ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGI2ZjI1MDQ3Li41MjRlYzUxIDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTEwMCw5ICsxMDAsMTEgQEAKIAljb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENhbGxiYWNrLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFBiYXAuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRTZXJ2aWNlLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUludGVudFJlY2VpdmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUludGVudFNlbmRlci5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSVN5bmNBZGFwdGVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSVN5bmNDb250ZXh0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSVN5bmNTdGF0dXNPYnNlcnZlci5haWRsIFwKQEAgLTEzMiw3ICsxMzQsNiBAQAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJDb25uZWN0aW9uLmFpZGwgXAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJFbmdpbmUuYWlkbCBcCiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlclNlcnZpY2UuYWlkbCBcCi0JY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuLmFpZGwgXApAQCAtMTYyLDYgKzE2Myw5IEBACiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kQ2xpZW50LmFpZGwgXAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZE1hbmFnZXIuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kU2Vzc2lvbi5haWRsIFwKKwljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBcCisJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbCBcCisJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHZW9jb2RlUHJvdmlkZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNMaXN0ZW5lci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUdwc1N0YXR1c1Byb3ZpZGVyLmFpZGwgXApAQCAtMzYzLDcgKzM2Nyw4IEBACiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS82LnhtbCA2IFwKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzcueG1sIDcgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvOC54bWwgOCBcCi0JCS1lcnJvciAxIC1lcnJvciAyIC13YXJuaW5nIDMgLWVycm9yIDQgLWVycm9yIDYgLWVycm9yIDggXAorICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvY3VycmVudC54bWwgSEMgXAorCQktZXJyb3IgMTAxIC1lcnJvciAxMDIgLXdhcm5pbmcgMTAzIC1lcnJvciAxMDQgLWVycm9yIDEwNiAtZXJyb3IgMTA4IFwKIAkJLW92ZXJ2aWV3ICQoTE9DQUxfUEFUSCkvY29yZS9qYXZhL292ZXJ2aWV3Lmh0bWwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUjo9JChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmspCkBAIC00MTksNyArNDI0LDkgQEAKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9XaWt0aW9uYXJ5U2ltcGxlIFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAiV2lrdGlvbmFyeSAoU2ltcGxpZmllZCkiIFwKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9Wb2ljZVJlY29nbml0aW9uU2VydmljZSBcCi0JCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIgorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIgXAorCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1htbEFkYXB0ZXJzIFwKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvWG1sQWRhcHRlcnMgIlhNTCBBZGFwdGVycyIKIAogIyMgU0RLIHZlcnNpb24gaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgcHVibGlzaGVkIGRvY3MKICAgIyBtYWpvclsubWlub3JdIHZlcnNpb24gZm9yIGN1cnJlbnQgU0RLLiAoZnVsbCByZWxlYXNlcyBvbmx5KQpAQCAtNDcwLDcgKzQ3Nyw4IEBACiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAotJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQorIyAkKGdlbiksIGkuZS4gZnJhbWV3b3JrLmFpZGwsIGlzIGFsc28gbmVlZGVkIHdoaWxlIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgc3R1Yi4KKyQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkgJChnZW4pCiAkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKTogJChmdWxsX3RhcmdldCkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSkpCiAKQEAgLTU3MywxMCArNTgxLDE0IEBACiBleHRfZGlycyA6PSBcCiAJLi4vLi4vZXh0ZXJuYWwvbmlzdC1zaXAvamF2YSBcCiAJLi4vLi4vZXh0ZXJuYWwvYXBhY2hlLWh0dHAvc3JjIFwKLQkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYworCS4uLy4uL2V4dGVybmFsL3RhZ3NvdXAvc3JjIFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYwogCiBleHRfc3JjX2ZpbGVzIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwkKGV4dF9kaXJzKSkKIAorZXh0X3Jlc19kaXJzIDo9IFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYworCiAjID09PT0gIHRoZSBsaWJyYXJ5ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTU4NCw3ICs1OTYsNyBAQAogCiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZQotCitMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gJChleHRfcmVzX2RpcnMpCiBMT0NBTF9NT0RVTEUgOj0gZXh0CiAKIExPQ0FMX05PX0VNTUFfSU5TVFJVTUVOVCA6PSB0cnVlCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKaW5kZXggMWVmZTc3Yy4uZjczZTRkNSAxMDA2NDQKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyBiL0NsZWFuU3BlYy5tawpAQCAtNjcsNiArNjcsMTUgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYnJldmVyYl9pbnRlcm1lZGlhdGVzKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlicmV2ZXJidGVzdF9pbnRlcm1lZGlhdGVzKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9zb3VuZGZ4LykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAuIC10eXBlIGYgLW5hbWUgIioucnMiIC1wcmludDAgfCB4YXJncyAtMCB0b3VjaCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmFuZHJvaWRfcnVudGltZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJod3VpX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovbGliL2xpYmh3dWkuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGliaHd1aS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliaHd1aS5zbykKIAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCmRpZmYgLS1naXQgYS9hcGkvOS54bWwgYi9hcGkvOS54bWwKaW5kZXggZjE4NjIzZi4uZjE1MWExNiAxMDA2NDQKLS0tIGEvYXBpLzkueG1sCisrKyBiL2FwaS85LnhtbApAQCAtNTg1OTMsMTYgKzU4NTkzLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTE5LDE3ICs1OTUwOSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZyZWVHbENhY2hlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDbGlwQm91bmRzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTU3NiwxNyArNTk1NTUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRHTCIKLSByZXR1cm49ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTk1MCwyMSArNTk5MTgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3NzgyLDE3ICsxNDc3MzUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0NzgwNCwzMCArMTQ3NzQ2LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0Nzg1NCwxNyArMTQ3NzcyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODA2MSwxNyArMTQ3OTY4LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI3NSwxNyArMTQ4MTcxLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3VwcG9ydHNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgzMTIsMTI0ICsxNDgxOTcsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRG91YmxlIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVGbG9hdCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVJbnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUxvbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTdHJpbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVUb051bGwiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tEaWFsb2dJbnRlcmZhY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE2NDY5Niw3ICsxNjQ0NjMsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTY0NzA3LDcgKzE2NDQ3NCw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpkaWZmIC0tZ2l0IGEvYXBpL2N1cnJlbnQueG1sIGIvYXBpL2N1cnJlbnQueG1sCmluZGV4IDAwZTRlNWUuLmE5ZWY1NGUgMTAwNjQ0Ci0tLSBhL2FwaS9jdXJyZW50LnhtbAorKysgYi9hcGkvY3VycmVudC54bWwKQEAgLTIwODgsNiArMjA4OCw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTMyLDYgKzIxODcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFkYXB0ZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhZGRTdGF0ZXNGcm9tQ2hpbGRyZW4iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTY1LDYgKzIyMzEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFsbG93QmFja3VwIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI1Myw2ICsyMzMwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW5pbWF0ZU9uQ2xpY2siCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzQxLDYgKzI0MjksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYXV0aG9yIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAwMSw2ICszMTAwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjb2x1bW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjb2x1bW5EZWxheSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDQsNiArMzI1NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImN5Y2xlcyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDgsNiArMzUyOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGlzcGxheU9wdGlvbnMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkaXRoZXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNjA2LDYgKzM3MzgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNTYsNiArNDI5OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcmVlemVzVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNjcsNiArNDMyMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxODksNiArNDM1NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbVZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbVhEZWx0YSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ0NzUsNiArNDY1MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imhhc0NvZGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02Njg2LDYgKzY4NzMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibWVudUNhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjgxOCw2ICs3MDE2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJuYXZpZ2F0aW9uTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im5lZ2F0aXZlQnV0dG9uVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY5ODMsNiArNzE5MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ib3JkZXJpbmciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJvcmRlcmluZ0Zyb21YbWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03Mzc5LDYgKzc1OTksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByZXZpZXdJbWFnZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByaW9yaXR5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNzUzMyw2ICs3NzY0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJwcm9wZXJ0eU5hbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcm90ZWN0aW9uTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04MzAzLDYgKzg1NDUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDEzLDYgKzg2NjYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNob3dBc0FjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNob3dEZWZhdWx0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ5MCw2ICs4NzU0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzb3J0T3JkZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzb3VuZEVmZmVjdHNFbmFibGVkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODg0Miw2ICs5MTE3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InN1Z2dlc3RBY3Rpb25Nc2ciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05Njc4LDYgKzk5NjQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idG9BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk3MDAsNiArOTk5NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg3Niw2ICsxMDE4NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05OTA5LDYgKzEwMjI4LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZUZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUeXBlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmFyaWFibGVQYWRkaW5nIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTAyMTcsNiArMTA1NjksMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEwNDI2LDYgKzEwODExLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoQ2xhc3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndyaXRlUGVybWlzc2lvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MDc1LDYgKzE0NDgyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJob21lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaWNvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0NDYwLDYgKzE0ODc4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3RUZXh0TW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTA4MzU0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNlbGVjdGVkSWNvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1MDAwLDYgKzE1NDI5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0X2NvbnRlbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzM2NzA3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcmVmZXJlbmNlX2NhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTU1NjgsNiArMTYwMDgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTcwMzk0MDgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idW5rbm93bk5hbWUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjA1OCw2ICsxNjUwOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfRGlhbG9nX05vRnJhbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MTU3LDYgKzE2NjE5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ob1RpdGxlQmFyX092ZXJsYXlBY3Rpb25Nb2RlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX1BhbmVsIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNDUsNiArMTY3MTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX1dpdGhBY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk2OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjI2Nyw2ICsxNjc1MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0FjdGlvbkJ1dHRvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9BdXRvQ29tcGxldGVUZXh0VmlldyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NjQxLDYgKzE3MTM2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfU3Bpbm5lcl9Ecm9wRG93biIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9UYWJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTA2NSw4ICsxOTU3MSwxOTM0IEBACiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KKzxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uIgorPgorPGNsYXNzIG5hbWU9IkFuaW1hdGFibGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0YWJsZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0ZW5lcnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBbGxMaXN0ZW5lcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblJlcGVhdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleWZyYW1lcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlRnJvbSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZUZyb20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVUbyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZUZyb20iIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVUbyIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZUZyb20iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRVcGRhdGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGVkVmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRQbGF5VGltZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhbWVEZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlRnJvbSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWVUbyIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVXBkYXRlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXJyZW50UGxheVRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwbGF5VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFtZURlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFtZURlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRDb3VudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVwZWF0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVGcm9tIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVGcm9tIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlVG8iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZVRvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iSU5GSU5JVEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSRVNUQVJUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSRVZFUlNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uVXBkYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJEb3VibGVFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRG91YmxlRXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkRvdWJsZUV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uRmxvYXRFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkludEV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJbnRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uSW50RXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJLZXlmcmFtZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFjdGlvbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVycG9sYXRvciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIgorIGV4dGVuZHM9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZUZyb20iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZVRvIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVGcm9tIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlRnJvbSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZVRvIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZVRvIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZUZyb20iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlVG8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZVRvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5ZnJhbWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZS4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEdldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXQiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImdldHRlciIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb3BlcnR5TmFtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXR0ZXIiIHR5cGU9ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUkdCRXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJHQkV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5SR0JFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcXVlbmNlciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZXF1ZW5jZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldENoaWxkQW5pbWF0aW9ucyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlNlcXVlbmNlci5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlTZXF1ZW50aWFsbHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXF1ZW5jZUl0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlUb2dldGhlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlcXVlbmNlSXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU2VxdWVuY2VyLkJ1aWxkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZnRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWZvcmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndpdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJUeXBlRXZhbHVhdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5hcHAiCiA+Cis8Y2xhc3MgbmFtZT0iQWN0aW9uQmFyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbkJhciIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkVGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0VGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3VGFiIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVRhYkF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtYXNrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZVJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZVJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFiTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFiTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfSElERV9IT01FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX1VTRV9MT0dPIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfQ1VTVE9NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfVEFCUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1Qb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtSWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOVkFMSURfUE9TSVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTIsNiArMjE2NDQsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXYiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeUlkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlUYWciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3QnlJZCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5Mjc3LDYgKzIxNzM1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNoaWxkIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpb25CYXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QXBwbGljYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTM4Nyw2ICsyMTg1NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXJNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMb2NhbENsYXNzTmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MjEsNiArMjIwMDEsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0NoYW5naW5nQ29uZmlndXJhdGlvbnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2hpbGQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NjE2LDYgKzIyMTE4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2hGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkF0dGFjaGVkVG9XaW5kb3ciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjAyLDYgKzIyNzE3LDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblN0b3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzE1LDYgKzIyODQzLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5GcmFnbWVudFRyYW5zYWN0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvcGVuT3B0aW9uc01lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzQxLDYgKzIyODgwLDQ3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4aXRBbmltIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3NDUsNiArMjMzMjUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDc3Nyw2ICsyMzM3MCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5SWZOZWVkZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMDA5LDYgKzIzNjE5LDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlJFU1VMVF9DQU5DRUxFRCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzNzMyLDYgKzI2MzUzLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDE3MCw2ICsyNjgwMiwxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25TdG9wIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDU3OCw2ICsyNzIyMywyMTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRpYWxvZ0ZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkRpc21pc3NMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGlhbG9nRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZW1lIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDYW5jZWxhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGhlbWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaWFsb2ciIHR5cGU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVEaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhbmNlbGFibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW5jZWxhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT1JNQUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX0ZSQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19JTlBVVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fVElUTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJFeHBhbmRhYmxlTGlzdEFjdGl2aXR5IgogIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NzM3LDYgKzI3NTg3LDk4NiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnQiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpdml0eSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXJNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXRhaW5JbnN0YW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYWciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc2hDb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zdGFudGlhdGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZm5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkNsYXNzTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iTm9TdWNoTWV0aG9kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQWRkZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIaWRkZW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSZXN1bWVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVmlzaWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFjdGl2aXR5Q3JlYXRlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eVJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc3VsdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3Q29uZmlnIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZXh0SXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFuaW1hdGlvbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXh0QW5pbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51SW5mbyIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRldGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IaWRkZW5DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5mbGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb3dNZW1vcnkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uT3B0aW9uc0l0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNNZW51Q2xvc2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QYXVzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlc3VtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0b3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIYXNPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imhhc01lbnUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXRhaW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkVG9CYWNrU3RhY2siCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tbWl0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbUFuaW1hdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4aXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNpdGlvblN0eWxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfQUNUSVZJVFlfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfQUNUSVZJVFlfT1BFTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQxMDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FTlRFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FTlRFUl9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VYSVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRVhJVF9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0hJREUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9QUkVWSUVXX0RPTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfU0hPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9UQVNLX0NMT1NFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODIwMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1RBU0tfT1BFTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQxMDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9UQVNLX1RPX0JBQ0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MjAzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVEFTS19UT19GUk9OVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQxMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9VTlNFVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODIwNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgyMDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQxMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9XQUxMUEFQRVJfT1BFTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQxMDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJJbnN0cnVtZW50YXRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjE4Niw2ICszMDAxNiwzNzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+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+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvY2FsQWN0aXZpdHlNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk5MTAsNiArMzQxMDcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJVU0VTX1BPTElDWV9XQVRDSF9MT0dJTiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwMTk5LDYgKzM0NDA3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEdsb2JhbFByb3h5QWRtaW4iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDIyNSw2ICszNDQ0NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNYXhpbXVtTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjUxLDYgKzM0NDgzLDg0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzMjcsNiArMzQ2MzcsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRHbG9iYWxQcm94eSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3h5U3BlYyIgdHlwZT0iamF2YS5uZXQuUHJveHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1c2lvbkxpc3QiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDM1Nyw2ICszNDY4NCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0aW1lTXMiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzcyLDYgKzM0NzE0LDk2IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA0NjYsNiArMzQ4OTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjM5MzIxNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMTQ0OSw2ICszNTg5Miw0MCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQXBwV2lkZ2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDA2MCw2ICszODUzNyw3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbExvYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49IkQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnJvYWRjYXN0UmVjZWl2ZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MjkwLDYgKzM4ODMyLDM0OSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKKyBleHRlbmRzPSJhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcmltYXJ5Q2xpcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzVGV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlwIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByaW1hcnlDbGlwQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ2xpcHBlZERhdGEiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwcGVkRGF0YSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW0iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFiZWwiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcHBlZERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcHBlZERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb2VyY2VUb1RleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlbnQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50Q2FsbGJhY2tzIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zNDYxMyw2ICszOTQ5OCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcGFyZU1pbWVUeXBlcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uY3JldGVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNpcmVkVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZWxldGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY2Myw2ICszOTU2MywyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFR5cGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3OTksNiArMzk3MTQsNDggQEAKIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuUGlwZUhlbHBlciIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ1bmMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDg1OSw2ICszOTgxNiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNodXRkb3duIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDg3OSw2ICszOTg0NywzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0id3JpdGVEYXRhVG9QaXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRwdXQiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRlbnRQcm92aWRlckNsaWVudCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0OTUxLDYgKzM5OTQ4LDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzUwMjEsNiArNDAwMzUsMjcgQEAKIDxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTc5MSw2ICs0MDgyNiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRob3JpdHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTeW5jQWRhcHRlclR5cGVzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyVHlwZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM1OTg4LDYgKzQxMDM4LDI1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzY2NTMsNiArNDE3MjIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNzcwMyw2ICs0Mjc4MywyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zOTE0MSw2ICs0NDI0MCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM5NDY3LDYgKzQ0NTg1LDIyNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvamVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29ydE9yZGVyIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmkiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9qZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvcnRPcmRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRVcmkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iRGlhbG9nSW50ZXJmYWNlIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zOTgyOCw2ICs0NTE2NSw5MyBAQAogPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5JSW50ZXJmYWNlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgZXh0ZW5kcz0iYW5kcm9pZC5vcy5CaW5kZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYXNCaW5kZXIiCisgcmV0dXJuPSJhbmRyb2lkLm9zLklCaW5kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXNJbnRlcmZhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJhbmRyb2lkLm9zLklCaW5kZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25UcmFuc2FjdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGx5IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJJbnRlbnQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00MjA0Niw2ICs0NzQ3MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX1BBU1RFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJBQ1RJT05fUElDSyIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDQ0NCw2ICs0OTg3OSwxODMgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZW50Q2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZENvbXBsZXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ik11dGFibGVDb250ZXh0V3JhcHBlciIKICBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDQ5ODMsNiArNTA1OTUsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1MTE0LDYgKzUwNzQxLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dFN0cmluZ1NldCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1ODMxLDYgKzUxNDczLDE0NSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxldGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZVVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmlYbWxQdWxsUGFyc2VyIgorIHJldHVybj0ib3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc2VydCIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmNvbnRlbnQucG0iCiA+CkBAIC00NjA5Niw2ICs1MTg3NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19JTU1FUlNJVkUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01MzU1Myw2ICs1OTM0NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRVcGRhdGVkRmllbGQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTUzNTYwLDcgKzU5MzY1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzNjI4LDcgKzU5NDMzLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzOTE0LDcgKzU5NzE5LDcgQEAKICB2b2xhdGlsZT0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgpAQCAtNTQwNTAsNyArNTk4NTUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwNjMsNyArNTk4NjgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwNzYsNyArNTk4ODEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQxMDIsNyArNTk5MDcsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ1NzYsNiArNjAzODEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NDgxNiw2ICs2MDYzNCw2MSBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0JMT0IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfRkxPQVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfSU5URUdFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9OVUxMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX1NUUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDdXJzb3JJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgpAQCAtNTUxNzMsNiArNjEwNDYsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQmxvYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTUxODAsNyArNjEwNjgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTk1LDcgKzYxMDgzLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTIxMCw3ICs2MTA5OCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUyMjUsNyArNjExMTMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MjQwLDcgKzYxMTI4LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTY1MSw2ICs2MTUzOSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU2NjIsNiArNjE1NjMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V3JhcHBlZEN1cnNvciIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWZ0ZXJMYXN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTk3MCw2ICs2MTg4MiwyNyBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJEYXRhYmFzZUVycm9ySGFuZGxlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ29ycnVwdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTYwMDEsNiArNjE5MzQsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFwcGVuZFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYXBwZW5kVmFsdWVUb1NxbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTY0NzAsNiArNjI0MTgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTcWxTdGF0ZW1lbnRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNxbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb25nRm9yUXVlcnkiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2NjIwLDYgKzYyNTgxLDgzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQUJPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BVFRBQ0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9CRUdJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0NPTU1JVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX09USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfU0VMRUNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfVVBEQVRFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTU2ODU0LDYgKzYyODkyLDM4IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1hdHJpeEN1cnNvciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3MzM3LDYgKzYzNDA3LDExNCBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZUNsb3NhYmxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NzQ0OCw3ICs2MzYyNiw3IEBACiAgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJkYiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgpAQCAtNTc0NjAsNiArNjM2MzgsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDdXJzb3IiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHJpdmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3JEcml2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVkaXRUYWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0Q29sdW1uTmFtZXMiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc1OTcsNiArNjM3ODksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2MTAsNiArNjM4MTMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2NjYsNiArNjM4ODIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmVBcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5kVHJhbnNhY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NzIyLDYgKzYzOTQ5LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdHRhY2hlZERicyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC51dGlsLlBhaXImbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzc2Miw3ICs2NDAwMCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTc4NDMsNiArNjQwODEsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3ODk0LDcgKzY0MTQzLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01NzkwOSw3ICs2NDE1OCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTc5NjAsNiArNjQyMDksMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzk5MCw2ICs2NDI1OCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgxODMsNiArNjQ0NjgsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDb25uZWN0aW9uUG9vbFNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb2NhbGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4MjA5LDYgKzY0NTA3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImxvY2tpbmdFbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1heFNxbENhY2hlU2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NDExLDYgKzY0NzIyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVhfU1FMX0NBQ0hFX1NJWkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTk9fTE9DQUxJWkVEX0NPTExBVE9SUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU4NTEwLDYgKzY0ODMyLDYwIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVEaXNrSU9FeGNlcHRpb24iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NjY5LDYgKzY1MDQ1LDI0IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3BlbkhlbHBlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NzQ2LDYgKzY1MTQwLDMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVQcm9ncmFtIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTg3NTQsNiArNjUxNzUsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImJpbmRBbGxBcmdzQXNTdHJpbmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmluZEFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiaW5kQmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg4NzEsNyArNjUzMDUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTkyOTQsNiArNjU3MjgsMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVTdGF0ZW1lbnQiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTMyNCw2ICs2NTc4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJleGVjdXRlVXBkYXRlRGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yTG9uZyIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkzNDcsNiArNjU4MTksMzMgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtNjI1NDQsMTYgKzY5MDQzLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYzMzI3LDcgKzY5ODE2LDcgQEAKIDxtZXRob2QgbmFtZT0iZHJhd1RleHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNjM0NzAsMTcgKzY5OTU5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYzNTM0LDggKzcwMDEyLDggQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCkBAIC02MzU5NSw2ICs3MDA3MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MzkwMSwyMSArNzAzOTAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzMyODAsNiArNzk3NTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcHV0ZUNvbnN0YW50U2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDE3NCw2ICs4MDY1OSwzNiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik1pcG1hcERyYXdhYmxlIgorIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTWlwbWFwRHJhd2FibGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcmF3YWJsZSIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJOaW5lUGF0Y2hEcmF3YWJsZSIKICBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTkyMDkzLDYgKzk4NjA4LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9InByb2ZpbGUiIHR5cGU9ImFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaW1lTGFwc2VQYXJhbWV0ZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlVGltZUxhcHNlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmNvZGVyTGV2ZWwiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWaWRlb0VuY29kZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTk4MDY2LDYgKzEwNDYwMCwyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCb29sZWFuUXVlcnlQYXJhbWV0ZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRFbmNvZGVkQXV0aG9yaXR5IgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTEyMTU4Nyw2ICsxMjgxMzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkhPTkVZQ09NQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCdW5kbGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTEyNzYyMiw2ICsxMzQxODIsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlUGlwZSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTUxMCw2ICsxMzYwODMsNTMgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQub3Muc3RvcmFnZSIKID4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25TdG9yYWdlU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVXNiTWFzc1N0b3JhZ2VDb25uZWN0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTdG9yYWdlTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTUxOCw2ICsxMzYxMzgsMjggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImRpc2FibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlVXNiTWFzc1N0b3JhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1vdW50ZWRPYmJQYXRoIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjk1NDQsNiArMTM2MTg2LDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTI5NTU5LDYgKzEzNjIyMywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5tb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTI5NTc0LDYgKzEzNjI1MSwxMjQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZm9yY2UiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RvcmFnZVJlc3VsdENvZGUiCisgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VSZXN1bHRDb2RlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkSW50ZXJuYWxFcnJvciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQmxhbmsiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRNZWRpYUNvcnJ1cHQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWROb01lZGlhIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZUJ1c3kiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlTW91bnRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii02IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VOb3RNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uU3VjY2VlZGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLnByZWZlcmVuY2UiCkBAIC0xMzAzNjksNiArMTM3MTY0LDE0OCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImZpbmRJbmRleE9mVmFsdWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEVudHJpZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyaWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cmllcyIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyeVZhbHVlc1Jlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlByZWZlcmVuY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzA0ODcsNiArMTM3NDI0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50IgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRJbnRlbnQiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTA0OSw2ICsxMzc5OTcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEludGVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMzY3LDYgKzEzODMyOCw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eSIKICB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5IgogIHN0YXRpYz0iZmFsc2UiCkBAIC0xMzEzODIsNiArMTM4MzQ1LDI5MSBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRQcmVmZXJlbmNlIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJlZmVyZW5jZVNjcmVlbiIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkJ1aWxkSGVhZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0SW5pdGlhbEZyYWdtZW50IgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkhlYWRlckNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbklzSGlkaW5nSGVhZGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlVHJlZUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZSIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJlZmVyZW5jZVNjcmVlbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZVNjcmVlbiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRXaXRoRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMTMxNDY1LDUxICsxMzg3MTMsMjkgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgotPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgotIGFic3RyYWN0PSJmYWxzZSIKKzxpbnRlcmZhY2UgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50Lk9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlR3JvdXAiCiAgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xMzI0MDksOSArMTM5NjM1LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJzdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idHJ1bmNhdGVIaXN0b3J5IgpAQCAtMTMyNzk1LDcgKzE0MDAyMSw3IEBACiAgdmFsdWU9IiZxdW90O3VybCZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTM4NzUwLDYgKzE0NTk3NiwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KKzxmaWVsZCBuYW1lPSJBVVRPX0FERCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthdXRvX2FkZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJERUxFVEVEIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzODc2MSw2ICsxNDU5OTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZBVk9SSVRFUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtmYXZvcml0ZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iR1JPVVBfVklTSUJMRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDg4NDMsNyArMTU2MDkxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWZvcmVUZXh0Q2hhbmdlZCIKQEAgLTE1MzY3NCw2ICsxNjA5MjIsMzYgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyBleHRlbmRzPSJhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyVGVzdENhc2UiCisgdHlwZT0iYW5kcm9pZC50ZXN0LkxvYWRlclRlc3RDYXNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlclJlc3VsdFN5bmNocm9ub3VzbHkiCisgcmV0dXJuPSJUIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9yZUFzc2VydHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTY1OTQsNiArMTYzODcyLDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU2OTM4LDE3ICsxNjQyMzUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1Njk2MCwzMCArMTY0MjQ2LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1NzAxMCwxNyArMTY0MjcyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1NzIwNiw4ICsxNjQ0NTcsOCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0xNTcyMTYsOCArMTY0NDY3LDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCis8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMTU3NDMxLDE3ICsxNjQ2ODQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1NzQ2OCwxMjQgKzE2NDcxMCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTU5NzIxLDE1ICsxNjY4NDUsMjMgQEAKIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgorIHR5cGU9ImFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE1OTc0MCw3ICsxNjY4NzIsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1RleHQiCiAgcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE1OTc1MSw3ICsxNjY4ODMsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRleHQiCiAgcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2MjU3Niw2ICsxNjk3MDgsMjkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHRSdW5DdXJzb3IiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRTdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0RW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3JPcHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnNlcnQiCiAgcmV0dXJuPSJhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNjM2MzYsNyArMTcwNzkxLDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdmFpbCIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CkBAIC0xNjYzMjgsNiArMTczNDgzLDI5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3Vyc29yQ29udHJvbGxlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvckNvbnRyb2xsZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkN1cnNvckNvbnRyb2xsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ3Vyc29yQ29udHJvbGxlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5DdXJzb3JDb250cm9sbGVyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkJhc2VLZXlMaXN0ZW5lciIKICBleHRlbmRzPSJhbmRyb2lkLnRleHQubWV0aG9kLk1ldGFLZXlLZXlMaXN0ZW5lciIKQEAgLTE3MzIwMCw2ICsxODAzNzgsNDgzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uUmVhZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5DbG9zZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikpzb25SZWFkZXIiCisgdHlwZT0iYW5kcm9pZC51dGlsLkpzb25SZWFkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiZWdpbkFycmF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5PYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZEFycmF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kT2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzTmV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRCb29sZWFuIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dERvdWJsZSIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEludCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dExvbmciCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHROdWxsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dFN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWsiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMZW5pZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuaWVudCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJza2lwVmFsdWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzeW50YXhFcnJvciIKKyByZXR1cm49ImphdmEuaW8uSU9FeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25Ub2tlbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuRW51bSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9InZhbHVlT2YiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWVzIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uV3JpdGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5DbG9zZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikpzb25Xcml0ZXIiCisgdHlwZT0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uV3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmVnaW5BcnJheSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpbk9iamVjdCIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZEFycmF5IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZE9iamVjdCIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbHVzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5hbWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibnVsbFZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluZGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMb2ciCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNzM5MjUsNyArMTgxNTgwLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE3MzkzNiw3ICsxODE1OTEsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSkmcXVvdDsiCisgdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkpJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE3NDIwMyw2ICsxODE4NTgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFZhbHVlQXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3NTgwOCw2ICsxODM0NzYsMjMxIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBY3Rpb25Nb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbk1vZGUiCisgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluaXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbVZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnVJbmZsYXRlciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0aXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUaXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFjdGlvbk1vZGUuQ2FsbGJhY2siCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aW9uSXRlbUNsaWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBY3Rpb25Nb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95QWN0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlQWN0aW9uTW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQ29udGV4dE1lbnUiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE4MTI5Niw2ICsxODkxODksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWxwaGFDaGFyIiB0eXBlPSJjaGFyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dBc0FjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uRW51bSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRpdGxlIgogIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTgxMzQ4LDYgKzE4OTI1NCwzOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fQUxXQVlTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9JRl9ST09NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9ORVZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODUxMDgsNiArMTkzMDQ3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFscGhhIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uIgogIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1NTQxLDYgKzE5MzQ5MSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iaW50W10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWF0cml4IgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWVhc3VyZWRIZWlnaHQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1NjczLDYgKzE5MzYzNCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQaXZvdFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQaXZvdFkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZXNvdXJjZXMiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODU3MjgsNiArMTkzNzExLDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb25YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb25ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NhbGVYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NhbGVZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2Nyb2xsQmFyU3R5bGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1ODczLDYgKzE5MzkxMSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2xhdGlvblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2xhdGlvblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRWZXJ0aWNhbEZhZGluZ0VkZ2VMZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1OTc0LDYgKzE5NDAzNCwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJvdXRSZWN0IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlJlY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0WCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNGb2N1cyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2MzA0LDYgKzE5NDM4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNTY3JvbGxiYXJGYWRpbmdFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODcyOTMsNiArMTk1Mzg2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc3NTYsNiArMTk1ODYyLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImJvdHRvbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBpdm90WCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpdm90WCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGl2b3RZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGl2b3RZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQcmVzc2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc3NjksNiArMTk1OTAxLDQ1IEBACiA8cGFyYW1ldGVyIG5hbWU9InByZXNzZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb25YIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb25YIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvblkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvblkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNhdmVFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc3ODIsNiArMTk1OTUzLDQ1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY2FsZVgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZVgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjYWxlWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsQmFyU3R5bGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Nzg4OCw2ICsxOTYwOTgsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVsZWdhdGUiIHR5cGU9ImFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNsYXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NTMsNiArMTk2MTg5LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9IndpbGxOb3REcmF3IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2hvd0NvbnRleHRNZW51IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NjQsNiArMTk2MjI2LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDc0MSw2ICsxOTkwMTYsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGVGb3JDaGlsZCIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRMYXlvdXRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTQzMSw2ICsxOTk3MjEsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGVGb3JDaGlsZCIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iVmlld1N0dWIiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LlZpZXciCkBAIC0xOTIxMDcsNiArMjAwNDEyLDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0ZlYXR1cmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzU29mdElucHV0TW9kZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTE4LDYgKzIwMDQzNiwxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlUGFuZWxNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FjdGl2ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyNjc5LDYgKzIwMTAxMCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJhcHBOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdpbmRvd01hbmFnZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3bSIgdHlwZT0iYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFRva2VuIiB0eXBlPSJhbmRyb2lkLm9zLklCaW5kZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3VwZXJEaXNwYXRjaEtleUV2ZW50IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5Mjc4Myw2ICsyMDExMzMsMjggQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfQUNUSU9OX0JBUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX0NPTlRFWFRfTUVOVSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE5MjgwNSw2ICsyMDExNzcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTMxNjQsNiArMjAxNTQ3LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uV2luZG93QXR0cmlidXRlc0NoYW5nZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTkzNjUzLDYgKzIwMjA0OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yMTQ3NDgzNjQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTU1MzksNiArMjAzOTQ2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlRmFjdG9yIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3RhcnRPZmZzZXQiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NTU3Niw2ICsyMDM5OTQsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNmb3JtYXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJyZW50VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRaQWRqdXN0bWVudCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTYyMTUsNiArMjA0NjUwLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEFuaW1hdG9yIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb2FkSW50ZXJwb2xhdG9yIgogIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAyODU1LDYgKzIxMTMwNywxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QWxsb3dGaWxlQWNjZXNzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDM0NzAsNiArMjExOTMzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWciIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYW50YXN5Rm9udEZhbWlseSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0NDAyLDYgKzIxMjg3OCwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJXZWJWaWV3IgorIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByaXZhdGVCcm93c2luZyIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImFkZEphdmFzY3JpcHRJbnRlcmZhY2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDQ1Miw2ICsyMTI5NDQsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbUluIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5ab29tT3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYXB0dXJlUGljdHVyZSIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQ4MTEsNiArMjEzMzI1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpc2libGVUaXRsZUhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRab29tQ29udHJvbHMiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQ4NjgsNiArMjEzMzkzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9hZERhdGEiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNTE4Nyw2ICsyMTM3MjMsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0U3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2F2ZVdlYkFyY2hpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXV0b25hbWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENlcnRpZmljYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY0MzUsNiArMjE1MDAxLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblJlc3RvcmVJbnN0YW5jZVN0YXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY2MTIsNiArMjE1MjAwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5SZWN5Y2xlckxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZVZpZXdzQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxJbmRpY2F0b3JzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY3NjEsNiArMjE1MzYyLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImJvdW5kUG9zaXRpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uRnJvbVRvcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InZlcmlmeURyYXdhYmxlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDgwNDEsNiArMjE2NjU3LDU1OCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50VmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpc3BsYXllZENoaWxkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluQW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuaW1hdGVGaXJzdFZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXllZENoaWxkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2hpY2hDaGlsZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluQW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5BbmltYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluQW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlSUQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRBbmltYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE91dEFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUlEIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVtb3RlVmlld3NBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd05leHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dQcmV2aW91cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdGbGlwcGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0ZsaXBwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJpc0F1dG9TdGFydCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNGbGlwcGluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXV0b1N0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXV0b1N0YXJ0IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZsaXBJbnRlcnZhbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbGxpc2Vjb25kcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0RmxpcHBpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BGbGlwcGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImxvYWRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmluZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibVRyYW5zZm9ybWF0aW9uIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybVRvUmVzb3VyY2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFscGhhYmV0SW5kZXhlciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTAwMjgsNiArMjE5MTk2LDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJiaW5kVmlldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMTAxNzUsNiArMjE5MzU3LDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmV3RHJvcERvd25WaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEwMjQ2LDYgKzIxOTQ0NSwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJRdWVyeVByb3ZpZGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRkxBR19BVVRPX1JFUVVFUlkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkN1cnNvclRyZWVBZGFwdGVyIgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIiCkBAIC0yMTI2ODUsNiArMjIxOTA2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE51bUNvbHVtbnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3RyZXRjaE1vZGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEyODAwLDYgKzIyMjAzMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2ZXJ0aWNhbFNwYWNpbmciIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iQVVUT19GSVQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTM4NzEsNiArMjIzMTE2LDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaW5lYXJMYXlvdXQiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTM5MTUsNiArMjIzMTc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkxheW91dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEzOTg4LDYgKzIyMzI1OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJob3Jpem9udGFsR3Jhdml0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T3JpZW50YXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDE4NCw2ICsyMjM0NjcsNjc4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+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+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbUNsaWNrTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlja0xpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZExpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9tcHRWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9OT1RfTkVFREVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVRDSF9QQVJFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1NJVElPTl9QUk9NUFRfQUJPVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9CRUxPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV1JBUF9DT05URU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDM0Nyw2ICsyMjQzMDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Db3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUlkcyIKICByZXR1cm49ImxvbmdbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ2MDIsNiArMjI0NTY4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Iml0ZW1zQ2FuRm9jdXMiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ2NDEsNiArMjI0NjIwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTQ2NTIsNiArMjI0NjQ0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNDcyMiw2ICsyMjQ3MjUsMzUgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ib25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGVja2VkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJNZWRpYUNvbnRyb2xsZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE1MTczLDYgKzIyNTIwNSwxMDUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJQb3B1cE1lbnUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwTWVudSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51SW5mbGF0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk1lbnVJdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iUG9wdXBXaW5kb3ciCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTUyMjQsNiArMjI1MzU1LDIyIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgogIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgpAQCAtMjE2MjUzLDYgKzIyNjQwMCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGNsdWRlTWltZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbWFnZVRvRGVmYXVsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TW9kZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE3NDY4LDYgKzIyNzYyNiwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZXRob2ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTc1MTksNiArMjI3Njk0LDUxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImluZGV0ZXJtaW5hdGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTc2ODEsNiArMjI3OTAxLDE0OSBAQAogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiI+CiA8L2ltcGxlbWVudHM+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZSIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5TZXJ2aWNlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NTZXJ2aWNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQmluZCIKKyByZXR1cm49ImFuZHJvaWQub3MuSUJpbmRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0Vmlld0ZhY3RvcnkiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2UuUmVtb3RlVmlld3NGYWN0b3J5IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlLlJlbW90ZVZpZXdzRmFjdG9yeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGluZ1ZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXdBdCIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Vmlld1R5cGVDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1N0YWJsZUlkcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjE3NzE5LDYgKzIyODA4MiwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVzb3VyY2VDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsYXlvdXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJuZXdWaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE5Nzk5LDYgKzIzMDE3OCwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJwcm9tcHRJZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iTU9ERV9ESUFMT0ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1PREVfRFJPUERPV04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU3Bpbm5lckFkYXB0ZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMTk4MjcsNiArMjMwMjI4LDM3IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iU3RhY2tWaWV3IgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0YWNrVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TdGFja1ZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJUYWJIb3N0IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjgzOCw2ICsyMzMyNzAsMTA4IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlRleHRWaWV3LkN1cnNvckNvbnRyb2xsZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImRyYXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbnZhcyIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0T2Zmc2V0WCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0T2Zmc2V0WSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblRvdWNoRXZlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGQURFX09VVF9EVVJBVElPTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJUZXh0Vmlldy5PbkVkaXRvckFjdGlvbkxpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKZGlmZiAtLWdpdCBhL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCmluZGV4IDMwMTg4M2YuLmZiNjBmZGYgMTAwNjQ0Ci0tLSBhL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKKysrIGIvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQpAQCAtOTgsNiArOTgsOCBAQAogICAgICAgICAgICAgc2VuZEJyb2FkY2FzdCgpOwogICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygicHJvZmlsZSIpKSB7CiAgICAgICAgICAgICBydW5Qcm9maWxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJkdW1waGVhcCIpKSB7CisgICAgICAgICAgICBydW5EdW1wSGVhcCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjb21tYW5kOiAiICsgb3ApOwogICAgICAgICB9CkBAIC00MjQsNiArNDI2LDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcnVuRHVtcEhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gISItbiIuZXF1YWxzKG5leHRPcHRpb24oKSk7CisgICAgICAgIFN0cmluZyBwcm9jZXNzID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFN0cmluZyBoZWFwRmlsZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoaGVhcEZpbGUpLAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX0NSRUFURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfVFJVTkNBVEUgfAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfV1JJVEUpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogVW5hYmxlIHRvIG9wZW4gZmlsZTogIiArIGhlYXBGaWxlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUFtLmR1bXBIZWFwKHByb2Nlc3MsIG1hbmFnZWQsIGhlYXBGaWxlLCBmZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkRXhjZXB0aW9uKCJIRUFQIERVTVAgRkFJTEVEIG9uIHByb2Nlc3MgIiArIHByb2Nlc3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBJbnRlbnRSZWNlaXZlciBleHRlbmRzIElJbnRlbnRSZWNlaXZlci5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZCA9IGZhbHNlOwogCkBAIC01OTMsNiArNjE3LDggQEAKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RhcnQgPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0b3AgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdG9wXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGR1bXAgaGVhcDogYW0gZHVtcGhlYXAgW2ZsYWdzXSA8UFJPQ0VTUz4gPEZJTEU+XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtbjogZHVtcCBuYXRpdmUgaGVhcCBpbnN0ZWFkIG9mIG1hbmFnZWQgaGVhcFxuIiArCiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICA8SU5URU5UPiBzcGVjaWZpY2F0aW9ucyBpbmNsdWRlIHRoZXNlIGZsYWdzOlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy1hIDxBQ1RJT04+XSBbLWQgPERBVEFfVVJJPl0gWy10IDxNSU1FX1RZUEU+XVxuIiArCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDA4MmU3MDQuLjAyYzljYmMgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC0xMDMsNiArMTAzLDkgQEAKICAgICBkdW1wX2ZpbGUoIk5FVFdPUksgUk9VVEVTIiwgIi9wcm9jL25ldC9yb3V0ZSIpOwogICAgIGR1bXBfZmlsZSgiQVJQIENBQ0hFIiwgIi9wcm9jL25ldC9hcnAiKTsKIAorICAgIHJ1bl9jb21tYW5kKCJXSUZJIE5FVFdPUktTIiwgMjAsCisgICAgICAgICAgICAic3UiLCAicm9vdCIsICJ3cGFfY2xpIiwgImxpc3RfbmV0d29ya3MiLCBOVUxMKTsKKwogI2lmZGVmIEZXRFVNUF9iY200MzI5CiAgICAgcnVuX2NvbW1hbmQoIkRVTVAgV0lGSSBGSVJNV0FSRSBMT0ciLCA2MCwKICAgICAgICAgICAgICJzdSIsICJyb290IiwgImRoZHV0aWwiLCAiLWkiLCAiZXRoMCIsICJ1cGxvYWQiLCAiL2RhdGEvbG9jYWwvdG1wL3dsYW5fY3Jhc2guZHVtcCIsIE5VTEwpOwpAQCAtMTY0LDggKzE2NywxMSBAQAogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkdW1wc3RhdGUgWy1kXSBbLW8gZmlsZV0gWy1zXSBbLXpdXG4iCisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZHVtcHN0YXRlIFstYiBmaWxlXSBbLWRdIFstZSBmaWxlXSBbLW8gZmlsZV0gWy1zXSAiCisgICAgICAgICAgICAiWy16XVxuIgorICAgICAgICAgICAgIiAgLWI6IHBsYXkgc291bmQgZmlsZSBpbnN0ZWFkIG9mIHZpYnJhdGUsIGF0IGJlZ2lubmluZyBvZiBqb2JcbiIKICAgICAgICAgICAgICIgIC1kOiBhcHBlbmQgZGF0ZSB0byBmaWxlbmFtZSAocmVxdWlyZXMgLW8pXG4iCisgICAgICAgICAgICAiICAtZTogcGxheSBzb3VuZCBmaWxlIGluc3RlYWQgb2YgdmlicmF0ZSwgYXQgZW5kIG9mIGpvYlxuIgogICAgICAgICAgICAgIiAgLW86IHdyaXRlIHRvIGZpbGUgKGluc3RlYWQgb2Ygc3Rkb3V0KVxuIgogICAgICAgICAgICAgIiAgLXM6IHdyaXRlIG91dHB1dCB0byBjb250cm9sIHNvY2tldCAoZm9yIGluaXQpXG4iCiAgICAgICAgICAgICAiICAtejogZ3ppcCBvdXRwdXQgKHJlcXVpcmVzIC1vKVxuIik7CkBAIC0xNzUsNiArMTgxLDggQEAKICAgICBpbnQgZG9fYWRkX2RhdGUgPSAwOwogICAgIGludCBkb19jb21wcmVzcyA9IDA7CiAgICAgY2hhciogdXNlX291dGZpbGUgPSAwOworICAgIGNoYXIqIGJlZ2luX3NvdW5kID0gMDsKKyAgICBjaGFyKiBlbmRfc291bmQgPSAwOwogICAgIGludCB1c2Vfc29ja2V0ID0gMDsKIAogICAgIExPR0koImJlZ2luXG4iKTsKQEAgLTE5MSw5ICsxOTksMTEgQEAKICAgICBkdW1wX3RyYWNlc19wYXRoID0gZHVtcF92bV90cmFjZXMoKTsKIAogICAgIGludCBjOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGhvOnN2eiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYjpkZTpobzpzdnoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdiJzogYmVnaW5fc291bmQgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2QnOiBkb19hZGRfZGF0ZSA9IDE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZSc6IGVuZF9zb3VuZCA9IG9wdGFyZzsgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdvJzogdXNlX291dGZpbGUgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOiB1c2Vfc29ja2V0ID0gMTsgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAndic6IGJyZWFrOyAgLy8gY29tcGF0aWJpbGl0eSBuby1vcApAQCAtMjQxLDE2ICsyNTEsMTggQEAKICAgICAgICAgZ3ppcF9waWQgPSByZWRpcmVjdF90b19maWxlKHN0ZG91dCwgdG1wX3BhdGgsIGRvX2NvbXByZXNzKTsKICAgICB9CiAKLSAgICAvKiBienp6enp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGJlZ2luX3NvdW5kKSB7CisgICAgICAgIHBsYXlfc291bmQoYmVnaW5fc291bmQpOworICAgIH0gZWxzZSBpZiAodmlicmF0b3IpIHsKICAgICAgICAgZnB1dHMoIjE1MCIsIHZpYnJhdG9yKTsKICAgICAgICAgZmZsdXNoKHZpYnJhdG9yKTsKICAgICB9CiAKICAgICBkdW1wc3RhdGUoKTsKIAotICAgIC8qIGJ6enogYnp6eiBienp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGVuZF9zb3VuZCkgeworICAgICAgICBwbGF5X3NvdW5kKGVuZF9zb3VuZCk7CisgICAgfSBlbHNlIGlmICh2aWJyYXRvcikgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgZnB1dHMoIjc1XG4iLCB2aWJyYXRvcik7CmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaCBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCmluZGV4IDY4MmVhZmQuLjgzYjFkMTEgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCkBAIC00NCw0ICs0NCw3IEBACiAvKiBEaXNwbGF5cyBhIGJsb2NrZWQgcHJvY2Vzc2VzIGluLWtlcm5lbCB3YWl0IGNoYW5uZWwgKi8KIHZvaWQgc2hvd193Y2hhbihpbnQgcGlkLCBjb25zdCBjaGFyICpuYW1lKTsKIAorLyogUGxheSBhIHNvdW5kIHZpYSBTdGFnZWZyaWdodCAqLwordm9pZCBwbGF5X3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpOworCiAjZW5kaWYgLyogX0RVTVBTVEFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvdXRpbHMuYyBiL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKaW5kZXggYzdhNzhjYy4uZjkyYWNiYmIgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwpAQCAtNDI5LDMgKzQyOSw3IEBACiAgICAgcmVuYW1lKGFucl90cmFjZXNfcGF0aCwgdHJhY2VzX3BhdGgpOwogICAgIHJldHVybiBkdW1wX3RyYWNlc19wYXRoOwogfQorCit2b2lkIHBsYXlfc291bmQoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsICIvc3lzdGVtL2Jpbi9zdGFnZWZyaWdodCIsICItbyIsICItYSIsIHBhdGgsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxZDllMGYxLi5lNmIxYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzk5LDE5ICszOTksMTkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRBY2NvdW50SW50b0RhdGFiYXNlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBub0Jyb2FkY2FzdCA9IGFjY291bnQudHlwZS5lcXVhbHMoR09PR0xFX0FDQ09VTlRfVFlQRSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYXMgIT0gbnVsbCAmJiBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOworICAgICAgICAvLyBSZW1vdmUgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QgaW4gdGhlIGRiLiBJdCBpcyBpbnN0ZWFkCisgICAgICAgIC8vIHVzZWQgYXMgYSBjb250cm9sIHNpZ25hbCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc2VydGlvbiBzaG91bGQgcmVzdWx0IGluCisgICAgICAgIC8vIGFuIGFjY291bnRzIGNoYW5nZWQgYnJvYWRjYXN0IGJlaW5nIHNlbnQuCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7CisgICAgICAgIH0KICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBhbmQgcmVtb3ZlIGl0IHNpbmNlIHdlIGRvbid0IHdhbnQgaXQgdG8gcGVyc2lzdAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBkYi4KLSAgICAgICAgICAgICAgICBub0Jyb2FkY2FzdCA9IGV4dHJhcy5nZXRCb29sZWFuKE5PX0JST0FEQ0FTVF9GTEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGxvbmcgbnVtTWF0Y2hlcyA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLAogICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRBQkxFX0FDQ09VTlRTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFICIgKyBBQ0NPVU5UU19OQU1FICsgIj0/IEFORCAiICsgQUNDT1VOVFNfVFlQRSsgIj0/IiwKQEAgLTQzNiwxMyArNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICB9CisgICAgICAgIGlmICghbm9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgaW5zZXJ0RXh0cmEoU1FMaXRlRGF0YWJhc2UgZGIsIGxvbmcgYWNjb3VudElkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKQEAgLTE2NTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkuZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255Lm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBwcm92aXNpb25pbmciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBOT1Qgd2lwaW5nIG91dCB0aGUgcGFzc3dvcmRzCkBAIC0xNjgxLDExICsxNjgxLDExIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiREVMRVRFIGZyb20gIiArIFRBQkxFX0FVVEhUT0tFTlMpOwogICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJVUERBVEUgIiArIFRBQkxFX0FDQ09VTlRTICsgIiBTRVQgIiArIEFDQ09VTlRTX1BBU1NXT1JEICsgIiA9ICcnIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0TWV0YVZhbHVlKCJpbXNpIiwgaW1zaSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDE1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgY2xhc3NlcyB3aGljaCBwcm92aWRlIGJhc2ljIHN1cHBvcnQgZm9yIGFuaW1hdGlvbnMgd2hpY2ggY2FuIGJlCisgKiBzdGFydGVkLCBlbmRlZCwgYW5kIGhhdmUgPGNvZGU+QW5pbWF0YWJsZUxpc3RlbmVyczwvY29kZT4gYWRkZWQgdG8gdGhlbS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdGFibGUgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGxpc3RlbmVycyB0byBiZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGlzIGFuaW1hdGlvbi4gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub256ZXJvIHN0YXJ0RGVsYXksIHRoZSBhbmltYXRpb24gd2lsbCBzdGFydAorICAgICAqIHJ1bm5pbmcgYWZ0ZXIgdGhhdCBkZWxheSBlbGFwc2VzLiBOb3RlIHRoYXQgdGhlIGFuaW1hdGlvbiBkb2VzIG5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdpdGgKKyAgICAgKiB0aGlzIGNhbGwsIGJlY2F1c2UgYWxsIGFuaW1hdGlvbiBldmVudHMgYXJlIHBvc3RlZCB0byBhIGNlbnRyYWwgdGltaW5nIGxvb3Agc28gdGhhdCBhbmltYXRpb24KKyAgICAgKiB0aW1lcyBhcmUgYWxsIHN5bmNocm9uaXplZCBvbiBhIHNpbmdsZSB0aW1pbmcgcHVsc2Ugb24gdGhlIFVJIHRocmVhZC4gU28gdGhlIGFuaW1hdGlvbiB3aWxsCisgICAgICogc3RhcnQgdGhlIG5leHQgdGltZSB0aGF0IGV2ZW50IGhhbmRsZXIgcHJvY2Vzc2VzIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24uIFVubGlrZSB7QGxpbmsgI2VuZCgpfSwgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvCisgICAgICogc3RvcCBpbiBpdHMgdHJhY2tzLCBzZW5kaW5nIGFuIHtAbGluayBBbmltYXRhYmxlTGlzdGVuZXIjb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSl9IHRvCisgICAgICogaXRzIGxpc3RlbmVycywgZm9sbG93ZWQgYnkgYW4ge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlKX0gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGFzc2lnbiB0aGUgZW5kIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZworICAgICAqIGFuaW1hdGVkLCB0aGVuIGNhbGxpbmcgdGhlIHtAbGluayBBbmltYXRhYmxlTGlzdGVuZXIjb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSl9IG1ldGhvZCBvbgorICAgICAqIGl0cyBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLCBzdWNoIGFzIHN0YXJ0LCByZXBlYXQsIGFuZCBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNldCBvZiB7QGxpbmsgQW5pbWF0YWJsZUxpc3RlbmVyfSBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAqIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgPGNvZGU+QW5pbWF0YWJsZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBUaGUgc2V0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIG9iamVjdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRMaXN0ZW5lcnMoKTwvY29kZT4gZm9sbG93ZWQgYnkgY2FsbGluZyA8Y29kZT5jbGVhcigpPC9jb2RlPiBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QW4gYW5pbWF0aW9uIGxpc3RlbmVyIHJlY2VpdmVzIG5vdGlmaWNhdGlvbnMgZnJvbSBhbiBhbmltYXRpb24uCisgICAgICogTm90aWZpY2F0aW9ucyBpbmRpY2F0ZSBhbmltYXRpb24gcmVsYXRlZCBldmVudHMsIHN1Y2ggYXMgdGhlIGVuZCBvciB0aGUKKyAgICAgKiByZXBldGl0aW9uIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFuaW1hdGFibGVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIHN0YXJ0ZWQgYW5pbWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGFibGUgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkCisgICAgICAgICAqIGZvciBhbmltYXRpb25zIHdpdGggcmVwZWF0IGNvdW50IHNldCB0byBJTkZJTklURS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCByZWFjaGVkIGl0cyBlbmQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkCisgICAgICAgICAqIGZvciBhbmltYXRpb25zIHdpdGggcmVwZWF0IGNvdW50IHNldCB0byBJTkZJTklURS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgY2FuY2VsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdGFibGUgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIHJlcGV0aXRpb24gb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgcmVwZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGFibGUgYW5pbWF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWE4NDJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyOworCisvKioKKyAqIFRoaXMgYWRhcHRlciBjbGFzcyBwcm92aWRlcyBlbXB0eSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZnJvbSB7QGxpbmsgQW5pbWF0YWJsZUxpc3RlbmVyfS4KKyAqIEFueSBjdXN0b20gbGlzdGVuZXIgdGhhdCBjYXJlcyBvbmx5IGFib3V0IGEgc3Vic2V0IG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgbGlzdGVuZXIgY2FuCisgKiBzaW1wbHkgc3ViY2xhc3MgdGhpcyBhZGFwdGVyIGNsYXNzIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgZGlyZWN0bHkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyIGltcGxlbWVudHMgQW5pbWF0YWJsZUxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEB7aW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEB7aW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEB7aW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEB7aW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwMTNlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDk5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSB0aW1pbmcgZW5naW5lIGZvciBydW5uaW5nIGFuaW1hdGlvbnMKKyAqIHdoaWNoIGNhbGN1bGF0ZSBhbmltYXRlZCB2YWx1ZXMgYW5kIHNldCB0aGVtIG9uIHRhcmdldCBvYmplY3RzLgorICoKKyAqIDxwPlRoZXJlIGlzIGEgc2luZ2xlIHRpbWluZyBwdWxzZSB0aGF0IGFsbCBhbmltYXRpb25zIHVzZS4gSXQgcnVucyBpbiBhCisgKiBjdXN0b20gaGFuZGxlciB0byBlbnN1cmUgdGhhdCBwcm9wZXJ0eSBjaGFuZ2VzIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkLjwvcD4KKyAqCisgKiA8cD5CeSBkZWZhdWx0LCBBbmltYXRvciB1c2VzIG5vbi1saW5lYXIgdGltZSBpbnRlcnBvbGF0aW9uLCB2aWEgdGhlCisgKiB7QGxpbmsgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9IGNsYXNzLCB3aGljaCBhY2NlbGVyYXRlcyBpbnRvIGFuZCBkZWNlbGVyYXRlcworICogb3V0IG9mIGFuIGFuaW1hdGlvbi4gVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nCisgKiB7QGxpbmsgQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvcil9LjwvcD4KKyAqLworcHVibGljIGNsYXNzIEFuaW1hdG9yIGV4dGVuZHMgQW5pbWF0YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgaW4gbXMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0ZSQU1FX0RFTEFZID0gMzA7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlcyBzZW50IHRvIHRpbWluZyBoYW5kbGVyOiBTVEFSVCBpcyBzZW50IHdoZW4gYW4gYW5pbWF0aW9uIGZpcnN0IGJlZ2lucywgRlJBTUUgaXMgc2VudAorICAgICAqIGJ5IHRoZSBoYW5kbGVyIHRvIGl0c2VsZiB0byBwcm9jZXNzIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fU1RBUlQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fRlJBTUUgPSAxOworCisgICAgLyoqCisgICAgICogVmFsdWVzIHVzZWQgd2l0aCBpbnRlcm5hbCB2YXJpYWJsZSBtUGxheWluZ1N0YXRlIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9QUEVEICAgID0gMDsgLy8gTm90IHlldCBwbGF5aW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkcgICAgPSAxOyAvLyBQbGF5aW5nIG5vcm1hbGx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTEVEICAgPSAyOyAvLyBjYW5jZWwoKSBjYWxsZWQgLSBuZWVkIHRvIGVuZCBpdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRFRCAgICAgID0gMzsgLy8gZW5kKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFS0VEICAgICA9IDQ7IC8vIFNlZWtlZCB0byBzb21lIHRpbWUgdmFsdWUKKworICAgIC8qKgorICAgICAqIEVudW0gdmFsdWVzIHVzZWQgaW4gWE1MIGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUgdGhlIHZhbHVlIGZvciBtVmFsdWVUeXBlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfRkxPQVQgICAgICAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0lOVCAgICAgICAgID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9ET1VCTEUgICAgICA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfQ09MT1IgICAgICAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0NVU1RPTSAgICAgID0gNDsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZhcmlhYmxlcworICAgICAqLworCisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGF0IHRoZSBhbmltYXRpb24ncyBhbmltYXRlRnJhbWUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIHRpbWUgaXMgdXNlZCB0bworICAgIC8vIGRldGVybWluZSBlbGFwc2VkIHRpbWUgKGFuZCB0aGVyZWZvcmUgdGhlIGVsYXBzZWQgZnJhY3Rpb24pIGluIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAvLyB0byBhbmltYXRlRnJhbWUoKQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogU2V0IHdoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkgaXMgY2FsbGVkLiBJZiBuZWdhdGl2ZSwgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc2Vla2VkCisgICAgICogdG8gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbVNlZWtUaW1lID0gLTE7CisKKyAgICAvLyBUaGUgc3RhdGljIHNBbmltYXRpb25IYW5kbGVyIHByb2Nlc3NlcyB0aGUgaW50ZXJuYWwgdGltaW5nIGxvb3Agb24gd2hpY2ggYWxsIGFuaW1hdGlvbnMKKyAgICAvLyBhcmUgYmFzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb25IYW5kbGVyIHNBbmltYXRpb25IYW5kbGVyOworCisgICAgLy8gVGhlIHN0YXRpYyBsaXN0IG9mIGFsbCBhY3RpdmUgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHNldCBvZiBhbmltYXRpb25zIHRvIGJlIHN0YXJ0ZWQgb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUGVuZGluZ0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgaWYgbm9uZSBpcyBzZXQgb24gdGhlIGFuaW1hdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVycG9sYXRvciBzRGVmYXVsdEludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBwbGF5aW5nIGluIHJldmVyc2UuIFRoaXMgY2F1c2VzIHRoZQorICAgICAqIGVsYXBzZWQgZnJhY3Rpb24gdG8gYmUgaW52ZXJ0ZWQgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgY3VycmVudCBpdGVyYXRpb24gdGhhdCBpcyBwbGF5aW5nLiBXaGVuIG1DdXJyZW50SXRlcmF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogcmVwZWF0Q291bnQgKGlmIHJlcGVhdENvdW50IT1JTkZJTklURSksIHRoZSBhbmltYXRpb24gZW5kcworICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB3aGV0aGVyIGEgc3RhcnREZWxheSdkIGFuaW1hdGlvbiBoYXMgYmVndW4gcGxheWluZyB0aHJvdWdoIHRoZSBzdGFydERlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGFuaW1hdGlvbiBiZWdhbiBwbGF5aW5nIHRocm91Z2ggaXRzIHN0YXJ0RGVsYXkuIFRoaXMgaXMKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgbVN0YXJ0VGltZSB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCB0byB0cmFjayB3aGVuIHRoZSBhbmltYXRpb24gYmVjYW1lCisgICAgICogYWN0aXZlICh3aGljaCBpcyB3aGVuIHRoZSBzdGFydERlbGF5IGV4cGlyZWQgYW5kIHRoZSBhbmltYXRpb24gd2FzIGFkZGVkIHRvIHRoZSBhY3RpdmUKKyAgICAgKiBhbmltYXRpb25zIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtRGVsYXlTdGFydFRpbWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYW5pbWF0aW9uLiBVc2VkIHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBzdGFydAorICAgICAqIGFuIGFuaW1hdGlvbiAoaWYgc3RhdGUgPT0gU1RPUFBFRCkuIEFsc28gdXNlZCB0byBlbmQgYW4gYW5pbWF0aW9uIHRoYXQKKyAgICAgKiBoYXMgYmVlbiBjYW5jZWwoKSdkIG9yIGVuZCgpJ2Qgc2luY2UgdGhlIGxhc3QgYW5pbWF0aW9uIGZyYW1lLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICogU1RPUFBFRCwgUlVOTklORywgRU5ERUQsIENBTkNFTEVELgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29sbGVjdGlvbnMgdXNlZCB0byBhdm9pZCBzZXQgY29sbGlzaW9ucyBhcyBhbmltYXRpb25zIHN0YXJ0IGFuZCBlbmQgd2hpbGUgYmVpbmcKKyAgICAgKiBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzRW5kaW5nQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0RlbGF5ZWRBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUmVhZHlBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgZGVub3RlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaXMgc2V0IHVwIGFuZCByZWFkeSB0byBnby4gVXNlZCBieSBzZWVrKCkgdG8KKyAgICAgKiBzZXQgdXAgYW5pbWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIC8vCisgICAgLy8gQmFja2luZyB2YXJpYWJsZXMKKyAgICAvLworCisgICAgLy8gSG93IGxvbmcgdGhlIGFuaW1hdGlvbiBzaG91bGQgbGFzdCBpbiBtcworICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb247CisKKyAgICAvLyBUaGUgdmFsdWUgdGhhdCB0aGUgYW5pbWF0aW9uIHNob3VsZCBzdGFydCBmcm9tLCBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCisgICAgcHJpdmF0ZSBPYmplY3QgbVZhbHVlRnJvbTsKKworICAgIC8vIFRoZSB2YWx1ZSB0aGF0IHRoZSBhbmltYXRpb24gc2hvdWxkIGFuaW1hdGUgdG8sIHNldCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIE9iamVjdCBtVmFsdWVUbzsKKworICAgIC8vIFRoZSBhbW91bnQgb2YgdGltZSBpbiBtcyB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyIHN0YXJ0KCkgaXMgY2FsbGVkCisgICAgcHJpdmF0ZSBsb25nIG1TdGFydERlbGF5ID0gMDsKKworICAgIC8vIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0ZyYW1lRGVsYXkgPSBERUZBVUxUX0ZSQU1FX0RFTEFZOworCisgICAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBUaGUgZGVmYXVsdCBpcyAwLCB3aGljaCBtZWFucyB0aGUgYW5pbWF0aW9uCisgICAgLy8gd2lsbCBwbGF5IG9ubHkgb25jZQorICAgIHByaXZhdGUgaW50IG1SZXBlYXRDb3VudCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiByZXBldGl0aW9uIHRoYXQgd2lsbCBvY2N1ciB3aGVuIHJlcGVhdE1vZGUgaXMgbm9uemVyby4gUkVTVEFSVCBtZWFucyB0aGUKKyAgICAgKiBhbmltYXRpb24gd2lsbCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb24gZXZlcnkgbmV3IGN5Y2xlLiBSRVZFUlNFIG1lYW5zIHRoZSBhbmltYXRpb24KKyAgICAgKiB3aWxsIHJldmVyc2UgZGlyZWN0aW9ucyBvbiBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZSA9IFJFU1RBUlQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZC4gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiB3aWxsIGJlIHBhc3NlZAorICAgICAqIHRocm91Z2ggdGhpcyBpbnRlcnBvbGF0b3IgdG8gY2FsY3VsYXRlIHRoZSBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24sIHdoaWNoIGlzIHRoZW4gdXNlZCB0bworICAgICAqIGNhbGN1bGF0ZSB0aGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBzRGVmYXVsdEludGVycG9sYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgYW5pbWF0ZWQgdmFsdWVzLiBUaGlzIGV2YWx1YXRvciBpcyBkZXRlcm1pbmVkCisgICAgICogYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgc3RhcnQvZW5kIG9iamVjdHMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLAorICAgICAqIGJ1dCB0aGUgc3lzdGVtIG9ubHkga25vd3MgYWJvdXQgdGhlIHByaW1pdGl2ZSB0eXBlcyBpbnQsIGRvdWJsZSwgYW5kIGZsb2F0LiBBbnkgb3RoZXIKKyAgICAgKiB0eXBlIHdpbGwgbmVlZCB0byBzZXQgdGhlIGV2YWx1YXRvciB0byBhIGN1c3RvbSBldmFsdWF0b3IgZm9yIHRoYXQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFR5cGVFdmFsdWF0b3IgbUV2YWx1YXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgaXMgY2FsY3VsYXRlZCBpbiBhbmltYXRlRnJhY3Rpb24oKSwKKyAgICAgKiBwcmlvciB0byBjYWxsaW5nIHRoZSBzZXR0ZXIgKGlmIHNldCkgYW5kIHNlbmRpbmcgb3V0IHRoZSBvbkFuaW1hdGlvblVwZGF0ZSgpIGNhbGxiYWNrCisgICAgICogdG8gdGhlIHVwZGF0ZSBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbUFuaW1hdGVkVmFsdWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlmcmFtZXMgKHRpbWUvdmFsdWUgcGFpcnMpIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWVTZXQgbUtleWZyYW1lU2V0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMsIGFzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlRnJvbS92YWx1ZVRvIHByb3BlcnRpZXMuCisgICAgICovCisgICAgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmVzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RBUlQgPSAxOworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmV2ZXJzZXMgZGlyZWN0aW9uIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhbHVlIHVzZWQgdXNlZCB3aXRoIHRoZSB7QGxpbmsgI3NldFJlcGVhdENvdW50KGludCl9IHByb3BlcnR5IHRvIHJlcGVhdAorICAgICAqIHRoZSBhbmltYXRpb24gaW5kZWZpbml0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklOSVRFID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFuaW1hdGlvbiB3aG9zZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYW5kCisgICAgICogYXR0cmlidXRlcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGhvbGRpbmcgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIEFuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIFR5cGVkQXJyYXkgYSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcik7CisKKyAgICAgICAgbUR1cmF0aW9uID0gKGxvbmcpIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX2R1cmF0aW9uLCAwKTsKKworICAgICAgICBtU3RhcnREZWxheSA9IChsb25nKSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9zdGFydE9mZnNldCwgMCk7CisKKyAgICAgICAgZmluYWwgaW50IHJlc0lEID0KKyAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfaW50ZXJwb2xhdG9yLCAwKTsKKyAgICAgICAgaWYgKHJlc0lEID4gMCkgeworICAgICAgICAgICAgc2V0SW50ZXJwb2xhdG9yKEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoY29udGV4dCwgcmVzSUQpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdmFsdWVUeXBlID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUeXBlLAorICAgICAgICAgICAgICAgIFZBTFVFX1RZUEVfRkxPQVQpOworCisgICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgbVZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgbVZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gZmxvYXQuY2xhc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfSU5UOgorICAgICAgICAgICAgICAgIG1WYWx1ZUZyb20gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDApOworICAgICAgICAgICAgICAgIG1WYWx1ZVRvID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMCk7CisgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IGludC5jbGFzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgbVZhbHVlRnJvbSA9IChkb3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMGYpOworICAgICAgICAgICAgICAgIG1WYWx1ZVRvID0gKGRvdWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpOworICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSBkb3VibGUuY2xhc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ09MT1I6CisgICAgICAgICAgICAgICAgbVZhbHVlRnJvbSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMCk7CisgICAgICAgICAgICAgICAgbVZhbHVlVG8gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwKTsKKyAgICAgICAgICAgICAgICBtRXZhbHVhdG9yID0gbmV3IFJHQkV2YWx1YXRvcigpOworICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSBpbnQuY2xhc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIC8vIFRPRE86IEhvdyB0byBnZXQgYW4gJ09iamVjdCcgdmFsdWU/CisgICAgICAgICAgICAgICAgbVZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgbVZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gT2JqZWN0LmNsYXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbVJlcGVhdENvdW50ID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0Q291bnQsIG1SZXBlYXRDb3VudCk7CisgICAgICAgIG1SZXBlYXRNb2RlID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0TW9kZSwgUkVTVEFSVCk7CisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdmFsdWVGcm9tLCBPYmplY3QgdmFsdWVUbywgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBtVmFsdWVGcm9tID0gdmFsdWVGcm9tOworICAgICAgICBtVmFsdWVUbz0gdmFsdWVUbzsKKyAgICAgICAgdGhpcy5tVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgdGFrZXMgYSBzZXQgb2Yge0BsaW5rIEtleWZyYW1lfSBvYmplY3RzIHRoYXQgZGVmaW5lIHRoZSB2YWx1ZXMKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbiwgYWxvbmcgd2l0aCB0aGUgdGltZXMgYXQgd2hpY2ggdGhvc2UgdmFsdWVzIHdpbGwgaG9sZCB0cnVlIGR1cmluZworICAgICAqIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIGtleWZyYW1lcyBUaGUgc2V0IG9mIGtleWZyYW1lcyB0aGF0IGRlZmluZSB0aGUgdGltZS92YWx1ZSBwYWlycyBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgS2V5ZnJhbWUuLi5rZXlmcmFtZXMpIHsKKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1LZXlmcmFtZVNldCA9IG5ldyBLZXlmcmFtZVNldChrZXlmcmFtZXMpOworICAgICAgICBtVmFsdWVUeXBlID0ga2V5ZnJhbWVzWzBdLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdmFsdWVGcm9tIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEBwYXJhbSB2YWx1ZVRvIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcHJvcGVydHkgd2lsbCBhbmltYXRlLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvcihsb25nIGR1cmF0aW9uLCBmbG9hdCB2YWx1ZUZyb20sIGZsb2F0IHZhbHVlVG8pIHsKKyAgICAgICAgdGhpcyhkdXJhdGlvbiwgdmFsdWVGcm9tLCB2YWx1ZVRvLCBmbG9hdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIDxjb2RlPmludDwvY29kZT4gdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgcHVibGljIEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIGludCB2YWx1ZUZyb20sIGludCB2YWx1ZVRvKSB7CisgICAgICAgIHRoaXMoZHVyYXRpb24sIHZhbHVlRnJvbSwgdmFsdWVUbywgaW50LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHZhbHVlRnJvbSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2hlbiB0aGUgYW5pbWF0aW9uIGJlZ2lucy4KKyAgICAgKiBAcGFyYW0gdmFsdWVUbyBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgZG91YmxlIHZhbHVlRnJvbSwgZG91YmxlIHZhbHVlVG8pIHsKKyAgICAgICAgdGhpcyhkdXJhdGlvbiwgdmFsdWVGcm9tLCB2YWx1ZVRvLCBkb3VibGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdmFsdWVGcm9tIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEBwYXJhbSB2YWx1ZVRvIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcHJvcGVydHkgd2lsbCBhbmltYXRlLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdmFsdWVGcm9tLCBPYmplY3QgdmFsdWVUbykgeworICAgICAgICB0aGlzKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8sCisgICAgICAgICAgICAgICAgKHZhbHVlRnJvbSAhPSBudWxsKSA/IHZhbHVlRnJvbS5nZXRDbGFzcygpIDogdmFsdWVUby5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZS4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBieSBQcm9wZXJ0eUFuaW1hdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgZmxvYXQgdmFsdWVUbykgeworICAgICAgICB0aGlzKGR1cmF0aW9uLCBudWxsLCB2YWx1ZVRvLCBmbG9hdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIGJ5IFByb3BlcnR5QW5pbWF0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHZhbHVlRnJvbSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2hlbiB0aGUgYW5pbWF0aW9uIGJlZ2lucy4KKyAgICAgKiBAcGFyYW0gdmFsdWVUbyBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZS4KKyAgICAgKi8KKyAgICBBbmltYXRvcihsb25nIGR1cmF0aW9uLCBpbnQgdmFsdWVUbykgeworICAgICAgICB0aGlzKGR1cmF0aW9uLCBudWxsLCB2YWx1ZVRvLCBpbnQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBzaW5nbGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZS4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBieSBQcm9wZXJ0eUFuaW1hdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgZG91YmxlIHZhbHVlVG8pIHsKKyAgICAgICAgdGhpcyhkdXJhdGlvbiwgbnVsbCwgdmFsdWVUbywgZG91YmxlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGVuc3VyZQorICAgICAqICB0aGF0IGludGVybmFsIG1lY2hhbmlzbXMgZm9yIHRoZSBhbmltYXRpb24gYXJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKG1FdmFsdWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IChtVmFsdWVUeXBlID09IGludC5jbGFzcykgPyBzSW50RXZhbHVhdG9yIDoKKyAgICAgICAgICAgICAgICAobVZhbHVlVHlwZSA9PSBkb3VibGUuY2xhc3MpID8gc0RvdWJsZUV2YWx1YXRvciA6IHNGbG9hdEV2YWx1YXRvcjsKKyAgICAgICAgfQorICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9IGZhbHNlOworICAgICAgICBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIHBvaW50IGluIHRpbWUuIFRoaXMgdGltZSBzaG91bGQKKyAgICAgKiBiZSBiZXR3ZWVuIDAgYW5kIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLCBpbmNsdWRpbmcgYW55IHJlcGV0aXRpb24uIElmCisgICAgICogdGhlIGFuaW1hdGlvbiBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHRoZW4gaXQgd2lsbCBub3QgYWR2YW5jZSBmb3J3YXJkIGFmdGVyIGl0IGlzCisgICAgICogc2V0IHRvIHRoaXMgdGltZTsgaXQgd2lsbCBzaW1wbHkgc2V0IHRoZSB0aW1lIHRvIHRoaXMgdmFsdWUgYW5kIHBlcmZvcm0gYW55IGFwcHJvcHJpYXRlCisgICAgICogYWN0aW9ucyBiYXNlZCBvbiB0aGF0IHRpbWUuIElmIHRoZSBhbmltYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLCB0aGVuIHNlZWsoKSB3aWxsCisgICAgICogc2V0IHRoZSBjdXJyZW50IHBsYXlpbmcgdGltZSB0byB0aGlzIHZhbHVlIGFuZCBjb250aW51ZSBwbGF5aW5nIGZyb20gdGhhdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbGF5VGltZSBUaGUgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byB3aGljaCB0aGUgYW5pbWF0aW9uIGlzIGFkdmFuY2VkIG9yIHJld291bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBsYXlUaW1lKGxvbmcgcGxheVRpbWUpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgbVNlZWtUaW1lID0gcGxheVRpbWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU0VFS0VEOworICAgICAgICB9CisgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIHBsYXlUaW1lOworICAgICAgICBhbmltYXRpb25GcmFtZShjdXJyZW50VGltZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIHRpbWUsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50CisgICAgICogdGltZSBtaW51cyB0aGUgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gc3RhcnRlZC4gQW4gYW5pbWF0aW9uIHRoYXQgaXMgbm90IHlldCBzdGFydGVkIHdpbGwKKyAgICAgKiByZXR1cm4gYSB2YWx1ZSBvZiB6ZXJvLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aW1lIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBsYXlUaW1lKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY3VzdG9tLCBzdGF0aWMgaGFuZGxlciBoYW5kbGVzIHRoZSB0aW1pbmcgcHVsc2UgdGhhdCBpcyBzaGFyZWQgYnkKKyAgICAgKiBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoaXMgYXBwcm9hY2ggZW5zdXJlcyB0aGF0IHRoZSBzZXR0aW5nIG9mIGFuaW1hdGlvbgorICAgICAqIHZhbHVlcyB3aWxsIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkIGFuZCB0aGF0IGFsbCBhbmltYXRpb25zIHdpbGwgc2hhcmUKKyAgICAgKiB0aGUgc2FtZSB0aW1lcyBmb3IgY2FsY3VsYXRpbmcgdGhlaXIgdmFsdWVzLCB3aGljaCBtYWtlcyBzeW5jaHJvbml6aW5nCisgICAgICogYW5pbWF0aW9ucyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFuaW1hdGlvbkhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZXJlIGFyZSBvbmx5IHR3byBtZXNzYWdlcyB0aGF0IHdlIGNhcmUgYWJvdXQ6IEFOSU1BVElPTl9TVEFSVCBhbmQKKyAgICAgICAgICogQU5JTUFUSU9OX0ZSQU1FLiBUaGUgU1RBUlQgbWVzc2FnZSBpcyBzZW50IHdoZW4gYW4gYW5pbWF0aW9uJ3Mgc3RhcnQoKQorICAgICAgICAgKiBtZXRob2QgaXMgY2FsbGVkLiBJdCBjYW5ub3Qgc3RhcnQgc3luY2hyb25vdXNseSB3aGVuIHN0YXJ0KCkgaXMgY2FsbGVkCisgICAgICAgICAqIGJlY2F1c2UgdGhlIGNhbGwgbWF5IGJlIG9uIHRoZSB3cm9uZyB0aHJlYWQsIGFuZCBpdCB3b3VsZCBhbHNvIG5vdCBiZQorICAgICAgICAgKiBzeW5jaHJvbml6ZWQgd2l0aCBvdGhlciBhbmltYXRpb25zIGJlY2F1c2UgaXQgd291bGQgbm90IHN0YXJ0IG9uIGEgY29tbW9uCisgICAgICAgICAqIHRpbWluZyBwdWxzZS4gU28gZWFjaCBhbmltYXRpb24gc2VuZHMgYSBTVEFSVCBtZXNzYWdlIHRvIHRoZSBoYW5kbGVyLCB3aGljaAorICAgICAgICAgKiBjYXVzZXMgdGhlIGhhbmRsZXIgdG8gcGxhY2UgdGhlIGFuaW1hdGlvbiBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUgYW5kCisgICAgICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcgZnJhbWVzIGZvciB0aGF0IGFuaW1hdGlvbi4KKyAgICAgICAgICogVGhlIEZSQU1FIG1lc3NhZ2UgaXMgdGhlIG9uZSB0aGF0IGlzIHNlbnQgb3ZlciBhbmQgb3ZlciB3aGlsZSB0aGVyZSBhcmUgYW55CisgICAgICAgICAqIGFjdGl2ZSBhbmltYXRpb25zIHRvIHByb2Nlc3MuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgYm9vbGVhbiBjYWxsQWdhaW4gPSB0cnVlOworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhdm9pZCBzZW5kaW5nIGZyYW1lIG1lc3NhZ2Ugd2hlbiBzdGFydGluZyBpZiB3ZQorICAgICAgICAgICAgICAgIC8vIHdlcmUgYWxyZWFkeSBydW5uaW5nPworICAgICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBpZiAoc0FuaW1hdGlvbnMuc2l6ZSgpID4gMCB8fCBzRGVsYXllZEFuaW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxBZ2FpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmdBbmltcyBob2xkcyBhbnkgYW5pbWF0aW9ucyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gY2xlYXIgc1BlbmRpbmdBbmltYXRpb25zLCBidXQgc3RhcnRpbmcgYW5pbWF0aW9uIG1heQorICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZSBtb3JlIHRvIGJlIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGxpc3QgKGZvciBleGFtcGxlLCBpZiBvbmUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHRyaWdnZXJzIGFub3RoZXIgc3RhcnRpbmcpLiBTbyB3ZSBsb29wIHVudGlsIHNQZW5kaW5nQW5pbWF0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNQZW5kaW5nQW5pbWF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3I+IHBlbmRpbmdDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvcj4pIHNQZW5kaW5nQW5pbWF0aW9ucy5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBwZW5kaW5nQ29weS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gcGVuZGluZ0NvcHkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gaGFzIGEgc3RhcnREZWxheSwgcGxhY2UgaXQgb24gdGhlIGRlbGF5ZWQgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLm1TdGFydERlbGF5ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEZWxheWVkQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gcHJvY2VzcyBmaXJzdCBmcmFtZSBvZiBuZXcgYW5pbWF0aW9ucworICAgICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGltZSBob2xkcyB0aGUgY29tbW9uIHRpbWUgZm9yIGFsbCBhbmltYXRpb25zIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhpcyBmcmFtZQorICAgICAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgcHJvY2VzcyBhbmltYXRpb25zIGN1cnJlbnRseSBzaXR0aW5nIG9uIHRoZSBkZWxheWVkIHF1ZXVlLCBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSB0byB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgaWYgdGhleSBhcmUgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bURlbGF5ZWRBbmltcyA9IHNEZWxheWVkQW5pbXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURlbGF5ZWRBbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gc0RlbGF5ZWRBbmltcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5kZWxheWVkQW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1JlYWR5QW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBudW1SZWFkeUFuaW1zID0gc1JlYWR5QW5pbXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtUmVhZHlBbmltcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZHlBbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IHNSZWFkeUFuaW1zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RlbGF5ZWRBbmltcy5yZW1vdmUoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzUmVhZHlBbmltcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHByb2Nlc3MgYWxsIGFjdGl2ZSBhbmltYXRpb25zLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gYW5pbWF0aW9uRnJhbWUoKQorICAgICAgICAgICAgICAgICAgICAvLyB0ZWxscyB0aGUgaGFuZGxlciB3aGV0aGVyIGl0IHNob3VsZCBub3cgYmUgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUFuaW1zID0gc0FuaW1hdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBzQW5pbWF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5hbmltYXRpb25GcmFtZShjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzRW5kaW5nQW5pbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW5kaW5nQW5pbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuZ2V0KGkpLmVuZEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIG9yIGRlbGF5ZWQgYW5pbWF0aW9ucywgY2FsbCB0aGUgaGFuZGxlciBhZ2FpbgorICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGUgZnJhbWVEZWxheQorICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEFnYWluICYmICghc0FuaW1hdGlvbnMuaXNFbXB0eSgpIHx8ICFzRGVsYXllZEFuaW1zLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKEFOSU1BVElPTl9GUkFNRSwgc0ZyYW1lRGVsYXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgcnVubmluZyB0aGUgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnREZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpIHsKKyAgICAgICAgdGhpcy5tU3RhcnREZWxheSA9IHN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gZWFjaCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGlzIGEKKyAgICAgKiByZXF1ZXN0ZWQgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhdHRlbXB0IHRvIGhvbm9yLCBidXQgdGhlIGFjdHVhbCBkZWxheSBiZXR3ZWVuCisgICAgICogZnJhbWVzIG1heSBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiBzeXN0ZW0gbG9hZCBhbmQgY2FwYWJpbGl0aWVzLiBUaGlzIGlzIGEgc3RhdGljCisgICAgICogZnVuY3Rpb24gYmVjYXVzZSB0aGUgc2FtZSBkZWxheSB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgYXJlIGFsbAorICAgICAqIHJ1biBvZmYgb2YgYSBzaW5nbGUgdGltaW5nIGxvb3AuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgdGltZSBiZXR3ZWVuIGZyYW1lcywgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldEZyYW1lRGVsYXkoKSB7CisgICAgICAgIHJldHVybiBzRnJhbWVEZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXQgb2Yga2V5ZnJhbWVzIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBLZXlmcmFtZVNldCBUaGUgc2V0IG9mIGtleWZyYW1lcyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgS2V5ZnJhbWVTZXQgZ2V0S2V5ZnJhbWVzKCkgeworICAgICAgICByZXR1cm4gbUtleWZyYW1lU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIHRoYXQgdGhpcyBhbmltYXRpb24gd2lsbCBzdGFydCBmcm9tLgorICAgICAqCisgICAgICogQHJldHVybiBPYmplY3QgVGhlIHN0YXJ0aW5nIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVGcm9tKCkgeworICAgICAgICBpZiAobUtleWZyYW1lU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5nZXQoMCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVZhbHVlRnJvbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSB0aGF0IHRoaXMgYW5pbWF0aW9uIHdpbGwgc3RhcnQgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUZyb20oT2JqZWN0IHZhbHVlRnJvbSkgeworICAgICAgICBpZiAobUtleWZyYW1lU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIGtmID0gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICAgICAga2Yuc2V0VmFsdWUodmFsdWVGcm9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1WYWx1ZUZyb20gPSB2YWx1ZUZyb207CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSB0aGF0IHRoaXMgYW5pbWF0aW9uIHdpbGwgYW5pbWF0ZSB0by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT2JqZWN0IFRoZSBlbmRpbmcgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZVRvKCkgeworICAgICAgICBpZiAobUtleWZyYW1lU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KG51bUtleWZyYW1lcyAtIDEpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1WYWx1ZVRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIHRoYXQgdGhpcyBhbmltYXRpb24gd2lsbCBhbmltYXRlIHRvLgorICAgICAqCisgICAgICogQHJldHVybiBPYmplY3QgVGhlIGVuZGluZyB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVRvKE9iamVjdCB2YWx1ZVRvKSB7CisgICAgICAgIGlmIChtS2V5ZnJhbWVTZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bUtleWZyYW1lcyA9IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLnNpemUoKTsKKyAgICAgICAgICAgIEtleWZyYW1lIGtmID0gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KG51bUtleWZyYW1lcyAtIDEpOworICAgICAgICAgICAga2Yuc2V0VmFsdWUodmFsdWVUbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVmFsdWVUbyA9IHZhbHVlVG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBlYWNoIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgYQorICAgICAqIHJlcXVlc3RlZCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGF0dGVtcHQgdG8gaG9ub3IsIGJ1dCB0aGUgYWN0dWFsIGRlbGF5IGJldHdlZW4KKyAgICAgKiBmcmFtZXMgbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHN5c3RlbSBsb2FkIGFuZCBjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiBmdW5jdGlvbiBiZWNhdXNlIHRoZSBzYW1lIGRlbGF5IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgYW5pbWF0aW9ucywgc2luY2UgdGhleSBhcmUgYWxsCisgICAgICogcnVuIG9mZiBvZiBhIHNpbmdsZSB0aW1pbmcgbG9vcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZURlbGF5IHRoZSByZXF1ZXN0ZWQgdGltZSBiZXR3ZWVuIGZyYW1lcywgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZyYW1lRGVsYXkobG9uZyBmcmFtZURlbGF5KSB7CisgICAgICAgIHNGcmFtZURlbGF5ID0gZnJhbWVEZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBmb3IgdGhlIHByb3BlcnR5CisgICAgICogYmVpbmcgYW5pbWF0ZWQuIFRoaXMgdmFsdWUgaXMgb25seSBzZW5zaWJsZSB3aGlsZSB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcuIFRoZSBtYWluCisgICAgICogcHVycG9zZSBmb3IgdGhpcyByZWFkLW9ubHkgcHJvcGVydHkgaXMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20gdGhlIDxjb2RlPkFuaW1hdG9yPC9jb2RlPgorICAgICAqIGR1cmluZyBhIGNhbGwgdG8ge0BsaW5rIEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIjb25BbmltYXRpb25VcGRhdGUoQW5pbWF0b3IpfSwgd2hpY2gKKyAgICAgKiBpcyBjYWxsZWQgZHVyaW5nIGVhY2ggYW5pbWF0aW9uIGZyYW1lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW5pbWF0ZWRWYWx1ZSBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+QW5pbWF0b3I8L2NvZGU+IGZvcgorICAgICAqIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QW5pbWF0ZWRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmltYXRlZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQuIElmIHRoZSByZXBlYXQKKyAgICAgKiBjb3VudCBpcyAwLCB0aGUgYW5pbWF0aW9uIGlzIG5ldmVyIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgb3Ige0BsaW5rICNJTkZJTklURX0sIHRoZSByZXBlYXQgbW9kZSB3aWxsIGJlIHRha2VuCisgICAgICogaW50byBhY2NvdW50LiBUaGUgcmVwZWF0IGNvdW50IGlzIDAgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0Q291bnQoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRDb3VudCA9IHZhbHVlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBpcyAwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdCwgb3Ige0BsaW5rICNJTkZJTklURX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVJlcGVhdENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hhdCB0aGlzIGFuaW1hdGlvbiBzaG91bGQgZG8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuIFRoaXMKKyAgICAgKiBzZXR0aW5nIGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSByZXBlYXQgY291bnQgaXMgZWl0aGVyIGdyZWF0ZXIgdGhhbgorICAgICAqIDAgb3Ige0BsaW5rICNJTkZJTklURX0uIERlZmF1bHRzIHRvIHtAbGluayAjUkVTVEFSVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0BsaW5rICNSRVNUQVJUfSBvciB7QGxpbmsgI1JFVkVSU0V9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgdmFsdWUpIHsKKyAgICAgICAgbVJlcGVhdE1vZGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLgorICAgICAqCisgICAgICogQHJldHVybiBlaXRoZXIgb25lIG9mIHtAbGluayAjUkVWRVJTRX0gb3Ige0BsaW5rICNSRVNUQVJUfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IHVwZGF0ZSBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZgorICAgICAqIGFuIGFuaW1hdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFsbCBsaXN0ZW5lcnMgZm9yIGV2ZXJ5IGZyYW1lIG9mIHRoZSBhbmltYXRpb24sCisgICAgICogYWZ0ZXIgdGhlIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbiBoYXZlIGJlZW4gY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVXBkYXRlTGlzdGVuZXIoQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgc2V0IGxpc3RlbmluZyB0byBmcmFtZSB1cGRhdGVzIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiB1cGRhdGUgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZUxpc3RlbmVyKEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdXNlZCBpbiBjYWxjdWxhdGluZyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGlzIGFuaW1hdGlvbi4gVGhlCisgICAgICogaW50ZXJwb2xhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uIHJ1bnMgd2l0aCBsaW5lYXIgb3Igbm9uLWxpbmVhciBtb3Rpb24sCisgICAgICogc3VjaCBhcyBhY2NlbGVyYXRpb24gYW5kIGRlY2VsZXJhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcn0KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgYnkgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW50ZXJwb2xhdG9yID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdG8gYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBhbmltYXRlZCB2YWx1ZXMgb2YgdGhpcyBhbmltYXRpb24uCisgICAgICogVGhlIHN5c3RlbSB3aWxsIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgZmxvYXQsIGludCwgb3IgZG91YmxlIGV2YWx1YXRvciBiYXNlZCBvbiB0aGUgdHlwZQorICAgICAqIG9mIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+IGFuZCA8Y29kZT5lbmRWYWx1ZTwvY29kZT4gaW4gdGhlIGNvbnN0cnVjdG9yLiBCdXQgaWYgdGhlc2UgdmFsdWVzCisgICAgICogYXJlIG5vdCBvbmUgb2YgdGhlc2UgcHJpbWl0aXZlIHR5cGVzLCBvciBpZiBkaWZmZXJlbnQgZXZhbHVhdGlvbiBpcyBkZXNpcmVkIChzdWNoIGFzIGlzCisgICAgICogbmVjZXNzYXJ5IHdpdGggaW50IHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvcnMpLCBhIGN1c3RvbSBldmFsdWF0b3IgbmVlZHMgdG8gYmUgYXNzaWduZWQuCisgICAgICogRm9yIGV4YW1wbGUsIHdoZW4gcnVubmluZyBhbiBhbmltYXRpb24gb24gY29sb3IgdmFsdWVzLCB0aGUge0BsaW5rIFJHQkV2YWx1YXRvcn0KKyAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBnZXQgY29ycmVjdCBSR0IgY29sb3IgaW50ZXJwb2xhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZXZhbHVhdG9yIHRvIGJlIHVzZWQgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuYWRkKHRoaXMpOworICAgICAgICBpZiAoc0FuaW1hdGlvbkhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIgPSBuZXcgQW5pbWF0aW9uSGFuZGxlcigpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGRvZXMgdGhpcyBwdXQgdG9vIG1hbnkgbWVzc2FnZXMgb24gdGhlIHF1ZXVlIGlmIHRoZSBoYW5kbGVyCisgICAgICAgIC8vIGlzIGFscmVhZHkgcnVubmluZz8KKyAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShBTklNQVRJT05fU1RBUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBDQU5DRUxFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IENBTkNFTEVEOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgLy8gSnVzdCBzZXQgdGhlIEVOREVEIGZsYWcgLSB0aGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGVuZCB0aGUgbmV4dCB0aW1lIGEgZnJhbWUKKyAgICAgICAgLy8gaXMgcHJvY2Vzc2VkLgorICAgICAgICBtUGxheWluZ1N0YXRlID0gRU5ERUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gZW5kIGFuIGFuaW1hdGlvbiBieSByZW1vdmluZyBpdCBmcm9tIHRoZSBhbmltYXRpb25zIGxpc3QuIE11c3QgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kQW5pbWF0aW9uKCkgeworICAgICAgICBzQW5pbWF0aW9ucy5yZW1vdmUodGhpcyk7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBzdGFydCBhbiBhbmltYXRpb24gYnkgYWRkaW5nIGl0IHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIHNBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgdG8gcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgb24gYW4gYW5pbWF0aW9uIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogc2xlZXBpbmcgdGhyb3VnaCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gcGhhc2UuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgaXQKKyAgICAgKiBzaG91bGQgYmUgd29rZW4gdXAgYW5kIHB1dCBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUsIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIGhhcyBleGNlZWRlZCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gYW5kIHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBhY3RpdmUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsYXllZEFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZERlbGF5KSB7CisgICAgICAgICAgICBtU3RhcnRlZERlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EZWxheVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyBkZWx0YVRpbWUgPSBjdXJyZW50VGltZSAtIG1EZWxheVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgPiBtU3RhcnREZWxheSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0RGVsYXkgZW5kZWQgLSBzdGFydCB0aGUgYW5pbSBhbmQgcmVjb3JkIHRoZQorICAgICAgICAgICAgICAgIC8vIG1TdGFydFRpbWUgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIChkZWx0YVRpbWUgLSBtU3RhcnREZWxheSk7CisgICAgICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFJVTk5JTkc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgc2luZ2xlIGFuaW1hdGlvbiBmcmFtZSBmb3IgYSBnaXZlbiBhbmltYXRpb24uIFRoZQorICAgICAqIGN1cnJlbnRUaW1lIHBhcmFtZXRlciBpcyB0aGUgdGltaW5nIHB1bHNlIHNlbnQgYnkgdGhlIGhhbmRsZXIsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICAgICAqIGVsYXBzZWQgZHVyYXRpb24sIGFuZCB0aGVyZWZvcmUKKyAgICAgKiB0aGUgZWxhcHNlZCBmcmFjdGlvbiwgb2YgdGhlIGFuaW1hdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICogc2hvdWxkIGJlIGVuZGVkICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgYW5pbWF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyB0aGUgcmVwZWF0Q291bnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFRoZSBjdXJyZW50IHRpbWUsIGFzIHRyYWNrZWQgYnkgdGhlIHN0YXRpYyB0aW1pbmcgaGFuZGxlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbnMgZHVlIHRvCisgICAgICogPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGhhcyBiZWVuIGV4Y2VlZGVkIGFuZCB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSBlbmRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYW5pbWF0aW9uRnJhbWUobG9uZyBjdXJyZW50VGltZSkgeworCisgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IFNUT1BQRUQpIHsKKyAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBSVU5OSU5HOworICAgICAgICAgICAgaWYgKG1TZWVrVGltZSA8IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIG1TZWVrVGltZTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSdyZSBwbGF5aW5nLCByZXNldCB0aGUgc2VlayB0aW1lCisgICAgICAgICAgICAgICAgbVNlZWtUaW1lID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtUGxheWluZ1N0YXRlKSB7CisgICAgICAgIGNhc2UgUlVOTklORzoKKyAgICAgICAgY2FzZSBTRUVLRUQ6CisgICAgICAgICAgICBmbG9hdCBmcmFjdGlvbiA9IChmbG9hdCkoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIG1EdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbiA+PSAxZikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEl0ZXJhdGlvbiA8IG1SZXBlYXRDb3VudCB8fCBtUmVwZWF0Q291bnQgPT0gSU5GSU5JVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZSB0byByZXBlYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25SZXBlYXQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyttQ3VycmVudEl0ZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFVkVSU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gbVBsYXlpbmdCYWNrd2FyZHMgPyBmYWxzZSA6IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9lc24ndCBhY2NvdW50IGZvciBmcmFjdGlvbiBnb2luZyBXYXl5eXl5IG92ZXIgMSwgbGlrZSAyKworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGZyYWN0aW9uIC0gMWY7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IE1hdGgubWluKGZyYWN0aW9uLCAxLjBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBsYXlpbmdCYWNrd2FyZHMpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDFmIC0gZnJhY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU5ERUQ6CisgICAgICAgICAgICAvLyBUaGUgZmluYWwgdmFsdWUgc2V0IG9uIHRoZSB0YXJnZXQgdmFyaWVzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAvLyB3YXMgc3VwcG9zZWQgdG8gcmVwZWF0IGFuIG9kZCBudW1iZXIgb2YgdGltZXMKKyAgICAgICAgICAgIGlmIChtUmVwZWF0Q291bnQgPiAwICYmIChtUmVwZWF0Q291bnQgJiAweDAxKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKDBmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBzZXQgZG9uZSBmbGFnCisgICAgICAgIGNhc2UgQ0FOQ0VMRUQ6CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgZnJhY3Rpb24gPSBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICBpZiAobUtleWZyYW1lU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbmltYXRlZFZhbHVlID0gbUtleWZyYW1lU2V0LmdldFZhbHVlKGZyYWN0aW9uLCBtRXZhbHVhdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BbmltYXRlZFZhbHVlID0gbUV2YWx1YXRvci5ldmFsdWF0ZShmcmFjdGlvbiwgbVZhbHVlRnJvbSwgbVZhbHVlVG8pOworICAgICAgICB9CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmdldChpKS5vbkFuaW1hdGlvblVwZGF0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYWRkIHRoZW1zZWx2ZXMgYXMgdXBkYXRlIGxpc3RlbmVycworICAgICAqIHRvIGFuIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBpbnN0YW5jZSB0byByZWNlaXZlIGNhbGxiYWNrcyBvbiBldmVyeSBhbmltYXRpb24KKyAgICAgKiBmcmFtZSwgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUncyB2YWx1ZXMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgZm9yIHRoYXQKKyAgICAgKiA8Y29kZT5BbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgb2NjdXJyZW5jZSBvZiBhbm90aGVyIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIHJlcGVhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvciBhbmltYXRpb24pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmUzZjIyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5Eb3VibGU8L2NvZGU+CisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkRvdWJsZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGRvdWJsZSBzdGFydERvdWJsZSA9IChEb3VibGUpIHN0YXJ0VmFsdWU7CisgICAgICAgIHJldHVybiBzdGFydERvdWJsZSArIGZyYWN0aW9uICogKChEb3VibGUpIGVuZFZhbHVlIC0gc3RhcnREb3VibGUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTZmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGbG9hdEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5GbG9hdDwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IgPGNvZGU+RmxvYXQ8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBmbG9hdCBzdGFydEZsb2F0ID0gKEZsb2F0KSBzdGFydFZhbHVlOworICAgICAgICByZXR1cm4gc3RhcnRGbG9hdCArIGZyYWN0aW9uICogKChGbG9hdCkgZW5kVmFsdWUgLSBzdGFydEZsb2F0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjkxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIEludEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBpbnQgc3RhcnRJbnQgPSAoSW50ZWdlcikgc3RhcnRWYWx1ZTsKKyAgICAgICAgcmV0dXJuIChpbnQpIChzdGFydEludCArIGZyYWN0aW9uICogKChJbnRlZ2VyKSBlbmRWYWx1ZSAtIHN0YXJ0SW50KSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4MDBiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSB0aW1lL3ZhbHVlIHBhaXIgZm9yIGFuIGFuaW1hdGlvbi4gVGhlIEtleWZyYW1lIGNsYXNzIGlzIHVzZWQKKyAqIGJ5IHtAbGluayBBbmltYXRvcn0gdG8gZGVmaW5lIHRoZSB2YWx1ZXMgdGhhdCB0aGUgYW5pbWF0aW9uIHRhcmdldCB3aWxsIGhhdmUgb3ZlciB0aGUgY291cnNlCisgKiBvZiB0aGUgYW5pbWF0aW9uLiBBcyB0aGUgdGltZSBwcm9jZWVkcyBmcm9tIG9uZSBrZXlmcmFtZSB0byB0aGUgb3RoZXIsIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIGJldHdlZW4gdGhlIHZhbHVlIGF0IHRoZSBwcmV2aW91cyBrZXlmcmFtZSBhbmQgdGhlIHZhbHVlIGF0IHRoZQorICogbmV4dCBrZXlmcmFtZS4gRWFjaCBrZXlmcmFtZSBhbHNvIGhvbGRzIGFuIG9wdGlvbiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3J9CisgKiBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHRpbWUgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZSBpbnRlcnZhbHVlIHByZWNlZGluZyB0aGUga2V5ZnJhbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlmcmFtZSB7CisgICAgLyoqCisgICAgICogVGhlIHRpbWUgYXQgd2hpY2ggbVZhbHVlIHdpbGwgaG9sZCB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUZyYWN0aW9uOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIHRpbWUgbUZyYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IG1WYWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpbiB0aGlzIEtleWZyYW1lLiBUaGlzIHR5cGUgaXMgZGV0ZXJtaW5lZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSwKKyAgICAgKiBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIG9wdGlvbmFsIHRpbWUgaW50ZXJwb2xhdG9yIGZvciB0aGUgaW50ZXJ2YWwgcHJlY2VkaW5nIHRoaXMga2V5ZnJhbWUuIEEgbnVsbCBpbnRlcnBvbGF0b3IKKyAgICAgKiAodGhlIGRlZmF1bHQpIHJlc3VsdHMgaW4gbGluZWFyIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBjYWxsZWQgZnJvbSB0aGUgcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIHRoZSBhZGRpdGlvbmFsCisgICAgICogPGNvZGU+dmFsdWVUeXBlPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QuIFRoaXMgaXMgdXNlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldFZhbHVlKCl9IGZ1bmN0aW9ubSwgd2hpY2ggaXMgcXVlcmllZCBieSB7QGxpbmsgQW5pbWF0b3J9IHRvIGRldGVybWluZQorICAgICAqIHRoZSB0eXBlIG9mIHtAbGluayBUeXBlRXZhbHVhdG9yfSB0byB1c2UgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHZhbHVlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgICAgICBtVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgT2JqZWN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGludGVnZXIgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIGludCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgaW50LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGZsb2F0IHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBmbG9hdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgZmxvYXQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZG91YmxlIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGRvdWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uCisgICAgICogZHVyYXRpb24uIFRoaXMgc2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGcmFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbihmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtRnJhY3Rpb24gPSBmcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzCisgICAgICogdGhhdCB0aGVyZSBpcyBubyBpbnRlcnBvbGF0aW9uLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIGtleWZyYW1lLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgQW5pbWF0b3IgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mCisgICAgICoge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHZhbHVlcyBiZXR3ZWVuIGtleWZyYW1lcy4gVGhlIHR5cGUgaXMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdHlwZSBvZiBLZXlmcmFtZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQ0YjljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIGNvbGxlY3Rpb24gb2YgS2V5ZnJhbWUgb2JqZWN0cyBhbmQgaXMgY2FsbGVkIGJ5IEFuaW1hdG9yIHRvIGNhbGN1bGF0ZQorICogdmFsdWVzIGJldHdlZW4gdGhvc2Uga2V5ZnJhbWVzIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlIGNsYXNzIGludGVybmFsIHRvIHRoZSBhbmltYXRpb24KKyAqIHBhY2thZ2UgYmVjYXVzZSBpdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgaG93IEtleWZyYW1lcyBhcmUgc3RvcmVkIGFuZCB1c2VkLgorICovCitjbGFzcyBLZXlmcmFtZVNldCB7CisKKyAgICBwcml2YXRlIGludCBtTnVtS2V5ZnJhbWVzOworCisgICAgQXJyYXlMaXN0PEtleWZyYW1lPiBtS2V5ZnJhbWVzOworCisgICAgcHVibGljIEtleWZyYW1lU2V0KEtleWZyYW1lLi4uIGtleWZyYW1lcykgeworICAgICAgICBtS2V5ZnJhbWVzID0gbmV3IEFycmF5TGlzdDxLZXlmcmFtZT4oKTsKKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZXlmcmFtZSA6IGtleWZyYW1lcykgeworICAgICAgICAgICAgbUtleWZyYW1lcy5hZGQoa2V5ZnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1OdW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRlZCB2YWx1ZSwgZ2l2ZW4gdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW50ZXJwb2xhdGVkIGJ5IHRoZQorICAgICAqIGFuaW1hdGlvbidzIGludGVycG9sYXRvcikgYW5kIHRoZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgaW4tYmV0d2VlbiB2YWx1ZXMuIFRoaXMKKyAgICAgKiBmdW5jdGlvbiBtYXBzIHRoZSBpbnB1dCBmcmFjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUga2V5ZnJhbWUgaW50ZXJ2YWwgYW5kIGEgZnJhY3Rpb24KKyAgICAgKiBiZXR3ZWVuIHRoZW0gYW5kIHJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZS4gTm90ZSB0aGF0IHRoZSBpbnB1dCBmcmFjdGlvbiBtYXkgZmFsbAorICAgICAqIG91dHNpZGUgdGhlIFswLTFdIGJvdW5kcywgaWYgdGhlIGFuaW1hdGlvbidzIGludGVycG9sYXRvciBtYWRlIHRoYXQgaGFwcGVuIChlLmcuLCBhCisgICAgICogc3ByaW5nIGludGVycG9sYXRpb24gdGhhdCBtaWdodCBzZW5kIHRoZSBmcmFjdGlvbiBwYXN0IDEuMCkuIFdlIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBieQorICAgICAqIGp1c3QgdXNpbmcgdGhlIHR3byBrZXlmcmFtZXMgYXQgdGhlIGFwcHJvcHJpYXRlIGVuZCB3aGVuIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRob3NlIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uCisgICAgICogQHBhcmFtIGV2YWx1YXRvciBUaGUgdHlwZSBldmFsdWF0b3IgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludGVycG9sYXRlZCB2YWx1ZXMuCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShmbG9hdCBmcmFjdGlvbiwgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogc3BlY2lhbC1jYXNlIDIta2V5ZnJhbWUgY29tbW9uIGNhc2UKKworICAgICAgICBpZiAoZnJhY3Rpb24gPD0gMGYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAyKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uIDwgbmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldktleWZyYW1lID0gbmV4dEtleWZyYW1lOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICByZXR1cm4gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpLmdldFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eUFuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjOTc5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eUFuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICogVGhpcyBzdWJjbGFzcyBvZiB7QGxpbmsgQW5pbWF0b3J9IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGFuaW1hdGluZyBwcm9wZXJ0aWVzIG9uIHRhcmdldCBvYmplY3RzLgorICogVGhlIGNvbnN0cnVjdG9ycyBvZiB0aGlzIGNsYXNzIHRha2UgcGFyYW1ldGVycyB0byBkZWZpbmUgdGhlIHRhcmdldCBvYmplY3QgdGhhdCB3aWxsIGJlIGFuaW1hdGVkCisgKiBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEFwcHJvcHJpYXRlIHNldC9nZXQgZnVuY3Rpb25zCisgKiBhcmUgdGhlbiBkZXRlcm1pbmVkIGludGVybmFsbHkgYW5kIHRoZSBhbmltYXRpb24gd2lsbCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgdG8KKyAqIGFuaW1hdGUgdGhlIHByb3BlcnR5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlBbmltYXRvciBleHRlbmRzIEFuaW1hdG9yIHsKKworICAgIC8vIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBleGlzdHMsIHNldCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIE9iamVjdCBtVGFyZ2V0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKKworICAgIHByaXZhdGUgTWV0aG9kIG1HZXR0ZXIgPSBudWxsOworCisgICAgLy8gVGhlIHByb3BlcnR5IHNldHRlciB0aGF0IGlzIGFzc2lnbmVkIGludGVybmFsbHksIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eU5hbWUgcGFzc2VkIGludG8KKyAgICAvLyB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIE1ldGhvZCBtU2V0dGVyOworCisgICAgLy8gVGhlc2UgbWFwcyBob2xkIGFsbCBwcm9wZXJ0eSBlbnRyaWVzIGZvciBhIHBhcnRpY3VsYXIgY2xhc3MuIFRoaXMgbWFwCisgICAgLy8gaXMgdXNlZCB0byBzcGVlZCB1cCBwcm9wZXJ0eS9zZXR0ZXIvZ2V0dGVyIGxvb2t1cHMgZm9yIGEgZ2l2ZW4gY2xhc3MvcHJvcGVydHkKKyAgICAvLyBjb21iaW5hdGlvbi4gTm8gbmVlZCB0byB1c2UgcmVmbGVjdGlvbiBvbiB0aGUgY29tYmluYXRpb24gbW9yZSB0aGFuIG9uY2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxPYmplY3QsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBzU2V0dGVyUHJvcGVydHlNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8T2JqZWN0LCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPE9iamVjdCwgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+IHNHZXR0ZXJQcm9wZXJ0eU1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxPYmplY3QsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PigpOworCisgICAgLy8gVGhpcyBsb2NrIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGUgcHJvcGVydHkgbWFwcworICAgIC8vIGF0IGEgdGltZS4KKyAgICBwcml2YXRlIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcHJvcGVydHlNYXBMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIC8vIFVzZWQgdG8gcGFzcyBzaW5nbGUgdmFsdWUgdG8gdmFyYXJncyBwYXJhbWV0ZXIgaW4gc2V0dGVyIGludm9jYXRpb24KKyAgICBwcml2YXRlIE9iamVjdFtdIG1UbXBWYWx1ZUFycmF5ID0gbmV3IE9iamVjdFsxXTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMgY2FsY3VsYXRlZAorICAgICAqIGR1cmluZyB0aGUgYW5pbWF0aW9uLiBTZXR0aW5nIHRoZSBzZXR0ZXIgbWV0aG9kIGlzIGFuIGFsdGVybmF0aXZlIHRvIHN1cHBseWluZyBhCisgICAgICoge0BsaW5rICNzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nKSBwcm9wZXJ0eU5hbWV9IGZyb20gd2hpY2ggdGhlIG1ldGhvZCBpcyBkZXJpdmVkLiBUaGlzCisgICAgICogYXBwcm9hY2ggaXMgbW9yZSBkaXJlY3QsIGFuZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGEgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdGhhdCBkb2VzCisgICAgICogbm90IGNvcnJlc3BvbmQgdG8gdGhlIGNvbnZlbnRpb24gb2YgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPi4gRm9yIGV4YW1wbGUsIGlmIGEgZnVuY3Rpb24KKyAgICAgKiBjYWxsZWQgPGNvZGU+b2Zmc2V0KCk8L2NvZGU+IGlzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+UHJvcGVydHlBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXIgVGhlIHNldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoTWV0aG9kIHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4gU2V0dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgdG8gZ2V0IGFuIGluaXRpYWwgdmFsdWUsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+UHJvcGVydHlBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBnZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBnZXR0ZXIgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZXRoZXIgc3VwcGxpZWQgaGVyZSBvciBkZXJpdmVkCisgICAgICogZnJvbSB0aGUgcHJvcGVydHkgbmFtZSwgaWYgb25lIG9mIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gYXJlCisgICAgICogbnVsbC4gSWYgYm90aCBvZiB0aG9zZSB2YWx1ZXMgYXJlIG5vbi1udWxsLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2V0IG9uZSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgYW5kIHRoZSBnZXR0ZXIgaXMgbm90IGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMgKHdoaWNoZXZlciBvZiB0aGVtIGFyZQorICAgICAqIG5vbi1udWxsKSwgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvIHRoZSBnZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZXR0ZXIgVGhlIGdldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCBpbml0aWFsIGFuaW1hdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2V0dGVyKE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgbUdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHRvIGdldCB1bnN1cHBsaWVkIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0R2V0dGVyKCkgeworICAgICAgICByZXR1cm4gbUdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFuaW1hdGlvbiB3aG9zZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYW5kCisgICAgICogYXR0cmlidXRlcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGhvbGRpbmcgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qcm9wZXJ0eUFuaW1hdG9yKTsKKworICAgICAgICBtUHJvcGVydHlOYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvcGVydHlBbmltYXRvcl9wcm9wZXJ0eU5hbWUpOworCisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCisgICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQorICAgICAqIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgorICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7CisgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIHNldHRlck5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7CisgICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIGFyZ3NbMF0gPSB2YWx1ZVR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVyblZhbCA9IG1UYXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwgYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlBbmltYXRvciIsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIHNldHRlci9nZXR0ZXIgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZXMuIFdoZW4gdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGlzIGNhbGxlZCwgdGhlIHN5c3RlbSBleHBlY3RzIHRvIGZpbmQgYSBzZXR0ZXIgZm9yIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb24KKyAgICAgKiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IHRha2VzIGEgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBhIHB1YmxpYyBmdW5jdGlvbiBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgcGFzc2VkIGluIGFzIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBvYmplY3QKKyAgICAgKiB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEdpdmVuIHRoaXMgbmFtZSwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgc2VhcmNoIGZvciBhCisgICAgICogc2V0dGVyIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0UHJvcGVydHlOYW1lPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIDxjb2RlPnByb3BlcnR5TmFtZSA9ICJmb28iPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0IHNob3VsZCBoYXZlIGEgc2V0dGVyIGZ1bmN0aW9uIHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0Rm9vKCk8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IoaW50IGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgZmxvYXQgdmFsdWVGcm9tLCBmbG9hdCB2YWx1ZVRvKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZQorICAgICAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIHRvLiBXaGVuIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyBjYWxsZWQsIHRoZSBzeXN0ZW0gZXhwZWN0cyB0byBmaW5kIGEgc2V0dGVyIGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9uCisgICAgICogdGhlIHRhcmdldCBvYmplY3QgdGhhdCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIDxjb2RlPk9iamVjdDwvY29kZT5zLiBUaGUKKyAgICAgKiBzeXN0ZW0gYWxzbyBleHBlY3RzIHRvIGZpbmQgYSBzaW1pbGFyIGdldHRlciBmdW5jdGlvbiB3aXRoIHdoaWNoIHRvIGRlcml2ZSB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgZnVuY3Rpb24gb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBHaXZlbiB0aGlzIG5hbWUsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHNlYXJjaCBmb3IgYQorICAgICAqIHNldHRlciBvbiB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldFByb3BlcnR5TmFtZTwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCA8Y29kZT5wcm9wZXJ0eU5hbWUgPSAiZm9vIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZSBhIHNldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldEZvbygpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWVUbyBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihpbnQgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZsb2F0IHZhbHVlVG8pIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIHZhbHVlVG8pOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlcy4gV2hlbiB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogaXMgY2FsbGVkLCB0aGUgc3lzdGVtIGV4cGVjdHMgdG8gZmluZCBhIHNldHRlciBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvbgorICAgICAqIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgdGFrZXMgYSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBhIHB1YmxpYyBmdW5jdGlvbiBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgcGFzc2VkIGluIGFzIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBvYmplY3QKKyAgICAgKiB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEdpdmVuIHRoaXMgbmFtZSwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgc2VhcmNoIGZvciBhCisgICAgICogc2V0dGVyIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0UHJvcGVydHlOYW1lPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIDxjb2RlPnByb3BlcnR5TmFtZSA9ICJmb28iPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0IHNob3VsZCBoYXZlIGEgc2V0dGVyIGZ1bmN0aW9uIHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0Rm9vKCk8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IoaW50IGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgaW50IHZhbHVlRnJvbSwgaW50IHZhbHVlVG8pIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIHZhbHVlRnJvbSwgdmFsdWVUbyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIDxjb2RlPmludDwvY29kZT4gdmFsdWUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZQorICAgICAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIHRvLiBXaGVuIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyBjYWxsZWQsIHRoZSBzeXN0ZW0gZXhwZWN0cyB0byBmaW5kIGEgc2V0dGVyIGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9uCisgICAgICogdGhlIHRhcmdldCBvYmplY3QgdGhhdCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIDxjb2RlPk9iamVjdDwvY29kZT5zLiBUaGUKKyAgICAgKiBzeXN0ZW0gYWxzbyBleHBlY3RzIHRvIGZpbmQgYSBzaW1pbGFyIGdldHRlciBmdW5jdGlvbiB3aXRoIHdoaWNoIHRvIGRlcml2ZSB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgZnVuY3Rpb24gb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBHaXZlbiB0aGlzIG5hbWUsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHNlYXJjaCBmb3IgYQorICAgICAqIHNldHRlciBvbiB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldFByb3BlcnR5TmFtZTwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCA8Y29kZT5wcm9wZXJ0eU5hbWUgPSAiZm9vIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZSBhIHNldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldEZvbygpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWVUbyBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihpbnQgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCB2YWx1ZVRvKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uLCB2YWx1ZVRvKTsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZXMuIFdoZW4gdGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGlzIGNhbGxlZCwgdGhlIHN5c3RlbSBleHBlY3RzIHRvIGZpbmQgYSBzZXR0ZXIgZm9yIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb24KKyAgICAgKiB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IHRha2VzIGEgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgZnVuY3Rpb24gb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBHaXZlbiB0aGlzIG5hbWUsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHNlYXJjaCBmb3IgYQorICAgICAqIHNldHRlciBvbiB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldFByb3BlcnR5TmFtZTwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCA8Y29kZT5wcm9wZXJ0eU5hbWUgPSAiZm9vIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZSBhIHNldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldEZvbygpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWVGcm9tIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEBwYXJhbSB2YWx1ZVRvIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcHJvcGVydHkgd2lsbCBhbmltYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUFuaW1hdG9yKGludCBkdXJhdGlvbiwgT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgIGRvdWJsZSB2YWx1ZUZyb20sIGRvdWJsZSB2YWx1ZVRvKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlLCB3aGljaCBpcyB0aGUgdmFsdWUgdGhhdCB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0by4gV2hlbiB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogaXMgY2FsbGVkLCB0aGUgc3lzdGVtIGV4cGVjdHMgdG8gZmluZCBhIHNldHRlciBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvbgorICAgICAqIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgdGFrZXMgYSB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+cy4gVGhlCisgICAgICogc3lzdGVtIGFsc28gZXhwZWN0cyB0byBmaW5kIGEgc2ltaWxhciBnZXR0ZXIgZnVuY3Rpb24gd2l0aCB3aGljaCB0byBkZXJpdmUgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKKyAgICAgKiBoYXZlIGEgcHVibGljIGZ1bmN0aW9uIG9uIGl0IGNhbGxlZCA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5uYW1lPC9jb2RlPiBpcworICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBwYXNzZWQgaW4gYXMgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+IG9iamVjdAorICAgICAqIHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gR2l2ZW4gdGhpcyBuYW1lLCB0aGUgY29uc3RydWN0b3Igd2lsbCBzZWFyY2ggZm9yIGEKKyAgICAgKiBzZXR0ZXIgb24gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgbmFtZSA8Y29kZT5zZXRQcm9wZXJ0eU5hbWU8L2NvZGU+LiBGb3IgZXhhbXBsZSwKKyAgICAgKiBpZiB0aGUgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdpdGggPGNvZGU+cHJvcGVydHlOYW1lID0gImZvbyI8L2NvZGU+LCB0aGVuIHRoZQorICAgICAqIHRhcmdldCBvYmplY3Qgc2hvdWxkIGhhdmUgYSBzZXR0ZXIgZnVuY3Rpb24gd2l0aCB0aGUgbmFtZSA8Y29kZT5zZXRGb28oKTwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IoaW50IGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBkb3VibGUgdmFsdWVUbykgeworICAgICAgICBzdXBlcihkdXJhdGlvbiwgdmFsdWVUbyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWVzLiBXaGVuIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyBjYWxsZWQsIHRoZSBzeXN0ZW0gZXhwZWN0cyB0byBmaW5kIGEgc2V0dGVyIGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9uCisgICAgICogdGhlIHRhcmdldCBvYmplY3QgdGhhdCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIDxjb2RlPk9iamVjdDwvY29kZT5zLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBhIHB1YmxpYyBmdW5jdGlvbiBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgcGFzc2VkIGluIGFzIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBvYmplY3QKKyAgICAgKiB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEdpdmVuIHRoaXMgbmFtZSwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgc2VhcmNoIGZvciBhCisgICAgICogc2V0dGVyIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0UHJvcGVydHlOYW1lPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIDxjb2RlPnByb3BlcnR5TmFtZSA9ICJmb28iPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0IHNob3VsZCBoYXZlIGEgc2V0dGVyIGZ1bmN0aW9uIHdpdGggdGhlIG5hbWUgPGNvZGU+c2V0Rm9vKCk8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZUZyb20gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQHBhcmFtIHZhbHVlVG8gVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IoaW50IGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgT2JqZWN0IHZhbHVlRnJvbSwgT2JqZWN0IHZhbHVlVG8pIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIHZhbHVlRnJvbSwgdmFsdWVUbyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZQorICAgICAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIHRvLiBXaGVuIHRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyBjYWxsZWQsIHRoZSBzeXN0ZW0gZXhwZWN0cyB0byBmaW5kIGEgc2V0dGVyIGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9uCisgICAgICogdGhlIHRhcmdldCBvYmplY3QgdGhhdCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIDxjb2RlPk9iamVjdDwvY29kZT5zLiBUaGUKKyAgICAgKiBzeXN0ZW0gYWxzbyBleHBlY3RzIHRvIGZpbmQgYSBzaW1pbGFyIGdldHRlciBmdW5jdGlvbiB3aXRoIHdoaWNoIHRvIGRlcml2ZSB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgZnVuY3Rpb24gb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBHaXZlbiB0aGlzIG5hbWUsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHNlYXJjaCBmb3IgYQorICAgICAqIHNldHRlciBvbiB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldFByb3BlcnR5TmFtZTwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCA8Y29kZT5wcm9wZXJ0eU5hbWUgPSAiZm9vIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZSBhIHNldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldEZvbygpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWVUbyBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihpbnQgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZVRvKSB7CisgICAgICAgIHRoaXMoZHVyYXRpb24sIHRhcmdldCwgcHJvcGVydHlOYW1lLCBudWxsLCB2YWx1ZVRvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+S2V5ZnJhbWU8L2NvZGU+cy4gV2hlbiB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogaXMgY2FsbGVkLCB0aGUgc3lzdGVtIGV4cGVjdHMgdG8gZmluZCBhIHNldHRlciBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvbgorICAgICAqIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgdGFrZXMgYSB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoYXQgcmV0dXJuZWQgZnJvbQorICAgICAqIHtAbGluayBLZXlmcmFtZSNnZXRUeXBlKCl9LgorICAgICAqIC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgZnVuY3Rpb24gb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBHaXZlbiB0aGlzIG5hbWUsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHNlYXJjaCBmb3IgYQorICAgICAqIHNldHRlciBvbiB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldFByb3BlcnR5TmFtZTwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCA8Y29kZT5wcm9wZXJ0eU5hbWUgPSAiZm9vIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZSBhIHNldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lIDxjb2RlPnNldEZvbygpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0ga2V5ZnJhbWVzIFRoZSBzZXQgb2Yga2V5ZnJhbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lcyBhbmQgdmFsdWVzIGZvciB0aGUgYW5pbWF0aW9uLgorICAgICAqIFRoZXNlIGtleWZyYW1lcyBzaG91bGQgYmUgb3JkZXJlZCBpbiBpbmNyZWFzaW5nIHRpbWUgdmFsdWUsIHNob3VsZCBoYXZlIGEgc3RhcnRpbmcKKyAgICAgKiBrZXlmcmFtZSB3aXRoIGEgZnJhY3Rpb24gb2YgMCBhbmQgYW5kIGVuZGluZyBrZXlmcmFtZSB3aXRoIGEgZnJhY3Rpb24gb2YgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihpbnQgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICBLZXlmcmFtZS4uLmtleWZyYW1lcykgeworICAgICAgICBzdXBlcihkdXJhdGlvbiwga2V5ZnJhbWVzKTsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIG1FdmFsdWF0b3IsIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0CisgICAgICogc2V0IGl0IHVwLCBhbmQgdGhlIHNldHRlci9nZXR0ZXIgbWV0aG9kcywgaWYgdGhlIHVzZXIgZGlkIG5vdCBzdXBwbHkKKyAgICAgKiB0aGVtLgorICAgICAqCisgICAgICogIDxwPk92ZXJyaWRlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGNhdXNlCisgICAgICogIGludGVybmFsIG1lY2hhbmlzbXMgdG8gYmUgc2V0IHVwIGNvcnJlY3RseS48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBpbml0QW5pbWF0aW9uKCkgeworICAgICAgICBzdXBlci5pbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGlmIChtU2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSB0byBsb2NrIHByb3BlcnR5IG1hcCBwcmlvciB0byByZWFkaW5nIGl0LCB0byBndWFyZCBhZ2FpbnN0CisgICAgICAgICAgICAgICAgLy8gYW5vdGhlciB0aHJlYWQgcHV0dGluZyBzb21ldGhpbmcgaW4gdGhlcmUgYWZ0ZXIgd2UndmUgY2hlY2tlZCBpdAorICAgICAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgd2UndmUgYWRkZWQgYW4gZW50cnkgdG8gaXQKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcExvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+IHByb3BlcnR5TWFwID0gc1NldHRlclByb3BlcnR5TWFwLmdldChtVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2V0dGVyID0gcHJvcGVydHlNYXAuZ2V0KG1Qcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVNldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXR0ZXIgPSBnZXRQcm9wZXJ0eUZ1bmN0aW9uKCJzZXQiLCBtVmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzU2V0dGVyUHJvcGVydHlNYXAucHV0KG1UYXJnZXQsIHByb3BlcnR5TWFwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQobVByb3BlcnR5TmFtZSwgbVNldHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcExvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldEtleWZyYW1lcygpID09IG51bGwgJiYgKGdldFZhbHVlRnJvbSgpID09IG51bGwgfHwgZ2V0VmFsdWVUbygpID09IG51bGwpKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIHNldCB1cCB0aGUgZ2V0dGVyIGlmIG5vdCBzZXQgYnkgdGhlIHVzZXIsIHRoZW4gY2FsbCBpdAorICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSBpbml0aWFsIHZhbHVlcworICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+IHByb3BlcnR5TWFwID0gc0dldHRlclByb3BlcnR5TWFwLmdldChtVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1HZXR0ZXIgPSBwcm9wZXJ0eU1hcC5nZXQobVByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUdldHRlciA9IGdldFByb3BlcnR5RnVuY3Rpb24oImdldCIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHZXR0ZXJQcm9wZXJ0eU1hcC5wdXQobVRhcmdldCwgcHJvcGVydHlNYXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIG1HZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGdldFZhbHVlRnJvbSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVGcm9tKG1HZXR0ZXIuaW52b2tlKG1UYXJnZXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdldFZhbHVlVG8oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlVG8obUdldHRlci5pbnZva2UobVRhcmdldCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gZHVyaW5nIGV2ZXJ5CisgICAgICogYW5pbWF0aW9uIGZyYW1lLiBUaGlzIGZ1bmN0aW9uIHR1cm5zIHRoZSBlbGFwc2VkIGZyYWN0aW9uIGludG8gYW4gaW50ZXJwb2xhdGVkIGZyYWN0aW9uCisgICAgICogYW5kIHRoZW4gaW50byBhbiBhbmltYXRlZCB2YWx1ZSAoZnJvbSB0aGUgZXZhbHVhdG9yLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIG1vc3RseSBkdXJpbmcKKyAgICAgKiBhbmltYXRpb24gdXBkYXRlcywgYnV0IGl0IGlzIGFsc28gY2FsbGVkIHdoZW4gdGhlIDxjb2RlPmVuZCgpPC9jb2RlPgorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdG8gc2V0IHRoZSBmaW5hbCB2YWx1ZSBvbiB0aGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2QgbXVzdCBjYWxsIHRoZSBzdXBlcmNsYXNzIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9uCisgICAgICogb2YgdGhlIGFuaW1hdGVkIHZhbHVlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgYW5pbWF0ZVZhbHVlKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIHN1cGVyLmFuaW1hdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgIGlmIChtU2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVRtcFZhbHVlQXJyYXlbMF0gPSBnZXRBbmltYXRlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbVNldHRlci5pbnZva2UobVRhcmdldCwgbVRtcFZhbHVlQXJyYXkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJBbmltYXRvcjogdGFyZ2V0OiAiICsgdGhpcy5tVGFyZ2V0ICsgIlxuIiArCisgICAgICAgICAgICAgICAgIiAgICBwcm9wZXJ0eTogIiArIG1Qcm9wZXJ0eU5hbWUgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGZyb206ICIgKyBnZXRWYWx1ZUZyb20oKSArICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgdG86ICIgKyBnZXRWYWx1ZVRvKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTBhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUkdCRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiBpbnRlZ2VyCisgKiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgQVJHQiBjb2xvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBSR0JFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBpbi1iZXR3ZWVuIHZhbHVlIGZvciBhIGNvbG9yCisgICAgICogZ2l2ZW4gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGluIHRoZSBmb3VyCisgICAgICogYnl0ZXMgb2YgdGhlIDMyLWJpdCBpbnQuIEVhY2ggY2hhbm5lbCBpcyBzZXBhcmF0ZWx5IGxpbmVhcmx5IGludGVycG9sYXRlZAorICAgICAqIGFuZCB0aGUgcmVzdWx0aW5nIGNhbGN1bGF0ZWQgdmFsdWVzIGFyZSByZWNvbWJpbmVkIGludG8gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGVuZFZhbHVlIEEgMzItYml0IGludCB2YWx1ZSByZXByZXNlbnRpbmcgY29sb3JzIGluIHRoZQorICAgICAqIHNlcGFyYXRlIGJ5dGVzIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIEEgdmFsdWUgdGhhdCBpcyBjYWxjdWxhdGVkIHRvIGJlIHRoZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiByZXN1bHQsIGRlcml2ZWQgYnkgc2VwYXJhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgaW50byBzZXBhcmF0ZQorICAgICAqIGNvbG9yIGNoYW5uZWxzIGFuZCBpbnRlcnBvbGF0aW5nIGVhY2ggb25lIHNlcGFyYXRlbHksIHJlY29tYmluaW5nIHRoZQorICAgICAqIHJlc3VsdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgd2F5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gKEludGVnZXIpIHN0YXJ0VmFsdWU7CisgICAgICAgIGludCBzdGFydEEgPSAoc3RhcnRJbnQgPj4gMjQpOworICAgICAgICBpbnQgc3RhcnRSID0gKHN0YXJ0SW50ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGludCBzdGFydEcgPSAoc3RhcnRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRCID0gc3RhcnRJbnQgJiAweGZmOworCisgICAgICAgIGludCBlbmRJbnQgPSAoSW50ZWdlcikgZW5kVmFsdWU7CisgICAgICAgIGludCBlbmRBID0gKGVuZEludCA+PiAyNCk7CisgICAgICAgIGludCBlbmRSID0gKGVuZEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgZW5kRyA9IChlbmRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgZW5kQiA9IGVuZEludCAmIDB4ZmY7CisKKyAgICAgICAgcmV0dXJuIChpbnQpKChzdGFydEEgKyAoaW50KShmcmFjdGlvbiAqIChlbmRBIC0gc3RhcnRBKSkpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0UiArIChpbnQpKGZyYWN0aW9uICogKGVuZFIgLSBzdGFydFIpKSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoaW50KSgoc3RhcnRHICsgKGludCkoZnJhY3Rpb24gKiAoZW5kRyAtIHN0YXJ0RykpKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0QiArIChpbnQpKGZyYWN0aW9uICogKGVuZEIgLSBzdGFydEIpKSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vU2VxdWVuY2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3OGEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9TZXF1ZW5jZXIuamF2YQpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHBsYXlzIGEgc2V0IG9mIHtAbGluayBBbmltYXRhYmxlfSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuIEFuaW1hdGlvbnMKKyAqIGNhbiBiZSBzZXQgdXAgdG8gcGxheSB0b2dldGhlciwgaW4gc2VxdWVuY2UsIG9yIGFmdGVyIGEgc3BlY2lmaWVkIGRlbGF5LgorICoKKyAqIDxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gYWRkaW5nIGFuaW1hdGlvbnMgdG8gYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+OgorICogZWl0aGVyIHRoZSB7QGxpbmsgU2VxdWVuY2VyI3BsYXlUb2dldGhlcihBbmltYXRhYmxlW10pIHBsYXlUb2dldGhlcigpfSBvcgorICoge0BsaW5rIFNlcXVlbmNlciNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGVbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgdG8gYWRkCisgKiBhIHNldCBvZiBhbmltYXRpb25zIGFsbCBhdCBvbmNlLCBvciB0aGUge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYW4gYmUKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXRob2RzIGluIHRoZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyLkJ1aWxkZXIgQnVpbGRlcn0KKyAqIGNsYXNzIHRvIGFkZCBhbmltYXRpb25zCisgKiBvbmUgYnkgb25lLjwvcD4KKyAqCisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IHdpdGggY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJldHdlZW4KKyAqIGl0cyBhbmltYXRpb25zLiBGb3IgZXhhbXBsZSwgYW4gYW5pbWF0aW9uIGExIGNvdWxkIGJlIHNldCB1cCB0byBzdGFydCBiZWZvcmUgYW5pbWF0aW9uIGEyLCBhMgorICogYmVmb3JlIGEzLCBhbmQgYTMgYmVmb3JlIGExLiBUaGUgcmVzdWx0cyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gYXJlIHVuZGVmaW5lZCwgYnV0IHdpbGwgdHlwaWNhbGx5CisgKiByZXN1bHQgaW4gbm9uZSBvZiB0aGUgYWZmZWN0ZWQgYW5pbWF0aW9ucyBiZWluZyBwbGF5ZWQuIEJlY2F1c2Ugb2YgdGhpcyAoYW5kIGJlY2F1c2UKKyAqIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBkbyBub3QgbWFrZSBsb2dpY2FsIHNlbnNlIGFueXdheSksIGNpcmN1bGFyIGRlcGVuZGVuY2llcworICogc2hvdWxkIGJlIGF2b2lkZWQsIGFuZCB0aGUgZGVwZW5kZW5jeSBmbG93IG9mIGFuaW1hdGlvbnMgc2hvdWxkIG9ubHkgYmUgaW4gb25lIGRpcmVjdGlvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcXVlbmNlciBleHRlbmRzIEFuaW1hdGFibGUgeworCisgICAgLyoqCisgICAgICogVHJhY2tzIGFuaW1hdGlvbnMgY3VycmVudGx5IGJlaW5nIHBsYXllZCwgc28gdGhhdCB3ZSBrbm93IHdoYXQgdG8KKyAgICAgKiBjYW5jZWwgb3IgZW5kIHdoZW4gY2FuY2VsKCkgb3IgZW5kKCkgaXMgY2FsbGVkIG9uIHRoaXMgU2VxdWVuY2VyCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8QW5pbWF0YWJsZT4gbVBsYXlpbmdTZXQgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdGFibGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBhbGwgbm9kZXMsIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIEFuaW1hdGFibGVzLiBXaGVuIG5ldworICAgICAqIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgYWRkZWQgZm9yIGFuIEFuaW1hdGFibGUsIHdlIHdhbnQgdG8gYWRkIGl0CisgICAgICogdG8gYSBzaW5nbGUgbm9kZSByZXByZXNlbnRpbmcgdGhhdCBBbmltYXRhYmxlLCBub3QgY3JlYXRlIGEgbmV3IE5vZGUKKyAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEFuaW1hdGFibGUsIE5vZGU+IG1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0YWJsZSwgTm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIFNldCBvZiBhbGwgbm9kZXMgY3JlYXRlZCBmb3IgdGhpcyBTZXF1ZW5jZXIuIFRoaXMgbGlzdCBpcyB1c2VkIHVwb24KKyAgICAgKiBzdGFydGluZyB0aGUgc2VxdWVuY2VyLCBhbmQgdGhlIG5vZGVzIGFyZSBwbGFjZWQgaW4gc29ydGVkIG9yZGVyIGludG8gdGhlCisgICAgICogc29ydGVkTm9kZXMgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxOb2RlPiBtTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydGVkIGxpc3Qgb2Ygbm9kZXMuIFRoaXMgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhbmltYXRpb25zIHdpbGwKKyAgICAgKiBiZSBwbGF5ZWQuIFRoZSBkZXRhaWxzIGFib3V0IHdoZW4gZXhhY3RseSB0aGV5IHdpbGwgYmUgcGxheWVkIGRlcGVuZAorICAgICAqIG9uIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE5vZGU+IG1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub2RlcyBzaG91bGQgYmUgc29ydGVkIHByaW9yIHRvIHBsYXlpbmcuIFRoaXMKKyAgICAgKiBmbGFnIGFsbG93cyB1cyB0byBjYWNoZSB0aGUgcHJldmlvdXMgc29ydGVkIG5vZGVzIHNvIHRoYXQgaWYgdGhlIHNlcXVlbmNlCisgICAgICogaXMgcmVwbGF5ZWQgd2l0aCBubyBjaGFuZ2VzLCBpdCBkb2VzIG5vdCBoYXZlIHRvIHJlLXNvcnQgdGhlIG5vZGVzIGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNTb3J0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyIG1TZXF1ZW5jZUxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBTZXF1ZW5jZXIgaGFzIGJlZW4gY2FuY2VsZWQgKGJ5IGNhbGxpbmcgY2FuY2VsKCkgb3IgZW5kKCkpLgorICAgICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGF2b2lkIHN0YXJ0aW5nIG90aGVyIGFuaW1hdGlvbnMgd2hlbiBjdXJyZW50bHktcGxheWluZworICAgICAqIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBTZXF1ZW5jZXIgZW5kLgorICAgICAqLworICAgIGJvb2xlYW4gbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgU2VxdWVuY2VyIHRvIHBsYXkgYWxsIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VxdWVuY2VJdGVtcyBUaGUgYW5pbWF0aW9ucyB0aGF0IHdpbGwgYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwbGF5VG9nZXRoZXIoQW5pbWF0YWJsZS4uLiBzZXF1ZW5jZUl0ZW1zKSB7CisgICAgICAgIGlmIChzZXF1ZW5jZUl0ZW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgQnVpbGRlciBidWlsZGVyID0gcGxheShzZXF1ZW5jZUl0ZW1zWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VxdWVuY2VJdGVtcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aChzZXF1ZW5jZUl0ZW1zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBTZXF1ZW5jZXIgdG8gcGxheSBlYWNoIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIHdoZW4gdGhlCisgICAgICogcHJldmlvdXMgYW5pbWF0aW9uIGVuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VxdWVuY2VJdGVtcyBUaGUgYW5pYW10aW9ucyB0aGF0IHdpbGwgYmUgc3RhcnRlZCBvbmUgYWZ0ZXIgYW5vdGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGUuLi4gc2VxdWVuY2VJdGVtcykgeworICAgICAgICBpZiAoc2VxdWVuY2VJdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZUl0ZW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGxheShzZXF1ZW5jZUl0ZW1zWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXF1ZW5jZUl0ZW1zLmxlbmd0aCAtIDE7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5KHNlcXVlbmNlSXRlbXNbaV0pLmJlZm9yZShzZXF1ZW5jZUl0ZW1zW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjaGlsZCBBbmltYXRhYmxlIG9iamVjdHMgY29udHJvbGxlZCBieSB0aGlzCisgICAgICogU2VxdWVuY2VyLiBUaGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgbGlzdDsgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmV0dXJuZWQgbGlzdAorICAgICAqIHdpbGwgbm90IGFmZmVjdCB0aGUgU2VxdWVuY2VyLCBhbHRob3VnaCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIEFuaW1hdGFibGUgb2JqZWN0cworICAgICAqIHdpbGwgYWZmZWN0IHRob3NlIG9iamVjdHMgYmVpbmcgbWFuYWdlZCBieSB0aGUgU2VxdWVuY2VyLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0YWJsZT4gVGhlIGxpc3Qgb2YgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIFNlcXVlbmNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGdldENoaWxkQW5pbWF0aW9ucygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZT4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGlsZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCwgd2hpY2ggaXMgdXNlZCB0bworICAgICAqIHNldCB1cCBwbGF5aW5nIGNvbnN0cmFpbnRzLiBUaGlzIGluaXRpYWwgPGNvZGU+cGxheSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiB0ZWxscyB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gdGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvcgorICAgICAqIHRoZSBzdWNjZWVkaW5nIGNvbW1hbmRzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogY2FsbGluZyA8Y29kZT5wbGF5KGExKS53aXRoKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgU2VxdWVuY2UgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBhbmQgPGNvZGU+YTI8L2NvZGU+IGF0IHRoZSBzYW1lIHRpbWUsCisgICAgICogPGNvZGU+cGxheShhMSkuYmVmb3JlKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgU2VxdWVuY2UgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBmaXJzdCwgZm9sbG93ZWQgYnkgPGNvZGU+YTI8L2NvZGU+LCBhbmQKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5hZnRlcihhMik8L2NvZGU+IHNldHMgdXAgdGhlIFNlcXVlbmNlIHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gZmlyc3QsIGZvbGxvd2VkIGJ5IDxjb2RlPmExPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCA8Y29kZT5wbGF5KCk8L2NvZGU+IGlzIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZQorICAgICAqIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoZSBhbmltYXRpb24gdXBvbiB3aGljaCB0aGUgZGVwZW5kZW5jeSBpcyBjcmVhdGVkLAorICAgICAqIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGluIDxjb2RlPkJ1aWxkZXI8L2NvZGU+CisgICAgICogd2lsbCBhbGwgcmVmZXIgdG8gdGhlIGluaXRpYWwgcGFyYW1ldGVyIHN1cHBsaWVkIGluIDxjb2RlPnBsYXkoKTwvY29kZT4KKyAgICAgKiBhcyB0aGUgZGVwZW5kZW5jeSBvZiB0aGUgb3RoZXIgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5iZWZvcmUoYTIpLmJlZm9yZShhMyk8L2NvZGU+IHdpbGwgcGxheSBib3RoIDxjb2RlPmEyPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5hMzwvY29kZT4gd2hlbiBhMSBlbmRzOyBpdCBkb2VzIG5vdCBzZXQgdXAgYSBkZXBlbmRlbmN5IGJldHdlZW4KKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gYW5kIDxjb2RlPmEzPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgdXNlZCBpbiBsYXRlciBjYWxscyB0byB0aGUKKyAgICAgKiBtZXRob2RzIGluIHRoZSByZXR1cm5lZCA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEEgbnVsbCBwYXJhbWV0ZXIgd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIG51bGwgPGNvZGU+QnVpbGRlcjwvY29kZT4gcmV0dXJuIHZhbHVlLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBUaGUgb2JqZWN0IHRoYXQgY29uc3RydWN0cyB0aGUgc2VxdWVuY2UgYmFzZWQgb24gdGhlIGRlcGVuZGVuY2llcworICAgICAqIG91dGxpbmVkIGluIHRoZSBjYWxscyB0byA8Y29kZT5wbGF5PC9jb2RlPiBhbmQgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhlCisgICAgICogPGNvZGU+QnVpbGRlcjwvY29kZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgcGxheShBbmltYXRhYmxlIGFuaW0pIHsKKyAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoYW5pbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGNhbmNlbGluZyBhIDxjb2RlPlNlcXVlbmNlcjwvY29kZT4gYWxzbyBjYW5jZWxzIGFsbCBvZiB0aGUgYW5pbWF0aW9ucyB0aGF0IGl0IGlzCisgICAgICogcmVzcG9uc2libGUgZm9yLjwvcD4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgZW5kaW5nIGEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBhbHNvIGVuZHMgYWxsIG9mIHRoZSBhbmltYXRpb25zIHRoYXQgaXQgaXMKKyAgICAgKiByZXNwb25zaWJsZSBmb3IuPC9wPgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+U3RhcnRpbmcgdGhpcyA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IHdpbGwsIGluIHR1cm4sIHN0YXJ0IHRoZSBhbmltYXRpb25zIGZvciB3aGljaAorICAgICAqIGl0IGlzIHJlc3BvbnNpYmxlLiBUaGUgZGV0YWlscyBvZiB3aGVuIGV4YWN0bHkgdGhvc2UgYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBkZXBlbmRzIG9uCisgICAgICogdGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAgYmV0d2VlbiB0aGUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gRmlyc3QsIHNvcnQgdGhlIG5vZGVzIChpZiBuZWNlc3NhcnkpLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgc29ydGVkTm9kZXMKKyAgICAgICAgLy8gY29udGFpbnMgdGhlIGFuaW1hdGlvbiBub2RlcyBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgc29ydE5vZGVzKCk7CisKKyAgICAgICAgLy8gbm9kZXNUb1N0YXJ0IGhvbGRzIHRoZSBsaXN0IG9mIG5vZGVzIHRvIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkuIFdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgLy8gc3RhcnQgdGhlIGFuaW1hdGlvbnMgaW4gdGhlIGxvb3AgZGlyZWN0bHkgYmVjYXVzZSB3ZSBmaXJzdCBuZWVkIHRvIHNldCB1cAorICAgICAgICAvLyBkZXBlbmRlbmNpZXMgb24gYWxsIG9mIHRoZSBub2Rlcy4gRm9yIGV4YW1wbGUsIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgYW4gYW5pbWF0aW9uCisgICAgICAgIC8vIHdoZW4gc29tZSBvdGhlciBhbmltYXRpb24gYWxzbyB3YW50cyB0byBzdGFydCB3aGVuIHRoZSBmaXJzdCBhbmltYXRpb24gYmVnaW5zLgorICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gbm9kZXNUb1N0YXJ0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgaWYgKG1TZXF1ZW5jZUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VxdWVuY2VMaXN0ZW5lciA9IG5ldyBTZXF1ZW5jZXJBbmltYXRhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgPT0gbnVsbCB8fCBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG5vZGVzVG9TdGFydC5hZGQobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVwZW5kZW5jeUxpc3RlbmVyKHRoaXMsIG5vZGUsIGRlcGVuZGVuY3kucnVsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLnRtcERlcGVuZGVuY2llcyA9IChBcnJheUxpc3Q8RGVwZW5kZW5jeT4pIG5vZGUuZGVwZW5kZW5jaWVzLmNsb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcihtU2VxdWVuY2VMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgYWxsIGRlcGVuZGVuY2llcyBhcmUgc2V0IHVwLCBzdGFydCB0aGUgYW5pbWF0aW9ucyB0aGF0IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgIG1QbGF5aW5nU2V0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBtZWNoYW5pc20gYnkgd2hpY2ggYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBiYXNlZCBvbiBldmVudHMgaW4gb3RoZXIKKyAgICAgKiBhbmltYXRpb25zLiBJZiBhbiBhbmltYXRpb24gaGFzIG11bHRpcGxlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBhbmltYXRpb25zLCB0aGVuCisgICAgICogYWxsIGRlcGVuZGVuY2llcyBtdXN0IGJlIHNhdGlzZmllZCBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3lMaXN0ZW5lciBpbXBsZW1lbnRzIEFuaW1hdGFibGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBTZXF1ZW5jZXIgbVNlcXVlbmNlcjsKKworICAgICAgICAvLyBUaGUgbm9kZSB1cG9uIHdoaWNoIHRoZSBkZXBlbmRlbmN5IGlzIGJhc2VkLgorICAgICAgICBwcml2YXRlIE5vZGUgbU5vZGU7CisKKyAgICAgICAgLy8gVGhlIERlcGVuZGVuY3kgcnVsZSAoV0lUSCBvciBBRlRFUikgdGhhdCB0aGUgbGlzdGVuZXIgc2hvdWxkIHdhaXQgZm9yIG9uCisgICAgICAgIC8vIHRoZSBub2RlCisgICAgICAgIHByaXZhdGUgaW50IG1SdWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5TGlzdGVuZXIoU2VxdWVuY2VyIHNlcXVlbmNlciwgTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5tU2VxdWVuY2VyID0gc2VxdWVuY2VyOworICAgICAgICAgICAgdGhpcy5tTm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLm1SdWxlID0gcnVsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgY2FuY2VsIGV2ZW50cyBmb3Igbm93LiBXZSBtYXkgd2FudCB0byBoYW5kbGUgdGhpcyBldmVudHVhbGx5LAorICAgICAgICAgKiB0byBwcmV2ZW50IGZvbGxvdy1vbiBhbmltYXRpb25zIGZyb20gcnVubmluZyB3aGVuIHNvbWUgZGVwZW5kZW5jeQorICAgICAgICAgKiBhbmltYXRpb24gaXMgY2FuY2VsZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGVuZCBldmVudCBpcyByZWNlaXZlZCAtIHNlZSBpZiB0aGlzIGlzIGFuIGV2ZW50IHdlIGFyZSBsaXN0ZW5pbmcgZm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuQUZURVIpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgcmVwZWF0IGV2ZW50cyBmb3Igbm93CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgc3RhcnQgZXZlbnQgaXMgcmVjZWl2ZWQgLSBzZWUgaWYgdGhpcyBpcyBhbiBldmVudCB3ZSBhcmUgbGlzdGVuaW5nIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuV0lUSCkgeworICAgICAgICAgICAgICAgIHN0YXJ0SWZSZWFkeShhbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGV2ZW50IHJlY2VpdmVkIGlzIG9uZSB0aGF0IHRoZSBub2RlIHdhcyB3YWl0aW5nIGZvci4KKyAgICAgICAgICogSWYgc28sIG1hcmsgaXQgYXMgY29tcGxldGUgYW5kIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydAorICAgICAgICAgKiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeUFuaW1hdGlvbiB0aGUgYW5pbWF0aW9uIHRoYXQgc2VudCB0aGUgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc3RhcnRJZlJlYWR5KEFuaW1hdGFibGUgZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1TZXF1ZW5jZXIubUNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBTZXF1ZW5jZXIgd2FzIGNhbmNlbGVkLCB0aGVuIGRvbid0IHN0YXJ0IGFueSBkZXBlbmRlbnQgYW5pbXMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3lUb1JlbW92ZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG1Ob2RlLnRtcERlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnJ1bGUgPT0gbVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24gPT0gZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGZpcmVkIC0gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGFuZCBsaXN0ZW5lciBhbmQgY2hlY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHdoZXRoZXIgaXQncyB0aW1lIHRvIHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeVRvUmVtb3ZlID0gZGVwZW5kZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUFuaW1hdGlvbi5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5vZGUudG1wRGVwZW5kZW5jaWVzLnJlbW92ZShkZXBlbmRlbmN5VG9SZW1vdmUpOworICAgICAgICAgICAgaWYgKG1Ob2RlLnRtcERlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGFsbCBkZXBlbmRlbmNpZXMgc2F0aXNmaWVkOiBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgbU5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbVNlcXVlbmNlci5tUGxheWluZ1NldC5hZGQobU5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXF1ZW5jZXJBbmltYXRhYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBBbmltYXRhYmxlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgU2VxdWVuY2VyIG1TZXF1ZW5jZXI7CisKKyAgICAgICAgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyKFNlcXVlbmNlciBzZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgIG1TZXF1ZW5jZXIgPSBzZXF1ZW5jZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1QbGF5aW5nU2V0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKG1TZXF1ZW5jZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBhbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtUGxheWluZ1NldC5yZW1vdmUoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIE5vZGUgYW5pbU5vZGUgPSBtU2VxdWVuY2VyLm1Ob2RlTWFwLmdldChhbmltYXRpb24pOworICAgICAgICAgICAgYW5pbU5vZGUuZG9uZSA9IHRydWU7CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBtU2VxdWVuY2VyLm1Tb3J0ZWROb2RlczsKKyAgICAgICAgICAgIGludCBudW1Ob2RlcyA9IHNvcnRlZE5vZGVzLnNpemUoKTsKKyAgICAgICAgICAgIGludCBub2RlSW5kZXggPSBzb3J0ZWROb2Rlcy5pbmRleE9mKGFuaW1Ob2RlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRG9uZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9kZUluZGV4ICsgMTsgaSA8IG51bU5vZGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvcnRlZE5vZGVzLmdldChpKS5kb25lKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbERvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsbERvbmUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjaGlsZCBhbmltYXRpb24gdG8gZW5kLCB0aGVuIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2VyIGhhcyBlbmRlZAorICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKG1TZXF1ZW5jZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNvcnRzIHRoZSBjdXJyZW50IHNldCBvZiBub2RlcywgaWYgbmVlZGVkLiBUaGUgc29ydCBpcyBhIHNpbXBsZQorICAgICAqIERlcGVuZGVuY3lHcmFwaCBzb3J0LCB3aGljaCBnb2VzIGxpa2UgdGhpczoKKyAgICAgKiAtIEFsbCBub2RlcyB3aXRob3V0IGRlcGVuZGVuY2llcyBiZWNvbWUgJ3Jvb3RzJworICAgICAqIC0gd2hpbGUgcm9vdHMgbGlzdCBpcyBub3QgbnVsbAorICAgICAqIC0gICBmb3IgZWFjaCByb290IHIKKyAgICAgKiAtICAgICBhZGQgciB0byBzb3J0ZWQgbGlzdAorICAgICAqIC0gICAgIHJlbW92ZSByIGFzIGEgZGVwZW5kZW5jeSBmcm9tIGFueSBvdGhlciBub2RlCisgICAgICogLSAgIGFueSBub2RlcyB3aXRoIG5vIGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdG8gdGhlIHJvb3RzIGxpc3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc29ydE5vZGVzKCkgeworICAgICAgICBpZiAobU5lZWRzU29ydCkgeworICAgICAgICAgICAgbVNvcnRlZE5vZGVzLmNsZWFyKCk7CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gcm9vdHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyA9PSBudWxsIHx8IG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RzLmFkZChub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gdG1wUm9vdHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB3aGlsZSAocm9vdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZSByb290IDogcm9vdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvcnRlZE5vZGVzLmFkZChyb290KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3Qubm9kZURlcGVuZGVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiByb290Lm5vZGVEZXBlbmRlbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzLnJlbW92ZShyb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlRGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJvb3RzLmFkZChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm9vdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByb290cy5hZGRBbGwodG1wUm9vdHMpOworICAgICAgICAgICAgICAgIHRtcFJvb3RzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSAhPSBtTm9kZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2lyY3VsYXIgZGVwZW5kZW5jaWVzIGNhbm5vdCBleGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBTZXF1ZW5jZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERvZXNuJ3QgbmVlZCBzb3J0aW5nLCBidXQgc3RpbGwgbmVlZCB0byBhZGQgaW4gdGhlIG5vZGVEZXBlbmRlbmNpZXMgbGlzdAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVzZSBnZXQgcmVtb3ZlZCBhcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZpcmUgYW5kIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIC8vIGFyZSBzYXRpc2ZpZWQKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzICE9IG51bGwgJiYgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlRGVwZW5kZW5jaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZURlcGVuZGVuY2llcy5jb250YWlucyhkZXBlbmRlbmN5Lm5vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUuZG9uZSA9IGZhbHNlOyAvLyBhbHNvIHJlc2V0IGRvbmUgZmxhZworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVwZW5kZW5jeSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSB0aGF0IHNvbWUgb3RoZXIgbm9kZSBpcworICAgICAqIGRlcGVuZGVudCB1cG9uIGFuZCB0aGUgbmF0dXJlIG9mIHRoYXQgZGVwZW5kZW5jeS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3kgeworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFdJVEggPSAwOyAvLyBkZXBlbmRlbnQgbm9kZSBtdXN0IHN0YXJ0IHdpdGggdGhpcyBkZXBlbmRlbmN5IG5vZGUKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBBRlRFUiA9IDE7IC8vIGRlcGVuZGVudCBub2RlIG11c3Qgc3RhcnQgd2hlbiB0aGlzIGRlcGVuZGVuY3kgbm9kZSBmaW5pc2hlcworCisgICAgICAgIC8vIFRoZSBub2RlIHRoYXQgdGhlIG90aGVyIG5vZGUgd2l0aCB0aGlzIERlcGVuZGVuY3kgaXMgZGVwZW5kZW50IHVwb24KKyAgICAgICAgcHVibGljIE5vZGUgbm9kZTsKKworICAgICAgICAvLyBUaGUgbmF0dXJlIG9mIHRoZSBkZXBlbmRlbmN5IChXSVRIIG9yIEFGVEVSKQorICAgICAgICBwdWJsaWMgaW50IHJ1bGU7CisKKyAgICAgICAgcHVibGljIERlcGVuZGVuY3koTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMucnVsZSA9IHJ1bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIE5vZGUgaXMgYW4gZW1ib2RpbWVudCBvZiBib3RoIHRoZSBBbmltYXRhYmxlIHRoYXQgaXQgd3JhcHMgYXMgd2VsbCBhcworICAgICAqIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgQW5pbWF0aW9uLiBUaGlzIGluY2x1ZGVzCisgICAgICogYm90aCBkZXBlbmRlbmNpZXMgdXBvbiBvdGhlciBub2RlcyAoaW4gdGhlIGRlcGVuZGVuY2llcyBsaXN0KSBhcworICAgICAqIHdlbGwgYXMgZGVwZW5kZW5jaWVzIG9mIG90aGVyIG5vZGVzIHVwb24gdGhpcyAoaW4gdGhlIG5vZGVEZXBlbmRlbnRzIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGUgeworICAgICAgICBwdWJsaWMgQW5pbWF0YWJsZSBhbmltYXRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHRoaXMgbm9kZSdzIGFuaW1hdGlvbiBoYXMgb24gb3RoZXIKKyAgICAgICAgICogIG5vZGVzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBub2RlJ3MgYW5pbWF0aW9uIHNob3VsZCBiZWdpbiB3aXRoIHNvbWUKKyAgICAgICAgICogIG90aGVyIGFuaW1hdGlvbiBlbmRzLCB0aGVuIHRoZXJlIHdpbGwgYmUgYW4gaXRlbSBpbiB0aGlzIG5vZGUncworICAgICAgICAgKiAgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHRoYXQgb3RoZXIgYW5pbWF0aW9uJ3Mgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogdG1wRGVwZW5kZW5jaWVzIGlzIGEgcnVudGltZSBkZXRhaWwuIFdlIHVzZSB0aGUgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHNvcnRpbmcuCisgICAgICAgICAqIEJ1dCB3ZSBhbHNvIHVzZSB0aGUgbGlzdCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gbXVsdGlwbGUgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQsCisgICAgICAgICAqIGJ1dCByZW1vdmluZyBlYWNoIGRlcGVuZGVuY3kgYXMgaXQgaXMgc2F0aXNmaWVkLiBXZSBkbyBub3Qgd2FudCB0byByZW1vdmUKKyAgICAgICAgICogdGhlIGRlcGVuZGVuY3kgaXRzZWxmIGZyb20gdGhlIGxpc3QsIGJlY2F1c2Ugd2UgbmVlZCB0byByZXRhaW4gdGhhdCBpbmZvcm1hdGlvbgorICAgICAgICAgKiBpZiB0aGUgc2VxdWVuY2VyIGlzIGxhdW5jaGVkIGluIHRoZSBmdXR1cmUuIFNvIHdlIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kKKyAgICAgICAgICogbGlzdCB3aGVuIHRoZSBzZXF1ZW5jZXIgc3RhcnRzIGFuZCB1c2UgdGhpcyB0bXBEZXBlbmRlbmNpZXMgbGlzdCB0byB0cmFjayB0aGUKKyAgICAgICAgICogbGlzdCBvZiBzYXRpc2ZpZWQgZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxEZXBlbmRlbmN5PiB0bXBEZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBub2RlRGVwZW5kZW5jaWVzIGlzIGp1c3QgYSBsaXN0IG9mIHRoZSBub2RlcyB0aGF0IHRoaXMgTm9kZSBpcyBkZXBlbmRlbnQgdXBvbi4KKyAgICAgICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGluIHNvcnROb2RlcygpLCB0byBkZXRlcm1pbmUgd2hlbiBhIG5vZGUgaXMgYSByb290LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxOb2RlPiBub2RlRGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogbm9kZURlcGRlbmRlbnRzIGlzIHRoZSBsaXN0IG9mIG5vZGVzIHRoYXQgaGF2ZSB0aGlzIG5vZGUgYXMgYSBkZXBlbmRlbmN5LiBUaGlzCisgICAgICAgICAqIGlzIGEgdXRpbGl0eSBmaWVsZCB1c2VkIGluIHNvcnROb2RlcyB0byBmYWNpbGl0YXRlIHJlbW92aW5nIHRoaXMgbm9kZSBhcyBhCisgICAgICAgICAqIGRlcGVuZGVuY3kgd2hlbiBpdCBpcyBhIHJvb3Qgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Tm9kZT4gbm9kZURlcGVuZGVudHMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYW5pbWF0aW9uIGluIHRoaXMgbm9kZSBpcyBmaW5pc2hlZC4gVGhpcyBmbGFnCisgICAgICAgICAqIGlzIHVzZWQgYnkgU2VxdWVuY2VyIHRvIGNoZWNrLCBhcyBlYWNoIGFuaW1hdGlvbiBlbmRzLCB3aGV0aGVyIGFsbCBjaGlsZCBhbmltYXRpb25zCisgICAgICAgICAqIGFyZSBkb25lIGFuZCBpdCdzIHRpbWUgdG8gc2VuZCBvdXQgYW4gZW5kIGV2ZW50IGZvciB0aGUgZW50aXJlIFNlcXVlbmNlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRvbmUgPSBmYWxzZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyB0aGUgTm9kZSB3aXRoIHRoZSBhbmltYXRpb24gdGhhdCBpdCBlbmNhcHN1bGF0ZXMuIEEgTm9kZSBoYXMgbm8KKyAgICAgICAgICogZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQ7IGRlcGVuZGVuY2llcyBhcmUgYWRkZWQgdmlhIHRoZSBhZGREZXBlbmRlbmN5KCkKKyAgICAgICAgICogbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gdGhhdCB0aGUgTm9kZSBlbmNhcHN1bGF0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm9kZShBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgdGhpcy5hbmltYXRpb24gPSBhbmltYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIE5vZGUuIFRoZSBkZXBlbmRlbmN5IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgKiBub2RlIHRoYXQgdGhpcyBub2RlIGlzIGRlcGVuZGVuY3kgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeS4KKyAgICAgICAgICogQHBhcmFtIGRlcGVuZGVuY3kKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVuY3koRGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PERlcGVuZGVuY3k+KCk7CisgICAgICAgICAgICAgICAgbm9kZURlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICAgICAgICBpZiAoIW5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgIG5vZGVEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlIGRlcGVuZGVuY3lOb2RlID0gZGVwZW5kZW5jeS5ub2RlOworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGZhY2lsaXRhdGUgYWRkaW5nIGFuaW1hdGlvbnMgdG8gYQorICAgICAqIDxjb2RlPlNlcXVlbmNlcjwvY29kZT4gYWxvbmcgd2l0aCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSB2YXJpb3VzIGFuaW1hdGlvbnMuIFRoZQorICAgICAqIGludGVudGlvbiBvZiB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gbWV0aG9kcywgYWxvbmcgd2l0aCB0aGUge0BsaW5rCisgICAgICogU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSkgcGxheSgpfSBtZXRob2Qgb2YgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCisgICAgICogZXhwcmVzcyB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIGFuaW1hdGlvbnMgaW4gYSBuYXR1cmFsIHdheS4gRGV2ZWxvcGVycyBjYW4gYWxzbyB1c2UKKyAgICAgKiB0aGUge0BsaW5rIFNlcXVlbmNlciNwbGF5VG9nZXRoZXIoQW5pbWF0YWJsZVtdKSBwbGF5VG9nZXRoZXIoKX0gYW5kIHtAbGluaworICAgICAqIFNlcXVlbmNlciNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGVbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGlmIHRoZXNlIHN1aXQgdGhlIG5lZWQsCisgICAgICogYnV0IGl0IG1pZ2h0IGJlIGVhc2llciBpbiBzb21lIHNpdHVhdGlvbnMgdG8gZXhwcmVzcyB0aGUgc2VxdWVuY2Ugb2YgYW5pbWF0aW9ucyBpbiBwYWlycy4KKyAgICAgKiA8cC8+CisgICAgICogPHA+VGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHksIGJ1dCBpcyByYXRoZXIgY29uc3RydWN0ZWQKKyAgICAgKiBpbnRlcm5hbGx5IHZpYSBhIGNhbGwgdG8ge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfS48L3A+CisgICAgICogPHAvPgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGlzIHNldHMgdXAgYSBTZXF1ZW5jZXIgdG8gcGxheSBhbmltMSBhbmQgYW5pbTIgYXQgdGhlIHNhbWUgdGltZSwgYW5pbTMgdG8KKyAgICAgKiBwbGF5IHdoZW4gYW5pbTIgZmluaXNoZXMsIGFuZCBhbmltNCB0byBwbGF5IHdoZW4gYW5pbTMgZmluaXNoZXM6PC9wPgorICAgICAqIDxwcmU+CisgICAgICogICAgIFNlcXVlbmNlciBzID0gbmV3IFNlcXVlbmNlcigpOworICAgICAqICAgICBzLnBsYXkoYW5pbTEpLndpdGgoYW5pbTIpOworICAgICAqICAgICBzLnBsYXkoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogICAgIHMucGxheShhbmltNCkuYWZ0ZXIoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIGluIHRoZSBleGFtcGxlIHRoYXQgYm90aCB7QGxpbmsgQnVpbGRlciNiZWZvcmUoQW5pbWF0YWJsZSl9IGFuZCB7QGxpbmsKKyAgICAgKiBCdWlsZGVyI2FmdGVyKEFuaW1hdGFibGUpfSBhcmUgdXNlZC4gVGhlc2UgYXJlIGp1c3QgZGlmZmVyZW50IHdheXMgb2YgZXhwcmVzc2luZyB0aGUgc2FtZQorICAgICAqIHJlbGF0aW9uc2hpcCBhbmQgYXJlIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNheSB0aGluZ3MgaW4gYSB3YXkgdGhhdCBpcyBtb3JlIG5hdHVyYWwsCisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBtYWtlIHNldmVyYWwgY2FsbHMgaW50byB0aGUgc2FtZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgdG8gZXhwcmVzcworICAgICAqIG11bHRpcGxlIHJlbGF0aW9uc2hpcHMuIEhvd2V2ZXIsIG5vdGUgdGhhdCBpdCBpcyBvbmx5IHRoZSBhbmltYXRpb24gcGFzc2VkIGludG8gdGhlIGluaXRpYWwKKyAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGluIGFueSBvZiB0aGUgc3VjY2Vzc2l2ZQorICAgICAqIGNhbGxzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc3RhcnRzIGJvdGggYW5pbTIKKyAgICAgKiBhbmQgYW5pbTMgd2hlbiBhbmltMSBlbmRzOyB0aGVyZSBpcyBubyBkaXJlY3QgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbmltMiBhbmQKKyAgICAgKiBhbmltMzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgU2VxdWVuY2VyIHMgPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICogICBzLnBsYXkoYW5pbTEpLmJlZm9yZShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBJZiB0aGUgZGVzaXJlZCByZXN1bHQgaXMgdG8gcGxheSBhbmltMSB0aGVuIGFuaW0yIHRoZW4gYW5pbTMsIHRoaXMgY29kZSBleHByZXNzZXMgdGhlCisgICAgICogcmVsYXRpb25zaGlwIGNvcnJlY3RseTo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgIFNlcXVlbmNlciBzID0gbmV3IFNlcXVlbmNlcigpOworICAgICAqICAgcy5wbGF5KGFuaW0xKS5iZWZvcmUoYW5pbTIpOworICAgICAqICAgcy5wbGF5KGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZXhwcmVzcyByZWxhdGlvbnNoaXBzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGFuZCB3aWxsIG5vdAorICAgICAqIHJlc3VsdCBpbiBzZW5zaWJsZSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGxheShhbmltMSkuYWZ0ZXIoYW5pbTEpPC9jb2RlPiBtYWtlcyBubworICAgICAqIHNlbnNlLiBJbiBnZW5lcmFsLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzIG9uZSAob3IgbW9yZSBpbmRpcmVjdCBvbmVzIHdoZXJlIGEgZGVwZW5kcworICAgICAqIG9uIGIsIHdoaWNoIGRlcGVuZHMgb24gYywgd2hpY2ggZGVwZW5kcyBvbiBhKSBzaG91bGQgYmUgYXZvaWRlZC4gT25seSBjcmVhdGUgc2VxdWVuY2VzIHRoYXQKKyAgICAgKiBjYW4gYm9pbCBkb3duIHRvIGEgc2ltcGxlLCBvbmUtd2F5IHJlbGF0aW9uc2hpcCBvZiBhbmltYXRpb25zIHN0YXJ0aW5nIHdpdGgsIGJlZm9yZSwgYW5kCisgICAgICogYWZ0ZXIgb3RoZXIsIGRpZmZlcmVudCwgYW5pbWF0aW9ucy48L3A+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHRyYWNrcyB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZC4gSXQgaXMgc3VwcGxpZWQgdG8gdGhlIHBsYXkoKSBtZXRob2QKKyAgICAgICAgICogb2YgU2VxdWVuY2VyIGFuZCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2YgQnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTm9kZSBtQ3VycmVudE5vZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3Rvci4gQnVpbGRlcnMgYXJlIG9ubHkgY29uc3RydWN0ZWQgYnkgU2VxdWVuY2VyLCB3aGVuIHRoZQorICAgICAgICAgKiBwbGF5KCkgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgb3RoZXIgYW5pbWF0aW9ucyBwYXNzZWQgaW50bworICAgICAgICAgKiB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlcihBbmltYXRhYmxlIGFuaW0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobUN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCB3aWxsIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCBzdGFydHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3aXRoKEFuaW1hdGFibGUgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5XSVRIKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gbWV0aG9kIGVuZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmUoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobUN1cnJlbnROb2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gc3RhcnQgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoaXMgbWV0aG9kIGNhbGwgZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB3aG9zZSBlbmQgd2lsbCBjYXVzZSB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCB0byBwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobm9kZSwgRGVwZW5kZW5jeS5BRlRFUik7CisgICAgICAgICAgICBtQ3VycmVudE5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gcGxheSB3aGVuIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZSBlbGFwc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsYXkgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBzaG91bGQgZWxhcHNlIGJlZm9yZSB0aGUKKyAgICAgICAgICogYW5pbWF0aW9uIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyKGxvbmcgZGVsYXkpIHsKKyAgICAgICAgICAgIC8vIHNldHVwIGR1bW15IEFuaW1hdG9yIGp1c3QgdG8gcnVuIHRoZSBjbG9jaworICAgICAgICAgICAgYWZ0ZXIobmV3IEFuaW1hdG9yKGRlbGF5LCAwZiwgMWYpKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUwZTAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHVzZSB3aXRoIHRoZSB7QGxpbmsgQW5pbWF0b3Ijc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IpfSBmdW5jdGlvbi4gRXZhbHVhdG9ycworICogYWxsb3cgZGV2ZWxvcGVycyB0byBjcmVhdGUgYW5pbWF0aW9ucyBvbiBhcmJpdHJhcnkgcHJvcGVydHkgdHlwZXMsIGJ5IGFsbG93aW5nIHRoZW0gdG8gc3VwcGx5CisgKiBjdXN0b20gZXZhdWxhdG9ycyBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdW5kZXJzdG9vZCBhbmQgdXNlZCBieSB0aGUgYW5pbWF0aW9uCisgKiBzeXN0ZW0uCisgKgorICogQHNlZSBBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcikKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlLgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw2IEBACis8aHRtbD4KKzxib2R5PgorUHJvdmlkZXMgY2xhc3NlcyBmb3IgYW5pbWF0aW5nIHZhbHVlcyBvdmVyIHRpbWUsIGFuZCBzZXR0aW5nIHRob3NlIHZhbHVlcyBvbiB0YXJnZXQKK29iamVjdHMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNDk0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIGNvbnRleHR1YWwgQWN0aW9uQmFyLgorICogVGhlIEFjdGlvbkJhciBhY3RzIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSB0aXRsZSBiYXIgaW4gQWN0aXZpdGllcy4KKyAqIEl0IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGNyZWF0aW5nIHRvb2xiYXIgYWN0aW9ucyBhcyB3ZWxsIGFzCisgKiBtZXRob2RzIG9mIG5hdmlnYXRpbmcgYXJvdW5kIGFuIGFwcGxpY2F0aW9uLiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkJhciB7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLiBDb25zaXN0cyBvZiBlaXRoZXIgYSBsb2dvIG9yIGljb24KKyAgICAgKiBhbmQgdGl0bGUgdGV4dCB3aXRoIGFuIG9wdGlvbmFsIHN1YnRpdGxlLiBDbGlja2luZyBhbnkgb2YgdGhlc2UgZWxlbWVudHMKKyAgICAgKiB3aWxsIGRpc3BhdGNoIG9uQWN0aW9uSXRlbVNlbGVjdGVkIHRvIHRoZSByZWdpc3RlcmVkIENhbGxiYWNrIHdpdGgKKyAgICAgKiBhIE1lbnVJdGVtIHdpdGggaXRlbSBJRCBhbmRyb2lkLlIuaWQuaG9tZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIERyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBtb2RlLiBJbnN0ZWFkIG9mIHN0YXRpYyB0aXRsZSB0ZXh0IHRoaXMgbW9kZQorICAgICAqIHByZXNlbnRzIGEgZHJvcGRvd24gbWVudSBmb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUID0gMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUYWIgbmF2aWdhdGlvbiBtb2RlLiBJbnN0ZWFkIG9mIHN0YXRpYyB0aXRsZSB0ZXh0IHRoaXMgbW9kZQorICAgICAqIHByZXNlbnRzIGEgc2VyaWVzIG9mIHRhYnMgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfVEFCUyA9IDI7CisgICAgCisgICAgLyoqCisgICAgICogQ3VzdG9tIG5hdmlnYXRpb24gbW9kZS4gVGhpcyBuYXZpZ2F0aW9uIG1vZGUgaXMgc2V0IGltcGxpY2l0bHkgd2hlbmV2ZXIKKyAgICAgKiBhIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgaXMgc2V0LiBTZWUge0BsaW5rICNzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3KX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX0NVU1RPTSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBVc2UgbG9nbyBpbnN0ZWFkIG9mIGljb24gaWYgYXZhaWxhYmxlLiBUaGlzIGZsYWcgd2lsbCBjYXVzZSBhcHByb3ByaWF0ZQorICAgICAqIG5hdmlnYXRpb24gbW9kZXMgdG8gdXNlIGEgd2lkZXIgbG9nbyBpbiBwbGFjZSBvZiB0aGUgc3RhbmRhcmQgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1VTRV9MT0dPID0gMHgxOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGUgJ2hvbWUnIGVsZW1lbnRzIGluIHRoaXMgYWN0aW9uIGJhciwgbGVhdmluZyBtb3JlIHNwYWNlIGZvciBvdGhlcgorICAgICAqIG5hdmlnYXRpb24gZWxlbWVudHMuIFRoaXMgaW5jbHVkZXMgbG9nbyBhbmQgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0hJREVfSE9NRSA9IDB4MjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHZpZXcKKyAgICAgKiBmb3IgY3VzdG9tIG5hdmlnYXRpb24uCisgICAgICogCisgICAgICogQ3VzdG9tIG5hdmlnYXRpb24gdmlld3MgYXBwZWFyIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGljb24gYW5kCisgICAgICogYW55IGFjdGlvbiBidXR0b25zIGFuZCBtYXkgdXNlIGFueSBzcGFjZSBhdmFpbGFibGUgdGhlcmUuIENvbW1vbgorICAgICAqIHVzZSBjYXNlcyBmb3IgY3VzdG9tIG5hdmlnYXRpb24gdmlld3MgbWlnaHQgaW5jbHVkZSBhbiBhdXRvLXN1Z2dlc3RpbmcKKyAgICAgKiBhZGRyZXNzIGJhciBmb3IgYSBicm93c2VyIG9yIG90aGVyIG5hdmlnYXRpb24gbWVjaGFuaXNtcyB0aGF0IGRvIG5vdAorICAgICAqIHRyYW5zbGF0ZSB3ZWxsIHRvIHByb3ZpZGVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIG5hdmlnYXRpb24gdmlldyB0byBwbGFjZSBpbiB0aGUgQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gZHJvcGRvd24gbmF2aWdhdGlvbiBtb2RlIGFuZCBzdXBwbHkgYW4gYWRhcHRlcgorICAgICAqIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGZvciBuYXZpZ2F0aW9uIGNob2ljZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGRyb3Bkb3duIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBOYXZpZ2F0aW9uQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5hdmlnYXRpb24gaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gZHJvcGRvd24gbmF2aWdhdGlvbiBtb2RlIGFuZCBzdXBwbHkgYW4gYWRhcHRlciB0aGF0IHdpbGwKKyAgICAgKiBwcm92aWRlIHZpZXdzIGZvciBuYXZpZ2F0aW9uIGNob2ljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGJvdGggdG8gZGlzcGxheSB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gc2VsZWN0aW9uIGFuZCBwb3B1bGF0ZSB2aWV3cyB3aXRoaW4gdGhlIGRyb3Bkb3duCisgICAgICogICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBtZW51LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIE5hdmlnYXRpb25DYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqICAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbmF2aWdhdGlvbiBpdGVtLgorICAgICAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbiBQb3NpdGlvbiB3aXRoaW4gdGhlIHByb3ZpZGVkIGFkYXB0ZXIgdGhhdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgZnJvbSB0aGUgb3V0c2V0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjaywgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgbmF2aWdhdGlvbiBpdGVtIGluIGRyb3Bkb3duIG9yIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBpdGVtIHRvIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGl0ZW0gaW4gZHJvcGRvd24gb3IgdGFiYmVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB0aXRsZSBhbmQgc3VidGl0bGUuCisgICAgICogCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUKKyAgICAgKiBuYW1lIG9mIHlvdXIgQWN0aXZpdHkuIFN1YnRpdGxlcyBhcmUgZGlzcGxheWVkIHVuZGVybmVhdGggdGhlIHRpdGxlLCB1c3VhbGx5CisgICAgICogaW4gYSBzbWFsbGVyIGZvbnQgb3Igb3RoZXJ3aXNlIGxlc3MgcHJvbWluZW50bHkgdGhhbiB0aGUgdGl0bGUuIFN1YnRpdGxlcyBhcmUKKyAgICAgKiBnb29kIGZvciBleHRlbmRlZCBkZXNjcmlwdGlvbnMgb2YgYWN0aXZpdHkgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gbnVsbCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgVGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gbnVsbCB3aWxsIHJlbW92ZSB0aGUgc3VidGl0bGUgZW50aXJlbHkuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB0aXRsZSBhbmQgc3VidGl0bGUuCisgICAgICogCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUKKyAgICAgKiBuYW1lIG9mIHlvdXIgQWN0aXZpdHkuIFN1YnRpdGxlcyBhcmUgZGlzcGxheWVkIHVuZGVybmVhdGggdGhlIHRpdGxlLCB1c3VhbGx5CisgICAgICogaW4gYSBzbWFsbGVyIGZvbnQgb3Igb3RoZXJ3aXNlIGxlc3MgcHJvbWluZW50bHkgdGhhbiB0aGUgdGl0bGUuIFN1YnRpdGxlcyBhcmUKKyAgICAgKiBnb29kIGZvciBleHRlbmRlZCBkZXNjcmlwdGlvbnMgb2YgYWN0aXZpdHkgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGVSZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHRpdGxlIHN0cmluZworICAgICAqIEBwYXJhbSBzdWJ0aXRsZVJlc0lkIFJlc291cmNlIElEIG9mIGEgc3VidGl0bGUgc3RyaW5nCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50IHRpdGxlUmVzSWQsIGludCBzdWJ0aXRsZVJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5IG9uIHN0YXJ0dXAgaWYgYW4gYWN0aW9uIGJhciBpcyBwcmVzZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIG51bGwgaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50KQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB0aXRsZSBhbmQgc3VidGl0bGUuCisgICAgICogCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUKKyAgICAgKiBuYW1lIG9mIHlvdXIgQWN0aXZpdHkgb24gc3RhcnR1cCBpZiBhbiBhY3Rpb24gYmFyIGlzIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGVSZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHRpdGxlIHN0cmluZworICAgICAqCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50IHRpdGxlUmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCB1c2luZyB0aGUgY3VycmVudGx5IHNldCB0aXRsZQorICAgICAqIGFuZC9vciBzdWJ0aXRsZS4KKyAgICAgKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIG5hbWUgb2YKKyAgICAgKiB5b3VyIEFjdGl2aXR5IG9uIHN0YXJ0dXAgaWYgYW4gYWN0aW9uIGJhciBpcyBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiB0aXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHN1YnRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIHN1YnRpdGxlIGVudGlyZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFN1YnRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBzdWJ0aXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCBkaXNwbGF5IG9wdGlvbnMuIFRoaXMgY2hhbmdlcyBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLiBUbyBjaGFuZ2UKKyAgICAgKiBhIGxpbWl0ZWQgc3Vic2V0IG9mIGRpc3BsYXkgb3B0aW9ucywgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50LCBpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgc2VsZWN0ZWQgZGlzcGxheSBvcHRpb25zLiBPbmx5IHRoZSBvcHRpb25zIHNwZWNpZmllZCBieSBtYXNrIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgKiBUbyBjaGFuZ2UgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZSwgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50KX0uCisgICAgICogCisgICAgICogPHA+RXhhbXBsZTogc2V0RGlzcGxheU9wdGlvbnMoMCwgRElTUExBWV9ISURFX0hPTUUpIHdpbGwgZGlzYWJsZSB0aGUKKyAgICAgKiB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBvcHRpb24uCisgICAgICogc2V0RGlzcGxheU9wdGlvbnMoRElTUExBWV9ISURFX0hPTUUsIERJU1BMQVlfSElERV9IT01FIHwgRElTUExBWV9VU0VfTE9HTykKKyAgICAgKiB3aWxsIGVuYWJsZSB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBhbmQgZGlzYWJsZSB7QGxpbmsgI0RJU1BMQVlfVVNFX0xPR099LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICogQHBhcmFtIG1hc2sgQSBiaXQgbWFzayBkZWNsYXJpbmcgd2hpY2ggZGlzcGxheSBvcHRpb25zIHNob3VsZCBiZSBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzayk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBBY3Rpb25CYXIncyBiYWNrZ3JvdW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEJhY2tncm91bmQgZHJhd2FibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjdXN0b20gbmF2aWdhdGlvbiB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4gVGhlIHJlc3VsdCB3aWxsIGJlIG9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1R9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfVEFCU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9DVVNUT019PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICogCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyKQorICAgICAqIEBzZWUgI3NldFRhYk5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBvZiBkaXNwbGF5IG9wdGlvbnMuIAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKiBAc2VlICNyZW1vdmVUYWIoVGFiKQorICAgICAqIEBzZWUgI3JlbW92ZVRhYkF0KGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWQgb2YgdGhlIGNvbnRhaW5lciB2aWV3IHdoZXJlIHRhYiBjb250ZW50IGZyYWdtZW50cyBzaG91bGQgYXBwZWFyLgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiKFRhYikKKyAgICAgKiBAc2VlICNyZW1vdmVUYWJBdChpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoaW50IGNvbnRhaW5lclZpZXdJZCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgVGFifS4KKyAgICAgKiBUaGlzIHRhYiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uIGJhciB1bnRpbCBpdCBpcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcgVGFiCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGFiIG5ld1RhYigpOworCisgICAgLyoqCisgICAgICogQWRkIGEgdGFiIGZvciB1c2UgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4gVGhlIHRhYiB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRhYiB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgaW5zZXJ0ZWQgYXQKKyAgICAgKiA8Y29kZT5wb3NpdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gYWRkCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIHRhYgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc2VydFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBzcGVjaWZpZWQgdGFiLiBJZiBpdCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGFjdGlvbiBiYXIgaXQgd2lsbCBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgQWN0aW9uQmFyIG5hdmlnYXRpb24gZXZlbnRzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE5hdmlnYXRpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBuYXZpZ2F0aW9uIGl0ZW0gaW4geW91ciBhY3Rpb24gYmFyCisgICAgICAgICAqIGlzIHNlbGVjdGVkLgorICAgICAgICAgKiAgICAKKyAgICAgICAgICogQHBhcmFtIGl0ZW1Qb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIElEIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChpbnQgaXRlbVBvc2l0aW9uLCBsb25nIGl0ZW1JZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiA8cD5UYWJzIG1hbmFnZSB0aGUgaGlkaW5nIGFuZCBzaG93aW5nIG9mIHtAbGluayBGcmFnbWVudH1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGFiIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGludmFsaWQgcG9zaXRpb24gZm9yIGEgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRQb3NpdGlvbigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BPU0lUSU9OID0gLTE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIHRhYiBpbiB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDdXJyZW50IHBvc2l0aW9uLCBvciB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIHRoaXMgdGFiIGlzIG5vdCBjdXJyZW50bHkgaW4KKyAgICAgICAgICogICAgICAgICB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IERyYXdhYmxlIGdldEljb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0YWIncyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRleHQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBpY29uIGRpc3BsYXllZCBvbiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGljb24gVGhlIGRyYXdhYmxlIHRvIHVzZSBhcyBhbiBpY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoaXMgdGFiLiBUZXh0IG1heSBiZSB0cnVuY2F0ZWQgaWYgdGhlcmUgaXMgbm90CisgICAgICAgICAqIHJvb20gdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gZGlzcGxheQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGZyYWdtZW50IHRoYXQgd2lsbCBiZSBzaG93biB3aGVuIHRoaXMgdGFiIGlzIHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEZyYWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IEZyYWdtZW50IGdldEZyYWdtZW50KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIHNob3duIHdoZW4gdGhpcyB0YWIgaXMgc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmcmFnbWVudCBGcmFnbWVudCB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHRhYgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWxlY3QgdGhpcyB0YWIuIE9ubHkgdmFsaWQgaWYgdGhlIHRhYiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggZjdjY2MxMi4uMzMxOGJiMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFjdGlvbkJhckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUludGVudFNlbmRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKQEAgLTM5LDYgKzQxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwpAQCAtNDksOCArNTIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkluZmxhdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKQEAgLTU4LDE3ICs2NCwxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC02MDcsNiArNjExLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfSElFUkFSQ0hZX1RBRyA9ICJhbmRyb2lkOnZpZXdIaWVyYXJjaHlTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UU19UQUcgPSAiYW5kcm9pZDpmcmFnbWVudHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfSURTX0tFWSA9ICJhbmRyb2lkOnNhdmVkRGlhbG9nSWRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HU19UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfS0VZX1BSRUZJWCA9ICJhbmRyb2lkOmRpYWxvZ18iOwpAQCAtNjI4LDE4ICs2MzMsMjggQEAKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudDsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eUluZm8gbUFjdGl2aXR5SW5mbzsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKLSAgICAvKnBhY2thZ2UqLyBPYmplY3QgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgLypwYWNrYWdlKi8gSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKICAgICBBY3Rpdml0eSBtUGFyZW50OwogICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdW1lZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQ7CiAgICAgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgYm9vbGVhbiBtU3RhcnRlZEFjdGl2aXR5OworICAgIC8qKiB0cnVlIGlmIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gcmVjcmVhdGUgaXQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uICovCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGludCBtQ29uZmlnQ2hhbmdlRmxhZ3M7CiAgICAgLypwYWNrYWdlKi8gQ29uZmlndXJhdGlvbiBtQ3VycmVudENvbmZpZzsKICAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgbVNlYXJjaE1hbmFnZXI7CiAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW47CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzOworICAgICAgICBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4gbG9hZGVyczsKKyAgICB9CisgICAgLyogcGFja2FnZSAqLyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKKyAgICAKICAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OwogCiAgICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwpAQCAtNjQ3LDEwICs2NjIsMTYgQEAKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1XaW5kb3dBZGRlZCA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tU2VydmVyID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21DbGllbnQgPSB0cnVlOworICAgIC8qcGFja2FnZSovIEFjdGlvbkJhckltcGwgbUFjdGlvbkJhciA9IG51bGw7CiAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CiAgICAgcHJpdmF0ZSBpbnQgbVRpdGxlQ29sb3IgPSAwOwogCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VyIG1GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgCisgICAgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYW5hZ2VkQ3Vyc29yIHsKICAgICAgICAgTWFuYWdlZEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwpAQCAtNjc3LDcgKzY5OCw3IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NUQVRFX1NFVCA9IHtjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3RhdGVfZm9jdXNlZH07CiAKICAgICBwcml2YXRlIFRocmVhZCBtVWlUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKIAogICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKICAgICAvKgpAQCAtNzQ4LDYgKzc2OSwzMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBnZXRMb2FkZXJNYW5hZ2VyKC0xLCBtU3RhcnRlZCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgTG9hZGVyTWFuYWdlckltcGwgZ2V0TG9hZGVyTWFuYWdlcihpbnQgaW5kZXgsIGJvb2xlYW4gc3RhcnRlZCwgYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+KCk7CisgICAgICAgIH0KKyAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGxtID09IG51bGwgJiYgY3JlYXRlKSB7CisgICAgICAgICAgICBsbSA9IG5ldyBMb2FkZXJNYW5hZ2VySW1wbChzdGFydGVkKTsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5wdXQoaW5kZXgsIGxtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG07CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I2dldEN1cnJlbnRGb2N1c30gb24gdGhlCiAgICAgICogV2luZG93IG9mIHRoaXMgQWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjdXJyZW50bHkgZm9jdXNlZCB2aWV3LgogICAgICAqIApAQCAtODAxLDYgKzg0NiwxNSBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgbVZpc2libGVGcm9tQ2xpZW50ID0gIW1XaW5kb3cuZ2V0V2luZG93U3R5bGUoKS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb0Rpc3BsYXksIGZhbHNlKTsKKyAgICAgICAgaWYgKG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMubG9hZGVyczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhcmNlbGFibGUgcCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcpOworICAgICAgICAgICAgbUZyYWdtZW50cy5yZXN0b3JlQWxsU3RhdGUocCwgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuZnJhZ21lbnRzIDogbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaENyZWF0ZSgpOwogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTkzMyw2ICs5ODcsMTMgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gZ2V0TG9hZGVyTWFuYWdlcigtMSwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA4NSw2ICsxMTQ2LDEwIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFdJTkRPV19ISUVSQVJDSFlfVEFHLCBtV2luZG93LnNhdmVIaWVyYXJjaHlTdGF0ZSgpKTsKKyAgICAgICAgUGFyY2VsYWJsZSBwID0gbUZyYWdtZW50cy5zYXZlQWxsU3RhdGUoKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHLCBwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQwNyw3ICsxNDcyLDggQEAKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5hY3Rpdml0eSA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQ2Myw4ICsxNTI5LDkgQEAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IHJldHVybmVkIGJ5CiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpfQogICAgICAqLwotICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmNoaWxkcmVuIDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDc4LDExICsxNTQ1LDY4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICAKKyAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKSB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eSA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBtRnJhZ21lbnRzLnJldGFpbk5vbkNvbmZpZygpOworICAgICAgICBib29sZWFuIHJldGFpbkxvYWRlcnMgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwcnVuZSBvdXQgYW55IGxvYWRlciBtYW5hZ2VycyB0aGF0IHdlcmUgYWxyZWFkeSBzdG9wcGVkIGFuZCBzbworICAgICAgICAgICAgLy8gaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byByZXRhaW4uCisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAobG0ubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICByZXRhaW5Mb2FkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsbS5kb0Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsICYmICFyZXRhaW5Mb2FkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBuY2kgPSBuZXcgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICBuY2kuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgbmNpLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgICAgIG5jaS5mcmFnbWVudHMgPSBmcmFnbWVudHM7CisgICAgICAgIG5jaS5sb2FkZXJzID0gbUFsbExvYWRlck1hbmFnZXJzOworICAgICAgICByZXR1cm4gbmNpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2VyaWVzIG9mIGVkaXQgb3BlcmF0aW9ucyBvbiB0aGUgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gb3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrRW50cnkobUZyYWdtZW50cyk7CisgICAgfQorICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIC8vTG9nLnYoVEFHLCAiaW52YWxpZGF0ZUZyYWdtZW50SW5kZXg6IGluZGV4PSIgKyBpbmRleCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG0uZG9EZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIEZyYWdtZW50IGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoaXMgYWN0aXZpdHksIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgdGhlIGNhbGwgdG8gaXRzIHtAbGluayBGcmFnbWVudCNvbkF0dGFjaCBGcmFnbWVudC5vbkF0dGFjaCgpfQorICAgICAqIG1ldGhvZCBhbmQgYmVmb3JlIHtAbGluayBGcmFnbWVudCNvbkNyZWF0ZSBGcmFnbWVudC5vbkNyZWF0ZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFdyYXBwZXIgYXJvdW5kCiAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKX0KICAgICAgKiB0aGF0IGdpdmVzIHRoZSByZXN1bHRpbmcge0BsaW5rIEN1cnNvcn0gdG8gY2FsbApAQCAtMTU0NCw0MCArMTY2OCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHBlciBhcm91bmQge0BsaW5rIEN1cnNvciNjb21taXRVcGRhdGVzKCl9IHRoYXQgdGFrZXMgY2FyZSBvZiBub3RpbmcKLSAgICAgKiB0aGF0IHRoZSBDdXJzb3IgbmVlZHMgdG8gYmUgcmVxdWVyaWVkLiAgWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluCi0gICAgICoge0BsaW5rICNvblBhdXNlfSBvciB7QGxpbmsgI29uU3RvcH0gdG8gaGF2ZSB0aGUgc3lzdGVtIGNhbGwKLSAgICAgKiB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UgaWYgdGhlIGFjdGl2aXR5IGlzIGxhdGVyIHJlc3VtZWQuICBUaGlzCi0gICAgICogYWxsb3dzIHlvdSB0byBhdm9pZCBkZXRlcm1pbmcgd2hlbiB0byBkbyB0aGUgcmVxdWVyeSB5b3Vyc2VsZiAod2hpY2ggaXMKLSAgICAgKiByZXF1aXJlZCBmb3IgdGhlIEN1cnNvciB0byBzZWUgYW55IGRhdGEgY2hhbmdlcyB0aGF0IHdlcmUgY29tbWl0dGVkIHdpdGgKLSAgICAgKiBpdCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB3aG9zZSBjaGFuZ2VzIGFyZSB0byBiZSBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHNlZSAjbWFuYWdlZFF1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCi0gICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgotICAgICAqIEBzZWUgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKQotICAgICAqIEBzZWUgQ3Vyc29yI3JlcXVlcnkKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgbWFuYWdlZENvbW1pdFVwZGF0ZXMoQ3Vyc29yIGMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNYW5hZ2VkQ3Vyc29yIG1jID0gbU1hbmFnZWRDdXJzb3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobWMubUN1cnNvciA9PSBjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ3Vyc29yICIgKyBjICsgIiBpcyBub3QgY3VycmVudGx5IG1hbmFnZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWN0aXZpdHkgdG8gdGFrZSBjYXJlIG9mIG1hbmFnaW5nIHRoZSBnaXZlbgogICAgICAqIHtAbGluayBDdXJzb3J9J3MgbGlmZWN5Y2xlIGZvciB5b3UgYmFzZWQgb24gdGhlIGFjdGl2aXR5J3MgbGlmZWN5Y2xlLgogICAgICAqIFRoYXQgaXMsIHdoZW4gdGhlIGFjdGl2aXR5IGlzIHN0b3BwZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKQEAgLTE2NTUsNyArMTc0NSw1MCBAQAogICAgIHB1YmxpYyBWaWV3IGZpbmRWaWV3QnlJZChpbnQgaWQpIHsKICAgICAgICAgcmV0dXJuIGdldFdpbmRvdygpLmZpbmRWaWV3QnlJZChpZCk7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhpcyBhY3Rpdml0eSdzIEFjdGlvbkJhci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEFjdGl2aXR5J3MgQWN0aW9uQmFyLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25CYXIgZ2V0QWN0aW9uQmFyKCkgeworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CisgICAgICAgIHJldHVybiBtQWN0aW9uQmFyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFjdGlvbkJhciwgbG9jYXRlcyB0aGUgaW5mbGF0ZWQgQWN0aW9uQmFyVmlldywKKyAgICAgKiBpbml0aWFsaXplcyB0aGUgQWN0aW9uQmFyIHdpdGggdGhlIHZpZXcsIGFuZCBzZXRzIG1BY3Rpb25CYXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRBY3Rpb25CYXIoKSB7CisgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBnZXRXaW5kb3coKTsKKyAgICAgICAgaWYgKGlzQ2hpbGQoKSB8fCAhd2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikgfHwgbUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1BY3Rpb25CYXIgPSBuZXcgQWN0aW9uQmFySW1wbCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBpZCBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHRoZSBjb250YWluZXIgSUQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBvbmx5CisgICAgICogcmV0dXJucyBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5VGFnKHRhZyk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgYWN0aXZpdHkgY29udGVudCBmcm9tIGEgbGF5b3V0IHJlc291cmNlLiAgVGhlIHJlc291cmNlIHdpbGwgYmUKICAgICAgKiBpbmZsYXRlZCwgYWRkaW5nIGFsbCB0b3AtbGV2ZWwgdmlld3MgdG8gdGhlIGFjdGl2aXR5LgpAQCAtMTY2NCw2ICsxNzk3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhpbnQgbGF5b3V0UmVzSUQpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcobGF5b3V0UmVzSUQpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjc1LDYgKzE4MDksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KFZpZXcgdmlldykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4Nyw2ICsxODIyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KHZpZXcsIHBhcmFtcyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OTgsNiArMTgzNCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5hZGRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTIxLDEyICsyMDU4LDU5IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKSB7CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2sobnVsbCwgLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCBmcmFnbWVudCB0cmFuc2l0aW9uIGZyb20gdGhlIGxvY2FsIGFjdGl2aXR5J3MgZnJhZ21lbnQKKyAgICAgKiBiYWNrIHN0YWNrLiAgSWYgdGhlcmUgaXMgbm90aGluZyB0byBwb3AsIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBuYW1lIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgcHJldmlvdXMgYmFjayBzdGF0ZQorICAgICAqIHRvIGxvb2sgZm9yOyBpZiBmb3VuZCwgYWxsIHN0YXRlcyB1cCB0byB0aGF0IHN0YXRlIHdpbGwgYmUgcG9wcGVkLiAgVGhlCisgICAgICoge0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9IGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICogdGhlIG5hbWVkIHN0YXRlIGl0c2VsZiBpcyBwb3BwZWQuIElmIG51bGwsIG9ubHkgdGhlIHRvcCBzdGF0ZSBpcyBwb3BwZWQuCisgICAgICogQHBhcmFtIGZsYWdzIEVpdGhlciAwIG9yIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2tTdGF0ZShtSGFuZGxlciwgbmFtZSwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2tTdGF0ZShtSGFuZGxlciwgaWQsIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGhhcyBkZXRlY3RlZCB0aGUgdXNlcidzIHByZXNzIG9mIHRoZSBiYWNrCiAgICAgICoga2V5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGZpbmlzaGVzIHRoZSBjdXJyZW50IGFjdGl2aXR5LAogICAgICAqIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZG8gd2hhdGV2ZXIgeW91IHdhbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKLSAgICAgICAgZmluaXNoKCk7CisgICAgICAgIGlmICghcG9wQmFja1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjE2NCw3ICsyMzQ4LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdyA9IG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBzaG93IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShtZW51LCBnZXRNZW51SW5mbGF0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gc2hvdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjE4MSw2ICsyMzY3LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVQYW5lbChpbnQgZmVhdHVyZUlkLCBWaWV3IHZpZXcsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbWVudSAhPSBudWxsKSB7CiAgICAgICAgICAgICBib29sZWFuIGdvZm9yaXQgPSBvblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGdvZm9yaXQgfD0gbUZyYWdtZW50cy5kaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICAgICAgICAgIHJldHVybiBnb2Zvcml0ICYmIG1lbnUuaGFzVmlzaWJsZUl0ZW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yMjExLDExICsyMzk4LDE3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBjYWxsIHRocm91Z2ggdG8gc3VwZXJjbGFzcydzIGltcGxtZWVudGF0aW9uIG9mIGVhY2gKICAgICAgICAgICAgICAgICAvLyBvZiB0aGVzZSBtZXRob2RzIGJlbG93CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMCwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfQ09OVEVYVF9NRU5VOgogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDEsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMzQsNiArMjQyNyw3IEBACiAgICAgcHVibGljIHZvaWQgb25QYW5lbENsb3NlZChpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTDoKKyAgICAgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgb25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKQEAgLTIyNDQsNiArMjQzOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhhdCB0aGUgb3B0aW9ucyBtZW51IGhhcyBjaGFuZ2VkLCBzbyBzaG91bGQgYmUgcmVjcmVhdGVkLgorICAgICAqIFRoZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aGUgbmV4dAorICAgICAqIHRpbWUgaXQgbmVlZHMgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKICAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4KICAgICAgKiAKQEAgLTMwODUsNiArMzI4OCwzNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpbiB0aGlzIGFjdGl2aXR5IGNhbGxzIGl0cyAKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eX0gb3Ige0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHR9CisgICAgICogbWV0aG9kLgorICAgICAqIAorICAgICAqIDxwPlRoaXMgbWV0aG9kIHRocm93cyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb259CisgICAgICogaWYgdGhlcmUgd2FzIG5vIEFjdGl2aXR5IGZvdW5kIHRvIHJ1biB0aGUgZ2l2ZW4gSW50ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHkgCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEludGVudCBpbnRlbnQsIAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgIGlmIChhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCisgICAgICAgICAgICAgICAgbVRva2VuLCBmcmFnbWVudC5tV2hvLCByZXF1ZXN0Q29kZSwKKyAgICAgICAgICAgICAgICBhci5nZXRSZXN1bHRDb2RlKCksIGFyLmdldFJlc3VsdERhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eUZyb21DaGlsZChBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwgYnV0CiAgICAgICogdGFraW5nIGEgSW50ZW50U2VuZGVyOyBzZWUKICAgICAgKiB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQpfQpAQCAtMzI0Myw2ICszNDc2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhpcyBhY3Rpdml0eSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYmUKKyAgICAgKiByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBUaGlzIGlzIG9mdGVuIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uU3RvcH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgb3Igd2lsbCBiZSBwYXNzZWQKKyAgICAgKiBvbiB0byB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgdmlhIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCisgICAgICogCisgICAgICogQHJldHVybiBJZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgdG9ybiBkb3duIGluIG9yZGVyIHRvIGJlIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24sCisgICAgICogcmV0dXJucyB0cnVlOyBlbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHdoZW4geW91ciBhY3Rpdml0eSBpcyBkb25lIGFuZCBzaG91bGQgYmUgY2xvc2VkLiAgVGhlCiAgICAgICogQWN0aXZpdHlSZXN1bHQgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHdob2V2ZXIgbGF1bmNoZWQgeW91IHZpYQogICAgICAqIG9uQWN0aXZpdHlSZXN1bHQoKS4KQEAgLTMzNDMsOCArMzU4OSw3IEBACiAgICAgICogQHNlZSAjY3JlYXRlUGVuZGluZ1Jlc3VsdAogICAgICAqIEBzZWUgI3NldFJlc3VsdChpbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLAotICAgICAgICAgICAgSW50ZW50IGRhdGEpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzI4LDE1ICszOTczLDY5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KLSAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4gIFRoaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBudWxsIGZvciBhbGwgdmlldyBuYW1lcy4KKyAgICAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgorICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyA8ZnJhZ21lbnQ+IHRhZ3MgdG8gZW1iZWQgZnJhZ21lbnRzIGluc2lkZQorICAgICAqIG9mIHRoZSBhY3Rpdml0eS4KICAgICAgKgogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyI2NyZWF0ZVZpZXcKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0TGF5b3V0SW5mbGF0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoISJmcmFnbWVudCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gCisgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50KTsKKyAgICAgICAgU3RyaW5nIGZuYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfbmFtZSk7CisgICAgICAgIGludCBpZCA9IGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9pZCwgMCk7CisgICAgICAgIFN0cmluZyB0YWcgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF90YWcpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IE11c3Qgc3BlY2lmeSB1bmlxdWUgYW5kcm9pZDppZCBmb3IgIiArIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHdlIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSwgd2UgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAgICAgLy8gaW5zdGFudGlhdGVkIHRoaXMgZnJhZ21lbnQgZnJvbSB0aGUgc3RhdGUgYW5kIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIHRoYXQgaW5zdGFuY2UgaW5zdGVhZCBvZiBtYWtpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlci5ERUJVRykgTG9nLnYoVEFHLCAib25DcmVhdGVWaWV3OiBpZD0weCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArICIgZm5hbWU9IiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBleGlzdGluZz0iICsgZnJhZ21lbnQpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudCA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZuYW1lKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tRnJvbUxheW91dCA9IHRydWU7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50SWQgPSBpZDsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVGFnID0gdGFnOworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IHRoaXM7CisgICAgICAgICAgICAgICAgbUZyYWdtZW50cy5hZGRGcmFnbWVudChmcmFnbWVudCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZyYWdtZW50IGlzIG5ld2x5IGluc3RhbnRpYXRlZCAoZWl0aGVyIHJpZ2h0IG5vdywgb3IKKyAgICAgICAgICAgIC8vIGZyb20gbGFzdCBzYXZlZCBzdGF0ZSksIHRoZW4gZ2l2ZSBpdCB0aGUgYXR0cmlidXRlcyB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBpdHNlbGYuCisgICAgICAgICAgICBpZiAoIWZyYWdtZW50Lm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5vbkluZmxhdGUodGhpcywgYXR0cnMsIGZyYWdtZW50Lm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNyZWF0ZSBhIHZpZXcuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRJZChpZCk7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcuZ2V0VGFnKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFRhZyh0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50Lm1WaWV3OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IEVycm9yIGluZmxhdGluZyBmcmFnbWVudCAiICsgZm5hbWUpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3NzksNiArNDA3OCwyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjb250ZXh0IG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIG1hbmFnZSBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGlzIGNvbnRleHQgbW9kZQorICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREZWNvclZpZXcoKS5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgCiAgICAgZmluYWwgdm9pZCBzZXRQYXJlbnQoQWN0aXZpdHkgcGFyZW50KSB7CkBAIC0zNzg3LDI4ICs0MTA2LDMwIEBACiAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywgQ2hhclNlcXVlbmNlIHRpdGxlLCAKLSAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKKyAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIGluc3RyLCB0b2tlbiwgMCwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsIHBhcmVudCwgaWQsCi0gICAgICAgICAgICBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBudWxsLCBjb25maWcpOworICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsIGNvbmZpZyk7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgYXR0YWNoKENvbnRleHQgY29udGV4dCwgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCwKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwgaW50IGlkZW50LAogICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBpbmZvLAogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlLCBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLAorICAgICAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaEJhc2VDb250ZXh0KGNvbnRleHQpOwogCisgICAgICAgIG1GcmFnbWVudHMuYXR0YWNoQWN0aXZpdHkodGhpcyk7CisgICAgICAgIAogICAgICAgICBtV2luZG93ID0gUG9saWN5TWFuYWdlci5tYWtlTmV3V2luZG93KHRoaXMpOwogICAgICAgICBtV2luZG93LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtV2luZG93LmdldExheW91dEluZmxhdGVyKCkuc2V0RmFjdG9yeSh0aGlzKTsKICAgICAgICAgaWYgKGluZm8uc29mdElucHV0TW9kZSAhPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX1NUQVRFX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldFNvZnRJbnB1dE1vZGUoaW5mby5zb2Z0SW5wdXRNb2RlKTsKICAgICAgICAgfQogICAgICAgICBtVWlUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCisgICAgICAgIAogICAgICAgICBtTWFpblRocmVhZCA9IGFUaHJlYWQ7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBpbnN0cjsKICAgICAgICAgbVRva2VuID0gdG9rZW47CkBAIC0zODIwLDEwICs0MTQxLDEwIEBACiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgICAgICBtUGFyZW50ID0gcGFyZW50OwogICAgICAgICBtRW1iZWRkZWRJRCA9IGlkOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKKyAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAKLSAgICAgICAgbVdpbmRvdy5zZXRXaW5kb3dNYW5hZ2VyKG51bGwsIG1Ub2tlbiwgbUNvbXBvbmVudC5mbGF0dGVuVG9TdHJpbmcoKSk7CisgICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgKGluZm8uZmxhZ3MgJiBBY3Rpdml0eUluZm8uRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCkgIT0gMCk7CiAgICAgICAgIGlmIChtUGFyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1XaW5kb3cuc2V0Q29udGFpbmVyKG1QYXJlbnQuZ2V0V2luZG93KCkpOwogICAgICAgICB9CkBAIC0zODM1LDE0ICs0MTU2LDI2IEBACiAgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LmdldEFjdGl2aXR5VG9rZW4oKSA6IG1Ub2tlbjsKICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIHBlcmZvcm1DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBvbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCk7CisgICAgfQorICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVN0YXJ0KCkgewogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdGFydCh0aGlzKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBtQ29tcG9uZW50LnRvU2hvcnRTdHJpbmcoKSArCiAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKICAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RhcnQoKTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdGFydCgpIHsKQEAgLTM4NTEsNyArNDE4NCwxMCBAQAogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwogICAgICAgICAgICAgICAgIGlmIChtYy5tUmVsZWFzZWQgfHwgbWMubVVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWMubUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWMubUN1cnNvci5yZXF1ZXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtYy5tUmVsZWFzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbWMubVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CkBAIC0zODc0LDcgKzQyMTAsOSBAQAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3VtZSgpIHsKICAgICAgICAgcGVyZm9ybVJlc3RhcnQoKTsKICAgICAgICAgCi0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKKyAgICAgICAgCisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgIAogICAgICAgICAvLyBGaXJzdCBjYWxsIG9uUmVzdW1lKCkgLWJlZm9yZS0gc2V0dGluZyBtUmVzdW1lZCwgc28gd2UgZG9uJ3QKICAgICAgICAgLy8gc2VuZCBvdXQgYW55IHN0YXR1cyBiYXIgLyBtZW51IG5vdGlmaWNhdGlvbnMgdGhlIGNsaWVudCBtYWtlcy4KQEAgLTM4ODksNiArNDIyNywxMCBAQAogICAgICAgICAvLyBOb3cgcmVhbGx5IHJlc3VtZSwgYW5kIGluc3RhbGwgdGhlIGN1cnJlbnQgc3RhdHVzIGJhciBhbmQgbWVudS4KICAgICAgICAgbVJlc3VtZWQgPSB0cnVlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUmVzdW1lKCk7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CisgICAgICAgIAogICAgICAgICBvblBvc3RSZXN1bWUoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCkBAIC0zODk4LDYgKzQyNDAsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVBhdXNlKCkgeworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUGF1c2UoKTsKICAgICAgICAgb25QYXVzZSgpOwogICAgIH0KICAgICAKQEAgLTM5MDcsMTEgKzQyNTAsMjQgQEAKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAoIW1TdG9wcGVkKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbG9zZUFsbFBhbmVscygpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RvcCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RvcCh0aGlzKTsKICAgICAgICAgICAgIGlmICghbUNhbGxlZCkgewpAQCAtMzkzNiw2ICs0MjkyLDE0IEBACiAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtRGVzdHJveSgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaERlc3Ryb3koKTsKKyAgICAgICAgb25EZXN0cm95KCk7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKICAgICAgICAgcmV0dXJuIG1SZXN1bWVkOwogICAgIH0KQEAgLTM5NDcsNiArNDMxMSwxMSBAQAogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CiAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudCBmcmFnID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVdobyh3aG8pOworICAgICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWcub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggOWE1NWE2Zi4uYTkzMTg0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTI5NSw2ICsxMjk1LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBkdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChyZXMgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yODc1LDYgKzI4ODgsMjggQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvY2Vzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IGM4OGUwODYuLjFjOGM3M2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKQEAgLTE5NSw4ICsxOTYsNyBAQAogICAgICAgICBXaW5kb3cgd2luZG93OwogICAgICAgICBBY3Rpdml0eSBwYXJlbnQ7CiAgICAgICAgIFN0cmluZyBlbWJlZGRlZElEOwotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBib29sZWFuIHBhdXNlZDsKICAgICAgICAgYm9vbGVhbiBzdG9wcGVkOwogICAgICAgICBib29sZWFuIGhpZGVGb3JOb3c7CkBAIC0zNTcsMTEgKzM1NywxNiBAQAogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wSGVhcERhdGEgeworICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvblRocmVhZCBleHRlbmRzIEFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVBfQ09MVU1OID0gIiUxN3MgJThzICU4cyAlOHMgJThzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9DT1VOVF9DT0xVTU4gPSAiJTE3cyAlOGQiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFdPX0NPVU5UX0NPTFVNTlMgPSAiJTE3cyAlOGQgJTE3cyAlOGQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOGQgJThkICUxMGQgICVzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJTRkICU2ZCAlOGQgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC02MjQsNiArNjI5LDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTc2MSw3ICs3NzMsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTIsMTEgKzgyNCwxMiBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTBzICAlcyIsICJQYWdlc2l6ZSIsICJEYnNpemUiLCAiTG9va2FzaWRlIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlNHMgJTZzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAibGthc2lkZSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04NzQsNiArODg3LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0pJVCAgICAgICAgICAgICAgPSAxMzI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUID0gMTMzOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkFTSCAgICAgICAgICA9IDEzNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9IRUFQICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgICAgIFN0cmluZyBjb2RlVG9TdHJpbmcoaW50IGNvZGUpIHsKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKQEAgLTkxMiw2ICs5MjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRV9KSVQ6IHJldHVybiAiRU5BQkxFX0pJVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1Q6IHJldHVybiAiRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOiByZXR1cm4gIlNDSEVEVUxFX0NSQVNIIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6IHJldHVybiAiRFVNUF9IRUFQIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gIih1bmtub3duKSI7CkBAIC0xMDM3LDEzICsxMDUyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBtYXliZVNuYXBzaG90KCkgewogICAgICAgICAgICAgaWYgKG1Cb3VuZEFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSAqcHJpdmF0ZSogQWN0aXZpdHlUaHJlYWQuUGFja2FnZUluZm8gdG8gKnB1YmxpYyoga25vd24KKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQm91bmRBcHBsaWNhdGlvbi5pbmZvLm1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldFN5c3RlbUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBpZihwbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgUGFja2FnZU1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBwYWNrYWdlIGluZm8gZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDM0LDcgKzE0NzEsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCiAgICAgICAgIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8sIElCaW5kZXIgdG9rZW4sIEJ1bmRsZSBzdGF0ZSwKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcykgewogICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbmV3IEFjdGl2aXR5Q2xpZW50UmVjb3JkKCk7CiAgICAgICAgICAgICByLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICByLmlkZW50ID0gMDsKQEAgLTE0NDMsNyArMTQ4MCw3IEBACiAgICAgICAgICAgICByLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCA9IGlkOwogICAgICAgICAgICAgci5hY3Rpdml0eUluZm8gPSBhY3Rpdml0eUluZm87Ci0gICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBuYW1lID0gaW50ZW50LmdldENvbXBvbmVudCgpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNTY1LDE0ICsxNjAyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUgKyAiIHdpdGggY29uZmlnICIgKyBjb25maWcpOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5LmF0dGFjaChhcHBDb250ZXh0LCB0aGlzLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgci50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWRlbnQsIGFwcCwgci5pbnRlbnQsIHIuYWN0aXZpdHlJbmZvLCB0aXRsZSwgci5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywgY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdXN0b21JbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tSW50ZW50ID0gY3VzdG9tSW50ZW50OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkubVN0YXJ0ZWRBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB0aGVtZSA9IHIuYWN0aXZpdHlJbmZvLmdldFRoZW1lUmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gMCkgewpAQCAtMjU0MSw2ICsyNTc2LDkgQEAKICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1GaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghci5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKQEAgLTI1ODEsOCArMjYxOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5yZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTI1OTEsMjIgKzI2MjksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldGFpbiBjaGlsZCBhY3Rpdml0aWVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25EZXN0cm95KHIuYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIGlmICghci5hY3Rpdml0eS5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpICsKQEAgLTMwMTgsNiArMzA0NCwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBoYW5kbGVEdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIER1bXBIZWFwRGF0YSBkaGQpIHsKKyAgICAgICAgaWYgKG1hbmFnZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGVidWcuZHVtcEhwcm9mRGF0YShkaGQucGF0aCwgZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNYW5hZ2VkIGhlYXAgZHVtcCBmYWlsZWQgb24gcGF0aCAiICsgZGhkLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBjYW4gdGhlIHByb2Nlc3MgYWNjZXNzIHRoaXMgcGF0aD8iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGhkLmZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHByb2ZpbGUgZmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWJ1Zy5kdW1wTmF0aXZlSGVhcChkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCB2b2lkIGhhbmRsZURpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgewogICAgICAgICBib29sZWFuIGhhc1BrZ0luZm8gPSBmYWxzZTsKICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDIzODI1OTYuLjFlMDEyZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGNhbmRpZGF0ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KERFRkFVTFRfRVJST1JfUkVDRUlWRVJfUFJPUEVSVFkpOwogICAgICAgICByZXR1cm4gZ2V0RXJyb3JSZXBvcnRSZWNlaXZlcihwbSwgcGFja2FnZU5hbWUsIGNhbmRpZGF0ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFjdGl2aXR5IGluIHJlY2VpdmVyUGFja2FnZSB0aGF0IGhhbmRsZXMgQUNUSU9OX0FQUF9FUlJPUi4KICAgICAgKgpAQCAtNTgxLDYgKzU4MSw5IEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfQkFUVEVSWToKICAgICAgICAgICAgICAgICBiYXR0ZXJ5SW5mby5kdW1wKHB3LCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1JVTk5JTkdfU0VSVklDRToKKyAgICAgICAgICAgICAgICBydW5uaW5nU2VydmljZUluZm8uZHVtcChwdywgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uZGMyMTQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMTcgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODQwLDIyIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzYjg2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoRnJhZ21lbnRNYW5hZ2VyIGZtLCBCYWNrU3RhY2tFbnRyeSBic2UpIHsKKyAgICAgICAgaW50IG51bVJlbW92ZWQgPSAwOworICAgICAgICBCYWNrU3RhY2tFbnRyeS5PcCBvcCA9IGJzZS5tSGVhZDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIG51bVJlbW92ZWQgKz0gb3AucmVtb3ZlZC5zaXplKCk7CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbU9wcyA9IG5ldyBpbnRbYnNlLm1OdW1PcCo1ICsgbnVtUmVtb3ZlZF07CisgICAgICAgIAorICAgICAgICBvcCA9IGJzZS5tSGVhZDsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmNtZDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZnJhZ21lbnQubUluZGV4OworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gb3AucmVtb3ZlZC5zaXplKCk7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSBOOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5yZW1vdmVkLmdldChpKS5tSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3BzW3BvcysrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSBic2UubVRyYW5zaXRpb247CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBic2UubVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgbU5hbWUgPSBic2UubU5hbWU7CisgICAgICAgIG1JbmRleCA9IGJzZS5tSW5kZXg7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbU9wcyA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1UcmFuc2l0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gaW4ucmVhZEludCgpOworICAgICAgICBtTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkgaW5zdGFudGlhdGUoRnJhZ21lbnRNYW5hZ2VyIGZtKSB7CisgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IG5ldyBCYWNrU3RhY2tFbnRyeShmbSk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAocG9zIDwgbU9wcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5Lk9wIG9wID0gbmV3IEJhY2tTdGFja0VudHJ5Lk9wKCk7CisgICAgICAgICAgICBvcC5jbWQgPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nKys7CisgICAgICAgICAgICBvcC5mcmFnbWVudCA9IGY7CisgICAgICAgICAgICBvcC5lbnRlckFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIG9wLmV4aXRBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KE4pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZC5hZGQoZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic2UuYWRkT3Aob3ApOworICAgICAgICB9CisgICAgICAgIGJzZS5tVHJhbnNpdGlvbiA9IG1UcmFuc2l0aW9uOworICAgICAgICBic2UubVRyYW5zaXRpb25TdHlsZSA9IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIGJzZS5tTmFtZSA9IG1OYW1lOworICAgICAgICBic2UubUluZGV4ID0gbUluZGV4OworICAgICAgICByZXR1cm4gYnNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobU9wcyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb24pOworICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1OYW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtSW5kZXgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxCYWNrU3RhY2tTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJhY2tTdGFja1N0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEBoaWRlIEVudHJ5IG9mIGFuIG9wZXJhdGlvbiBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjay4KKyAqLworZmluYWwgY2xhc3MgQmFja1N0YWNrRW50cnkgaW1wbGVtZW50cyBGcmFnbWVudFRyYW5zYWN0aW9uLCBSdW5uYWJsZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmFja1N0YWNrRW50cnkiOworICAgIAorICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBtTWFuYWdlcjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX05VTEwgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFUExBQ0UgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNT1ZFID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0hJREUgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hPVyA9IDU7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9wIHsKKyAgICAgICAgT3AgbmV4dDsKKyAgICAgICAgT3AgcHJldjsKKyAgICAgICAgaW50IGNtZDsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgICAgIGludCBlbnRlckFuaW07CisgICAgICAgIGludCBleGl0QW5pbTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZW1vdmVkOworICAgIH0KKyAgICAKKyAgICBPcCBtSGVhZDsKKyAgICBPcCBtVGFpbDsKKyAgICBpbnQgbU51bU9wOworICAgIGludCBtRW50ZXJBbmltOworICAgIGludCBtRXhpdEFuaW07CisgICAgaW50IG1UcmFuc2l0aW9uOworICAgIGludCBtVHJhbnNpdGlvblN0eWxlOworICAgIGJvb2xlYW4gbUFkZFRvQmFja1N0YWNrOworICAgIFN0cmluZyBtTmFtZTsKKyAgICBib29sZWFuIG1Db21taXR0ZWQ7CisgICAgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkoRnJhZ21lbnRNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZE9wKE9wIG9wKSB7CisgICAgICAgIGlmIChtSGVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1UYWlsID0gb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcC5wcmV2ID0gbVRhaWw7CisgICAgICAgICAgICBtVGFpbC5uZXh0ID0gb3A7CisgICAgICAgICAgICBtVGFpbCA9IG9wOworICAgICAgICB9CisgICAgICAgIG9wLmVudGVyQW5pbSA9IG1FbnRlckFuaW07CisgICAgICAgIG9wLmV4aXRBbmltID0gbUV4aXRBbmltOworICAgICAgICBtTnVtT3ArKzsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKDAsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIG51bGwsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQWRkT3AoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcsIGludCBvcGNtZCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IGFscmVhZHkgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVRhZyAhPSBudWxsICYmICF0YWcuZXF1YWxzKGZyYWdtZW50Lm1UYWcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIHRhZyBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tVGFnCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gMCAmJiBmcmFnbWVudC5tRnJhZ21lbnRJZCAhPSBjb250YWluZXJWaWV3SWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBjaGFuZ2UgY29udGFpbmVyIElEIG9mIGZyYWdtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnJhZ21lbnQgKyAiOiB3YXMgIiArIGZyYWdtZW50Lm1GcmFnbWVudElkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyBjb250YWluZXJWaWV3SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubUNvbnRhaW5lcklkID0gZnJhZ21lbnQubUZyYWdtZW50SWQgPSBjb250YWluZXJWaWV3SWQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IG9wY21kOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICByZXR1cm4gcmVwbGFjZShjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBpZiAoY29udGFpbmVyVmlld0lkID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3QgdXNlIG5vbi16ZXJvIGNvbnRhaW5lclZpZXdJZCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfUkVQTEFDRSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1JFTU9WRTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfSElERTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNob3coRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1NIT1c7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpIHsKKyAgICAgICAgbUVudGVyQW5pbSA9IGVudGVyOworICAgICAgICBtRXhpdEFuaW0gPSBleGl0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdGlvbikgeworICAgICAgICBtVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKSB7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBzdHlsZVJlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1BZGRUb0JhY2tTdGFjayA9IHRydWU7CisgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21taXQoKSB7CisgICAgICAgIGlmIChtQ29tbWl0dGVkKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21taXQgYWxyZWFkeSBjYWxsZWQiKTsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlci5ERUJVRykgTG9nLnYoVEFHLCAiQ29tbWl0OiAiICsgdGhpcyk7CisgICAgICAgIG1Db21taXR0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtSW5kZXggPSBtTWFuYWdlci5hbGxvY0JhY2tTdGFja0luZGV4KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgbU1hbmFnZXIuZW5xdWV1ZUFjdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VyLkRFQlVHKSBMb2cudihUQUcsICJSdW46ICIgKyB0aGlzKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIGlmIChtSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkVG9CYWNrU3RhY2soKSBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmFnZXIubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWFuYWdlci5tQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBtTWFuYWdlci5tQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXIuREVCVUcpIExvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUF9SRVBMQUNFOiBhZGRpbmc9IiArIGYgKyAiIG9sZD0iICsgb2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLm1Db250YWluZXJJZCA9PSBmLm1Db250YWluZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KG9sZCwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwgbVRyYW5zaXRpb24sCisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlICYmIG1NYW5hZ2VyLm1BY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFuYWdlci5tQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICBtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEJhY2tTdGFja1N0YXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHBvcEZyb21CYWNrU3RhY2soKSB7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXIuREVCVUcpIExvZy52KFRBRywgInBvcEZyb21CYWNrU3RhY2s6ICIgKyB0aGlzKTsKKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbVRhaWw7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8b3AucmVtb3ZlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IG9sZCA9IG9wLnJlbW92ZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLm1CYWNrU3RhY2tOZXN0aW5nLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KG9sZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLnByZXY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwKKyAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgJiYgbU1hbmFnZXIubUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgbU1hbmFnZXIuZnJlZUJhY2tTdGFja0luZGV4KG1JbmRleCk7CisgICAgICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb25TdHlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IDNiZmM3ZTcuLjI3ODYzNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC01NiwxMSArNTYsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5RGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwpAQCAtODksNyArOTIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzLkZpbGVTdGF0dXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CkBAIC0xNjcsNiArMTcwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBUaHJvdHRsZU1hbmFnZXIgc1Rocm90dGxlTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBXaWZpTWFuYWdlciBzV2lmaU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYXRpb25NYW5hZ2VyIHNMb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnRyeURldGVjdG9yIHNDb3VudHJ5RGV0ZWN0b3I7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxGaWxlLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+IHNTaGFyZWRQcmVmcyA9CiAgICAgICAgICAgICBuZXcgSGFzaE1hcDxGaWxlLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+KCk7CiAKQEAgLTU0Miw2ICs1NDYsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCB0cnVlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShmLmdldFBhdGgoKSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgc2V0RmlsZVBlcm1pc3Npb25zRnJvbU1vZGUoZi5nZXRQYXRoKCksIG1vZGUsIDApOworICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgZmFsc2UpOwpAQCAtNjE5LDcgKzYzMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBJcyB0aGlzIHJlYWxseSB3aGF0IHlvdSB3YW50PyIpOwogICAgICAgICB9CiAgICAgICAgIG1NYWluVGhyZWFkLmdldEluc3RydW1lbnRhdGlvbigpLmV4ZWNTdGFydEFjdGl2aXR5KAotICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsIG51bGwsIGludGVudCwgLTEpOworICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsCisgICAgICAgICAgICAoQWN0aXZpdHkpbnVsbCwgaW50ZW50LCAtMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NDMsNiArOTU3LDggQEAKICAgICAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKTsKICAgICAgICAgfSBlbHNlIGlmIChMT0NBVElPTl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uTWFuYWdlcigpOworICAgICAgICB9IGVsc2UgaWYgKENPVU5UUllfREVURUNUT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnRyeURldGVjdG9yKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VBUkNIX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0U2VhcmNoTWFuYWdlcigpOwogICAgICAgICB9IGVsc2UgaWYgKFNFTlNPUl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewpAQCAtMTEwOSw2ICsxMTI1LDE3IEBACiAgICAgICAgIHJldHVybiBzTG9jYXRpb25NYW5hZ2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgQ291bnRyeURldGVjdG9yIGdldENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3luYykgeworICAgICAgICAgICAgaWYgKHNDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ09VTlRSWV9ERVRFQ1RPUik7CisgICAgICAgICAgICAgICAgSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlID0gSUNvdW50cnlEZXRlY3Rvci5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgICAgIHNDb3VudHJ5RGV0ZWN0b3IgPSBuZXcgQ291bnRyeURldGVjdG9yKHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzQ291bnRyeURldGVjdG9yOworICAgIH0KKwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBnZXRTZWFyY2hNYW5hZ2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVNlYXJjaE1hbmFnZXIgPT0gbnVsbCkgewpAQCAtMjc1Nyw2ICsyNzg0LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHYgPSAoU2V0PFN0cmluZz4pIG1NYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjc5OSw2ICsyODMzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKaW5kZXggZGE4YzllNS4uYjRjMTM4ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQpAQCAtMTYsMTggKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWN0aW9uQmFySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC0zNiwxMyArMzksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTc2LDYgKzc4LDcgQEAKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIFdpbmRvdyBtV2luZG93OwogICAgIFZpZXcgbURlY29yOworICAgIHByaXZhdGUgQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyOwogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzcsNiArMTgwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHtAbGluayBBY3Rpb25CYXJ9IGF0dGFjaGVkIHRvIHRoaXMgZGlhbG9nLCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyIGF0dGFjaGVkIHRvIHRoZSBkaWFsb2cgb3IgbnVsbCBpZiBubyBBY3Rpb25CYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgQWN0aXZpdHkgdGhhdCBvd25zIHRoaXMgZGlhbG9nLiBBbiBleGFtcGxlIHVzZTogVGhpcyBEaWFsb2cgd2lsbAogICAgICAqIHVzZSB0aGUgc3VnZ2VzdGVkIHZvbHVtZSBjb250cm9sIHN0cmVhbSBvZiB0aGUgQWN0aXZpdHkuCiAgICAgICogCkBAIC0yMjcsNiArMjM5LDExIEBACiAKICAgICAgICAgb25TdGFydCgpOwogICAgICAgICBtRGVjb3IgPSBtV2luZG93LmdldERlY29yVmlldygpOworCisgICAgICAgIGlmIChtQWN0aW9uQmFyID09IG51bGwgJiYgbVdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBsID0gbVdpbmRvdy5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGlmICgobC5zb2Z0SW5wdXRNb2RlCiAgICAgICAgICAgICAgICAgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0lTX0ZPUldBUkRfTkFWSUdBVElPTikgPT0gMCkgewpAQCAtODMyLDggKzg0OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2FpdGVkIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBnZXRBc3NvY2lhdGVkQWN0aXZpdHkoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU93bmVyQWN0aXZpdHk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWY2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgZGlhbG9nIHdpbmRvdywgZmxvYXRpbmcgb24gdG9wIG9mIGl0cworICogYWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgRGlhbG9nIG9iamVjdCwgd2hpY2ggaXQKKyAqIGRpc3BsYXlzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBmcmFnbWVudCdzIHN0YXRlLiAgQ29udHJvbCBvZgorICogdGhlIGRpYWxvZyAoZGVjaWRpbmcgd2hlbiB0byBzaG93LCBoaWRlLCBkaXNtaXNzIGl0KSBzaG91bGQgYmUgZG9uZSB0aHJvdWdoCisgKiB0aGUgQVBJIGhlcmUsIG5vdCB3aXRoIGRpcmVjdCBjYWxscyBvbiB0aGUgZGlhbG9nLgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfSB0byBzdXBwbHkgdGhlCisgKiBjb250ZW50IG9mIHRoZSBkaWFsb2cuICBBbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBvdmVycmlkZQorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgYW4gZW50aXJlbHkgY3VzdG9tIGRpYWxvZywgc3VjaAorICogYXMgYW4gQWxlcnREaWFsb2csIHdpdGggaXRzIG93biBjb250ZW50LgorICovCitwdWJsaWMgY2xhc3MgRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyLCBEaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjRGlhbG9nRnJhZ21lbnQoaW50LCBpbnQpfSBjb25zdHJ1Y3RvcjogYSBiYXNpYywKKyAgICAgKiBub3JtYWwgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PUk1BTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNEaWFsb2dGcmFnbWVudChpbnQsIGludCl9IGNvbnN0cnVjdG9yOiBkb24ndCBpbmNsdWRlCisgICAgICogYSB0aXRsZSBhcmVhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX1RJVExFID0gMTsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI0RpYWxvZ0ZyYWdtZW50KGludCwgaW50KX0gY29uc3RydWN0b3I6IGRvbid0IGRyYXcKKyAgICAgKiBhbnkgZnJhbWUgYXQgYWxsOyB0aGUgdmlldyBoaWVyYXJjaHkgcmV0dXJuZWQgYnkge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogaXMgZW50aXJlbHkgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19GUkFNRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNEaWFsb2dGcmFnbWVudChpbnQsIGludCl9IGNvbnN0cnVjdG9yOiBsaWtlCisgICAgICoge0BsaW5rICNTVFlMRV9OT19GUkFNRX0sIGJ1dCBhbHNvIGRpc2FibGVzIGFsbCBpbnB1dCB0byB0aGUgZGlhbG9nLgorICAgICAqIFRoZSB1c2VyIGNhbiBub3QgdG91Y2ggaXQsIGFuZCBpdHMgd2luZG93IHdpbGwgbm90IHJlY2VpdmUgaW5wdXQgZm9jdXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fSU5QVVQgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19TVEFURV9UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ1N0YXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfU1RZTEUgPSAiYW5kcm9pZDpzdHlsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1RIRU1FID0gImFuZHJvaWQ6dGhlbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9DQU5DRUxBQkxFID0gImFuZHJvaWQ6Y2FuY2VsYWJsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0JBQ0tfU1RBQ0tfSUQgPSAiYW5kcm9pZDpiYWNrU3RhY2tJZCI7CisKKyAgICBpbnQgbVN0eWxlID0gU1RZTEVfTk9STUFMOworICAgIGludCBtVGhlbWUgPSAwOworICAgIGJvb2xlYW4gbUNhbmNlbGFibGUgPSB0cnVlOworICAgIGludCBtQmFja1N0YWNrSWQgPSAtMTsKKworICAgIERpYWxvZyBtRGlhbG9nOworICAgIGJvb2xlYW4gbURlc3Ryb3llZDsKKworICAgIHB1YmxpYyBEaWFsb2dGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0byBjdXN0b21pemUgdGhlIGJhc2ljIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW9yIG9mIHRoZQorICAgICAqIGZyYWdtZW50J3MgZGlhbG9nLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3Igc29tZSBjb21tb24gZGlhbG9nIGJlaGF2aW9ycywKKyAgICAgKiB0YWtpbmcgY2FyZSBvZiBzZWxlY3RpbmcgZmxhZ3MsIHRoZW1lLCBhbmQgb3RoZXIgb3B0aW9ucyBmb3IgeW91LiAgVGhlCisgICAgICogc2FtZSBlZmZlY3QgY2FuIGJlIGFjaGlldmUgYnkgbWFudWFsbHkgc2V0dGluZyBEaWFsb2cgYW5kIFdpbmRvdworICAgICAqIGF0dHJpYnV0ZXMgeW91cnNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgU2VsZWN0cyBhIHN0YW5kYXJkIHN0eWxlOiBtYXkgYmUge0BsaW5rICNTVFlMRV9OT1JNQUx9LAorICAgICAqIHtAbGluayAjU1RZTEVfTk9fVElUTEV9LCB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0lOUFVUfS4KKyAgICAgKiBAcGFyYW0gdGhlbWUgT3B0aW9uYWwgY3VzdG9tIHRoZW1lLiAgSWYgMCwgYW4gYXBwcm9wcmlhdGUgdGhlbWUgKGJhc2VkCisgICAgICogb24gdGhlIHN0eWxlKSB3aWxsIGJlIHNlbGVjdGVkIGZvciB5b3UuCisgICAgICovCisgICAgcHVibGljIERpYWxvZ0ZyYWdtZW50KGludCBzdHlsZSwgaW50IHRoZW1lKSB7CisgICAgICAgIG1TdHlsZSA9IHN0eWxlOworICAgICAgICBpZiAobVN0eWxlID09IFNUWUxFX05PX0ZSQU1FIHx8IG1TdHlsZSA9PSBTVFlMRV9OT19JTlBVVCkgeworICAgICAgICAgICAgbVRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19Ob0ZyYW1lOworICAgICAgICB9CisgICAgICAgIGlmICh0aGVtZSAhPSAwKSB7CisgICAgICAgICAgICBtVGhlbWUgPSB0aGVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB0byB0aGUgZ2l2ZW4gYWN0aXZpdHkuICBUaGlzCisgICAgICogaXMgYSBjb252ZW5pZW5jZSBmb3IgZXhwbGljaXRseSBjcmVhdGluZyBhIHRyYW5zYWN0aW9uLCBhZGRpbmcgdGhlCisgICAgICogZnJhZ21lbnQgdG8gaXQgd2l0aCB0aGUgZ2l2ZW4gdGFnLCBhbmQgY29tbWl0dGluZyBpdC4gIFRoaXMgZG9lcworICAgICAqIDxlbT5ub3Q8L2VtPiBhZGQgdGhlIHRyYW5zYWN0aW9uIHRvIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBkaXNtaXNzZWQsIGEgbmV3IHRyYW5zYWN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdG8gcmVtb3ZlIGl0IGZyb20KKyAgICAgKiB0aGUgYWN0aXZpdHkuCisgICAgICogQHBhcmFtIGFjdGl2aXR5IFRoZSBhY3Rpdml0eSB0aGlzIGZyYWdtZW50IHdpbGwgYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGZvciB0aGlzIGZyYWdtZW50LCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNhZGQoRnJhZ21lbnQsIFN0cmluZykgRnJhZ21lbnRUcmFuc2FjdGlvbi5hZGR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIGFjdGl2aXR5IHVzaW5nCisgICAgICogYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24gYW5kIHRoZW4gY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGFjdGl2aXR5IFRoZSBhY3Rpdml0eSB0aGlzIGZyYWdtZW50IHdpbGwgYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIGFkZCB0aGUgZnJhZ21lbnQuCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGZvciB0aGlzIGZyYWdtZW50LCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNhZGQoRnJhZ21lbnQsIFN0cmluZykgRnJhZ21lbnRUcmFuc2FjdGlvbi5hZGR9LgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWl0dGVkIHRyYW5zYWN0aW9uLCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNob3coQWN0aXZpdHkgYWN0aXZpdHksIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIG1CYWNrU3RhY2tJZCA9IHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gbUJhY2tTdGFja0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIGZyYWdtZW50IGFuZCBpdHMgZGlhbG9nLiAgSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiBiYWNrIHN0YWNrLCBhbGwgYmFjayBzdGFjayBzdGF0ZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgZW50cnkgd2lsbAorICAgICAqIGJlIHBvcHBlZC4gIE90aGVyd2lzZSwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgdG8gcmVtb3ZlCisgICAgICogdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICB9CisgICAgICAgIGlmIChtQmFja1N0YWNrSWQgPj0gMCkgeworICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5wb3BCYWNrU3RhY2sobUJhY2tTdGFja0lkLCBBY3Rpdml0eS5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0QWN0aXZpdHkoKS5vcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZnQucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgZnQuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIGdldERpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2c7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaGVtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxhYmxlKGJvb2xlYW4gY2FuY2VsYWJsZSkgeworICAgICAgICBtQ2FuY2VsYWJsZSA9IGNhbmNlbGFibGU7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIG1EaWFsb2cuc2V0Q2FuY2VsYWJsZShjYW5jZWxhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbUNhbmNlbGFibGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdHlsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU0FWRURfU1RZTEUsIG1TdHlsZSk7CisgICAgICAgICAgICBtVGhlbWUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1RIRU1FLCBtVGhlbWUpOworICAgICAgICAgICAgbUNhbmNlbGFibGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihTQVZFRF9DQU5DRUxBQkxFLCBtQ2FuY2VsYWJsZSk7CisgICAgICAgICAgICBtQmFja1N0YWNrSWQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX0JBQ0tfU1RBQ0tfSUQsIG1CYWNrU3RhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2coZ2V0QWN0aXZpdHkoKSwgZ2V0VGhlbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICBpZiAobUJhY2tTdGFja0lkID49IDApIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgZnJhZ21lbnQgaXMgcGFydCBvZiB0aGUgYmFjayBzdGFjaywgdGhlbiBjYW5jZWxsaW5nCisgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIG1lYW5zIHBvcHBpbmcgb2ZmIHRoZSBiYWNrIHN0YWNrLgorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5wb3BCYWNrU3RhY2sobUJhY2tTdGFja0lkLCBBY3Rpdml0eS5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fSU5QVVQ6CisgICAgICAgICAgICAgICAgbURpYWxvZy5nZXRXaW5kb3coKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19GUkFNRToKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fVElUTEU6CisgICAgICAgICAgICAgICAgbURpYWxvZy5yZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgVmlldyB2aWV3ID0gZ2V0VmlldygpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlhbG9nRnJhZ21lbnQgY2FuIG5vdCBiZSBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1EaWFsb2cuc2V0T3duZXJBY3Rpdml0eShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbURpYWxvZy5zZXRDYW5jZWxhYmxlKG1DYW5jZWxhYmxlKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRyk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIG1EaWFsb2cuc2hvdygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBtRGlhbG9nLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcsIGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfU1RZTEUsIG1TdHlsZSk7CisgICAgICAgIG91dFN0YXRlLnB1dEludChTQVZFRF9USEVNRSwgbVRoZW1lKTsKKyAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihTQVZFRF9DQU5DRUxBQkxFLCBtQ2FuY2VsYWJsZSk7CisgICAgICAgIG91dFN0YXRlLnB1dEludChTQVZFRF9CQUNLX1NUQUNLX0lELCBtQmFja1N0YWNrSWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIG1EaWFsb2cuaGlkZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBmcm9tIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIyMDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitmaW5hbCBjbGFzcyBGcmFnbWVudFN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnZpZXdfc3RhdGUiOworICAgIAorICAgIGZpbmFsIFN0cmluZyBtQ2xhc3NOYW1lOworICAgIGZpbmFsIGludCBtSW5kZXg7CisgICAgZmluYWwgYm9vbGVhbiBtRnJvbUxheW91dDsKKyAgICBmaW5hbCBpbnQgbUZyYWdtZW50SWQ7CisgICAgZmluYWwgaW50IG1Db250YWluZXJJZDsKKyAgICBmaW5hbCBTdHJpbmcgbVRhZzsKKyAgICBmaW5hbCBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICBCdW5kbGUgbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAKKyAgICBGcmFnbWVudCBtSW5zdGFuY2U7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50U3RhdGUoRnJhZ21lbnQgZnJhZykgeworICAgICAgICBtQ2xhc3NOYW1lID0gZnJhZy5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgbUluZGV4ID0gZnJhZy5tSW5kZXg7CisgICAgICAgIG1Gcm9tTGF5b3V0ID0gZnJhZy5tRnJvbUxheW91dDsKKyAgICAgICAgbUZyYWdtZW50SWQgPSBmcmFnLm1GcmFnbWVudElkOworICAgICAgICBtQ29udGFpbmVySWQgPSBmcmFnLm1Db250YWluZXJJZDsKKyAgICAgICAgbVRhZyA9IGZyYWcubVRhZzsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gZnJhZy5tUmV0YWluSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtQ2xhc3NOYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtSW5kZXggPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1Gcm9tTGF5b3V0ID0gaW4ucmVhZEludCgpICE9IDA7CisgICAgICAgIG1GcmFnbWVudElkID0gaW4ucmVhZEludCgpOworICAgICAgICBtQ29udGFpbmVySWQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1UYWcgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtU2F2ZWRGcmFnbWVudFN0YXRlID0gaW4ucmVhZEJ1bmRsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgaWYgKG1JbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZXN0b3JlIGZyYWdtZW50ICIgKyBtQ2xhc3NOYW1lLCBlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRWaWV3U3RhdGUKKyAgICAgICAgICAgICAgICAgICAgPSBtU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheShWSUVXX1NUQVRFX1RBRyk7CisgICAgICAgIH0KKyAgICAgICAgbUluc3RhbmNlLnNldEluZGV4KG1JbmRleCk7CisgICAgICAgIG1JbnN0YW5jZS5tRnJvbUxheW91dCA9IG1Gcm9tTGF5b3V0OworICAgICAgICBtSW5zdGFuY2UubUZyYWdtZW50SWQgPSBtRnJhZ21lbnRJZDsKKyAgICAgICAgbUluc3RhbmNlLm1Db250YWluZXJJZCA9IG1Db250YWluZXJJZDsKKyAgICAgICAgbUluc3RhbmNlLm1UYWcgPSBtVGFnOworICAgICAgICBtSW5zdGFuY2UubVJldGFpbkluc3RhbmNlID0gbVJldGFpbkluc3RhbmNlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtQ2xhc3NOYW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtSW5kZXgpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Gcm9tTGF5b3V0ID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlSW50KG1GcmFnbWVudElkKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtQ29udGFpbmVySWQpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UYWcpOworICAgICAgICBkZXN0LndyaXRlSW50KG1SZXRhaW5JbnN0YW5jZSA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudFN0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudFN0YXRlW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KKworLyoqCisgKiBBIEZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYW4gYXBwbGljYXRpb24ncyB1c2VyIGludGVyZmFjZSBvciBiZWhhdmlvcgorICogdGhhdCBjYW4gYmUgcGxhY2VkIGluIGFuIHtAbGluayBBY3Rpdml0eX0uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcywgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IHNDbGFzc01hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PigpOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaSU5HID0gMDsgICAgIC8vIE5vdCB5ZXQgY3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IENSRUFURUQgPSAxOyAgICAgICAgICAvLyBDcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfQ1JFQVRFRCA9IDI7IC8vIFRoZSBhY3Rpdml0eSBoYXMgZmluaXNoZWQgaXRzIGNyZWF0aW9uLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCA9IDM7ICAgICAgICAgIC8vIENyZWF0ZWQgYW5kIHN0YXJ0ZWQsIG5vdCByZXN1bWVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FRCA9IDQ7ICAgICAgICAgIC8vIENyZWF0ZWQgc3RhcnRlZCBhbmQgcmVzdW1lZC4KKyAgICAKKyAgICBpbnQgbVN0YXRlID0gSU5JVElBTElaSU5HOworICAgIAorICAgIC8vIFdoZW4gaW5zdGFudGlhdGVkIGZyb20gc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHNhdmVkIHN0YXRlLgorICAgIEJ1bmRsZSBtU2F2ZWRGcmFnbWVudFN0YXRlOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TYXZlZFZpZXdTdGF0ZTsKKyAgICAKKyAgICAvLyBJbmRleCBpbnRvIGFjdGl2ZSBmcmFnbWVudCBhcnJheS4KKyAgICBpbnQgbUluZGV4ID0gLTE7CisgICAgCisgICAgLy8gSW50ZXJuYWwgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnJhZ21lbnQ7CisgICAgU3RyaW5nIG1XaG87CisgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIGxpc3Qgb2YgYWRkZWQgZnJhZ21lbnRzLgorICAgIGJvb2xlYW4gbUFkZGVkOworICAgIAorICAgIC8vIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGluIHRoZSByZXN1bWVkIHN0YXRlLgorICAgIGJvb2xlYW4gbVJlc3VtZWQ7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBmcmFnbWVudCB3YXMgaW5zdGFudGlhdGVkIGZyb20gYSBsYXlvdXQgZmlsZS4KKyAgICBib29sZWFuIG1Gcm9tTGF5b3V0OworICAgIAorICAgIC8vIE51bWJlciBvZiBhY3RpdmUgYmFjayBzdGFjayBlbnRyaWVzIHRoaXMgZnJhZ21lbnQgaXMgaW4uCisgICAgaW50IG1CYWNrU3RhY2tOZXN0aW5nOworICAgIAorICAgIC8vIFNldCBhcyBzb29uIGFzIGEgZnJhZ21lbnQgaXMgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbiAob3IgcmVtb3ZlZCksCisgICAgLy8gdG8gYmUgYWJsZSB0byBkbyB2YWxpZGF0aW9uLgorICAgIEFjdGl2aXR5IG1JbW1lZGlhdGVBY3Rpdml0eTsKKyAgICAKKyAgICAvLyBBY3Rpdml0eSB0aGlzIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvLgorICAgIEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudCAtLSBlaXRoZXIgdGhlIGNvbnRhaW5lciBJRCBpZiBpdAorICAgIC8vIHdhcyBkeW5hbWljYWxseSBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIG9yIHRoZSBJRCBzdXBwbGllZCBpbgorICAgIC8vIGxheW91dC4KKyAgICBpbnQgbUZyYWdtZW50SWQ7CisgICAgCisgICAgLy8gV2hlbiBhIGZyYWdtZW50IGlzIGJlaW5nIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgdGhpcworICAgIC8vIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyIGl0IGlzIGJlaW5nIGFkZGVkIHRvLgorICAgIGludCBtQ29udGFpbmVySWQ7CisgICAgCisgICAgLy8gVGhlIG9wdGlvbmFsIG5hbWVkIHRhZyBmb3IgdGhpcyBmcmFnbWVudCAtLSB1c3VhbGx5IHVzZWQgdG8gZmluZAorICAgIC8vIGZyYWdtZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbGF5b3V0LgorICAgIFN0cmluZyBtVGFnOworICAgIAorICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIGFwcCBoYXMgcmVxdWVzdGVkIHRoYXQgdGhpcyBmcmFnbWVudCBiZSBoaWRkZW4KKyAgICAvLyBmcm9tIHRoZSB1c2VyLgorICAgIGJvb2xlYW4gbUhpZGRlbjsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIGl0cyBpbnN0YW5jZSByZXRhaW5lZCBhY3Jvc3MKKyAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmV0YWluZWQgYWNyb3NzIHRoZSBjdXJyZW50IGNvbmZpZyBjaGFuZ2UuCisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgYm9vbGVhbiBtSGFzTWVudTsKKyAgICAKKyAgICAvLyBVc2VkIHRvIHZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FsbCB0aHJvdWdoIHRvIHN1cGVyIGNsYXNzLgorICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICAKKyAgICAvLyBJZiBhcHAgaGFzIHJlcXVlc3RlZCBhIHNwZWNpZmljIGFuaW1hdGlvbiwgdGhpcyBpcyB0aGUgb25lIHRvIHVzZS4KKyAgICBpbnQgbU5leHRBbmltOworICAgIAorICAgIC8vIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoZSBmcmFnbWVudCBhZnRlciBkeW5hbWljYWxseSBhZGRlZCB0byBVSS4KKyAgICBWaWV3R3JvdXAgbUNvbnRhaW5lcjsKKyAgICAKKyAgICAvLyBUaGUgVmlldyBnZW5lcmF0ZWQgZm9yIHRoaXMgZnJhZ21lbnQuCisgICAgVmlldyBtVmlldzsKKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOworICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOworICAgIAorICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuICA8c3Ryb25nPkV2ZXJ5PC9zdHJpbmc+IGZyYWdtZW50IG11c3QgaGF2ZSBhbgorICAgICAqIGVtcHR5IGNvbnN0cnVjdG9yLCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVzdG9yaW5nIGl0cworICAgICAqIGFjdGl2aXR5J3Mgc3RhdGUuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHN1YmNsYXNzZXMgZG8gbm90CisgICAgICogaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2l0aCBwYXJhbWV0ZXJzLCBzaW5jZSB0aGVzZSBjb25zdHJ1Y3RvcnMKKyAgICAgKiB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgcmUtaW5zdGFudGlhdGVkOyBpbnN0ZWFkLAorICAgICAqIHJldHJpZXZlIHN1Y2ggcGFyYW1ldGVycyBmcm9tIHRoZSBhY3Rpdml0eSBpbiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0uCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuICBUaGlzIGlzCisgICAgICogdGhlIHNhbWUgYXMgY2FsbGluZyBpdHMgZW1wdHkgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGluZyBjb250ZXh0IGJlaW5nIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIGZyYWdtZW50LgorICAgICAqIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCB0byBnZXQgaXRzIENsYXNzTG9hZGVyLgorICAgICAqIEBwYXJhbSBmbmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gaW5zdGFudGlhdGUuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IGZyYWdtZW50IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIFRoZSBmcmFnbWVudCBkb2VzIG5vdCBoYXZlIGFuIGVtcHR5IGNvbnN0cnVjdG9yLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBUaGUgZnJhZ21lbnQgY2xhc3MgZG9lcyBub3QgZXhpc3QuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gQmFkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBmcmFnbWVudCBjbGFzcworICAgICAqIGNvbnN0cnVjdG9yIChzaG91bGQgbm90IGhhcHBlbikuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIENhbGxlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gaW5zdGFudGlhdGUKKyAgICAgKiB0aGUgZnJhZ21lbnQgKGZvciBleGFtcGxlIGl0cyBjb25zdHJ1Y3RvciBpcyBub3QgcHVibGljKS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gQ2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MKKyAgICAgKiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY2xhc3MuCisgICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIEZhaWx1cmUgcnVubmluZyB0aGUgZnJhZ21lbnQncyBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHNDbGFzc01hcC5nZXQoZm5hbWUpOworCisgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAorICAgICAgICAgICAgY2xhenogPSBjb250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGZuYW1lKTsKKyAgICAgICAgICAgIHNDbGFzc01hcC5wdXQoZm5hbWUsIGNsYXp6KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEZyYWdtZW50KWNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZVZpZXdTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlldy5yZXN0b3JlSGllcmFyY2h5U3RhdGUobVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgIG1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgIG1XaG8gPSAiYW5kcm9pZDpmcmFnbWVudDoiICsgbUluZGV4OworICAgfQorICAgIAorICAgIHZvaWQgY2xlYXJJbmRleCgpIHsKKyAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIG1XaG8gPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgZXF1YWxzKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBoYXNoQ29kZSgpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgiRnJhZ21lbnR7Iik7CisgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GcmFnbWVudElkICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGlkPTB4Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhtRnJhZ21lbnRJZCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1UYWcpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIHRoaXMgZnJhZ21lbnQgaXMga25vd24gYnkuICBUaGlzIGlzIGVpdGhlcgorICAgICAqIHRoZSBhbmRyb2lkOmlkIHZhbHVlIHN1cHBsaWVkIGluIGEgbGF5b3V0IG9yIHRoZSBjb250YWluZXIgdmlldyBJRAorICAgICAqIHN1cHBsaWVkIHdoZW4gYWRkaW5nIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50SWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFnIG5hbWUgb2YgdGhlIGZyYWdtZW50LCBpZiBzcGVjaWZpZWQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBib3RoIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCBpcyBjcmVhdGVkLCBhcyB3ZWxsCisgICAgICogbGF0ZXIgd2hlbiBpdCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20gaXRzIHNhdmVkIHN0YXRlICh3aGljaCBpcyBhbHNvCisgICAgICogZ2l2ZW4gaGVyZSkuCisgICAgICogCisgICAgICogWFhYIFRoaXMgaXMga2luZC1vZiB5dWNreS4uLiAgbWF5YmUgd2UgY291bGQganVzdCBzdXBwbHkgdGhlCisgICAgICogQXR0cmlidXRlU2V0IHRvIG9uQ3JlYXRlKCk/CisgICAgICogCisgICAgICogQHBhcmFtIGFjdGl2aXR5IFRoZSBBY3Rpdml0eSB0aGF0IGlzIGluZmxhdGluZyB0aGUgZnJhZ21lbnQuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQWN0aXZpdHkgYWN0aXZpdHksIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgZmlyc3QgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFuaW1hdGlvbiBvbkNyZWF0ZUFuaW1hdGlvbihpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwgaW50IG5leHRBbmltKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZQorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaXMKKyAgICAgKiBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLiAgQXMgc3VjaCwgeW91IGNhbiBub3QgcmVseQorICAgICAqIG9uIHRoaW5ncyBsaWtlIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQgdmlldyBoaWVyYXJjaHkgYmVpbmcgaW5pdGlhbGl6ZWQKKyAgICAgKiBhdCB0aGlzIHBvaW50LiAgSWYgeW91IHdhbnQgdG8gZG8gd29yayBvbmNlIHRoZSBhY3Rpdml0eSBpdHNlbGYgaXMKKyAgICAgKiBjcmVhdGVkLCBzZWUge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCisgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKKyAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSByZXR1cm4gYSBWaWV3IGZyb20gaGVyZSwgeW91IHdpbGwgbGF0ZXIgYmUgY2FsbGVkIGluCisgICAgICoge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSB3aGVuIHRoZSB2aWV3IGlzIGJlaW5nIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZsYXRlciBUaGUgTGF5b3V0SW5mbGF0ZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5mbGF0ZQorICAgICAqIGFueSB2aWV3cyBpbiB0aGUgZnJhZ21lbnQsCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcGFyZW50IHZpZXcgdGhhdCB0aGUgZnJhZ21lbnQncworICAgICAqIFVJIHNob3VsZCBiZSBhdHRhY2hlZCB0by4gIFRoZSBmcmFnbWVudCBzaG91bGQgbm90IGFkZCB0aGUgdmlldyBpdHNlbGYsCisgICAgICogYnV0IHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIExheW91dFBhcmFtcyBvZiB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIG5vbi1udWxsLCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNvbnN0cnVjdGVkCisgICAgICogZnJvbSBhIHByZXZpb3VzIHNhdmVkIHN0YXRlIGFzIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIFZpZXcgZm9yIHRoZSBmcmFnbWVudCdzIFVJLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtVmlldzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhpcworICAgICAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgaW5zdGFudGlhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gZG8gZmluYWwKKyAgICAgKiBpbml0aWFsaXphdGlvbiBvbmNlIHRoZXNlIHBpZWNlcyBhcmUgaW4gcGxhY2UsIHN1Y2ggYXMgcmV0cmlldmluZworICAgICAqIHZpZXdzIG9yIHJlc3RvcmluZyBzdGF0ZS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2UKKyAgICAgKiB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfSB0byByZXRhaW4gdGhlaXIgaW5zdGFuY2UsCisgICAgICogYXMgdGhpcyBjYWxsYmFjayB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RhcnQoKSBBY3Rpdml0eS5vblN0YXJ0fSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgYWN0aXZlbHkgcnVubmluZy4KKyAgICAgKiBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUmVzdW1lKCkgQWN0aXZpdHkub25SZXN1bWV9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHJlc3VtZWQuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUGF1c2UoKSBBY3Rpdml0eS5vblBhdXNlfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHN0YXJ0ZWQuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RvcCgpIEFjdGl2aXR5Lm9uU3RvcH0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSB2aWV3IHByZXZpb3VzbHkgY3JlYXRlZCBieSB7QGxpbmsgI29uQ3JlYXRlVmlld30gaGFzCisgICAgICogYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBmcmFnbWVudC4gIFRoZSBuZXh0IHRpbWUgdGhlIGZyYWdtZW50IG5lZWRzCisgICAgICogdG8gYmUgZGlzcGxheWVkLCBhIG5ldyB2aWV3IHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGVzdHJveSgpfTsgaXQgaXMgb25seQorICAgICAqIGNhbGxlZCBpZiB7QGxpbmsgI29uQ3JlYXRlVmlld30gcmV0dXJucyBhIG5vbi1udWxsIFZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW4gdXNlLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXRhY2goKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgLy9Mb2cudigiZm9vIiwgIm9uRGVzdHJveTogbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyPSIgKyBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIKKyAgICAgICAgLy8gICAgICAgICsgIiBtTG9hZGVyTWFuYWdlcj0iICsgbUxvYWRlck1hbmFnZXIpOworICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gbUFjdGl2aXR5LmdldExvYWRlck1hbmFnZXIobUluZGV4LCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LiAgVGhpcworICAgICAqIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uRGVzdHJveSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQorICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LiAgRm9yIHRoaXMgbWV0aG9kCisgICAgICogdG8gYmUgY2FsbGVkLCB5b3UgbXVzdCBoYXZlIGZpcnN0IGNhbGxlZCB7QGxpbmsgI3NldEhhc09wdGlvbnNNZW51fS4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uQ3JlYXRlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBpbiB3aGljaCB5b3UgcGxhY2UgeW91ciBpdGVtcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uUHJlcGFyZU9wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25PcHRpb25zSXRlbVNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGhlIFNjcmVlbidzIHN0YW5kYXJkIG9wdGlvbnMgbWVudSB0byBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzCisgICAgICogY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgbWVudSBpcyBzaG93biwgZXZlcnkgdGltZSBpdCBpcyBzaG93bi4gIFlvdSBjYW4KKyAgICAgKiB1c2UgdGhpcyBtZXRob2QgdG8gZWZmaWNpZW50bHkgZW5hYmxlL2Rpc2FibGUgaXRlbXMgb3Igb3RoZXJ3aXNlCisgICAgICogZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjb250ZW50cy4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvblByZXBhcmVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vblByZXBhcmVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIHlvdXIgb3B0aW9ucyBtZW51IGlzIHNlbGVjdGVkLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbAorICAgICAqIHByb2Nlc3NpbmcgaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8KKyAgICAgKiBpdHMgSGFuZGxlciBhcyBhcHByb3ByaWF0ZSkuICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zCisgICAgICogZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogCisgICAgICogPHA+RGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvCisgICAgICogcGVyZm9ybSB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG9wdGlvbnMgbWVudSBpcyBiZWluZyBjbG9zZWQgKGVpdGhlciBieSB0aGUgdXNlciBjYW5jZWxpbmcKKyAgICAgKiB0aGUgbWVudSB3aXRoIHRoZSBiYWNrL21lbnUgYnV0dG9uLCBvciB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQpLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25PcHRpb25zTWVudUNsb3NlZChNZW51IG1lbnUpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB7QGNvZGUgdmlld30gaXMgYWJvdXQgdG8gYmUgc2hvd24uCisgICAgICogVW5saWtlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0sIHRoaXMgd2lsbCBiZSBjYWxsZWQgZXZlcnkKKyAgICAgKiB0aW1lIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24gYW5kIHNob3VsZCBiZSBwb3B1bGF0ZWQgZm9yCisgICAgICogdGhlIHZpZXcgKG9yIGl0ZW0gaW5zaWRlIHRoZSB2aWV3IGZvciB7QGxpbmsgQWRhcHRlclZpZXd9IHN1YmNsYXNzZXMsCisgICAgICogdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHtAY29kZSBtZW51SW5mb30pKS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rICNvbkNvbnRleHRJdGVtU2VsZWN0ZWQoYW5kcm9pZC52aWV3Lk1lbnVJdGVtKX0gdG8ga25vdyB3aGVuIGFuCisgICAgICogaXRlbSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB1cCB0bworICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51IEFjdGl2aXR5Lm9uQ3JlYXRlQ29udGV4dE1lbnV9LCB0aG91Z2gKKyAgICAgKiB5b3UgY2FuIG5vdCBjYWxsIHRoaXMgaW1wbGVtZW50YXRpb24gaWYgeW91IGRvbid0IHdhbnQgdGhhdCBiZWhhdmlvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIGNvbnRleHQgbWVudSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIGdldEFjdGl2aXR5KCkub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldyAobXVsdGlwbGUgdmlld3MKKyAgICAgKiBjYW4gc2hvdyB0aGUgY29udGV4dCBtZW51KS4gVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlCisgICAgICoge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcgdG8gdGhpcyBmcmFnbWVudCwgc28KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUsIFZpZXcsIENvbnRleHRNZW51SW5mbyl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgd2hlbiBpdCBpcyB0aW1lIHRvIHNob3cgdGhlIGNvbnRleHQgbWVudS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICN1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzaG93IGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiByZW1vdmUgdGhlIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3LgorICAgICAqIAorICAgICAqIEBzZWUgI3JlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzdG9wIHNob3dpbmcgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIGEgY29udGV4dCBtZW51IGlzIHNlbGVjdGVkLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbCBwcm9jZXNzaW5nCisgICAgICogaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gaXRzIEhhbmRsZXIKKyAgICAgKiBhcyBhcHByb3ByaWF0ZSkuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMgZm9yIHdoaWNoIHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyIGZhY2lsaXRpZXMuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayBNZW51SXRlbSNnZXRNZW51SW5mbygpfSB0byBnZXQgZXh0cmEgaW5mb3JtYXRpb24gc2V0IGJ5IHRoZQorICAgICAqIFZpZXcgdGhhdCBhZGRlZCB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8gcGVyZm9ybQorICAgICAqIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRleHQgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGNvbnRleHQgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIG9uU3RvcCgpOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCB8fCAhbUFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjQ2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50TWFuYWdlclN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgRnJhZ21lbnRTdGF0ZVtdIG1BY3RpdmU7CisgICAgaW50W10gbUFkZGVkOworICAgIEJhY2tTdGFja1N0YXRlW10gbUJhY2tTdGFjazsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUFjdGl2ZSA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoRnJhZ21lbnRTdGF0ZS5DUkVBVE9SKTsKKyAgICAgICAgbUFkZGVkID0gaW4uY3JlYXRlSW50QXJyYXkoKTsKKyAgICAgICAgbUJhY2tTdGFjayA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoQmFja1N0YWNrU3RhdGUuQ1JFQVRPUik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1BY3RpdmUsIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZUludEFycmF5KG1BZGRlZCk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1CYWNrU3RhY2ssIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudE1hbmFnZXJTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KKworLyoqCisgKiBAaGlkZQorICogQ29udGFpbmVyIGZvciBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2aXR5LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRnJhZ21lbnRNYW5hZ2VyIjsKKyAgICAKKyAgICBBcnJheUxpc3Q8UnVubmFibGU+IG1QZW5kaW5nQWN0aW9uczsKKyAgICBSdW5uYWJsZVtdIG1UbXBBY3Rpb25zOworICAgIGJvb2xlYW4gbUV4ZWN1dGluZ0FjdGlvbnM7CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWN0aXZlOworICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFkZGVkOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxJbmRpY2VzOworICAgIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2tJbmRpY2VzOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzOworCisgICAgaW50IG1DdXJTdGF0ZSA9IEZyYWdtZW50LklOSVRJQUxJWklORzsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgYm9vbGVhbiBtTmVlZE1lbnVJbnZhbGlkYXRlOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBBbmltYXRpb24gbG9hZEFuaW1hdGlvbihGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIsCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIEFuaW1hdGlvbiBhbmltT2JqID0gZnJhZ21lbnQub25DcmVhdGVBbmltYXRpb24odHJhbnNpdGlvblN0eWxlLCBlbnRlciwKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICBpZiAoYW5pbU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYW5pbU9iajsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1OZXh0QW5pbSAhPSAwKSB7CisgICAgICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24obUFjdGl2aXR5LCBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbmltOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IHN0eWxlSW5kZXggPSB0cmFuc2l0VG9TdHlsZUluZGV4KHRyYW5zaXQsIGVudGVyKTsKKyAgICAgICAgaWYgKHN0eWxlSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwICYmIG1BY3Rpdml0eS5nZXRXaW5kb3coKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUgPSBtQWN0aXZpdHkuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpbmRvd0FuaW1hdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhdHRycyA9IG1BY3Rpdml0eS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKHRyYW5zaXRpb25TdHlsZSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb24pOworICAgICAgICBpbnQgYW5pbSA9IGF0dHJzLmdldFJlc291cmNlSWQoc3R5bGVJbmRleCwgMCk7CisgICAgICAgIGF0dHJzLnJlY3ljbGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhbmltID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihtQWN0aXZpdHksIGFuaW0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYsIGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgLy8gRnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYWRkZWQgd2lsbCBzaXQgaW4gdGhlIG9uQ3JlYXRlKCkgc3RhdGUuCisgICAgICAgIGlmICghZi5tQWRkZWQgJiYgbmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IEZyYWdtZW50LkNSRUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmLm1TdGF0ZSA8IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5JTklUSUFMSVpJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLm9uQXR0YWNoKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkF0dGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uQXR0YWNoRnJhZ21lbnQoZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkNyZWF0ZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Gcm9tTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnJhZ21lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNvbnRlbnQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0LCB3ZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGluZmxhdGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBDT05URU5UOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tQ29udGFpbmVySWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoVmlld0dyb3VwKW1BY3Rpdml0eS5maW5kVmlld0J5SWQoZi5tQ29udGFpbmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldyB2aWV3IGZvdW5kIGZvciBpZCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGYubUNvbnRhaW5lcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZyYWdtZW50ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbG9hZEFuaW1hdGlvbihmLCB0cmFuc2l0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZXN1bWUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi5tU3RhdGUgPiBuZXdTdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChmLm1TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuUkVTVU1FRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuUkVTVU1FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25QYXVzZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveVZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveWVkVmlldygpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gc2F2ZSB0aGUgY3VycmVudCB2aWV3IHN0YXRlIGlmIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY3Rpdml0eS5pc0ZpbmlzaGluZygpICYmIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhdGUgPiBGcmFnbWVudC5JTklUSUFMSVpJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbG9hZEFuaW1hdGlvbihmLCB0cmFuc2l0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIucmVtb3ZlVmlldyhmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXRhY2goKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGYubVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtb3ZlVG9TdGF0ZShuZXdTdGF0ZSwgMCwgMCwgYWx3YXlzKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCB0cmFuc2l0LCBpbnQgdHJhbnNpdFN0eWxlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgJiYgbmV3U3RhdGUgIT0gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsd2F5cyAmJiBtQ3VyU3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUN1clN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZiwgbmV3U3RhdGUsIHRyYW5zaXQsIHRyYW5zaXRTdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBudWxsKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChmLm1JbmRleCk7CisgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlRnJhZ21lbnRJbmRleChmLm1JbmRleCk7CisgICAgICAgIGYuY2xlYXJJbmRleCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBtb3ZlVG9TdGF0ZU5vdykgeworICAgICAgICBpZiAobUFkZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUFkZGVkLmFkZChmcmFnbWVudCk7CisgICAgICAgIG1ha2VBY3RpdmUoZnJhZ21lbnQpOworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImFkZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBtQ3VyU3RhdGUsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlbW92ZTogIiArIGZyYWdtZW50ICsgIiBuZXN0aW5nPSIgKyBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgIG1BZGRlZC5yZW1vdmUoZnJhZ21lbnQpOworICAgICAgICBmaW5hbCBib29sZWFuIGluYWN0aXZlID0gZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcgPD0gMDsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIGluYWN0aXZlID8gRnJhZ21lbnQuSU5JVElBTElaSU5HIDogRnJhZ21lbnQuQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLCB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICBpZiAoaW5hY3RpdmUpIHsKKyAgICAgICAgICAgIG1ha2VJbmFjdGl2ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaGlkZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImhpZGU6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmICghZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbG9hZEFuaW1hdGlvbihmcmFnbWVudCwgdHJhbnNpdGlvbiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2hvd0ZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNob3c6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbG9hZEFuaW1hdGlvbihmcmFnbWVudCwgdHJhbnNpdGlvbiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5V2hvKFN0cmluZyB3aG8pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB3aG8uZXF1YWxzKGYubVdobykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbnF1ZXVlQWN0aW9uKFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UnVubmFibGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnBvc3QobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgYWxsb2NCYWNrU3RhY2tJbmRleChCYWNrU3RhY2tFbnRyeSBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsIHx8IG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1CYWNrU3RhY2tJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNldHRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHRvICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChic2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnJlbW92ZShtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnNpemUoKS0xKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgd2l0aCAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja1N0YWNrSW5kZXgoaW50IGluZGV4LCBCYWNrU3RhY2tFbnRyeSBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBOID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuc2V0KGluZGV4LCBic2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoTiA8IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBhdmFpbGFibGUgYmFjayBzdGFjayBpbmRleCAiICsgTik7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMuYWRkKE4pOworICAgICAgICAgICAgICAgICAgICBOKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChic2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZnJlZUJhY2tTdGFja0luZGV4KGludCBpbmRleCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgbnVsbCk7CisgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLmFkZChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGNhbGwgZnJvbSBtYWluIHRocmVhZCEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjUGVuZGluZ0FjdGlvbnMoKSB7CisgICAgICAgIGlmIChtRXhlY3V0aW5nQWN0aW9ucykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVjdXJzaXZlIGVudHJ5IHRvIGV4ZWNQZW5kaW5nQWN0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IG51bUFjdGlvbnM7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCB8fCBtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBudW1BY3Rpb25zID0gbVBlbmRpbmdBY3Rpb25zLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAobVRtcEFjdGlvbnMgPT0gbnVsbCB8fCBtVG1wQWN0aW9ucy5sZW5ndGggPCBudW1BY3Rpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1UbXBBY3Rpb25zID0gbmV3IFJ1bm5hYmxlW251bUFjdGlvbnNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMudG9BcnJheShtVG1wQWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1FeGVjdXRpbmdBY3Rpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1BY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVG1wQWN0aW9uc1tpXS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeGVjdXRpbmdBY3Rpb25zID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQmFja1N0YWNrU3RhdGUoQmFja1N0YWNrRW50cnkgc3RhdGUpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJhY2tTdGFjay5hZGQoc3RhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKGhhbmRsZXIsIG5hbWUsIC0xLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrU3RhdGUoSGFuZGxlciBoYW5kbGVyLCBpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAoaWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKGhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lLCBpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBpZCA8IDAgJiYgKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgPT0gMCkgeworICAgICAgICAgICAgaW50IGxhc3QgPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5yZW1vdmUobGFzdCk7CisgICAgICAgICAgICBlbnF1ZXVlQWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgYnNzKTsKKyAgICAgICAgICAgICAgICAgICAgYnNzLnBvcEZyb21CYWNrU3RhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUobUN1clN0YXRlLCByZXZlcnNlVHJhbnNpdChic3MuZ2V0VHJhbnNpdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3MuZ2V0VHJhbnNpdGlvblN0eWxlKCksIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsIHx8IGlkID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBhIG5hbWUgb3IgSUQgaXMgc3BlY2lmaWVkLCBsb29rIGZvciB0aGF0IHBsYWNlIGluCisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrLgorICAgICAgICAgICAgICAgIGluZGV4ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBmb2xsb3dpbmcgZW50cmllcyB0aGF0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IG1CYWNrU3RhY2suc2l6ZSgpLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IHN0YXRlcworICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c3RhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlBvcHBpbmcgYmFjayBzdGFjayBzdGF0ZTogIiArIHN0YXRlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLmdldChpKS5wb3BGcm9tQmFja1N0YWNrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUobUN1clN0YXRlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZXRhaW5Ob25Db25maWcoKSB7CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzID0gbnVsbDsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BY3RpdmUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1SZXRhaW5JbnN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZChmKTsKKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZyYWdtZW50czsKKyAgICB9CisgICAgCisgICAgdm9pZCBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGF0ZUFycmF5ID0gbmV3IFNwYXJzZUFycmF5PFBhcmNlbGFibGU+KCk7CisgICAgICAgIH0KKyAgICAgICAgZi5tVmlldy5zYXZlSGllcmFyY2h5U3RhdGUobVN0YXRlQXJyYXkpOworICAgICAgICBpZiAobVN0YXRlQXJyYXkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZi5tU2F2ZWRWaWV3U3RhdGUgPSBtU3RhdGVBcnJheTsKKyAgICAgICAgICAgIG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBQYXJjZWxhYmxlIHNhdmVBbGxTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCB8fCBtQWN0aXZlLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRmlyc3QgY29sbGVjdCBhbGwgYWN0aXZlIGZyYWdtZW50cy4KKyAgICAgICAgaW50IE4gPSBtQWN0aXZlLnNpemUoKTsKKyAgICAgICAgRnJhZ21lbnRTdGF0ZVtdIGFjdGl2ZSA9IG5ldyBGcmFnbWVudFN0YXRlW05dOworICAgICAgICBib29sZWFuIGhhdmVGcmFnbWVudHMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhdmVGcmFnbWVudHMgPSB0cnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBuZXcgRnJhZ21lbnRTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVbaV0gPSBmczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm9uU2F2ZUluc3RhbmNlU3RhdGUobVN0YXRlQnVuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0ZUJ1bmRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TdGF0ZUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaGF2ZUZyYWdtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludFtdIGFkZGVkID0gbnVsbDsKKyAgICAgICAgQmFja1N0YWNrU3RhdGVbXSBiYWNrU3RhY2sgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBOID0gbUFkZGVkLnNpemUoKTsKKyAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkZWRbaV0gPSBtQWRkZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTm93IHNhdmUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1CYWNrU3RhY2suc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgYmFja1N0YWNrID0gbmV3IEJhY2tTdGFja1N0YXRlW05dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja1N0YWNrW2ldID0gbmV3IEJhY2tTdGFja1N0YXRlKHRoaXMsIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpOworICAgICAgICBmbXMubUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgZm1zLm1BZGRlZCA9IGFkZGVkOworICAgICAgICBmbXMubUJhY2tTdGFjayA9IGJhY2tTdGFjazsKKyAgICAgICAgcmV0dXJuIGZtczsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlQWxsU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSwgQXJyYXlMaXN0PEZyYWdtZW50PiBub25Db25maWcpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2F2ZWQgc3RhdGUgYXQgYWxsLCB0aGVuIHRoZXJlIGNhbiBub3QgYmUKKyAgICAgICAgLy8gYW55IG5vbkNvbmZpZyBmcmFnbWVudHMgZWl0aGVyLCBzbyB0aGF0IGlzIHRoYXQuCisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IChGcmFnbWVudE1hbmFnZXJTdGF0ZSlzdGF0ZTsKKyAgICAgICAgaWYgKGZtcy5tQWN0aXZlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IHJlLWF0dGFjaCBhbnkgbm9uLWNvbmZpZyBpbnN0YW5jZXMgd2UgYXJlIHJldGFpbmluZyBiYWNrCisgICAgICAgIC8vIHRvIHRoZWlyIHNhdmVkIHN0YXRlLCBzbyB3ZSBkb24ndCB0cnkgdG8gaW5zdGFudGlhdGUgdGhlbSBhZ2Fpbi4KKyAgICAgICAgaWYgKG5vbkNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bm9uQ29uZmlnLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG5vbkNvbmZpZy5nZXQoaSk7CisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2YubUluZGV4XTsKKyAgICAgICAgICAgICAgICBmcy5tSW5zdGFuY2UgPSBmOworICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nID0gMDsKKyAgICAgICAgICAgICAgICBmLm1BZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRWaWV3U3RhdGUgPSBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlLlZJRVdfU1RBVEVfVEFHKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIHRoZSBmdWxsIGxpc3Qgb2YgYWN0aXZlIGZyYWdtZW50cywgaW5zdGFudGlhdGluZyB0aGVtIGZyb20KKyAgICAgICAgLy8gdGhlaXIgc2F2ZWQgc3RhdGUuCisgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihmbXMubUFjdGl2ZS5sZW5ndGgpOworICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWN0aXZlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudFN0YXRlIGZzID0gZm1zLm1BY3RpdmVbaV07CisgICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUuYWRkKGZzLmluc3RhbnRpYXRlKG1BY3Rpdml0eSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMuYWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBpZiAoZm1zLm1BZGRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihmbXMubUFkZGVkLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1BZGRlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChmbXMubUFkZGVkW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGluc3RhbnRpYXRlZCBmcmFnbWVudCBmb3IgaW5kZXggIyIgKyBmbXMubUFkZGVkW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbUFjdGl2aXR5OworICAgICAgICAgICAgICAgIG1BZGRlZC5hZGQoZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWRkZWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKGZtcy5tQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PihmbXMubUJhY2tTdGFjay5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQmFja1N0YWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gZm1zLm1CYWNrU3RhY2tbaV0uaW5zdGFudGlhdGUodGhpcyk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFjay5hZGQoYnNlKTsKKyAgICAgICAgICAgICAgICBpZiAoYnNlLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEJhY2tTdGFja0luZGV4KGJzZS5tSW5kZXgsIGJzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYXR0YWNoQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSAhPSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaENyZWF0ZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuQ1JFQVRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0YXJ0KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5TVEFSVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUmVzdW1lKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5SRVNVTUVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUGF1c2UoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTdG9wKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRGVzdHJveSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuSU5JVElBTElaSU5HLCBmYWxzZSk7CisgICAgICAgIG1BY3Rpdml0eSA9IG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93ID0gZmFsc2U7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBzaG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZi5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUsIGluZmxhdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3c7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hPcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaE9wdGlvbnNNZW51Q2xvc2VkKE1lbnUgbWVudSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5vbk9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCByZXZlcnNlVHJhbnNpdChpbnQgdHJhbnNpdCkgeworICAgICAgICBpbnQgcmV2ID0gMDsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0KSB7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FTlRFUjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRVhJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VYSVQ6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VOVEVSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfU0hPVzoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfSElERTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0hJREU6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1NIT1c7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9PUEVOOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9DTE9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX0NMT1NFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9PUEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19PUEVOOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19DTE9TRToKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19PUEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19GUk9OVDoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19CQUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19CQUNLOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0ZST05UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9DTE9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9DTE9TRToKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV2OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnQgdHJhbnNpdFRvU3R5bGVJbmRleChpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlcikgeworICAgICAgICBpbnQgYW5pbUF0dHIgPSAtMTsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0KSB7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FTlRFUjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93aW5kb3dFbnRlckFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VYSVQ6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2luZG93RXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1NIT1c6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2luZG93U2hvd0FuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0hJREU6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2luZG93SGlkZUFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX09QRU46CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5T3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5Q2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tPcGVuRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza0Nsb3NlRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0ZST05UOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tUb0Zyb250RW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tUb0Zyb250RXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fQkFDSzoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrVG9CYWNrRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tUb0JhY2tFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX09QRU46CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVyT3BlbkVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJPcGVuRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJJbnRyYU9wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVySW50cmFPcGVuRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJJbnRyYUNsb3NlRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckludHJhQ2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltQXR0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNmODVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogQml0IG1hc2sgdGhhdCBpcyBzZXQgZm9yIGFsbCBlbnRlciB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRU5URVJfTUFTSyA9IDB4MTAwMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGV4aXQgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VYSVRfTUFTSyA9IDB4MjAwMDsKKyAgICAKKyAgICAvKiogTm90IHNldCB1cCBmb3IgYSB0cmFuc2l0aW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9VTlNFVCA9IC0xOworICAgIC8qKiBObyBhbmltYXRpb24gZm9yIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX05PTkUgPSAwOworICAgIC8qKiBXaW5kb3cgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHNjcmVlbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRU5URVIgPSAxIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBXaW5kb3cgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzY3JlZW4uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VYSVQgPSAyIHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIFdpbmRvdyBoYXMgYmVlbiBtYWRlIHZpc2libGUuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1NIT1cgPSAzIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBXaW5kb3cgaGFzIGJlZW4gbWFkZSBpbnZpc2libGUuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0hJREUgPSA0IHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIFRoZSAiYXBwbGljYXRpb24gc3RhcnRpbmciIHByZXZpZXcgd2luZG93IGlzIG5vIGxvbmdlciBuZWVkZWQsIGFuZCB3aWxsCisgICAgICogYW5pbWF0ZSBhd2F5IHRvIHNob3cgdGhlIHJlYWwgd2luZG93LiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9QUkVWSUVXX0RPTkUgPSA1OworICAgIC8qKiBBIHdpbmRvdyBpbiBhIG5ldyBhY3Rpdml0eSBpcyBiZWluZyBvcGVuZWQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIG9uZQorICAgICAqIGluIHRoZSBzYW1lIHRhc2suICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0FDVElWSVRZX09QRU4gPSA2IHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBUaGUgd2luZG93IGluIHRoZSB0b3AtbW9zdCBhY3Rpdml0eSBpcyBiZWluZyBjbG9zZWQgdG8gcmV2ZWFsIHRoZQorICAgICAqIHByZXZpb3VzIGFjdGl2aXR5IGluIHRoZSBzYW1lIHRhc2suICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0FDVElWSVRZX0NMT1NFID0gNyB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhIG5ldyB0YXNrIGlzIGJlaW5nIG9wZW5lZCBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgb25lCisgICAgICogaW4gYW5vdGhlciBhY3Rpdml0eSdzIHRhc2suICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1RBU0tfT1BFTiA9IDggfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIHRoZSB0b3AtbW9zdCBhY3Rpdml0eSBpcyBiZWluZyBjbG9zZWQgdG8gcmV2ZWFsIHRoZQorICAgICAqIHByZXZpb3VzIGFjdGl2aXR5IGluIGEgZGlmZmVyZW50IHRhc2suICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1RBU0tfQ0xPU0UgPSA5IHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGFuIGV4aXN0aW5nIHRhc2sgaXMgYmVpbmcgZGlzcGxheWVkIG9uIHRvcCBvZiBhbiBleGlzdGluZyBvbmUKKyAgICAgKiBpbiBhbm90aGVyIGFjdGl2aXR5J3MgdGFzay4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19UT19GUk9OVCA9IDEwIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhbiBleGlzdGluZyB0YXNrIGlzIGJlaW5nIHB1dCBiZWxvdyBhbGwgb3RoZXIgdGFza3MuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1RBU0tfVE9fQkFDSyA9IDExIHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGEgbmV3IGFjdGl2aXR5IHRoYXQgZG9lc24ndCBoYXZlIGEgd2FsbHBhcGVyIGlzIGJlaW5nCisgICAgICogb3BlbmVkIG9uIHRvcCBvZiBvbmUgdGhhdCBkb2VzLCBlZmZlY3RpdmVseSBjbG9zaW5nIHRoZSB3YWxscGFwZXIuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSA9IDEyIHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGEgbmV3IGFjdGl2aXR5IHRoYXQgZG9lcyBoYXZlIGEgd2FsbHBhcGVyIGlzIGJlaW5nCisgICAgICogb3BlbmVkIG9uIG9uZSB0aGF0IGRpZG4ndCwgZWZmZWN0aXZlbHkgb3BlbmluZyB0aGUgd2FsbHBhcGVyLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTiA9IDEzIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhIG5ldyBhY3Rpdml0eSBpcyBiZWluZyBvcGVuZWQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIG9uZSwKKyAgICAgKiBhbmQgYm90aCBhcmUgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOID0gMTQgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIFRoZSB3aW5kb3cgaW4gdGhlIHRvcC1tb3N0IGFjdGl2aXR5IGlzIGJlaW5nIGNsb3NlZCB0byByZXZlYWwgdGhlCisgICAgICogcHJldmlvdXMgYWN0aXZpdHksIGFuZCBib3RoIGFyZSBvbiB0b3Agb2YgaGUgd2FsbHBhcGVyLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0UgPSAxNSB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdCk7CisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcyk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkVG9CYWNrU3RhY2soU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgY29tbWl0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQgdGhlIGNvbW1pdCBkb2VzCisgICAgICogbm90IGhhcHBlbiBpbW1lZGlhdGVseTsgaXQgd2lsbCBiZSBzY2hlZHVsZWQgYXMgd29yayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKiB0byBiZSBkb25lIHRoZSBuZXh0IHRpbWUgdGhhdCB0aHJlYWQgaXMgcmVhZHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyB0cmFuc2FjdGlvbidzIGJhY2sgc3RhY2sgZW50cnksCisgICAgICogaWYge0BsaW5rICNhZGRUb0JhY2tTdGFjayhTdHJpbmcpfSBoYWQgYmVlbiBjYWxsZWQuICBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggODFiMjhiOS4uMGQzNWJhNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTcsNyArMzE3LDExIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgCisKKyAgICAvLyBDYXVzZSB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gZHVtcCB0aGUgc3BlY2lmaWVkIGhlYXAuCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG5vbi1CaW5kZXIgaW50ZXJmYWNlcwogICAgICAqLwpAQCAtNTM0LDQgKzUzOCw1IEBACiAgICAgaW50IFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTExOwogICAgIGludCBJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExMjsKICAgICBpbnQgQ1JBU0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTEzOworICAgIGludCBEVU1QX0hFQVBfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCmluZGV4IGM4ZWYxN2YuLjAzOWJjYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDYgKzk3LDggQEAKICAgICB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZChJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgcHJvZmlsZXJDb250cm9sKGJvb2xlYW4gc3RhcnQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBzZXRTY2hlZHVsaW5nR3JvdXAoaW50IGdyb3VwKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgZ2V0TWVtb3J5SW5mbyhEZWJ1Zy5NZW1vcnlJbmZvIG91dEluZm8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX1JFTU9WRUQgPSAwOwpAQCAtMTQwLDQgKzE0Miw1IEBACiAgICAgaW50IFNDSEVEVUxFX1NVSUNJREVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzI7CiAgICAgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMzOwogICAgIGludCBTQ0hFRFVMRV9DUkFTSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNDsKKyAgICBpbnQgRFVNUF9IRUFQX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzM1OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCmluZGV4IGI4YzNhYTMuLjRkNWYzNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKQEAgLTk5Nyw4ICs5OTcsMTAgQEAKICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewogICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSljbGF6ei5uZXdJbnN0YW5jZSgpOwogICAgICAgICBBY3Rpdml0eVRocmVhZCBhVGhyZWFkID0gbnVsbDsKLSAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LCBpbmZvLCB0aXRsZSwKLSAgICAgICAgICAgICAgICBwYXJlbnQsIGlkLCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LAorICAgICAgICAgICAgICAgIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAorICAgICAgICAgICAgICAgIChBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKWxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSk7CiAgICAgICAgIHJldHVybiBhY3Rpdml0eTsKICAgICB9CiAKQEAgLTEwNTgsMjEgKzEwNjAsMjMgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25EZXN0cm95KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlXYWl0ZXIgYXcgPSBtV2FpdGluZ0FjdGl2aXRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgIGF3LmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQorICAgICAgLy8gVE9ETzogdGhlIGZvbGxvd2luZyBibG9jayBjYXVzZXMgaW50ZXJtaXR0ZW50IGhhbmdzIHdoZW4gdXNpbmcgc3RhcnRBY3Rpdml0eQorICAgICAgLy8gdGVtcG9yYXJpbHkgY29tbWVudCBvdXQgdW50aWwgcm9vdCBjYXVzZSBpcyBmaXhlZCAoYnVnIDI2MzA2ODMpCisvLyAgICAgIGlmIChtV2FpdGluZ0FjdGl2aXRpZXMgIT0gbnVsbCkgeworLy8gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworLy8gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKKy8vICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKKy8vICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKKy8vICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5maWx0ZXJFcXVhbHMoYWN0aXZpdHkuZ2V0SW50ZW50KCkpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OworLy8gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOworLy8gICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgfQorLy8gICAgICB9CiAgICAgICAKLSAgICAgIGFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgYWN0aXZpdHkucGVyZm9ybURlc3Ryb3koKTsKICAgICAgIAogICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CkBAIC0xMzMxLDcgKzEzMzUsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCiAgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAogICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgotICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggYWN0aXZpdHkgaXMgcGVyZm9ybSB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCiAgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KTsgbWF5IGJlIG51bGwgaWYgdGhpcyBjYWxsIGlzIG5vdCBiZWluZyBtYWRlCiAgICAgICogICAgICAgICAgICAgICBmcm9tIGFuIGFjdGl2aXR5LgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCkBAIC0xMzgxLDYgKzEzODUsNjQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2V4ZWNTdGFydEFjdGl2aXR5KENvbnRleHQsIElCaW5kZXIsIElCaW5kZXIsIEFjdGl2aXR5LCBJbnRlbnQsIGludCl9LAorICAgICAqIGJ1dCBmb3IgY2FsbHMgZnJvbSBhIHsjbGluayBGcmFnbWVudH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdobyBUaGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0VGhyZWFkIFRoZSBtYWluIHRocmVhZCBvZiB0aGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAorICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgorICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggZnJhZ21lbnQgaXMgcGVyZm9ybWluZyB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiAgICAgICAgICAgICAgIGFueSByZXN1bHQpLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElkZW50aWZpZXIgZm9yIHRoaXMgcmVxdWVzdCdzIHJlc3VsdDsgbGVzcyB0aGFuIHplcm8gCisgICAgICogICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjYWxsZXIgaXMgbm90IGV4cGVjdGluZyBhIHJlc3VsdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRvIGZvcmNlIHRoZSByZXR1cm4gb2YgYSBwYXJ0aWN1bGFyIHJlc3VsdCwgcmV0dXJuIGFuIAorICAgICAqICAgICAgICAgQWN0aXZpdHlSZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgZGF0YTsgb3RoZXJ3aXNlCisgICAgICogICAgICAgICByZXR1cm4gbnVsbC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIG51bGwuCisgICAgICogIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KQorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQKKyAgICAgKiAKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIEFjdGl2aXR5UmVzdWx0IGV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICBDb250ZXh0IHdobywgSUJpbmRlciBjb250ZXh0VGhyZWFkLCBJQmluZGVyIHRva2VuLCBGcmFnbWVudCB0YXJnZXQsCisgICAgICAgIEludGVudCBpbnRlbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgd2hvVGhyZWFkID0gKElBcHBsaWNhdGlvblRocmVhZCkgY29udGV4dFRocmVhZDsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BY3Rpdml0eU1vbml0b3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TW9uaXRvciBhbSA9IG1BY3Rpdml0eU1vbml0b3JzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFtLm1hdGNoKHdobywgbnVsbCwgaW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYW0ubUhpdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbS5pc0Jsb2NraW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdENvZGUgPj0gMCA/IGFtLmdldFJlc3VsdCgpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQorICAgICAgICAgICAgICAgIC5zdGFydEFjdGl2aXR5KHdob1RocmVhZCwgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnJlc29sdmVUeXBlSWZOZWVkZWQod2hvLmdldENvbnRlbnRSZXNvbHZlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIDAsIHRva2VuLCB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5tV2hvIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKnBhY2thZ2UqLyBmaW5hbCB2b2lkIGluaXQoQWN0aXZpdHlUaHJlYWQgdGhyZWFkLAogICAgICAgICAgICAgQ29udGV4dCBpbnN0ckNvbnRleHQsIENvbnRleHQgYXBwQ29udGV4dCwgQ29tcG9uZW50TmFtZSBjb21wb25lbnQsIAogICAgICAgICAgICAgSUluc3RydW1lbnRhdGlvbldhdGNoZXIgd2F0Y2hlcikgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCmluZGV4IDRiZjU1MTguLmQ0OTk2OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudF9zaW1wbGUpOwogCiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyZjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBBIGZyYWdtZW50IHRoYXQgZGlzcGxheXMgYSBsaXN0IG9mIGl0ZW1zIGJ5IGJpbmRpbmcgdG8gYSBkYXRhIHNvdXJjZSBzdWNoIGFzCisgKiBhbiBhcnJheSBvciBDdXJzb3IsIGFuZCBleHBvc2VzIGV2ZW50IGhhbmRsZXJzIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtLgorICogPHA+CisgKiBMaXN0RnJhZ21lbnQgaG9zdHMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgTGlzdFZpZXd9IG9iamVjdCB0aGF0IGNhbgorICogYmUgYm91bmQgdG8gZGlmZmVyZW50IGRhdGEgc291cmNlcywgdHlwaWNhbGx5IGVpdGhlciBhbiBhcnJheSBvciBhIEN1cnNvcgorICogaG9sZGluZyBxdWVyeSByZXN1bHRzLiBCaW5kaW5nLCBzY3JlZW4gbGF5b3V0LCBhbmQgcm93IGxheW91dCBhcmUgZGlzY3Vzc2VkCisgKiBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorICogPHA+CisgKiA8c3Ryb25nPlNjcmVlbiBMYXlvdXQ8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogTGlzdEZyYWdtZW50IGhhcyBhIGRlZmF1bHQgbGF5b3V0IHRoYXQgY29uc2lzdHMgb2YgYSBzaW5nbGUgbGlzdCB2aWV3LgorICogSG93ZXZlciwgaWYgeW91IGRlc2lyZSwgeW91IGNhbiBjdXN0b21pemUgdGhlIGZyYWdtZW50IGxheW91dCBieSByZXR1cm5pbmcKKyAqIHlvdXIgb3duIHZpZXcgaGllcmFyY2h5IGZyb20ge0BsaW5rICNvbkNyZWF0ZVZpZXd9LgorICogVG8gZG8gdGhpcywgeW91ciB2aWV3IGhpZXJhcmNoeSA8ZW0+bXVzdDwvZW0+IGNvbnRhaW4gYSBMaXN0VmlldyBvYmplY3Qgd2l0aCB0aGUKKyAqIGlkICJAYW5kcm9pZDppZC9saXN0IiAob3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNsaXN0fSBpZiBpdCdzIGluIGNvZGUpCisgKiA8cD4KKyAqIE9wdGlvbmFsbHksIHlvdXIgdmlldyBoaWVyYXJjaHkgY2FuIGNvbnRhaW4gYW5vdGhlciB2aWV3IG9iamVjdCBvZiBhbnkgdHlwZSB0bworICogZGlzcGxheSB3aGVuIHRoZSBsaXN0IHZpZXcgaXMgZW1wdHkuIFRoaXMgImVtcHR5IGxpc3QiIG5vdGlmaWVyIG11c3QgaGF2ZSBhbgorICogaWQgImFuZHJvaWQ6ZW1wdHkiLiBOb3RlIHRoYXQgd2hlbiBhbiBlbXB0eSB2aWV3IGlzIHByZXNlbnQsIHRoZSBsaXN0IHZpZXcKKyAqIHdpbGwgYmUgaGlkZGVuIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBkaXNwbGF5LgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGNvZGUgZGVtb25zdHJhdGVzIGFuICh1Z2x5KSBjdXN0b20gbGlzdCBsYXlvdXQuIEl0IGhhcyBhIGxpc3QKKyAqIHdpdGggYSBncmVlbiBiYWNrZ3JvdW5kLCBhbmQgYW4gYWx0ZXJuYXRlIHJlZCAibm8gZGF0YSIgbWVzc2FnZS4KKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7dXRmLTgmcXVvdDs/Jmd0OworICogJmx0O0xpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249JnF1b3Q7dmVydGljYWwmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0mcXVvdDs4ZHAmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9JnF1b3Q7OGRwJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7TGlzdFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAaWQvYW5kcm9pZDpsaXN0JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0mcXVvdDsjMDBGRjAwJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0mcXVvdDsxJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAaWQvYW5kcm9pZDplbXB0eSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7I0ZGMDAwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9JnF1b3Q7Tm8gZGF0YSZxdW90Oy8mZ3Q7CisgKiAmbHQ7L0xpbmVhckxheW91dCZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogPHN0cm9uZz5Sb3cgTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIGluZGl2aWR1YWwgcm93cyBpbiB0aGUgbGlzdC4gWW91IGRvIHRoaXMgYnkKKyAqIHNwZWNpZnlpbmcgYSBsYXlvdXQgcmVzb3VyY2UgaW4gdGhlIExpc3RBZGFwdGVyIG9iamVjdCBob3N0ZWQgYnkgdGhlIGZyYWdtZW50CisgKiAodGhlIExpc3RBZGFwdGVyIGJpbmRzIHRoZSBMaXN0VmlldyB0byB0aGUgZGF0YTsgbW9yZSBvbiB0aGlzIGxhdGVyKS4KKyAqIDxwPgorICogQSBMaXN0QWRhcHRlciBjb25zdHJ1Y3RvciB0YWtlcyBhIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyBhIGxheW91dCByZXNvdXJjZQorICogZm9yIGVhY2ggcm93LiBJdCBhbHNvIGhhcyB0d28gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgbGV0IHlvdSBzcGVjaWZ5CisgKiB3aGljaCBkYXRhIGZpZWxkIHRvIGFzc29jaWF0ZSB3aXRoIHdoaWNoIG9iamVjdCBpbiB0aGUgcm93IGxheW91dCByZXNvdXJjZS4KKyAqIFRoZXNlIHR3byBwYXJhbWV0ZXJzIGFyZSB0eXBpY2FsbHkgcGFyYWxsZWwgYXJyYXlzLgorICogPC9wPgorICogPHA+CisgKiBBbmRyb2lkIHByb3ZpZGVzIHNvbWUgc3RhbmRhcmQgcm93IGxheW91dCByZXNvdXJjZXMuIFRoZXNlIGFyZSBpbiB0aGUKKyAqIHtAbGluayBhbmRyb2lkLlIubGF5b3V0fSBjbGFzcywgYW5kIGhhdmUgbmFtZXMgc3VjaCBhcyBzaW1wbGVfbGlzdF9pdGVtXzEsCisgKiBzaW1wbGVfbGlzdF9pdGVtXzIsIGFuZCB0d29fbGluZV9saXN0X2l0ZW0uIFRoZSBmb2xsb3dpbmcgbGF5b3V0IFhNTCBpcyB0aGUKKyAqIHNvdXJjZSBmb3IgdGhlIHJlc291cmNlIHR3b19saW5lX2xpc3RfaXRlbSwgd2hpY2ggZGlzcGxheXMgdHdvIGRhdGEKKyAqIGZpZWxkcyxvbmUgYWJvdmUgdGhlIG90aGVyLCBmb3IgZWFjaCBsaXN0IHJvdy4KKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7dXRmLTgmcXVvdDs/Jmd0OworICogJmx0O0xpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90OworICogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249JnF1b3Q7dmVydGljYWwmcXVvdDsmZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0AraWQvdGV4dDEmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0mcXVvdDsxNnNwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSZxdW90O2JvbGQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQyJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90Oy8mZ3Q7CisgKiAmbHQ7L0xpbmVhckxheW91dCZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogWW91IG11c3QgaWRlbnRpZnkgdGhlIGRhdGEgYm91bmQgdG8gZWFjaCBUZXh0VmlldyBvYmplY3QgaW4gdGhpcyBsYXlvdXQuIFRoZQorICogc3ludGF4IGZvciB0aGlzIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorICogPC9wPgorICogPHA+CisgKiA8c3Ryb25nPkJpbmRpbmcgdG8gRGF0YTwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgYmluZCB0aGUgTGlzdEZyYWdtZW50J3MgTGlzdFZpZXcgb2JqZWN0IHRvIGRhdGEgdXNpbmcgYSBjbGFzcyB0aGF0CisgKiBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgTGlzdEFkYXB0ZXJ9IGludGVyZmFjZS4KKyAqIEFuZHJvaWQgcHJvdmlkZXMgdHdvIHN0YW5kYXJkIGxpc3QgYWRhcHRlcnM6CisgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlciBTaW1wbGVBZGFwdGVyfSBmb3Igc3RhdGljIGRhdGEgKE1hcHMpLAorICogYW5kIHtAbGluayBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyIFNpbXBsZUN1cnNvckFkYXB0ZXJ9IGZvciBDdXJzb3IKKyAqIHF1ZXJ5IHJlc3VsdHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSA8Yj5tdXN0PC9iPiB1c2UKKyAqIHtAbGluayAjc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIpIExpc3RGcmFnbWVudC5zZXRMaXN0QWRhcHRlcigpfSB0bworICogYXNzb2NpYXRlIHRoZSBsaXN0IHdpdGggYW4gYWRhcHRlci4gIERvIG5vdCBkaXJlY3RseSBjYWxsCisgKiB7QGxpbmsgTGlzdFZpZXcjc2V0QWRhcHRlcihMaXN0QWRhcHRlcikgTGlzdFZpZXcuc2V0QWRhcHRlcigpfSBvciBlbHNlCisgKiBpbXBvcnRhbnQgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBza2lwcGVkLgorICogPC9wPgorICoKKyAqIEBzZWUgI3NldExpc3RBZGFwdGVyCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgZmluYWwgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIGZpbmFsIHByaXZhdGUgUnVubmFibGUgbVJlcXVlc3RGb2N1cyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbUxpc3QuZm9jdXNhYmxlVmlld0F2YWlsYWJsZShtTGlzdCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIGZpbmFsIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtT25DbGlja0xpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBvbkxpc3RJdGVtQ2xpY2soKExpc3RWaWV3KXBhcmVudCwgdiwgcG9zaXRpb24sIGlkKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBMaXN0VmlldyBtTGlzdDsKKyAgICBWaWV3IG1FbXB0eVZpZXc7CisgICAgVGV4dFZpZXcgbVN0YW5kYXJkRW1wdHlWaWV3OworICAgIFZpZXcgbVByb2dyZXNzQ29udGFpbmVyOworICAgIFZpZXcgbUxpc3RDb250YWluZXI7CisgICAgYm9vbGVhbiBtU2V0RW1wdHlUZXh0OworICAgIGJvb2xlYW4gbUxpc3RTaG93bjsKKworICAgIHB1YmxpYyBMaXN0RnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIHNpbXBsZSBsaXN0IHZpZXcuICBTdWJjbGFzc2VzCisgICAgICogY2FuIG92ZXJyaWRlIHRvIHJlcGxhY2Ugd2l0aCB0aGVpciBvd24gbGF5b3V0LiAgSWYgZG9pbmcgc28sIHRoZQorICAgICAqIHJldHVybmVkIHZpZXcgaGllcmFyY2h5IDxlbT5tdXN0PC9lbT4gaGF2ZSBhIExpc3RWaWV3IHdob3NlIGlkCisgICAgICogaXMge0BsaW5rIGFuZHJvaWQuUi5pZCNsaXN0IGFuZHJvaWQuUi5pZC5saXN0fSBhbmQgY2FuIG9wdGlvbmFsbHkKKyAgICAgKiBoYXZlIGEgc2libGluZyB2aWV3IGlkIHtAbGluayBhbmRyb2lkLlIuaWQjZW1wdHkgYW5kcm9pZC5SLmlkLmVtcHR5fQorICAgICAqIHRoYXQgaXMgdG8gYmUgc2hvd24gd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiB5b3UgYXJlIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Qgd2l0aCB5b3VyIG93biBjdXN0b20gY29udGVudCwKKyAgICAgKiBjb25zaWRlciBpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxheW91dCB7QGxpbmsgYW5kcm9pZC5SLmxheW91dCNsaXN0X2NvbnRlbnR9CisgICAgICogaW4geW91ciBsYXlvdXQgZmlsZSwgc28gdGhhdCB5b3UgY29udGludWUgdG8gcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQKKyAgICAgKiBiZWhhdmlvciBvZiBMaXN0RnJhZ21lbnQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqIHdheSB0byBoYXZlIHRoZSBidWlsdC1pbiBpbmRldGVybWluYW50IHByb2dyZXNzIHN0YXRlIGJlIHNob3duLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9jb250ZW50LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCB0byBsaXN0IHZpZXcgb25jZSBGcmFnbWVudCBpcyByZWFkeSB0byBydW4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0YWNoIGZyb20gbGlzdCB2aWV3LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVxdWVzdEZvY3VzKTsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhbiBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLiBTdWJjbGFzc2VzIGNhbiBjYWxsCisgICAgICogZ2V0TGlzdFZpZXcoKS5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbikgaWYgdGhleSBuZWVkIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsIFRoZSBMaXN0VmlldyB3aGVyZSB0aGUgY2xpY2sgaGFwcGVuZWQKKyAgICAgKiBAcGFyYW0gdiBUaGUgdmlldyB0aGF0IHdhcyBjbGlja2VkIHdpdGhpbiB0aGUgTGlzdFZpZXcKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSB2aWV3IGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGlkIFRoZSByb3cgaWQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGhlIGN1cnNvciBmb3IgdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGJvb2xlYW4gaGFkQWRhcHRlciA9IG1BZGFwdGVyICE9IG51bGw7CisgICAgICAgIG1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgICAgICBpZiAoIW1MaXN0U2hvd24gJiYgIWhhZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdCB3YXMgaGlkZGVuLCBhbmQgcHJldmlvdXNseSBkaWRuJ3QgaGF2ZSBhbgorICAgICAgICAgICAgICAgIC8vIGFkYXB0ZXIuICBJdCBpcyBub3cgdGltZSB0byBzaG93IGl0LgorICAgICAgICAgICAgICAgIHNldExpc3RTaG93bih0cnVlLCBnZXRWaWV3KCkuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogcG9zaXRpb24gd2l0aCB0aGUgYWRhcHRlcidzIGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICBtTGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnNvciByb3cgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhY3Rpdml0eSdzIGxpc3QgdmlldyB3aWRnZXQuCisgICAgICovCisgICAgcHVibGljIExpc3RWaWV3IGdldExpc3RWaWV3KCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjb250ZW50IGZvciBhIExpc3RGcmFnbWVudCBoYXMgYSBUZXh0VmlldyB0aGF0IGNhbgorICAgICAqIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuICBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGl0CisgICAgICogc2hvd24sIGNhbGwgdGhpcyBtZXRob2QgdG8gc3VwcGx5IHRoZSB0ZXh0IGl0IHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1wdHlUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgaWYgKG1TdGFuZGFyZEVtcHR5VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBiZSB1c2VkIHdpdGggYSBjdXN0b20gY29udGVudCB2aWV3Iik7CisgICAgICAgIH0KKyAgICAgICAgbVN0YW5kYXJkRW1wdHlWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgIGlmICghbVNldEVtcHR5VGV4dCkgeworICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7CisgICAgICAgICAgICBtU2V0RW1wdHlUZXh0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgdGhlIGxpc3QgaXMgYmVpbmcgZGlzcGxheWVkLiAgWW91IGNhbiBtYWtlIGl0IG5vdAorICAgICAqIGRpc3BsYXllZCBpZiB5b3UgYXJlIHdhaXRpbmcgZm9yIHRoZSBpbml0aWFsIGRhdGEgdG8gc2hvdyBpbiBpdC4gIER1cmluZworICAgICAqIHRoaXMgdGltZSBhbiBpbmRldGVybWluYW50IHByb2dyZXNzIGluZGljYXRvciB3aWxsIGJlIHNob3duIGluc3RlYWQuCisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIHVzZSB0aGlzIHRoZW1zZWx2ZXMuICBUaGUgZGVmYXVsdAorICAgICAqIGJlaGF2aW9yIG9mIExpc3RGcmFnbWVudCBpcyB0byBzdGFydCB3aXRoIHRoZSBsaXN0IG5vdCBiZWluZyBzaG93biwgb25seQorICAgICAqIHNob3dpbmcgaXQgb25jZSBhbiBhZGFwdGVyIGlzIGdpdmVuIHdpdGgge0BsaW5rICNzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlcil9LgorICAgICAqIElmIHRoZSBsaXN0IGF0IHRoYXQgcG9pbnQgaGFkIG5vdCBiZWVuIHNob3duLCB3aGVuIGl0IGRvZXMgZ2V0IHNob3duCisgICAgICogaXQgd2lsbCBiZSBkbyB3aXRob3V0IHRoZSB1c2VyIGV2ZXIgc2VlaW5nIHRoZSBoaWRkZW4gc3RhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIHNob3duIElmIHRydWUsIHRoZSBsaXN0IHZpZXcgaXMgc2hvd247IGlmIGZhbHNlLCB0aGUgcHJvZ3Jlc3MKKyAgICAgKiBpbmRpY2F0b3IuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTaG93bihib29sZWFuIHNob3duKSB7CisgICAgICAgIHNldExpc3RTaG93bihzaG93biwgdHJ1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNzZXRMaXN0U2hvd24oYm9vbGVhbil9LCBidXQgbm8gYW5pbWF0aW9uIGlzIHVzZWQgd2hlbgorICAgICAqIHRyYW5zaXRpb25pbmcgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdFNob3duTm9BbmltYXRpb24oYm9vbGVhbiBzaG93bikgeworICAgICAgICBzZXRMaXN0U2hvd24oc2hvd24sIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBsaXN0IGlzIGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gbWFrZSBpdCBub3QKKyAgICAgKiBkaXNwbGF5ZWQgaWYgeW91IGFyZSB3YWl0aW5nIGZvciB0aGUgaW5pdGlhbCBkYXRhIHRvIHNob3cgaW4gaXQuICBEdXJpbmcKKyAgICAgKiB0aGlzIHRpbWUgYW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBpbmRpY2F0b3Igd2lsbCBiZSBzaG93biBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaG93biBJZiB0cnVlLCB0aGUgbGlzdCB2aWV3IGlzIHNob3duOyBpZiBmYWxzZSwgdGhlIHByb2dyZXNzCisgICAgICogaW5kaWNhdG9yLiAgVGhlIGluaXRpYWwgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBJZiB0cnVlLCBhbiBhbmltYXRpb24gd2lsbCBiZSB1c2VkIHRvIHRyYW5zaXRpb24gdG8gdGhlCisgICAgICogbmV3IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93biwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBiZSB1c2VkIHdpdGggYSBjdXN0b20gY29udGVudCB2aWV3Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0U2hvd24gPT0gc2hvd24pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdFNob3duID0gc2hvd247CisgICAgICAgIGlmIChzaG93bikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfb3V0KSk7CisgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0ZSkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9pbikpOworICAgICAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIExpc3RBZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGl2aXR5J3MgTGlzdFZpZXcuCisgICAgICovCisgICAgcHVibGljIExpc3RBZGFwdGVyIGdldExpc3RBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxpc3QoKSB7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlldyByb290ID0gZ2V0VmlldygpOworICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250ZW50IHZpZXcgbm90IHlldCBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBMaXN0VmlldykgeworICAgICAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcm9vdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGFuZGFyZEVtcHR5VmlldyA9IChUZXh0Vmlldylyb290LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbnRlcm5hbEVtcHR5KTsKKyAgICAgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyID0gcm9vdC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcm9ncmVzc0NvbnRhaW5lcik7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdENvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IHJhd0xpc3RWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmxpc3QpOworICAgICAgICAgICAgaWYgKCEocmF3TGlzdFZpZXcgaW5zdGFuY2VvZiBMaXN0VmlldykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGhhcyB2aWV3IHdpdGggaWQgYXR0cmlidXRlICdhbmRyb2lkLlIuaWQubGlzdCcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgYSBMaXN0VmlldyBjbGFzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcmF3TGlzdFZpZXc7CisgICAgICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FbXB0eVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtRW1wdHlWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGlzdFNob3duID0gdHJ1ZTsKKyAgICAgICAgbUxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBzdGFydGluZyB3aXRob3V0IGFuIGFkYXB0ZXIsIHNvIGFzc3VtZSB3ZSB3b24ndAorICAgICAgICAgICAgLy8gaGF2ZSBvdXIgZGF0YSByaWdodCBhd2F5IGFuZCBzdGFydCB3aXRoIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuCisgICAgICAgICAgICBpZiAobVByb2dyZXNzQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRMaXN0U2hvd24oZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5wb3N0KG1SZXF1ZXN0Rm9jdXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWJjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CisKKy8qKgorICogSW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCBhbiB7QGxpbmsgQWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudH0gZm9yIG1hbmFnaW5nCisgKiBvbmUgb3IgbW9yZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkxvYWRlcn0gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworcHVibGljIGludGVyZmFjZSBMb2FkZXJNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGEgY2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBMb2FkZXJDYWxsYmFja3M8RD4geworICAgICAgICAvKioKKyAgICAgICAgICogSW5zdGFudGlhdGUgYW5kIHJldHVybiBhIG5ldyBMb2FkZXIgZm9yIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlkIFRoZSBJRCB3aG9zZSBsb2FkZXIgaXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgQW55IGFyZ3VtZW50cyBzdXBwbGllZCBieSB0aGUgY2FsbGVyLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybiBhIG5ldyBMb2FkZXIgaW5zdGFuY2UgdGhhdCBpcyByZWFkeSB0byBzdGFydCBsb2FkaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9hZGVyIGhhcyBmaW5pc2hlZCBpdHMgbG9hZC4KKyAgICAgICAgICogQHBhcmFtIGxvYWRlciBUaGUgTG9hZGVyIHRoYXQgaGFzIGZpbmlzaGVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBnZW5lcmF0ZWQgYnkgdGhlIExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVuc3VyZXMgYSBsb2FkZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIGFjdGl2ZS4gIElmIHRoZSBsb2FkZXIgZG9lc24ndAorICAgICAqIGFscmVhZHkgZXhpc3QsIG9uZSBpcyBjcmVhdGVkIGFuZCAoaWYgdGhlIGFjdGl2aXR5L2ZyYWdtZW50IGlzIGN1cnJlbnRseQorICAgICAqIHN0YXJ0ZWQpIHN0YXJ0cyB0aGUgbG9hZGVyLiAgT3RoZXJ3aXNlIHRoZSBsYXN0IGNyZWF0ZWQKKyAgICAgKiBsb2FkZXIgaXMgcmUtdXNlZC4KKyAgICAgKgorICAgICAqIDxwPkluIGVpdGhlciBjYXNlLCB0aGUgZ2l2ZW4gY2FsbGJhY2sgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2FkZXIsIGFuZAorICAgICAqIHdpbGwgYmUgY2FsbGVkIGFzIHRoZSBsb2FkZXIgc3RhdGUgY2hhbmdlcy4gIElmIGF0IHRoZSBwb2ludCBvZiBjYWxsCisgICAgICogdGhlIGNhbGxlciBpcyBpbiBpdHMgc3RhcnRlZCBzdGF0ZSwgYW5kIHRoZSByZXF1ZXN0ZWQgbG9hZGVyCisgICAgICogYWxyZWFkeSBleGlzdHMgYW5kIGhhcyBnZW5lcmF0ZWQgaXRzIGRhdGEsIHRoZW4KKyAgICAgKiBjYWxsYmFjay4ge0BsaW5rIExvYWRlckNhbGxiYWNrcyNvbkxvYWRGaW5pc2hlZH0gd2lsbAorICAgICAqIGJlIGNhbGxlZCBpbW1lZGlhdGVseSAoaW5zaWRlIG9mIHRoaXMgZnVuY3Rpb24pLCBzbyB5b3UgbXVzdCBiZSBwcmVwYXJlZAorICAgICAqIGZvciB0aGlzIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBpbml0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGxvYWRlciBpbiB0aGlzIG1hbmFnZXIsIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIHRvIGl0LAorICAgICAqIGFuZCAoaWYgdGhlIGFjdGl2aXR5L2ZyYWdtZW50IGlzIGN1cnJlbnRseSBzdGFydGVkKSBzdGFydHMgbG9hZGluZyBpdC4KKyAgICAgKiBJZiBhIGxvYWRlciB3aXRoIHRoZSBzYW1lIGlkIGhhcyBwcmV2aW91c2x5IGJlZW4KKyAgICAgKiBzdGFydGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgbmV3IGxvYWRlciBjb21wbGV0ZXMKKyAgICAgKiBpdHMgd29yay4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgb2xkIGxvYWRlcgorICAgICAqIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiByZXN0YXJ0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbmQgcmVtb3ZlcyB0aGUgbG9hZGVyIHdpdGggdGhlIGdpdmVuIElELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkZXIoaW50IGlkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyIHdpdGggdGhlIGdpdmVuIGlkIG9yIG51bGwgaWYgbm8gbWF0Y2hpbmcgTG9hZGVyCisgICAgICogaXMgZm91bmQuCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCk7Cit9CisKK2NsYXNzIExvYWRlck1hbmFnZXJJbXBsIGltcGxlbWVudHMgTG9hZGVyTWFuYWdlciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9hZGVyTWFuYWdlckltcGwiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgIC8vIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBsb2FkZXJzLiAgQSBsb2FkZXIgaXMgaGVyZQorICAgIC8vIGZyb20gdGhlIHRpbWUgaXRzIGxvYWQgaXMgc3RhcnRlZCB1bnRpbCBpdCBoYXMgYmVlbiBleHBsaWNpdGx5CisgICAgLy8gc3RvcHBlZCBvciByZXN0YXJ0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1Mb2FkZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlckluZm8+KCk7CisKKyAgICAvLyBUaGVzZSBhcmUgcHJldmlvdXNseSBydW4gbG9hZGVycy4gIFRoaXMgbGlzdCBpcyBtYWludGFpbmVkIGludGVybmFsbHkKKyAgICAvLyB0byBhdm9pZCBkZXN0cm95aW5nIGEgbG9hZGVyIHdoaWxlIGFuIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHVzaW5nIGl0LgorICAgIC8vIEl0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZXN0YXJ0IGEgbG9hZGVyLCBidXQgY29udGludWUgdXNpbmcgaXRzCisgICAgLy8gcHJldmlvdXNseSBydW4gbG9hZGVyIHVudGlsIHRoZSBuZXcgbG9hZGVyJ3MgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgZmluYWwgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4gbUluYWN0aXZlTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworCisgICAgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nU3RhcnRlZDsKKworICAgIGZpbmFsIGNsYXNzIExvYWRlckluZm8gaW1wbGVtZW50cyBMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxPYmplY3Q+IHsKKyAgICAgICAgZmluYWwgaW50IG1JZDsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1BcmdzOworICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IG1DYWxsYmFja3M7CisgICAgICAgIExvYWRlcjxPYmplY3Q+IG1Mb2FkZXI7CisgICAgICAgIE9iamVjdCBtRGF0YTsKKyAgICAgICAgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICAgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgICAgICBib29sZWFuIG1SZXRhaW5pbmdTdGFydGVkOworICAgICAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgICAgIGJvb2xlYW4gbUxpc3RlbmVyUmVnaXN0ZXJlZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBMb2FkZXJJbmZvKGludCBpZCwgQnVuZGxlIGFyZ3MsIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgICAgIG1BcmdzID0gYXJnczsKKyAgICAgICAgICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBpZiAobVJldGFpbmluZyAmJiBtUmV0YWluaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIE91ciBvd25lciBpcyBzdGFydGVkLCBidXQgd2Ugd2VyZSBiZWluZyByZXRhaW5lZCBmcm9tIGEKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBpbnN0YW5jZSBpbiB0aGUgc3RhcnRlZCBzdGF0ZS4uLiAgc28gdGhlcmUgaXMgcmVhbGx5CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBzaW5jZSB0aGUgbG9hZGVycyBhcmUgc3RpbGwgc3RhcnRlZC4KKyAgICAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBsb2FkZXIgYWxyZWFkeSBzdGFydGVkLCBkb24ndCByZXN0YXJ0LgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFN0YXJ0aW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBpZiAobUxvYWRlciA9PSBudWxsICYmIG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgbUxvYWRlciA9IG1DYWxsYmFja3Mub25DcmVhdGVMb2FkZXIobUlkLCBtQXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtTGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihtSWQsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgcmV0YWluKCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFJldGFpbmluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICBtUmV0YWluaW5nU3RhcnRlZCA9IG1TdGFydGVkOworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGZpbmlzaFJldGFpbigpIHsKKyAgICAgICAgICAgIGlmIChtUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIEZpbmlzaGVkIFJldGFpbmluZzogIiArIHRoaXMpOworICAgICAgICAgICAgICAgIG1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgIT0gbVJldGFpbmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2FkZXIgd2FzIHJldGFpbmVkIGluIGEgc3RhcnRlZCBzdGF0ZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHJldGFpbmluZyBldmVyeXRoaW5nIG91ciBvd25lciBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbG9uZ2VyIHN0YXJ0ZWQuLi4gIHNvIG1ha2UgaXQgc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgbURhdGEgIT0gbnVsbCAmJiBtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2FkZXIgd2FzIHJldGFpbmVkLCBhbmQgbm93IGF0IHRoZSBwb2ludCBvZgorICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hpbmcgdGhlIHJldGFpbiB3ZSBmaW5kIHdlIHJlbWFpbiBzdGFydGVkLCBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIG91ciBkYXRhLCBhbmQgdGhlIG93bmVyIGhhcyBhIG5ldyBjYWxsYmFjay4uLiAgc28KKyAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgZGVsaXZlciB0aGUgZGF0YSBub3cuCisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3Mub25Mb2FkRmluaXNoZWQobUxvYWRlciwgbURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFN0b3BwaW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCAmJiBtTGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgbG9hZGVyIGtub3cgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURhdGEgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgRGVzdHJveWluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxPYmplY3Q+IGxvYWRlciwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAib25Mb2FkQ29tcGxldGU6ICIgKyB0aGlzICsgIiBtRGVzdHJveWVkPSIgKyBtRGVzdHJveWVkKTsKKworICAgICAgICAgICAgaWYgKG1EZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvZiB0aGUgbmV3IGRhdGEgc28gdGhlIGFwcCBjYW4gc3dpdGNoIG91dCB0aGUgb2xkIGRhdGEgYmVmb3JlCisgICAgICAgICAgICAvLyB3ZSB0cnkgdG8gZGVzdHJveSBpdC4KKyAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKGxvYWRlciwgZGF0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAib25Mb2FkRmluaXNoZWQgcmV0dXJuZWQ6ICIgKyB0aGlzKTsKKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgZ2l2ZW4gdGhlIGFwcGxpY2F0aW9uIHRoZSBuZXcgbG9hZGVyIHdpdGggaXRzCisgICAgICAgICAgICAvLyBsb2FkZWQgZGF0YSwgc28gaXQgc2hvdWxkIGhhdmUgc3RvcHBlZCB1c2luZyB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIGxvYWRlci4gIElmIHRoZXJlIGlzIGEgcHJldmlvdXMgbG9hZGVyIG9uIHRoZSBpbmFjdGl2ZSBsaXN0LAorICAgICAgICAgICAgLy8gY2xlYW4gaXQgdXAuCisgICAgICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtSW5hY3RpdmVMb2FkZXJzLmdldChtSWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpbmZvLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoNjQpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJMb2FkZXJJbmZveyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICMiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtSWQpOworICAgICAgICAgICAgaWYgKG1BcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobUFyZ3MudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsKGJvb2xlYW4gc3RhcnRlZCkgeworICAgICAgICBtU3RhcnRlZCA9IHN0YXJ0ZWQ7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgTG9hZGVySW5mbyBjcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbmV3IExvYWRlckluZm8oaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIG1Mb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIExvYWRlcjxPYmplY3Q+IGxvYWRlciA9IGNhbGxiYWNrLm9uQ3JlYXRlTG9hZGVyKGlkLCBhcmdzKTsKKyAgICAgICAgaW5mby5tTG9hZGVyID0gKExvYWRlcjxPYmplY3Q+KWxvYWRlcjsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBUaGUgYWN0aXZpdHkgd2lsbCBzdGFydCBhbGwgZXhpc3RpbmcgbG9hZGVycyBpbiBpdCdzIG9uU3RhcnQoKSwKKyAgICAgICAgICAgIC8vIHNvIG9ubHkgc3RhcnQgdGhlbSBoZXJlIGlmIHdlJ3JlIHBhc3QgdGhhdCBwb2ludCBvZiB0aGUgYWN0aXZpdGl5J3MKKyAgICAgICAgICAgIC8vIGxpZmUgY3ljbGUKKyAgICAgICAgICAgIGluZm8uc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gaW5pdExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICAKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJpbml0TG9hZGVyIGluICIgKyB0aGlzICsgIjogY3VyPSIgKyBpbmZvKTsKKworICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb2FkZXIgZG9lc24ndCBhbHJlYWR5IGV4aXN0OyBjcmVhdGUuCisgICAgICAgICAgICBpbmZvID0gY3JlYXRlTG9hZGVyKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzID0gKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2s7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLm1EYXRhICE9IG51bGwgJiYgbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsb2FkZXIgaGFzIGFscmVhZHkgZ2VuZXJhdGVkIGl0cyBkYXRhLCByZXBvcnQgaXQgbm93LgorICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKGluZm8ubUxvYWRlciwgaW5mby5tRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gcmVzdGFydExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RhcnRMb2FkZXIgaW4gIiArIHRoaXMgKyAiOiBjdXI9IiArIGluZm8pOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvIGluYWN0aXZlID0gbUluYWN0aXZlTG9hZGVycy5nZXQoaWQpOworICAgICAgICAgICAgaWYgKGluYWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5tRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIG5vdyBoYXMgZGF0YS4uLiAgd2UgYXJlIHByb2JhYmx5IGJlaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIHdpdGhpbiBvbkxvYWRDb21wbGV0ZSwgd2hlcmUgd2UgaGF2ZW4ndAorICAgICAgICAgICAgICAgICAgICAvLyB5ZXQgZGVzdHJveWVkIHRoZSBsYXN0IGluYWN0aXZlIGxvYWRlci4gIFNvIGp1c3QgZG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBub3cuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZW1vdmluZyBsYXN0IGluYWN0aXZlIGxvYWRlciBpbiAiICsgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBpbmFjdGl2ZSBsb2FkZXIgZm9yIHRoaXMgSUQgdGhhdCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IhICBOb3cgd2UgaGF2ZSB0aHJlZSBhY3RpdmUgbG9hZGVycy4uLiBsZXQncyBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhlIG9uZSBpbiB0aGUgbWlkZGxlLCBzaW5jZSB3ZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRzIHJlc3VsdCBidXQgdGhhdCByZXN1bHQgaXMgYWxyZWFkeSBvdXQgb2YgZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFJlbW92aW5nIGludGVybWVkaWF0ZSBsb2FkZXIgaW4gIiArIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpbmZvLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoaXMgbG9hZGVyIHNvIHdlIGNhbiBkZXN0cm95CisgICAgICAgICAgICAgICAgLy8gaXQgd2hlbiB0aGUgbmV3IG9uZSBjb21wbGV0ZXMuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIE1ha2luZyBpbmFjdGl2ZTogIiArIGluZm8pOworICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIChMb2FkZXI8RD4paW5mby5tTG9hZGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGVyKGludCBpZCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInN0b3BMb2FkZXIgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBpZCk7CisgICAgICAgIGludCBpZHggPSBtTG9hZGVycy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy52YWx1ZUF0KGlkeCk7CisgICAgICAgICAgICBtTG9hZGVycy5yZW1vdmVBdChpZHgpOworICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBnZXRMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIExvYWRlckluZm8gbG9hZGVySW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChsb2FkZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KW1Mb2FkZXJzLmdldChpZCkubUxvYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgCisgICAgdm9pZCBkb1N0YXJ0KCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0YXJ0aW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgLy8gQ2FsbCBvdXQgdG8gc3ViIGNsYXNzZXMgc28gdGhleSBjYW4gc3RhcnQgdGhlaXIgbG9hZGVycworICAgICAgICAvLyBMZXQgdGhlIGV4aXN0aW5nIGxvYWRlcnMga25vdyB0aGF0IHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIGxvYWQgaXMgY29tcGxldGUKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1N0b3AoKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU3RvcHBpbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGRvUmV0YWluKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJldGFpbmluZzogIiArIHRoaXMpOworCisgICAgICAgIG1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnJldGFpbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgZmluaXNoUmV0YWluKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkZpbmlzaGVkIFJldGFpbmluZzogIiArIHRoaXMpOworCisgICAgICAgIG1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5maW5pc2hSZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGRvRGVzdHJveSgpIHsKKyAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgQWN0aXZlOiAiICsgdGhpcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRGVzdHJveWluZyBJbmFjdGl2ZTogIiArIHRoaXMpOworICAgICAgICBmb3IgKGludCBpID0gbUluYWN0aXZlTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMudmFsdWVBdChpKS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgICAgbUluYWN0aXZlTG9hZGVycy5jbGVhcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDE3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBBIEZyYWdtZW50IHRoYXQgaGFzIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFuYWdpbmcge0BsaW5rIExvYWRlcn1zLgorICoKKyAqIEBwYXJhbSA8RD4gVGhlIHR5cGUgb2YgZGF0YSByZXR1cm5lZCBieSB0aGUgTG9hZGVyLiBJZiB5b3UncmUgdXNpbmcgbXVsdGlwbGUgTG9hZGVycyB3aXRoCisgKiBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIHVzZSBPYmplY3QgYW5kIGNhc2UgdGhlIHJlc3VsdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50PEQ+IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZGVySW5mbzxEPiB7CisgICAgICAgIHB1YmxpYyBCdW5kbGUgYXJnczsKKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBsb2FkZXI7CisgICAgfQorICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBtTG9hZGVyczsKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUluYWN0aXZlTG9hZGVyczsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxvYWRlciB3aXRoIHRoaXMgYWN0aXZpdHksIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIG9uIGl0LCBhbmQgc3RhcnRzIGl0IGxvYWRpbmcuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuIHN0YXJ0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlc3Ryb3llZAorICAgICAqIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzIGl0J3Mgd29yay4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgb2xkIGxvYWRlcgorICAgICAqIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IHN0YXJ0TG9hZGluZyhpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoaXMgbG9hZGVyIHNvIHdlIGNhbiBkZXN0cm95CisgICAgICAgICAgICAvLyBpdCB3aGVuIHRoZSBuZXcgb25lIGNvbXBsZXRlcy4KKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvID0gbmV3IExvYWRlckluZm88RD4oKTsKKyAgICAgICAgaW5mby5hcmdzID0gYXJnczsKKyAgICAgICAgbUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBhcmdzKTsKKyAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksIHNvIG9ubHkgc3RhcnQgdGhlbQorICAgICAgICAgICAgLy8gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzIGxpZmUgY3ljbGUKKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9hZGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpIHsKKyAgICAgICAgLy8gTm90aWZ5IG9mIHRoZSBuZXcgZGF0YSBzbyB0aGUgYXBwIGNhbiBzd2l0Y2ggb3V0IHRoZSBvbGQgZGF0YSBiZWZvcmUKKyAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgIG9uTG9hZEZpbmlzaGVkKGxvYWRlciwgZGF0YSk7CisKKyAgICAgICAgLy8gTG9vayBmb3IgYW4gaW5hY3RpdmUgbG9hZGVyIGFuZCBkZXN0cm95IGl0IGlmIGZvdW5kCisgICAgICAgIGludCBpZCA9IGxvYWRlci5nZXRJZCgpOworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtSW5hY3RpdmVMb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlcjxEPiBvbGRMb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGlmIChvbGRMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9sZExvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZFN0YXRlKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwYXNzZWQgYWxvbmcgbG9hZGVyIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIGl0J3Mgbm90IHRoZXJlCisvLyBUT0RPOiB1bmNvbW1lbnQgb25jZSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlIG1ldGhvZCBpcyBhdmFpbGFibGUKKy8vICAgICAgICAgICAgbUxvYWRlcnMgPSAoSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPikgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+KCk7CisgICAgICAgICAgICAgICAgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtSW5hY3RpdmVMb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpbnQgaWQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgbG9hZGVyID0gb25DcmVhdGVMb2FkZXIoaWQsIGluZm8uYXJncyk7CisgICAgICAgICAgICAgICBpbmZvLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTGV0IHRoZSBsb2FkZXIga25vdyB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIGxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBsb2FkZXIgaXNuJ3QgZ2V0dGluZyBwYXNzZWQgYWxvbmcgdG8gdGhlIG5leHQgaW5zdGFuY2Ugc28gYXNrIGl0IHRvIHN0b3AgbG9hZGluZworICAgICAgICAgICAgaWYgKCFnZXRBY3Rpdml0eSgpLmlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKiBUTyBETzogVGhpcyBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHJldGFpbmVkIGZyYWdtZW50LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3Qgb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGxvYWRlciBhbG9uZyB0byB0aGUgbmV4dCBndXkKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1Mb2FkZXJzOworICAgICAgICBtTG9hZGVycyA9IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICoqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoaW50IGlkKSB7CisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJzLmdldChpZCkubG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYTI0ZmNhZS4uNTI0ZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlIHx8IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CiAKICAgICAvLyBJbnRlcm5hbCB0b2tlbiBmb3IgYW4gQWN0aXZpdHkgYmVpbmcgbWFuYWdlZCBieSBMb2NhbEFjdGl2aXR5TWFuYWdlci4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFjdGl2aXR5UmVjb3JkIGV4dGVuZHMgQmluZGVyIHsKQEAgLTExMiwxMSArMTEwLDE2IEBACiAgICAgICAgIAogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBJTklUSUFMSVpJTkcpIHsKICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKaW5kZXggMGJjZDY1Yy4uMjIzN2M4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQpAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX1dJUEVfREFUQSA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogYWJsZSB0byBzcGVjaWZ5IHRoZQorICAgICAqIGRldmljZSBHbG9iYWwgUHJveHksIHZpYSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRHbG9iYWxQcm94eX0uCisgICAgICoKKyAgICAgKiA8cD5UbyBjb250cm9sIHRoaXMgcG9saWN5LCB0aGUgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSBhICJzZXQtZ2xvYmFsLXByb3h5IgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSA9IDU7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTM4LDYgKzE0Nyw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSywgImZvcmNlLWxvY2siLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9mb3JjZUxvY2ssCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19mb3JjZUxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSwgInNldC1nbG9iYWwtcHJveHkiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5KSk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTMyOCw3ICszNDAsNyBAQAogICAgICAqIHRoZSBnaXZlbiBwb2xpY3kgY29udHJvbC4gIFRoZSBwb3NzaWJsZSBwb2xpY3kgaWRlbnRpZmllciBpbnB1dHMgYXJlOgogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKLSAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0uCisgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMjk2ZDcwYTQuLjJiN2U0MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjMsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc4LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMiwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc3LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjE0LDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzNSwyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg3LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjUsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA4LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzczMSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1OCwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTYsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNiwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzYsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODk0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTUsOTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogZ2xvYmFsIHByb3h5IGFuZCBleGNsdXNpb24gbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFl9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4gY2FuIHNldCB0aGUgcHJveHkuIElmIGEgc2Vjb25kIGFkbWluIGF0dGVtcHRzCisgICAgICogdG8gc2V0IHRoZSBwcm94eSwgdGhlIHtAbGluayBDb21wb25lbnROYW1lfSBvZiB0aGUgYWRtaW4gb3JpZ2luYWxseSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHdpbGwgYmUgcmV0dXJuZWQuIElmIHN1Y2Nlc3NmdWwgaW4gc2V0dGluZyB0aGUgcHJveHksIG51bGwgd2lsbAorICAgICAqIGJlIHJldHVybmVkLgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBkZXZpY2UgYWRtaW4gYWxyYWR5IHNldHRpbmcgdGhlCisgICAgICogcHJveHkgdG8gdXBkYXRlIHRoZSBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBwcm94eVNwZWMgdGhlIGdsb2JhbCBwcm94eSBkZXNpcmVkLiBNdXN0IGJlIGFuIEhUVFAgUHJveHkuCisgICAgICogICAgICAgICAgICBQYXNzIFByb3h5Lk5PX1BST1hZIHRvIHJlc2V0IHRoZSBwcm94eS4KKyAgICAgKiBAcGFyYW0gZXhjbHVzaW9uTGlzdCBhIGxpc3Qgb2YgZG9tYWlucyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciBhIHtAbGluayBDb21wb25lbnROYW1lfQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGRldmljZSBhZG1pbiB0aGF0IHNldHMgdGhldyBwcm94eSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgUHJveHkgcHJveHlTcGVjLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbkxpc3QgKSB7CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RTcGVjOworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAocHJveHlTcGVjLmVxdWFscyhQcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm94eVNwZWMudHlwZSgpLmVxdWFscyhQcm94eS5UeXBlLkhUVFApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJveHlTcGVjLmFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBzYS5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaG9zdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBob3N0U3BlYyA9IGhvc3RCdWlsZGVyLmFwcGVuZChob3N0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdERvbWFpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3REb21haW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0QnVpbGRlciA9IGxpc3RCdWlsZGVyLmFwcGVuZChleGNsRG9tYWluLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IGxpc3RCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuUHJveHkudmFsaWRhdGUoaG9zdE5hbWUsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldEdsb2JhbFByb3h5KGFkbWluLCBob3N0U3BlYywgZXhjbFNwZWMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIHNldHRpbmcgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgKiBAcmV0dXJuIENvbXBvbmVudE5hbWUgb2JqZWN0IG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXQgdGhlIGdsb2JhbCBwcm94eSwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgaWYgbm8gYWRtaW4gaGFzIHNldCB0aGUgcHJveHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTQzLDcgKzEwMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArMTAyNiwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01ODcsMTYgKzEwNTcsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArMTA4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjIyLDQgKzEwOTQsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNmY2Q2ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC00NSw2ICs2Niw5IEBACiAgICAgdm9pZCBsb2NrTm93KCk7CiAgICAgCiAgICAgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpOworCisgICAgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShpbiBDb21wb25lbnROYW1lIGFkbWluLCBTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CisgICAgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCk7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBib29sZWFuIGlzQWRtaW5BY3RpdmUoaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CkBAIC01Myw3ICs3Nyw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCmluZGV4IGIyZmMxM2YuLjYwMTFlZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVVBEQVRFID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9QUk9WSURFUl9DSEFOR0VEID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCA9IDM7CiAKICAgICBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTZXJ2aWNlTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7CkBAIC02MCw2ICs2MSwxNCBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IGluZm87CiAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBSZW1vdGVWaWV3cyB2aWV3cywgaW50IHZpZXdJZCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IGFwcFdpZGdldElkOworICAgICAgICAgICAgbXNnLmFyZzIgPSB2aWV3SWQ7CisgICAgICAgICAgICBtc2cub2JqID0gdmlld3M7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBVcGRhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CkBAIC03Nyw2ICs4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblByb3ZpZGVyQ2hhbmdlZChtc2cuYXJnMSwgKEFwcFdpZGdldFByb3ZpZGVySW5mbyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdEYXRhQ2hhbmdlZChtc2cuYXJnMSwgKFJlbW90ZVZpZXdzKSBtc2cub2JqLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1MCw2ICsyNjMsMTYgQEAKICAgICAgICAgICAgIHYudXBkYXRlQXBwV2lkZ2V0KHZpZXdzKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgUmVtb3RlVmlld3Mgdmlld3MsIGludCB2aWV3SWQpIHsKKyAgICAgICAgQXBwV2lkZ2V0SG9zdFZpZXcgdjsKKyAgICAgICAgc3luY2hyb25pemVkIChtVmlld3MpIHsKKyAgICAgICAgICAgIHYgPSBtVmlld3MuZ2V0KGFwcFdpZGdldElkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICB2LnZpZXdEYXRhQ2hhbmdlZCh2aWV3cywgdmlld0lkKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCmluZGV4IGIzM2IwOTcuLjIyZjQyNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCkBAIC0yMywxNSArMjMsMTggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKQEAgLTI1OCw2ICsyNjEsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQcm9jZXNzIGRhdGEtY2hhbmdlZCBub3RpZmljYXRpb25zIGZvciB0aGUgc3BlY2lmaWVkIHZpZXcgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIHNldCBvZiB7QGxpbmsgUmVtb3RlVmlld3N9IHZpZXdzLgorICAgICAqLworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIFZpZXcgdiA9IGZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICBpZiAoKHYgIT0gbnVsbCkgJiYgKHYgaW5zdGFuY2VvZiBBZGFwdGVyVmlldzw/PikpIHsKKyAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IGFkYXB0ZXJWaWV3ID0gKEFkYXB0ZXJWaWV3PD8+KSB2OworICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlclZpZXcuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlQWRhcHRlcikgeworICAgICAgICAgICAgICAgIEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKEJhc2VBZGFwdGVyKSBhZGFwdGVyOworICAgICAgICAgICAgICAgIGJhc2VBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCdWlsZCBhIHtAbGluayBDb250ZXh0fSBjbG9uZWQgaW50byBhbm90aGVyIHBhY2thZ2UgbmFtZSwgdXN1YWxseSBmb3IgdGhlCiAgICAgICogcHVycG9zZXMgb2YgcmVhZGluZyByZW1vdGUgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtMjc1LDYgKzI5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoQ2FudmFzIGNhbnZhcywgVmlldyBjaGlsZCwgbG9uZyBkcmF3aW5nVGltZSkgewogICAgICAgICBpZiAoQ1JPU1NGQURFKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkMmFiODVlLi41ZWU3MjFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTI4OCwxMSArMjg4LDQ4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZpZXcgaW4gYWxsIHRoZSBzcGVjaWZpZWQgQXBwV2lkZ2V0IGluc3RhbmNlcworICAgICAqIHRvIGludmFsaWRhdGUgdGhlaXIgY3VycmVudGx5IGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwV2lkZ2V0SWRzICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlcyBmb3Igd2hpY2ggdG8gbm90aWZ5IG9mIHZpZXcgZGF0YSBjaGFuZ2VzLgorICAgICAqIEBwYXJhbSB2aWV3cyAgICAgICAgIFRoZSBSZW1vdGVWaWV3cyB3aGljaCBjb250YWlucyB0aGUgdmlldyByZWZlcmVuY2VkIGF0IHZpZXdJZC4KKyAgICAgKiBAcGFyYW0gdmlld0lkICAgICAgICBUaGUgY29sbGVjdGlvbiB2aWV3IGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5ub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoYXBwV2lkZ2V0SWRzLCB2aWV3cywgdmlld0lkKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzeXN0ZW0gc2VydmVyIGRlYWQ/IiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmlldyBpbiBhbGwgdGhlIHNwZWNpZmllZCBBcHBXaWRnZXQgaW5zdGFuY2UKKyAgICAgKiB0byBpbnZhbGlkYXRlIGl0J3MgY3VycmVudGx5IGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwV2lkZ2V0SWQgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIG5vdGlmeSBvZiB2aWV3IGRhdGEgY2hhbmdlcy4KKyAgICAgKiBAcGFyYW0gdmlld3MgICAgICAgICBUaGUgUmVtb3RlVmlld3Mgd2hpY2ggY29udGFpbnMgdGhlIHZpZXcgcmVmZXJlbmNlZCBhdCB2aWV3SWQuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBSZW1vdGVWaWV3cyB2aWV3cywgaW50IHZpZXdJZCkgeworICAgICAgICBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQobmV3IGludFtdIHsgYXBwV2lkZ2V0SWQgfSwgdmlld3MsIHZpZXdJZCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgQXBwV2lkZ2V0IHByb3ZpZGVycyB0aGF0IGFyZSBjdXJyZW50bHkgaW5zdGFsbGVkLgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PEFwcFdpZGdldFByb3ZpZGVySW5mbz4gZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlLmdldEluc3RhbGxlZFByb3ZpZGVycygpOworICAgICAgICAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IHByb3ZpZGVycyA9IHNTZXJ2aWNlLmdldEluc3RhbGxlZFByb3ZpZGVycygpOworICAgICAgICAgICAgZm9yIChBcHBXaWRnZXRQcm92aWRlckluZm8gaW5mbyA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgY29tcGxleCB0byBkcC4KKyAgICAgICAgICAgICAgICBpbmZvLm1pbldpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluV2lkdGgsIG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgICAgICAgICAgaW5mby5taW5IZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5IZWlnaHQsIG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQppbmRleCBjZWUyODY1Li4zOTZlOTJkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCkBAIC0xMTAsNiArMTEwLDE3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIG9sZE5hbWU7CisgICAgCisgICAgLyoqCisgICAgICogQSBwcmV2aWV3IG9mIHdoYXQgdGhlIEFwcFdpZGdldCB3aWxsIGxvb2sgbGlrZSBhZnRlciBpdCdzIGNvbmZpZ3VyZWQuCisgICAgICogSWYgbm90IHN1cHBsaWVkLCB0aGUgQXBwV2lkZ2V0J3MgaWNvbiB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5hbmRyb2lkOnByZXZpZXdJbWFnZTwvY29kZT4gYXR0cmlidXRlIGluCisgICAgICogdGhlIDxjb2RlPiZsdDtyZWNlaXZlciZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworCXB1YmxpYyBpbnQgcHJldmlld0ltYWdlOwogCiAgICAgcHVibGljIEFwcFdpZGdldFByb3ZpZGVySW5mbygpIHsKICAgICB9CkBAIC0xMzAsNiArMTQxLDcgQEAKICAgICAgICAgfQogICAgICAgICB0aGlzLmxhYmVsID0gaW4ucmVhZFN0cmluZygpOwogICAgICAgICB0aGlzLmljb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIHRoaXMucHJldmlld0ltYWdlID0gaW4ucmVhZEludCgpOwogICAgIH0KIAogCkBAIC0xNTIsNiArMTY0LDcgQEAKICAgICAgICAgfQogICAgICAgICBvdXQud3JpdGVTdHJpbmcodGhpcy5sYWJlbCk7CiAgICAgICAgIG91dC53cml0ZUludCh0aGlzLmljb24pOworICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5wcmV2aWV3SW1hZ2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKaW5kZXggYzdmZWE5ZS4uMGM5YmFiMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKQEAgLTI1OSw2ICsyNTksOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUCA9IDE7CiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9PUFAgPSAyOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfSElEID0gMzsKIAogICAgIC8qKgogICAgICAqIENoZWNrIGNsYXNzIGJpdHMgZm9yIHBvc3NpYmxlIGJsdWV0b290aCBwcm9maWxlIHN1cHBvcnQuCkBAIC0zMjQsNiArMzI2LDggQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOGU2NTVlMi4uMWZkNzE1MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQpAQCAtNTgsMTkgKzU4LDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy9TVE9QU0hJUCAtIENoYW5nZSB0byBmYWxzZQogCisgICAgLy8gVE9ETygpOiBSZXN0cnVjdHVyZSB0aGUgc3RhdGUgbWFjaGluZSB0byBtYWtlIGl0IHNjYWxhYmxlIHdpdGggcmVnYXJkIHRvIHByb2ZpbGVzLgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEZQX09VVEdPSU5HID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hGUF9JTkNPTUlORyA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSElEX09VVEdPSU5HID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hJRF9JTkNPTUlORyA9IDY7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9PVVRHT0lORyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfT1VUR09JTkcgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfSU5DT01JTkcgPSA1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9PVVRHT0lORyA9IDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HID0gNTU7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlBBSVIgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1RPX1NUQUJMRSA9IDEwMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfREVMQVkgPSA2MDAwOyAvLyA2IHNlY3MKIApAQCAtNzksNiArODQsOCBAQAogICAgIHByaXZhdGUgSW5jb21pbmdIYW5kc2ZyZWUgbUluY29taW5nSGFuZHNmcmVlID0gbmV3IEluY29taW5nSGFuZHNmcmVlKCk7CiAgICAgcHJpdmF0ZSBJbmNvbWluZ0EyZHAgbUluY29taW5nQTJkcCA9IG5ldyBJbmNvbWluZ0EyZHAoKTsKICAgICBwcml2YXRlIE91dGdvaW5nQTJkcCBtT3V0Z29pbmdBMmRwID0gbmV3IE91dGdvaW5nQTJkcCgpOworICAgIHByaXZhdGUgT3V0Z29pbmdIaWQgbU91dGdvaW5nSGlkID0gbmV3IE91dGdvaW5nSGlkKCk7CisgICAgcHJpdmF0ZSBJbmNvbWluZ0hpZCBtSW5jb21pbmdIaWQgPSBuZXcgSW5jb21pbmdIaWQoKTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIEJsdWV0b290aFNlcnZpY2UgbVNlcnZpY2U7CkBAIC04OSw2ICs5Niw3IEBACiAgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKICAgICBwcml2YXRlIGludCBtSGVhZHNldFN0YXRlOwogICAgIHByaXZhdGUgaW50IG1BMmRwU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUhpZFN0YXRlOwogCiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTI1LDYgKzEzMywxOSBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBtSGlkU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9JTkNPTUlORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9BQ0xfQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgIGlmICghZ2V0Q3VycmVudFN0YXRlKCkuZXF1YWxzKG1Cb25kZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YXRlIGlzOiAiICsgZ2V0Q3VycmVudFN0YXRlKCkpOwpAQCAtMTY1LDYgKzE4Niw4IEBACiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hhbmRzZnJlZSk7CiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0EyZHApOwogICAgICAgICBhZGRTdGF0ZShtT3V0Z29pbmdBMmRwKTsKKyAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nSGlkKTsKKyAgICAgICAgYWRkU3RhdGUobUluY29taW5nSGlkKTsKICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1Cb25kZWREZXZpY2UpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CkBAIC0xNzIsNiArMTk1LDcgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKIApAQCAtMjI0LDYgKzI0OCwxNCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1PdXRnb2luZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRzZXRTdGF0ZSAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9IRlBfT1VUR09JTkcpOwpAQCAtMjMzLDYgKzI2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IaWRTdGF0ZSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kKFVOUEFJUik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0LDYgKzI5MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldENvbm5lY3RlZFNpbmtzKCkubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuY29ubmVjdFNpbmsobURldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKG1EZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9UT19TVEFCTEU6CkBAIC0zNDIsNiArMzgyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQwOSw2ICs0NjYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjYXVzZXMgaW5jb21pbmcgSEZQIHRvIGZhaWwsIGl0IGlzIG1vcmUgb2YgYSBoZWFkc2V0IHByb2JsZW0KICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYm90aCBjb25uZWN0aW9ucyBhcmUgaW5jb21pbmcgb25lcy4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNDk2LDYgKzU2MCwyMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTYxLDYgKzY0MiwxMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC01NzYsNiArNjY0LDE0MyBAQAogICAgIH0KIAogCisgICAgcHJpdmF0ZSBjbGFzcyBPdXRnb2luZ0hpZCBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgbG9nKCJFbnRlcmluZyBPdXRnb2luZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICAgIG1Db21tYW5kID0gZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0OworICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX09VVEdPSU5HICYmCisgICAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfT1VUR09JTkcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvcjogT3V0Z29pbmdIaWQgc3RhdGUgd2l0aCBjb21tYW5kOiIgKyBtQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgICAgaWYgKCFtU3RhdHVzKSBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBsb2coIk91dGdvaW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gZGVmZXIgYWxsIG91dGdvaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIYW5kc2ZyZWUpOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FuY2VsIEhJRCBvdXRnb2luZyBhcyB0aGVyZSBpcyBubyBndWFyYW50ZWUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgY2FuY2VsZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGFscmVhZHkgYmUgY29ubmVjdGVkIGJ1dCB3ZSBtaWdodCBub3QgaGF2ZSBnb3QgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0UuIEhlbmNlLCBubyBwb2ludCBkaXNjb25uZWN0aW5nIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JzdCBjYXNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGZhaWwsIHJldHJ5LgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gQmx1ZXogd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGNvbmZsaWN0cworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBIRlAuIFNvbWV0aW1lcyBISUQgY29ubmVjdGlvbiBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFpbCBkdWUgdG8gdGhlIGRpc2Nvbm5lY3Rpb24gb2YgSEZQLiBTbyBhZGQgYSByZXRyeQorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIEhJRC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUJvbmRlZERldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGUgY2xhc3MgSW5jb21pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXR1cyA9IGZhbHNlOworICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgbG9nKCJFbnRlcmluZyBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICBpZiAobUNvbW1hbmQgIT0gQ09OTkVDVF9ISURfSU5DT01JTkcgJiYKKyAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfSU5DT01JTkcpIHsKKyAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IEluY29taW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgIH0KKyAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgIGxvZygiSW5jb21pbmdIaWQgU3RhdGUtPlByb2Nlc3NpbmcgTWVzc2FnZTogIiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuIGJ1dCBpZiBkb2VzLCB3ZSBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gRGVwZW5kcyBpZiB0aGUgaGVhZHNldCBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gSW5jb21pbmcgSElEIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVleiwgRGlzY29ubmVjdCBIRlAKKyAgICAgICAgICAgICAgICAgIC8vIHRoZSBzb2NrZXQgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgorICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgfQorICB9CisKIAogICAgIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbENvbW1hbmQoaW50IGNvbW1hbmQpIHsKICAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ09OTkVDVF9IRlBfT1VUR09JTkcgKSB7CkBAIC02MTksNiArODQ0LDEwIEBACiAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIEJsdWV6IHRha2VzIGNhcmUKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CiAgICAgICAgICAgICAgICAgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZGVmZXJIZWFkc2V0TWVzc2FnZShjb21tYW5kKTsKQEAgLTY0NSw2ICs4NzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwU2VydmljZS5kaXNjb25uZWN0U2lua0ludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UpID09CisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlbW92ZUJvbmRJbnRlcm5hbChtRGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNjUzLDYgKzg5MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKwogICAgIC8qcGFja2FnZSovIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFB1YmxpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSElEIChJbnB1dCBEZXZpY2UpIFByb2ZpbGUKKyAqCisgKiBCbHVldG9vdGhJbnB1dERldmljZSBpcyBhIHByb3h5IG9iamVjdCB1c2VkIHRvIG1ha2UgY2FsbHMgdG8gQmx1ZXRvb3RoIFNlcnZpY2UKKyAqIHdoaWNoIGhhbmRsZXMgdGhlIEhJRCBwcm9maWxlLgorICoKKyAqIENyZWF0aW5nIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2Ugb2JqZWN0IHdpbGwgaW5pdGlhdGUgYSBiaW5kaW5nIHdpdGggdGhlCisgKiBCbHVldG9vdGggc2VydmljZS4gVXNlcnMgb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGNhbGwgY2xvc2UoKSB3aGVuIHRoZXkKKyAqIGFyZSBmaW5pc2hlZCwgc28gdGhhdCB0aGlzIHByb3h5IG9iamVjdCBjYW4gdW5iaW5kIGZyb20gdGhlIHNlcnZpY2UuCisgKgorICogQ3VycmVudGx5IHRoZSBCbHVldG9vdGggc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCisgKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCisgKgorICogIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhJbnB1dERldmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhJbnB1dERldmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5JTlBVVF9ERVZJQ0VfU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gaW5wdXQgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLAorICAgICAqIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSBhbmQgQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRQorICAgICAqIGV4dHJhcy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5hY3Rpb24uSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBdXRvIGNvbm5lY3Rpb24sIGluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMKKyAgICAgKiBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOworICAgIC8qKgorICAgICAqIEluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9ucyB0byB0aGUgZGV2aWNlIGFyZSBub3QgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09GRiA9IDA7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBsZXZlbCB3aGVuIHRoZSBkZXZpY2UgaXMgdW5wYWlyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2UgcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBTZXJ2aWNlIHdoaWNoIGhhbmRsZSB0aGUgSElEIHByb2ZpbGUuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhJbnB1dERldmljZShDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIgd2hlbiBpdCBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBJbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqICBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RJbnB1dERldmljZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBJbnB1dCBEZXZpY2UuCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJuIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBkaXNjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCisgICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNwZWNpZmllZCBJbnB1dERldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRydWUgaWYgY29ubmVjdGVkICwgZmFsc2Ugb3RoZXJ3aXNlIGFuZCBvbiBlcnJvci4KKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJpc0lucHV0RGV2aWNlQ29ubmVjdGVkKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpbnQgc3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9DT05ORUNURUQpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIGFueSBJbnB1dCBEZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIElucHV0IERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBJbnB1dCBEZXZpY2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHByaW9yaXR5IG9mIGFuIGlucHV0IGRldmljZS4KKyAgICAgKgorICAgICAqIFByaW9yaXR5IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIFByaW9yaXR5IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB2YWx1ZXM6CisgICAgICoge0BsaW5rIFBSSU9SSVRZX09OfSwge0BsaW5rIFBSSU9SSVRZX09GRn0sIHtAbGluayBQUklPUklUWV9BVVRPX0NPTk5FQ1R9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBkZXZpY2UuCisgICAgICogQHBhcmFtIHByaW9yaXR5IEludGVnZXIgcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIiwgIiArIHByaW9yaXR5ICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIElucHV0IERldmljZQorICAgICAqIEByZXR1cm4gbm9uLW5lZ2F0aXZlIHByaW9yaXR5LCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBQUklPUklUWV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOTQ2ZGNhYS4uYWQ3MGQwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQpAQCAtNDMsOCArNDMsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy8gU1RPUFNISVAgLSBjaGFuZ2UgdG8gZmFsc2UuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQcm9maWxlU3RhdGUiOwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgSEZQID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRlAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJRCA9IDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDA7CiAKQEAgLTcwLDYgKzcxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gSElEICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTg0LDYgKzkxLDcgQEAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQppbmRleCA0MTY0YTNkLi5mMWVlOTA3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKQEAgLTQ5LDYgKzQ5LDggQEAKICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE9iZXhPYmplY3RQdXNoID0KICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEhpZCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkW10gUkVTRVJWRURfVVVJRFMgPSB7CiAgICAgICAgIEF1ZGlvU2luaywgQXVkaW9Tb3VyY2UsIEFkdkF1ZGlvRGlzdCwgSFNQLCBIYW5kc2ZyZWUsIEF2cmNwQ29udHJvbGxlciwgQXZyY3BUYXJnZXQsCkBAIC04Miw2ICs4NCwxMCBAQAogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXZyY3BUYXJnZXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoSGlkKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgUGFyY2VsVXVpZCBpcyBwcmVzZW50IGluIHV1aWRBcnJheQogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAppbmRleCBlYTcxMDM0Li43NWYwOTNjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIAogLyoqCkBAIC03Miw0ICs3MywxMiBAQAogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gbm90aWZ5SW5jb21pbmdDb25uZWN0aW9uKFN0cmluZyBhZGRyZXNzKTsKKworICAgIC8vIEhJRCBwcm9maWxlIEFQSXMKKyAgICBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YTk5YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyLldha2VMb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogVGhlIEFuZHJvaWQgQmx1ZXRvb3RoIEFQSSBpcyBub3QgZmluYWxpemVkLCBhbmQgKndpbGwqIGNoYW5nZS4gVXNlIGF0IHlvdXIKLSAqIG93biByaXNrLgotICoKLSAqIFNpbXBsZSBTQ08gU29ja2V0LgotICogQ3VycmVudGx5IGluIEFuZHJvaWQsIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbmRpbmcgZGF0YSBvdmVyIGEgU0NPCi0gKiBzb2NrZXQgLSB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIGhhcmR3YXJlIGxpbmsgdG8gdGhlIEJsdWV0b290aCBDaGlwLiBUaGlzCi0gKiBjbGFzcyBpcyBpbnN0ZWFkIGludGVuZGVkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBTQ08gc29ja2V0IGxpZmV0aW1lLCAKLSAqIGFuZCBpcyB0YWlsb3JlZCBmb3IgdXNlIHdpdGggdGhlIGhlYWRzZXQgLyBoYW5kc2ZyZWUgcHJvZmlsZXMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU2NvU29ja2V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNjb1NvY2tldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkRCRyA9IGZhbHNlOyAgLy8gZXZlbiBtb3JlIGxvZ2dpbmcKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQURZID0gMTsgICAgLy8gUmVhZHkgZm9yIHVzZS4gTm8gdGhyZWFkcyBvciBzb2NrZXRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUNDRVBUID0gMjsgICAvLyBhY2NlcHQoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSAzOyAgLy8gY29ubmVjdCgpIHRocmVhZCBydW5uaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEID0gNDsgICAvLyBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIGNsb3NlKCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DTE9TRUQgPSA1OyAgIC8vIHdhcyBjb25uZWN0ZWQsIG5vdyBjbG9zZWQuCi0KLSAgICBwcml2YXRlIGludCBtU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGE7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgaW50IG1BY2NlcHRlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNsb3NlZENvZGU7Ci0KLSAgICBwcml2YXRlIFdha2VMb2NrIG1XYWtlTG9jazsgIC8vIGhlbGQgd2hpbGUgaW4gU1RBVEVfQ09OTkVDVElORwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIFNjb1NvY2tldChQb3dlck1hbmFnZXIgcG0sIEhhbmRsZXIgaGFuZGxlciwgaW50IGFjY2VwdGVkQ29kZSwgaW50IGNvbm5lY3RlZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VkQ29kZSkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQURZOwotICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgIG1BY2NlcHRlZENvZGUgPSBhY2NlcHRlZENvZGU7Ci0gICAgICAgIG1Db25uZWN0ZWRDb2RlID0gY29ubmVjdGVkQ29kZTsKLSAgICAgICAgbUNsb3NlZENvZGUgPSBjbG9zZWRDb2RlOwotICAgICAgICBtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssICJTY29Tb2NrZXQiKTsKLSAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgQ1RPUiIpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgRFRPUiIpOwotICAgICAgICAgICAgZGVzdHJveU5hdGl2ZSgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGVzdHJveU5hdGl2ZSgpOwotCi0gICAgLyoqIENvbm5lY3QgdGhpcyBTQ08gc29ja2V0IHRvIHRoZSBnaXZlbiBCVCBhZGRyZXNzLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdChTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKTogQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIGlmIChjb25uZWN0TmF0aXZlKGFkZHJlc3MsIG5hbWUpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3ROYXRpdmUoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKTsKLQotICAgIC8qKiBBY2NlcHQgaW5jb21pbmcgU0NPIGNvbm5lY3Rpb25zLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKCJhY2NlcHQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjY2VwdE5hdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ0NFUFQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGFjY2VwdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBjbG9zZSgpIG1TdGF0ZSA9ICIgKyBtU3RhdGUpOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICBjbG9zZU5hdGl2ZSgpOwotICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbG9zZU5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNvbm5lY3RlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgb25Db25uZWN0ZWQoKSBtU3RhdGUgPSAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09OTkVDVElORykgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJTdHJhbmdlIHN0YXRlLCBjbG9zaW5nICIgKyBtU3RhdGUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Db25uZWN0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkFjY2VwdGVkKGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygib25BY2NlcHRlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ0NFUFQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQWNjZXB0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQ2xvc2VkKCkgewotICAgICAgICBpZiAoREJHKSBsb2coIm9uQ2xvc2VkKCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NMT1NFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ2xvc2VkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKSB7Ci0gICAgICAgIGlmICghbVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLmFjcXVpcmUoKSAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICAvLyBLZWVwIGFwcHMgcHJvY2Vzc29yIGF3YWtlIGZvciBhIGZ1cnRoZXIgMiBzZWNvbmRzLgotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gcmVzb2x2ZSBpc3N1ZSBodHRwOi8vYi8xNjE2MjYzIC0gaW4gd2hpY2gKLSAgICAgICAgICAgIC8vIHdlIGFyZSBsZWZ0IGluIGEgODAgbUEgcG93ZXIgc3RhdGUgd2hlbiByZW1vdGVseSB0ZXJtaW5hdGluZyBhCi0gICAgICAgICAgICAvLyBjYWxsIHdoaWxlIGNvbm5lY3RlZCB0byBCVCBoZWFkc2V0ICJIVEMgQkggUzEwMCAiIHdpdGggQTJEUCBhbmQKLSAgICAgICAgICAgIC8vIEhGUCBwcm9maWxlcy4KLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgaW4gMiBzZWMiICsgdGhpcyk7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgyMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2tOb3coKSB7Ci0gICAgICAgIGlmIChtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgbm93IiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworCisvKioKKyAqIEFic3RyYWN0IExvYWRlciB0aGF0IHByb3ZpZGVzIGFuIHtAbGluayBBc3luY1Rhc2t9IHRvIGRvIHRoZSB3b3JrLgorICoKKyAqIEBwYXJhbSA8RD4gdGhlIGRhdGEgdHlwZSB0byBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2tMb2FkZXI8RD4gZXh0ZW5kcyBMb2FkZXI8RD4geworICAgIGZpbmFsIGNsYXNzIExvYWRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEQ+IHsKKworICAgICAgICBwcml2YXRlIEQgcmVzdWx0OworCisgICAgICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRCBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgcmVzdWx0ID0gQXN5bmNUYXNrTG9hZGVyLnRoaXMubG9hZEluQmFja2dyb3VuZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEIGRhdGEpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLmRpc3BhdGNoT25Mb2FkQ29tcGxldGUoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5vbkNhbmNlbGxlZChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgTG9hZFRhc2sgbVRhc2s7CisKKyAgICBwdWJsaWMgQXN5bmNUYXNrTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUxvYWQoKSB7CisgICAgICAgIGNhbmNlbExvYWQoKTsKKyAgICAgICAgbVRhc2sgPSBuZXcgTG9hZFRhc2soKTsKKyAgICAgICAgbVRhc2suZXhlY3V0ZSgoVm9pZFtdKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2suIFNlZSB7QGxpbmsgQXN5bmNUYXNrI2NhbmNlbChib29sZWFuKX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgdGFzayBjb3VsZCBub3QgYmUgY2FuY2VsZWQsCisgICAgICogICAgICAgICB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgbm9ybWFsbHksIG9yCisgICAgICogICAgICAgICBiZWNhdXNlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IGhhc24ndCBiZWVuIGNhbGxlZCwgYW5kCisgICAgICogICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbExvYWQoKSB7CisgICAgICAgIGlmIChtVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbmNlbGxlZCA9IG1UYXNrLmNhbmNlbChmYWxzZSk7CisgICAgICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2FuY2VsbGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaWYgdGhlIHRhc2sgd2FzIGNhbmNlbGVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiAgR2l2ZXMgdGhlIGNsYXNzIGEgY2hhbmNlCisgICAgICogdG8gcHJvcGVybHkgZGlzcG9zZSBvZiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEQgZGF0YSkgeworICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShEIGRhdGEpIHsKKyAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICBkZWxpdmVyUmVzdWx0KGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBvbiBhIHdvcmtlciB0aHJlYWQgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGxvYWQuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IGRlbGl2ZXIgdGhlCisgICAgICogcmVzdWx0cyBkaXJlY3RseSwgYnV0IHNob3VsZCByZXR1cm4gdGhlbSBmcm9tIHRoaXMgbWV0aG9kLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwCisgICAgICogY2FsbGluZyBkZWxpdmVyUmVzdWx0IG9uIHRoZSBVSSB0aHJlYWQuIElmIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIHByb2Nlc3MKKyAgICAgKiB0aGUgcmVzdWx0cyBvbiB0aGUgVUkgdGhyZWFkIHRoZXkgbWF5IG92ZXJyaWRlIGRlbGl2ZXJSZXN1bHQgYW5kIGRvIHNvCisgICAgICogdGhlcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRCBsb2FkSW5CYWNrZ3JvdW5kKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZSwgZm9yIHBsYWNpbmcgYW5kIHJldHJpZXZpbmcgdGV4dCBpbgorICogdGhlIGdsb2JhbCBjbGlwYm9hcmQuCisgKgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBDbGlwYm9hcmRNYW5hZ2VyIEFQSSBpdHNlbGYgaXMgdmVyeSBzaW1wbGU6IGl0IGNvbnNpc3RzIG9mIG1ldGhvZHMKKyAqIHRvIGF0b21pY2FsbHkgZ2V0IGFuZCBzZXQgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwYm9hcmQgZGF0YS4gIFRoYXQgZGF0YQorICogaXMgZXhwcmVzc2VkIGFzIGEge0BsaW5rIENsaXBwZWREYXRhfSBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHByb3RvY29sCisgKiBmb3IgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTdGF0aWNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzCisgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N0YXRpY0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7CisgICAgICAgICAgICBzU2VydmljZSA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIENsaXBib2FyZE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuICBUaGlzIGlzIHRoZSBjbGlwIHRoYXQKKyAgICAgKiBpcyBpbnZvbHZlZCBpbiBub3JtYWwgY3V0IGFuZCBwYXN0ZSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaXAgVGhlIGNsaXBwZWQgZGF0YSBpdGVtIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwcGVkRGF0YSBjbGlwKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwcGVkRGF0YSBnZXRQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNQcmltYXJ5Q2xpcCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB3aGF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLmFkZCh3aGF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgd2hhdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKHdoYXQpOworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkucmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRQcmltYXJ5Q2xpcCgpfSBpbnN0ZWFkLiAgVGhpcyByZXRyaWV2ZXMKKyAgICAgKiB0aGUgcHJpbWFyeSBjbGlwIGFuZCB0cmllcyB0byBjb2VyY2UgaXQgdG8gYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCAmJiBjbGlwLmdldEl0ZW1Db3VudCgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNsaXAuZ2V0SXRlbSgwKS5jb2VyY2VUb1RleHQobUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFByaW1hcnlDbGlwKENsaXBwZWREYXRhKX0gaW5zdGVhZC4gIFRoaXMKKyAgICAgKiBjcmVhdGVzIGEgQ2xpcHBlZEl0ZW0gaG9sZGluZyB0aGUgZ2l2ZW4gdGV4dCBhbmQgc2V0cyBpdCBhcyB0aGUKKyAgICAgKiBwcmltYXJ5IGNsaXAuICBJdCBoYXMgbm8gbGFiZWwgb3IgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIHNldFByaW1hcnlDbGlwKG5ldyBDbGlwcGVkRGF0YShudWxsLCBudWxsLCBuZXcgQ2xpcHBlZERhdGEuSXRlbSh0ZXh0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2hhc1ByaW1hcnlDbGlwKCl9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCkgeworICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnM7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMudG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgKChPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKWxpc3RlbmVyc1tpXSkub25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ2NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwcGVkRGF0YS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK3BhcmNlbGFibGUgQ2xpcHBlZERhdGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBwZWREYXRhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBwZWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmMDIzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuamF2YQpAQCAtMCwwICsxLDM5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY2xpcHBlZCBkYXRhIG9uIHRoZSBjbGlwYm9hcmQuCisgKgorICogPHA+Q2xpcHBlZERhdGEgaXMgYSBjb21wbGV4IHR5cGUgY29udGFpbmluZyBvbmUgb3IgSXRlbSBpbnN0YW5jZXMsCisgKiBlYWNoIG9mIHdoaWNoIGNhbiBob2xkIG9uZSBvciBtb3JlIHJlcHJlc2VudGF0aW9ucyBvZiBhbiBpdGVtIG9mIGRhdGEuCisgKiBGb3IgZGlzcGxheSB0byB0aGUgdXNlciwgaXQgYWxzbyBoYXMgYSBsYWJlbCBhbmQgaWNvbmljIHJlcHJlc2VudGF0aW9uLjwvcD4KKyAqCisgKiA8cD5FYWNoIEl0ZW0gaW5zdGFuY2UgY2FuIGJlIG9uZSBvZiB0aHJlZSBtYWluIGNsYXNzZXMgb2YgZGF0YTogYSBzaW1wbGUKKyAqIENoYXJTZXF1ZW5jZSBvZiB0ZXh0LCBhIHNpbmdsZSBJbnRlbnQgb2JqZWN0LCBvciBhIFVyaS4gIFNlZSB7QGxpbmsgSXRlbX0KKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nUGFzdGUiPjwvYT4KKyAqIDxoMz5JbXBsZW1lbnRpbmcgUGFzdGUgb3IgRHJvcDwvaDM+CisgKgorICogPHA+VG8gaW1wbGVtZW50IGEgcGFzdGUgb3IgZHJvcCBvZiBhIENsaXBwZWREYXRhIG9iamVjdCBpbnRvIGFuIGFwcGxpY2F0aW9uLAorICogdGhlIGFwcGxpY2F0aW9uIG11c3QgY29ycmVjdGx5IGludGVycHJldCB0aGUgZGF0YSBmb3IgaXRzIHVzZS4gIElmIHRoZSB7QGxpbmsgSXRlbX0KKyAqIGl0IGNvbnRhaW5zIGlzIHNpbXBsZSB0ZXh0IG9yIGFuIEludGVudCwgdGhlcmUgaXMgbGl0dGxlIHRvIGJlIGRvbmU6IHRleHQKKyAqIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHRleHQsIGFuZCBhbiBJbnRlbnQgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IKKyAqIGNyZWF0aW5nIHNob3J0Y3V0cyAoc3VjaCBhcyBwbGFjaW5nIGljb25zIG9uIHRoZSBob21lIHNjcmVlbikgb3Igb3RoZXIKKyAqIGFjdGlvbnMuCisgKgorICogPHA+SWYgYWxsIHlvdSB3YW50IGlzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwcGVkIGRhdGEsIHlvdQorICogY2FuIHVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0uCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBleGNoYW5nZXMgd2lsbCBiZSBkb25lIHRocm91Z2ggVVJJcywgaW4gcGFydGljdWxhcgorICogImNvbnRlbnQ6IiBVUklzLiAgQSBjb250ZW50IFVSSSBhbGxvd3MgdGhlIHJlY2lwaWVudCBvZiBhIENsaXBwZWREYXRhIGl0ZW0KKyAqIHRvIGludGVyYWN0IGNsb3NlbHkgd2l0aCB0aGUgQ29udGVudFByb3ZpZGVyIGhvbGRpbmcgdGhlIGRhdGEgaW4gb3JkZXIgdG8KKyAqIG5lZ290aWF0ZSB0aGUgdHJhbnNmZXIgb2YgdGhhdCBkYXRhLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBwYXN0ZSBmdW5jdGlvbiBvZiBhIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLgorICogV2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCwgaXQgY2FuIGRvIGVpdGhlciB0d28gdGhpbmdzOgorICogaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIFVSSSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm90ZSwgaXQgY29waWVzCisgKiB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiB0aGUgbm90ZSBpbnRvIGEgbmV3IG5vdGU7IG90aGVyd2lzZSwgaXQgc2ltcGx5CisgKiBjb2VyY2VzIHRoZSBjbGlwIGludG8gdGV4dCBhbmQgdXNlcyB0aGF0IGFzIHRoZSBuZXcgbm90ZSdzIGNvbnRlbnRzLgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQorICogICAgICBwYXN0ZX0KKyAqCisgKiA8cD5JbiBtYW55IGNhc2VzIGFuIGFwcGxpY2F0aW9uIGNhbiBwYXN0ZSB2YXJpb3VzIHR5cGVzIG9mIHN0cmVhbXMgb2YgZGF0YS4gIEZvcgorICogZXhhbXBsZSwgYW4gZS1tYWlsIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHBhc3RlIGFuIGltYWdlCisgKiBvciBvdGhlciBiaW5hcnkgZGF0YSBhcyBhbiBhdHRhY2htZW50LiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdGhyb3VnaCB0aGUKKyAqIENvbnRlbnRSZXNvbHZlciB7QGxpbmsgQ29udGVudFJlc29sdmVyI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKX0gYW5kCisgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuICBUaGVzZSBhbGxvdyBhIGNsaWVudCB0byBkaXNjb3ZlciB0aGUgdHlwZShzKSBvZiBkYXRhIHRoYXQgYSBwYXJ0aWN1bGFyCisgKiBjb250ZW50IFVSSSBjYW4gbWFrZSBhdmFpbGFibGUgYXMgYSBzdHJlYW0gYW5kIHJldHJpZXZlIHRoZSBzdHJlYW0gb2YgZGF0YS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0KKyAqIGl0c2VsZiB1c2VzIHRoaXMgdG8gdHJ5IHRvIHJldHJpZXZlIGEgVVJJIGNsaXAgYXMgYSBzdHJlYW0gb2YgdGV4dDoKKyAqCisgKiB7QHNhbXBsZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwcGVkRGF0YS5qYXZhIGNvZXJjZVRvVGV4dH0KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdDb3B5Ij48L2E+CisgKiA8aDM+SW1wbGVtZW50aW5nIENvcHkgb3IgRHJhZzwvaDM+CisgKgorICogPHA+VG8gYmUgdGhlIHNvdXJjZSBvZiBhIGNsaXAsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnN0cnVjdCBhIENsaXBwZWREYXRhCisgKiBvYmplY3QgdGhhdCBhbnkgcmVjaXBpZW50IGNhbiBpbnRlcnByZXQgYmVzdCBmb3IgdGhlaXIgY29udGV4dC4gIElmIHRoZSBjbGlwCisgKiBpcyB0byBjb250YWluIGEgc2ltcGxlIHRleHQsIEludGVudCwgb3IgVVJJLCB0aGlzIGlzIGVhc3k6IGFuIHtAbGluayBJdGVtfQorICogY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgdXNlZC4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMgcmVxdWlyZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3VwcG9ydCBpbgorICogYSBDb250ZW50UHJvdmlkZXIgZm9yIGRlc2NyaWJpbmcgYW5kIGdlbmVyYXRpbmcgdGhlIGRhdGEgZm9yIHRoZSByZWNpcGllbnQuCisgKiBBIGNvbW1vbiBzY2VuYXJpbyBpcyBvbmUgd2hlcmUgYW4gYXBwbGljYXRpb24gcGxhY2VzIG9uIHRoZSBjbGlwYm9hcmQgdGhlCisgKiBjb250ZW50OiBVUkkgb2YgYW4gb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNvcGllZCwgd2l0aCB0aGUgZGF0YSBhdCB0aGF0CisgKiBVUkkgY29uc2lzdGluZyBvZiBhIGNvbXBsaWNhdGVkIHN0cnVjdHVyZSB0aGF0IG9ubHkgb3RoZXIgYXBwbGljYXRpb25zIHdpdGgKKyAqIGRpcmVjdCBrbm93bGVkZ2Ugb2YgdGhlIHN0cnVjdHVyZSBjYW4gdXNlLgorICoKKyAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBpbnRyaW5zaWMga25vd2xlZGdlIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSwKKyAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGhvbGRpbmcgaXQgY2FuIG1ha2UgdGhlIGRhdGEgYXZhaWxhYmxlIGFzIGFuIGFyYml0cmFyeQorICogbnVtYmVyIG9mIHR5cGVzIG9mIGRhdGEgc3RyZWFtcy4gIFRoaXMgaXMgZG9uZSBieSBpbXBsZW1lbnRpbmcgdGhlCisgKiBDb250ZW50UHJvdmlkZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuCisgKgorICogPHA+R29pbmcgYmFjayB0byBvdXIgc2ltcGxlIE5vdGVQYWQgYXBwbGljYXRpb24sIHRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uCisgKiBpdCBtYXkgaGF2ZSB0byBjb252ZXJ0IGEgc2luZ2xlIG5vdGUgVVJJIChjb25zaXN0aW5nIG9mIGEgdGl0bGUgYW5kIHRoZSBub3RlCisgKiB0ZXh0KSBpbnRvIGEgc3RyZWFtIG9mIHBsYWluIHRleHQgZGF0YS4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQorICogICAgICBzdHJlYW19CisgKgorICogPHA+VGhlIGNvcHkgb3BlcmF0aW9uIGluIG91ciBOb3RlUGFkIGFwcGxpY2F0aW9uIGlzIG5vdyBqdXN0IGEgc2ltcGxlIG1hdHRlcgorICogb2YgbWFraW5nIGEgY2xpcCBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIG5vdGUgYmVpbmcgY29waWVkOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGlzdC5qYXZhCisgKiAgICAgIGNvcHl9CisgKgorICogPHA+Tm90ZSBpZiBhIHBhc3RlIG9wZXJhdGlvbiBuZWVkcyB0aGlzIGNsaXAgYXMgdGV4dCAoZm9yIGV4YW1wbGUgdG8gcGFzdGUKKyAqIGludG8gYW4gZWRpdG9yKSwgdGhlbiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQoQ29udGV4dCl9IHdpbGwgYXNrIHRoZSBjb250ZW50CisgKiBwcm92aWRlciBmb3IgdGhlIGNsaXAgVVJJIGFzIHRleHQgYW5kIHN1Y2Nlc3NmdWxseSBwYXN0ZSB0aGUgZW50aXJlIG5vdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwcGVkRGF0YSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIENoYXJTZXF1ZW5jZSBtTGFiZWw7CisgICAgQml0bWFwIG1JY29uOworCisgICAgZmluYWwgQXJyYXlMaXN0PEl0ZW0+IG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gaW4gYSBDbGlwcGVkRGF0YS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0eXBlcyB0aGFuIGFuIGluZGl2aWR1YWwgaXRlbSBjYW4gY3VycmVudGx5IGNvbnRhaW4gYXJlOjwvcD4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IFRleHQ6IGEgYmFzaWMgc3RyaW5nIG9mIHRleHQuICBUaGlzIGlzIGFjdHVhbGx5IGEgQ2hhclNlcXVlbmNlLAorICAgICAqIHNvIGl0IGNhbiBiZSBmb3JtYXR0ZWQgdGV4dCBzdXBwb3J0ZWQgYnkgY29ycmVzcG9uZGluZyBBbmRyb2lkIGJ1aWx0LWluCisgICAgICogc3R5bGUgc3BhbnMuICAoQ3VzdG9tIGFwcGxpY2F0aW9uIHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlCisgICAgICogc3RyaXBwZWQgd2hlbiB0cmFuc3BvcnRpbmcgdGhyb3VnaCB0aGUgY2xpcGJvYXJkLikKKyAgICAgKiA8bGk+IEludGVudDogYW4gYXJiaXRyYXJ5IEludGVudCBvYmplY3QuICBBIHR5cGljYWwgdXNlIGlzIHRoZSBzaG9ydGN1dAorICAgICAqIHRvIGNyZWF0ZSB3aGVuIHBhc3RpbmcgYSBjbGlwcGVkIGl0ZW0gb24gdG8gdGhlIGhvbWUgc2NyZWVuLgorICAgICAqIDxsaT4gVXJpOiBhIFVSSSByZWZlcmVuY2UuICBUaGlzIG1heSBiZSBhbnkgVVJJIChzdWNoIGFzIGFuIGh0dHA6IFVSSQorICAgICAqIHJlcHJlc2VudGluZyBhIGJvb2ttYXJrKSwgaG93ZXZlciBpdCBpcyBvZnRlbiBhIGNvbnRlbnQ6IFVSSS4gIFVzaW5nCisgICAgICogY29udGVudCBwcm92aWRlciByZWZlcmVuY2VzIGFzIGNsaXBzIGxpa2UgdGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8KKyAgICAgKiBzaGFyZSBjb21wbGV4IG9yIGxhcmdlIGNsaXBzIHRocm91Z2ggdGhlIHN0YW5kYXJkIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJdGVtIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgICAgICBJbnRlbnQgbUludGVudDsKKyAgICAgICAgVXJpIG1Vcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgYmxvY2sgb2YgKHBvc3NpYmx5IHN0eWxlZCkgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhbiBhcmJpdHJhcnkgSW50ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGFuIGFyYml0cmFyeSBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShVcmkgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGNvbXBsZXggSXRlbSwgY29udGFpbmluZyBtdWx0aXBsZSByZXByZXNlbnRhdGlvbnMgb2YKKyAgICAgICAgICogdGV4dCwgaW50ZW50LCBhbmQvb3IgVVJJLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oQ2hhclNlcXVlbmNlIHRleHQsIEludGVudCBpbnRlbnQsIFVyaSB1cmkpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgdGV4dCBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgSW50ZW50IGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW50ZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgVVJJIGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR1cm4gdGhpcyBpdGVtIGludG8gdGV4dCwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiBkYXRhIGl0CisgICAgICAgICAqIGFjdHVhbGx5IGNvbnRhaW5zLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGUgYWxnb3JpdGhtIGZvciBkZWNpZGluZyB3aGF0IHRleHQgdG8gcmV0dXJuIGlzOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRUZXh0fSBpcyBub24tbnVsbCwgcmV0dXJuIHRoYXQuCisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRVcml9IGlzIG5vbi1udWxsLCB0cnkgdG8gcmV0cmlldmUgaXRzIGRhdGEKKyAgICAgICAgICogYXMgYSB0ZXh0IHN0cmVhbSBmcm9tIGl0cyBjb250ZW50IHByb3ZpZGVyLiAgSWYgdGhpcyBzdWNjZWVkcywgY29weQorICAgICAgICAgKiB0aGUgdGV4dCBpbnRvIGEgU3RyaW5nIGFuZCByZXR1cm4gaXQuICBJZiBpdCBpcyBub3QgYSBjb250ZW50OiBVUkkgb3IKKyAgICAgICAgICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcGx5IGEgdGV4dCByZXByZXNlbnRhdGlvbiwgcmV0dXJuCisgICAgICAgICAqIHRoZSByYXcgVVJJIGFzIGEgc3RyaW5nLgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0SW50ZW50fSBpcyBub24tbnVsbCwgY29udmVydCB0aGF0IHRvIGFuIGludGVudDoKKyAgICAgICAgICogVVJJIGFuZCByZXR1cm5pdC4KKyAgICAgICAgICogPGxpPiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsZXIncyBDb250ZXh0LCBmcm9tIHdoaWNoIGl0cyBDb250ZW50UmVzb2x2ZXIKKyAgICAgICAgICogYW5kIG90aGVyIHRoaW5ncyBjYW4gYmUgcmV0cmlldmVkLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGl0ZW0ncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29lcmNlVG9UZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhbiBleHBsaWNpdCB0ZXh0dWFsIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoYXQuCisgICAgICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhIFVSSSB2YWx1ZSwgdHJ5IHVzaW5nIHRoYXQuCisgICAgICAgICAgICBpZiAobVVyaSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBzZWUgaWYgdGhlIFVSSSBjYW4gYmUgb3BlbmVkIGFzIGEgcGxhaW4gdGV4dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAvLyAob2YgYW55IHN1Yi10eXBlKS4gIElmIHNvLCB0aGlzIGlzIHRoZSBiZXN0IHRleHR1YWwKKyAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgaXQuCisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXNrIGZvciBhIHN0cmVhbSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGRlc2NyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKG1VcmksICJ0ZXh0LyoiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gZGVzY3IuY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSwgIlVURi04Iik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gR290IGl0Li4uICBjb3B5IHRoZSBzdHJlYW0gaW50byBhIGxvY2FsIHN0cmluZyBhbmQgcmV0dXJuIGl0LgorICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuPXJlYWRlci5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gb3BlbiBjb250ZW50IFVSSSBhcyB0ZXh0Li4uICBub3QgcmVhbGx5IGFuCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBqdXN0IHNvbWV0aGluZyB0byBpZ25vcmUuCisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkLgorICAgICAgICAgICAgICAgICAgICBMb2cudygiQ2xpcHBlZERhdGEiLCAiRmFpbHVyZSBsb2FkaW5nIHRleHQiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIFVSSSBhcyBhIHN0cmVhbSwgdGhlbiB0aGUgVVJJIGl0c2VsZgorICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IHNlcnZlcyBmYWlybHkgd2VsbCBhcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuIG1VcmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluYWxseSwgaWYgYWxsIHdlIGhhdmUgaXMgYW4gSW50ZW50LCB0aGVuIHdlIGNhbiBqdXN0IHR1cm4gdGhhdAorICAgICAgICAgICAgLy8gaW50byB0ZXh0LiAgTm90IHRoZSBtb3N0IHVzZXItZnJpZW5kbHkgdGhpbmcsIGJ1dCBpdCdzIHNvbWV0aGluZy4KKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUludGVudC50b1VyaShJbnRlbnQuVVJJX0lOVEVOVF9TQ0hFTUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorLy9FTkRfSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTGFiZWwgdG8gc2hvdyB0byB0aGUgdXNlciBkZXNjcmliaW5nIHRoaXMgY2xpcC4KKyAgICAgKiBAcGFyYW0gaWNvbiBCaXRtYXAgcHJvdmlkaW5nIHRoZSB1c2VyIHdpdGggYW4gaWNvbmluZyByZXByZXNlbnRhdGlvbiBvZgorICAgICAqIHRoZSBjbGlwLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgY2xpcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcHBlZERhdGEoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlbSBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKEl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1MYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0bWFwIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1MYWJlbCwgZGVzdCwgZmxhZ3MpOworICAgICAgICBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG1JY29uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IG1JdGVtcy5zaXplKCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoTik7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIEl0ZW0gaXRlbSA9IG1JdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChpdGVtLm1UZXh0LCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBpZiAoaXRlbS5tSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGl0ZW0ubUludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdGVtLm1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgaXRlbS5tVXJpLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ2xpcHBlZERhdGEoUGFyY2VsIGluKSB7CisgICAgICAgIG1MYWJlbCA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgbUljb24gPSBCaXRtYXAuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IGluLnJlYWRJbnQoKSAhPSAwID8gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgVXJpIHVyaSA9IGluLnJlYWRJbnQoKSAhPSAwID8gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgbUl0ZW1zLmFkZChuZXcgSXRlbSh0ZXh0LCBpbnRlbnQsIHVyaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcHBlZERhdGE+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBwZWREYXRhPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBwZWREYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcHBlZERhdGEoc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBwZWREYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBwZWREYXRhW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggOWI5Zjc5Ni4uZTFkNDMxZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0yOCwxMyArMjgsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTc2LDYgKzc5LDggQEAKICAqIGNyb3NzLXByb2Nlc3MgY2FsbHMuPC9wPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRlbnRQcm92aWRlciI7CisKICAgICAvKgogICAgICAqIE5vdGU6IGlmIHlvdSBhZGQgbWV0aG9kcyB0byBDb250ZW50UHJvdmlkZXIsIHlvdSBtdXN0IGFkZCBzaW1pbGFyIG1ldGhvZHMgdG8KICAgICAgKiAgICAgICBNb2NrQ29udGVudFByb3ZpZGVyLgpAQCAtMjQ4LDYgKzI1MywxOCBAQAogICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLmNhbGwobWV0aG9kLCByZXF1ZXN0LCBhcmdzKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMuZ2V0U3RyZWFtVHlwZXModXJpLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbmZvcmNlUmVhZFBlcm1pc3Npb24odXJpKTsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZVJlYWRQZXJtaXNzaW9uKFVyaSB1cmkpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgaWYgKHVpZCA9PSBtTXlVaWQpIHsKQEAgLTc0OSw2ICs3NjYsMTY0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSGVscGVyIHRvIGNvbXBhcmUgdHdvIE1JTUUgdHlwZXMsIHdoZXJlIG9uZSBtYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBjb25jcmV0ZVR5cGUgQSBmdWxseS1zcGVjaWZpZWQgTUlNRSB0eXBlLgorICAgICAqIEBwYXJhbSBkZXNpcmVkVHlwZSBBIGRlc2lyZWQgTUlNRSB0eXBlIHRoYXQgbWF5IGJlIGEgcGF0dGVybiBzdWNoIGFzICpcLyouCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBNSU1FIHR5cGVzIG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWltZVR5cGVzKFN0cmluZyBjb25jcmV0ZVR5cGUsIFN0cmluZyBkZXNpcmVkVHlwZSkgeworICAgICAgICBmaW5hbCBpbnQgdHlwZUxlbmd0aCA9IGRlc2lyZWRUeXBlLmxlbmd0aCgpOworICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSAzICYmIGRlc2lyZWRUeXBlLmVxdWFscygiKi8qIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHNsYXNocG9zID0gZGVzaXJlZFR5cGUuaW5kZXhPZignLycpOworICAgICAgICBpZiAoc2xhc2hwb3MgPiAwKSB7CisgICAgICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSBzbGFzaHBvcysyICYmIGRlc2lyZWRUeXBlLmNoYXJBdChzbGFzaHBvcysxKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFR5cGUucmVnaW9uTWF0Y2hlcygwLCBjb25jcmV0ZVR5cGUsIDAsIHNsYXNocG9zKzEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzaXJlZFR5cGUuZXF1YWxzKGNvbmNyZXRlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBkYXRhIHN0cmVhbXMgdGhhdCB0aGlzCisgICAgICogY29udGVudCBwcm92aWRlciBzdXBwb3J0cyBmb3IgdGhlIGdpdmVuIFVSSS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsLCBtZWFuaW5nIG5vIHR5cGVzLiAgSWYgeW91ciBjb250ZW50IHByb3ZpZGVyIHN0b3JlcyBkYXRhCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIHR5cGUsIHJldHVybiB0aGF0IE1JTUUgdHlwZSBpZiBpdCBtYXRjaGVzIHRoZSBnaXZlbgorICAgICAqIG1pbWVUeXBlRmlsdGVyLiAgSWYgaXQgY2FuIHBlcmZvcm0gdHlwZSBjb252ZXJzaW9ucywgcmV0dXJuIGFuIGFycmF5CisgICAgICogb2YgYWxsIHN1cHBvcnRlZCBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggbWltZVR5cGVGaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyogdG8gcmV0cmlldmUgYWxsIHBvc3NpYmxlIGRhdGEgdHlwZXMuCisgICAgICogQHJldHVybnMgUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBubyBwb3NzaWJsZSBkYXRhIHN0cmVhbXMgZm9yIHRoZQorICAgICAqIGdpdmVuIG1pbWVUeXBlRmlsdGVyLiAgT3RoZXJ3aXNlIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGF2YWlsYWJsZQorICAgICAqIGNvbmNyZXRlIE1JTUUgdHlwZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUeXBlKFVyaSkKKyAgICAgKiBAc2VlICNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIEJ1bmRsZSkKKyAgICAgKiBAc2VlICNjb21wYXJlTWltZVR5cGVzKFN0cmluZywgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGEgY2xpZW50IHRvIG9wZW4gYSByZWFkLW9ubHkgc3RyZWFtIGNvbnRhaW5pbmcgZGF0YSBvZiBhCisgICAgICogcGFydGljdWxhciBNSU1FIHR5cGUuICBUaGlzIGlzIGxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKX0sCisgICAgICogZXhjZXB0IHRoZSBmaWxlIGNhbiBvbmx5IGJlIHJlYWQtb25seSBhbmQgdGhlIGNvbnRlbnQgcHJvdmlkZXIgbWF5CisgICAgICogcGVyZm9ybSBkYXRhIGNvbnZlcnNpb25zIHRvIGdlbmVyYXRlIGRhdGEgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvbXBhcmVzIHRoZSBnaXZlbiBtaW1lVHlwZSBhZ2FpbnN0IHRoZQorICAgICAqIHJlc3VsdCBvZiB7QGxpbmsgI2dldFR5cGUoVXJpKX0gYW5kLCBpZiB0aGUgbWF0Y2gsIHNpbXBsZSBjYWxscworICAgICAqIHtAbGluayAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZyl9LgorICAgICAqCisgICAgICogPHA+U2VlIHtAbGluayBDbGlwcGVkRGF0YX0gZm9yIGV4YW1wbGVzIG9mIHRoZSB1c2UgYW5kIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyosIGlmIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzcGVjaWZpYyB0eXBlCisgICAgICogcmVxdWlyZW1lbnRzOyBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBwaWNrIGl0cyBiZXN0CisgICAgICogdHlwZSBtYXRjaGluZyB0aGUgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gb3B0cyBBZGRpdGlvbmFsIG9wdGlvbnMgZnJvbSB0aGUgY2xpZW50LiAgVGhlIGRlZmluaXRpb25zIG9mCisgICAgICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yIGZyb20gd2hpY2ggdGhlIGNsaWVudCBjYW4KKyAgICAgKiByZWFkIGRhdGEgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlcmUgaXMKKyAgICAgKiBubyBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJIG9yIHRoZSBtb2RlIGlzIGludmFsaWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBUaHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGNhbGxlciBkb2VzCisgICAgICogbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZykKKyAgICAgKiBAc2VlICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKQorICAgICAqIEBzZWUgI2NvbXBhcmVNaW1lVHlwZXMoU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlciwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0VHlwZSh1cmkpOworICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBjb21wYXJlTWltZVR5cGVzKGJhc2VUeXBlLCBtaW1lVHlwZUZpbHRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVuQXNzZXRGaWxlKHVyaSwgInIiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBvcGVuICIgKyB1cmkgKyAiIGFzIHR5cGUgIiArIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gd3JpdGUgYSBzdHJlYW0gb2YgZGF0YSB0byBhIHBpcGUuICBVc2Ugd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblBpcGVIZWxwZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUGlwZURhdGFXcml0ZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZCB0byBzdHJlYW0gZGF0YSBvdXQgdG8gYSBwaXBlLgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHBpcGUgaXMgYmxvY2tpbmcsIHNvIHRoaXMgdGhyZWFkIGNhbiBibG9jayBvbgorICAgICAgICAgKiB3cml0ZXMgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBpZiB0aGUgY2xpZW50IGlzIHNsb3cKKyAgICAgICAgICogYXQgcmVhZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG91dHB1dCBUaGUgcGlwZSB3aGVyZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLiAgVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGNsb3NlZCBmb3IgeW91IHVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YVRvUGlwZShQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRwdXQsIFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cywgVCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlfSwgZm9yCisgICAgICogY3JlYXRpbmcgYSBkYXRhIHBpcGUgYW5kIGJhY2tncm91bmQgdGhyZWFkIGFsbG93aW5nIHlvdSB0byBzdHJlYW0KKyAgICAgKiBnZW5lcmF0ZWQgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyICh0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBzdXBwbGllZCBieSBjYWxsZXIuCisgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gZnVuYyBJbnRlcmZhY2UgaW1wbGVtZW50aW5nIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgICAgKiBzdHJlYW0gdGhlIGRhdGEuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGhvbGRpbmcgdGhlIHJlYWQgc2lkZSBvZgorICAgICAqIHRoZSBwaXBlLiAgVGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBmb3IgcmVhZGluZzsgdGhlIGNhbGxlcgorICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5QaXBlSGVscGVyKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRzLCBmaW5hbCBUIGFyZ3MsIGZpbmFsIFBpcGVEYXRhV3JpdGVyPFQ+IGZ1bmMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gZmRzID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUGlwZSgpOworCisgICAgICAgICAgICBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4gdGFzayA9IG5ldyBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBkb0luQmFja2dyb3VuZChPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmMud3JpdGVEYXRhVG9QaXBlKGZkc1sxXSwgdXJpLCBtaW1lVHlwZSwgb3B0cywgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZHNbMV0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHBpcGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGFzay5leGVjdXRlKChPYmplY3RbXSludWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIGZkc1swXTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiZmFpbHVyZSBtYWtpbmcgcGlwZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaXMgYSB0ZW1wb3JhcnkgY29udGVudCBwcm92aWRlci4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyCiAgICAgICovCkBAIC03NzQsNiArOTQ5LDExIEBACiAgICAgICogQHBhcmFtIGluZm8gUmVnaXN0ZXJlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhdHRhY2hJbmZvKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJJbmZvIGluZm8pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgbWF5IGJlIHVzaW5nIEFzeW5jVGFzayBmcm9tIGJpbmRlciB0aHJlYWRzLiAgTWFrZSBpdCBpbml0IGhlcmUKKyAgICAgICAgICogc28gaXRzIHN0YXRpYyBoYW5kbGVyIGlzIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzeW5jVGFzay5pbml0KCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT25seSBhbGxvdyBpdCB0byBiZSBzZXQgb25jZSwgc28gYWZ0ZXIgdGhlIGNvbnRlbnQgc2VydmljZSBnaXZlcwpAQCAtODIxLDcgKzEwMDEsNyBAQAogICAgIC8qKgogICAgICAqIEBoaWRlIC0tIHVudGlsIGludGVyZmFjZSBoYXMgcHJvdmVuIGl0c2VsZgogICAgICAqCi0gICAgICogQ2FsbCBhbiBwcm92aWRlci1kZWZpbmVkIG1ldGhvZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50CisgICAgICogQ2FsbCBhIHByb3ZpZGVyLWRlZmluZWQgbWV0aG9kLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKICAgICAgKiBpbnRlcmZhY2VzIHRoYXQgYXJlIGNoZWFwZXIgdGhhbiB1c2luZyBhIEN1cnNvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIG5hbWUgdG8gY2FsbC4gIE9wYXF1ZSB0byBmcmFtZXdvcmsuCkBAIC04MzEsNCArMTAxMSwzMSBAQAogICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgcmVxdWVzdCwgQnVuZGxlIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgdG8gc2h1dCBkb3duIHRoZSBDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UuIFlvdSBjYW4gdGhlbgorICAgICAqIGludm9rZSB0aGlzIG1ldGhvZCBpbiB1bml0IHRlc3RzLgorICAgICAqIAorICAgICAqIDxwPgorICAgICAqIEFuZHJvaWQgbm9ybWFsbHkgaGFuZGxlcyBDb250ZW50UHJvdmlkZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24KKyAgICAgKiBhdXRvbWF0aWNhbGx5LiBZb3UgZG8gbm90IG5lZWQgdG8gc3RhcnQgdXAgb3Igc2h1dCBkb3duIGEKKyAgICAgKiBDb250ZW50UHJvdmlkZXIuIFdoZW4geW91IGludm9rZSBhIHRlc3QgbWV0aG9kIG9uIGEgQ29udGVudFByb3ZpZGVyLAorICAgICAqIGhvd2V2ZXIsIGEgQ29udGVudFByb3ZpZGVyIGluc3RhbmNlIGlzIHN0YXJ0ZWQgYW5kIGtlZXBzIHJ1bm5pbmcgYWZ0ZXIKKyAgICAgKiB0aGUgdGVzdCBmaW5pc2hlcywgZXZlbiBpZiBhIHN1Y2NlZWRpbmcgdGVzdCBpbnN0YW50aWF0ZXMgYW5vdGhlcgorICAgICAqIENvbnRlbnRQcm92aWRlci4gQSBjb25mbGljdCBkZXZlbG9wcyBiZWNhdXNlIHRoZSB0d28gaW5zdGFuY2VzIGFyZQorICAgICAqIHVzdWFsbHkgcnVubmluZyBhZ2FpbnN0IHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UgKGZvciBleGFtcGxlLCBhbgorICAgICAqIHNxbGl0ZSBkYXRhYmFzZSkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGluZyBzaHV0RG93bigpIGF2b2lkcyB0aGlzIGNvbmZsaWN0IGJ5IHByb3ZpZGluZyBhIHdheSB0bworICAgICAqIHRlcm1pbmF0ZSB0aGUgQ29udGVudFByb3ZpZGVyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBwcmV2ZW50IG1lbW9yeSBsZWFrcworICAgICAqIGZyb20gbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgb2YgdGhlIENvbnRlbnRQcm92aWRlciwgYW5kIGl0IGNhbiBlbnN1cmUKKyAgICAgKiB1bml0IHRlc3QgaXNvbGF0aW9uIGJ5IGFsbG93aW5nIHlvdSB0byBjb21wbGV0ZWx5IGNsZWFuIHVwIHRoZSB0ZXN0CisgICAgICogZml4dHVyZSBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IHRlc3QuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBMb2cudyhUQUcsICJpbXBsZW1lbnQgQ29udGVudFByb3ZpZGVyIHNodXRkb3duKCkgdG8gbWFrZSBzdXJlIGFsbCBkYXRhYmFzZSAiICsKKyAgICAgICAgICAgICAgICAiY29ubmVjdGlvbnMgYXJlIGdyYWNlZnVsbHkgc2h1dGRvd24iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQppbmRleCAwODU4ZWE1Li4wNTQwMTA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKQEAgLTQzLDUzICs0NCw3NyBAQAogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNxdWVyeX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjcXVlcnkgQ29udGVudFByb3ZpZGVyLnF1ZXJ5fSAqLwogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVybCwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5xdWVyeSh1cmwsIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGUgQ29udGVudFByb3ZpZGVyLmdldFR5cGV9ICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRUeXBlKHVybCk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2luc2VydH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0U3RyZWFtVHlwZXMgQ29udGVudFByb3ZpZGVyLmdldFN0cmVhbVR5cGVzfSAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjaW5zZXJ0IENvbnRlbnRQcm92aWRlci5pbnNlcnR9ICovCiAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmluc2VydCh1cmwsIGluaXRpYWxWYWx1ZXMpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0IENvbnRlbnRQcm92aWRlci5idWxrSW5zZXJ0fSAqLwogICAgIHB1YmxpYyBpbnQgYnVsa0luc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzW10gaW5pdGlhbFZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmJ1bGtJbnNlcnQodXJsLCBpbml0aWFsVmFsdWVzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZGVsZXRlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNkZWxldGUgQ29udGVudFByb3ZpZGVyLmRlbGV0ZX0gKi8KICAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJsLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmRlbGV0ZSh1cmwsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3VwZGF0ZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjdXBkYXRlIENvbnRlbnRQcm92aWRlci51cGRhdGV9ICovCiAgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVybCwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sCiAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIudXBkYXRlKHVybCwgdmFsdWVzLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZX0gKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkZpbGV9LiAgTm90ZSB0aGF0CisgICAgICogdGhpcyA8ZW0+ZG9lcyBub3Q8L2VtPgorICAgICAqIHRha2UgY2FyZSBvZiBub24tY29udGVudDogVVJJcyBzdWNoIGFzIGZpbGU6LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAgICAgKiB5b3UgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5GaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuRmlsZURlc2NyaXB0b3J9IEFQSSBpbnN0ZWFkLgorICAgICAqLwogICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKHVybCwgbW9kZSk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9ICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZX0uCisgICAgICogTm90ZSB0aGF0IHRoaXMgPGVtPmRvZXMgbm90PC9lbT4KKyAgICAgKiB0YWtlIGNhcmUgb2Ygbm9uLWNvbnRlbnQ6IFVSSXMgc3VjaCBhcyBmaWxlOi4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICogeW91IHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0gQVBJIGluc3RlYWQuCisgICAgICovCiAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlbkFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJsLCBtb2RlKTsKICAgICB9CiAKLSAgICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2h9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5UeXBlZEFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlfSAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2ggQ29udGVudFByb3ZpZGVyLmFwcGx5QmF0Y2h9ICovCiAgICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCmluZGV4IGZkYjNkMjAuLmQxYWI4ZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQpAQCAtMjU3LDYgKzI1NywzOCBAQAogICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUJ1bmRsZShyZXNwb25zZUJ1bmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBVcmkgdXJsID0gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlRmlsdGVyID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheSh0eXBlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVybCA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cyA9IGRhdGEucmVhZEJ1bmRsZSgpOworCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQ7CisgICAgICAgICAgICAgICAgICAgIGZkID0gb3BlblR5cGVkQXNzZXRGaWxlKHVybCwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy53cml0ZUV4Y2VwdGlvblRvUGFyY2VsKHJlcGx5LCBlKTsKQEAgLTU2OCw1ICs2MDAsNTAgQEAKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworCisgICAgICAgIHVybC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKG1pbWVUeXBlRmlsdGVyKTsKKworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElDb250ZW50UHJvdmlkZXIuR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworCisgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBTdHJpbmdbXSBvdXQgPSByZXBseS5jcmVhdGVTdHJpbmdBcnJheSgpOworCisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisKKyAgICAgICAgdXJsLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcobWltZVR5cGUpOworICAgICAgICBkYXRhLndyaXRlQnVuZGxlKG9wdHMpOworCisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSUNvbnRlbnRQcm92aWRlci5PUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKworICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25XaXRoRmlsZU5vdEZvdW5kRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIGludCBoYXMgPSByZXBseS5yZWFkSW50KCk7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBoYXMgIT0gMAorICAgICAgICAgICAgICAgID8gQXNzZXRGaWxlRGVzY3JpcHRvci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpIDogbnVsbDsKKworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBmZDsKKyAgICB9CisKICAgICBwcml2YXRlIElCaW5kZXIgbVJlbW90ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCmluZGV4IGRiY2I0YTcuLmM5NTUwOTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQpAQCAtMTI5LDcgKzEyOSw5IEBACiAgICAgLyoqIFJlcXVlcmllcyB0aGUgY3Vyc29yIGFuZCByZWFkcyB0aGUgY29udGVudHMgaW50byB0aGUgY2FjaGUgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXJ5KCkgewogICAgICAgICBtRGlydHkgPSBmYWxzZTsKLSAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIGlmICghbUN1cnNvci5yZXF1ZXJ5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICB9CiAgICAgICAgIHJlYWRDdXJzb3JJbnRvQ2FjaGUoKTsKICAgICAgICAgc2V0Q2hhbmdlZCgpOwogICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDY5Zjc2MTEuLjIyZmViOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtNDQsOSArNDQsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogCiAvKioKQEAgLTE4Niw4ICsxODYsNyBAQAogICAgICAqIHVzaW5nIHRoZSBjb250ZW50Oi8vIHNjaGVtZS4KICAgICAgKiBAcmV0dXJuIEEgTUlNRSB0eXBlIGZvciB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB0aGUgVVJMIGlzIGludmFsaWQgb3IgdGhlIHR5cGUgaXMgdW5rbm93bgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKQotICAgIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkgewogICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVybCk7CiAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTIwNCw2ICsyMDMsMzkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIHBvc3NpYmxlIE1JTUUgdHlwZXMgZm9yIHRoZSByZXByZXNlbnRhdGlvbnMgdGhlIGdpdmVuCisgICAgICogY29udGVudCBVUkwgY2FuIGJlIHJldHVybmVkIHdoZW4gb3BlbmVkIGFzIGFzIHN0cmVhbSB3aXRoCisgICAgICoge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yfS4gIE5vdGUgdGhhdCB0aGUgdHlwZXMgaGVyZSBhcmUKKyAgICAgKiBub3QgbmVjZXNzYXJpbHkgYSBzdXBlcnNldCBvZiB0aGUgdHlwZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGV9IC0tCisgICAgICogbWFueSBjb250ZW50IHByb3ZpZGVycyBjYW4gbm90IHJldHVybiBhIHJhdyBzdHJlYW0gZm9yIHRoZSBzdHJ1Y3R1cmVkCisgICAgICogZGF0YSB0aGF0IHRoZXkgY29udGFpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSBVcmkgaWRlbnRpZnlpbmcgY29udGVudCAoZWl0aGVyIGEgbGlzdCBvciBzcGVjaWZpYyB0eXBlKSwKKyAgICAgKiB1c2luZyB0aGUgY29udGVudDovLyBzY2hlbWUuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIFRoaXMgbWF5IGJlIGEgcGF0dGVybiwKKyAgICAgKiBzdWNoIGFzICpcLyosIHRvIHF1ZXJ5IGZvciBhbGwgYXZhaWxhYmxlIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCB0aGUKKyAgICAgKiBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiBNSU1FIHR5cGUgc3RyaW5ncyBmb3IgYWxsIGF2YWlsYWJsbGUKKyAgICAgKiBkYXRhIHN0cmVhbXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBJZiB0aGVyZSBhcmUgbm9uZSwKKyAgICAgKiBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmwpOworICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIFF1ZXJ5IHRoZSBnaXZlbiBVUkksIHJldHVybmluZyBhIHtAbGluayBDdXJzb3J9IG92ZXIgdGhlIHJlc3VsdCBzZXQuCiAgICAgICogPC9wPgpAQCAtMzQ5LDcgKzM4MSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpcyBsaWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfSwgYnV0IHVzZXMgdGhlCiAgICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlfQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuRmlsZSgpfSBtZXRob2QsIHNvIHdpbGwgPGVtPm5vdDwvZW0+IHdvcmsgd2l0aApAQCAtMzk5LDEwICs0MzEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSBVUkkuICBUaGlzCiAgICAgICogaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfQotICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKCl9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgorICAgICAqIG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KICAgICAgKgogICAgICAqIDxoNT5BY2NlcHRzIHRoZSBmb2xsb3dpbmcgVVJJIHNjaGVtZXM6PC9oNT4KICAgICAgKiA8dWw+CkBAIC00MzQsNiArNDY1LDExIEBACiAgICAgICogPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciByZWFkLW9ubHkgaW5wdXQgKG1vZGUgaXMgInIiKQorICAgICAqIG9uIGEgY29udGVudDogVVJJLCBpdCB3aWxsIGluc3RlYWQgY2FsbCB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3J9CisgICAgICogZm9yIHlvdSB3aXRoIGEgTUlNRSB0eXBlIG9mICIqXC8qIi4gIFRoaXMgYWxsb3dzIHN1Y2ggY2FsbGVycyB0byBiZW5lZml0CisgICAgICogZnJvbSBhbnkgYnVpbHQtaW4gZGF0YSBjb252ZXJzaW9uIHRoYXQgYSBwcm92aWRlciBpbXBsZW1lbnRzLgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZmlsZSBtb2RlIHRvIHVzZSwgYXMgcGVyIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlfS4KQEAgLTQ2MCwyOSArNDk2LDk3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpLCBtb2RlVG9Nb2RlKHVyaSwgbW9kZSkpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgMCwgLTEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBpZihmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcih1cmksICIqLyoiLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBwcm92aWRlci5vcGVuQXNzZXRGaWxlKHVyaSwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZG8gdGhhdCB3aGVuIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIChwb3RlbnRpYWxseSB0eXBlIHRyYW5zZm9ybWVkKQorICAgICAqIGRhdGEgZnJvbSBhICJjb250ZW50OiIgVVJJLiAgVGhpcyBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZworICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlfSBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIHJldHJpZXZlIGFueSBhcHByb3ByaWF0ZQorICAgICAqIGRhdGEgc3RyZWFtIGZvciB0aGUgZGF0YSBzdG9yZWQgdGhlcmUuCisgICAgICoKKyAgICAgKiA8cD5Vbmxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0sIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcworICAgICAqIHdpdGggImNvbnRlbnQ6IiBVUklzLCBiZWNhdXNlIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB0aGUgb25seSBmYWNpbGl0eQorICAgICAqIHdpdGggYW4gYXNzb2NpYXRlZCBNSU1FIHR5cGUgdG8gZW5zdXJlIHRoYXQgdGhlIHJldHVybmVkIGRhdGEgc3RyZWFtCisgICAgICogaXMgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIDxwPkFsbCB0ZXh0Lyogc3RyZWFtcyBhcmUgZW5jb2RlZCBpbiBVVEYtOC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRlc2lyZWQgVVJJIHRvIG9wZW4uCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgZGF0YS4gIFRoaXMgY2FuCisgICAgICogYmUgYSBwYXR0ZXJuIHN1Y2ggYXMgKlwvKiwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgY29udGVudCBwcm92aWRlciB0bworICAgICAqIHNlbGVjdCBhIHR5cGUsIHRob3VnaCB0aGVyZSBpcyBubyB3YXkgZm9yIHlvdSB0byBkZXRlcm1pbmUgd2hhdCB0eXBlCisgICAgICogaXQgaXMgcmV0dXJuaW5nLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgcHJvdmlkZXItZGVwZW5kZW50IG9wdGlvbnMuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb20gd2hpY2ggeW91IGNhbiByZWFkIHRoZQorICAgICAqIGRhdGEgc3RyZWFtIGZyb20gdGhlIHByb3ZpZGVyLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGEgcGlwZSwgbWVhbmluZworICAgICAqIHlvdSBjYW4ndCBzZWVrIGluIGl0LiAgVGhlIG9ubHkgc2VlayB5b3Ugc2hvdWxkIGRvIGlzIGlmIHRoZQorICAgICAqIEFzc2V0RmlsZURlc2NyaXB0b3IgY29udGFpbnMgYW4gb2Zmc2V0LCB0byBtb3ZlIHRvIHRoYXQgb2Zmc2V0IGJlZm9yZQorICAgICAqIHJlYWRpbmcuICBZb3Ugb3duIHRoaXMgZGVzY3JpcHRvciBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG9mIG5vCisgICAgICogZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlIGV4aXN0cyB1bmRlciB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MhICBEb24ndCByZWxlYXNlIHRoZSBwcm92aWRlciB3aGVuIGV4aXRpbmcsIGxldAorICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzQyLDcgKzE0NDYsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ3Vyc29yV3JhcHBlcklubmVyIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJDdXJzb3JXcmFwcGVySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlRmxhZyA9IGZhbHNlOwogCkBAIC0xMzcxLDcgKzE0NzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBleHRlbmRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VQcm92aWRlckZsYWcgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQppbmRleCA3NTc4N2NkLi5lNmRlZGMxMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEKQEAgLTQ0Niw2ICs0NDYsMTUgQEAKICAgICAgICAgcmV0dXJuIG1WYWx1ZXMuZW50cnlTZXQoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIGFsbCBvZiB0aGUga2V5cworICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiBhbGwgb2YgdGhlIGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gbVZhbHVlcy5rZXlTZXQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDb250ZW50VmFsdWVzPiBDUkVBVE9SID0KICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q29udGVudFZhbHVlcz4oKSB7CiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24iLCAidW5jaGVja2VkIn0pCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCmluZGV4IDAxMDA1NTAuLjNkMjkzNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uLk9uU2NhbkNvbXBsZXRlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC01ODgsNiArNTkwLDMyIEBACiAgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KTsKIAogICAgIC8qKgorICAgICAqIE9wZW4gYSBuZXcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKKyAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQ3JlYXRlcyB0aGUgZGF0YWJhc2UgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgKHVuaXF1ZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSkgb2YgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBtb2RlIE9wZXJhdGluZyBtb2RlLiAgVXNlIDAgb3Ige0BsaW5rICNNT0RFX1BSSVZBVEV9IGZvciB0aGUKKyAgICAgKiAgICAgZGVmYXVsdCBvcGVyYXRpb24sIHtAbGluayAjTU9ERV9XT1JMRF9SRUFEQUJMRX0KKyAgICAgKiAgICAgYW5kIHtAbGluayAjTU9ERV9XT1JMRF9XUklURUFCTEV9IHRvIGNvbnRyb2wgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGZhY3RvcnkgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBpbnN0YW50aWF0ZSBhCisgICAgICogICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIGlmIG51bGwsIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcn0gaXMgYXNzdW1lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiBhIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLgorICAgICAqCisgICAgICogQHNlZSAjTU9ERV9QUklWQVRFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9SRUFEQUJMRQorICAgICAqIEBzZWUgI01PREVfV09STERfV1JJVEVBQkxFCisgICAgICogQHNlZSAjZGVsZXRlRGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpOworCisgICAgLyoqCiAgICAgICogRGVsZXRlIGFuIGV4aXN0aW5nIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCiAgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4KICAgICAgKgpAQCAtMTM1Niw3ICsxMzg0LDE2IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1NFUlZJQ0UgPSAibG9jYXRpb24iOwotICAgIAorCisgICAgLyoqCisgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhCisgICAgICoge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yfSBmb3IgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQKKyAgICAgKiB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRSWV9ERVRFQ1RPUiA9ICJjb3VudHJ5X2RldGVjdG9yIjsKKwogICAgIC8qKgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYSB7QGxpbmsKICAgICAgKiBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyfSBmb3IgaGFuZGxpbmcgc2VhcmNoZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggYTQ0NzEwOC4uM2Y1ZDIxNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0yMDQsNiArMjA1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBtQmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShuYW1lLCBtb2RlLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBtQmFzZS5kZWxldGVEYXRhYmFzZShuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU5OWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIEEgbG9hZGVyIHRoYXQgcXVlcmllcyB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gYW5kIHJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfS4KKyAqLworcHVibGljIGNsYXNzIEN1cnNvckxvYWRlciBleHRlbmRzIEFzeW5jVGFza0xvYWRlcjxDdXJzb3I+IHsKKyAgICBDdXJzb3IgbUN1cnNvcjsKKyAgICBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgbU9ic2VydmVyOworICAgIGJvb2xlYW4gbVN0b3BwZWQ7CisgICAgVXJpIG1Vcmk7CisgICAgU3RyaW5nW10gbVByb2plY3Rpb247CisgICAgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgU3RyaW5nIG1Tb3J0T3JkZXI7CisKKyAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgbG9hZEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShtVXJpLCBtUHJvamVjdGlvbiwgbVNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgY3Vyc29yIHdpbmRvdyBpcyBmaWxsZWQKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJzb3I7CisgICAgfQorCisgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtU3RvcHBlZCkgeworICAgICAgICAgICAgLy8gQW4gYXN5bmMgcXVlcnkgY2FtZSBpbiB3aGlsZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEN1cnNvciBvbGRDdXJzb3IgPSBtQ3Vyc29yOworICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOworICAgICAgICBzdXBlci5kZWxpdmVyUmVzdWx0KGN1cnNvcik7CisKKyAgICAgICAgaWYgKG9sZEN1cnNvciAhPSBudWxsICYmICFvbGRDdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgb2xkQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yTG9hZGVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1PYnNlcnZlciA9IG5ldyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKTsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxpdmVyUmVzdWx0KG1DdXJzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCAmJiAhbUN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnNvciA9IG51bGw7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrIGlmIHBvc3NpYmxlLgorICAgICAgICBjYW5jZWxMb2FkKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYW55IG91dHN0YW5kaW5nIGxvYWRzIGNsZWFuIHRoZW1zZWx2ZXMgdXAgcHJvcGVybHkKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmICFjdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvLyBFbnN1cmUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgIHN0b3BMb2FkaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBtVXJpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVyaShVcmkgdXJpKSB7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0aW9uKFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oU3RyaW5nIHNlbGVjdGlvbikgeworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3Rpb25BcmdzKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQXJncyhTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvcnRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3J0T3JkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ydE9yZGVyKFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbApAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKKworLyoqCisgKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCwgd2hpY2ggYWxsb3dzIGNvcHlpbmcgYW5kIHBhc3RpbmcKKyAqIGJldHdlZW4gYXBwbGljYXRpb25zLgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNsaXBib2FyZCB7CisgICAgdm9pZCBzZXRQcmltYXJ5Q2xpcChpbiBDbGlwcGVkRGF0YSBjbGlwKTsKKyAgICBDbGlwcGVkRGF0YSBnZXRQcmltYXJ5Q2xpcCgpOworICAgIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKTsKKyAgICB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNjdlNzU4MS4uOGYxMjJjZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKICAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb247CisKICAgICAvKioKICAgICAgKiBAaGlkZSAtLSB1bnRpbCBpbnRlcmZhY2UgaGFzIHByb3ZlbiBpdHNlbGYKICAgICAgKgpAQCAtNzEsNiArNzIsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQnVuZGxlIGNhbGwoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIHJlcXVlc3QsIEJ1bmRsZSBhcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgLy8gRGF0YSBpbnRlcmNoYW5nZS4KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCiAgICAgLyogSVBDIGNvbnN0YW50cyAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvciA9ICJhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciI7CiAKQEAgLTg0LDQgKzkwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBQTFlfQkFUQ0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOTsKICAgICBzdGF0aWMgZmluYWwgaW50IENBTExfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDJhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworb25ld2F5IGludGVyZmFjZSBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgdm9pZCBkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKaW5kZXggMmFjYzRhMC4uNTgxNzRmYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCkBAIC05ODUsNiArOTg1LDE1IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlNFUlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCI7CiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBDcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLCBpbml0aWFsaXppbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIHRoZSBkaXJlY3RvcnkgKHZuZC5hbmRyb2lkLmN1cnNvci5kaXIvKikKKyAgICAgKiBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGF0YS4KKyAgICAgKiA8cD5PdXRwdXQ6IFVSSSBvZiB0aGUgbmV3IGRhdGEgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBU1RFID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSI7CisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBEZWxldGUgdGhlIGdpdmVuIGRhdGEgZnJvbSBpdHMgY29udGFpbmVyLgogICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiBkYXRhIHRvIGJlIGRlbGV0ZWQuCiAgICAgICogPHA+T3V0cHV0OiBub3RoaW5nLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyPEQ+IHsKKyAgICBpbnQgbUlkOworICAgIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbUxpc3RlbmVyOworICAgIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihpbnQgaWQsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBhbHJlYWR5IGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGxpc3RlbmVyIHJlZ2lzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIHRoZSB3cm9uZyBsaXN0ZW5lciIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4gVGhlIGxvYWRlciB3aWxsIG1vbml0b3IgdGhlIHNvdXJjZSBvZgorICAgICAqIHRoZSBkYXRhIHNldCBhbmQgbWF5IGRlbGl2ZXIgZnV0dXJlIGNhbGxiYWNrcyBpZiB0aGUgc291cmNlIGNoYW5nZXMuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgI3N0b3BMb2FkaW5nfSB3aWxsIHN0b3AgdGhlIGRlbGl2ZXJ5IG9mIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcn0gZGV0ZWN0cyBhIGNoYW5nZS4gIENhbGxzIHtAbGluayAjZm9yY2VMb2FkKCl9CisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CisgICAgICAgIGZvcmNlTG9hZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKaW5kZXggYTE1ZTI5ZS4uNTg0NzIxNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyBwcmVmZXJlbmNlIGRhdGEgcmV0dXJuZWQgYnkge0BsaW5rCkBAIC02OSw2ICs3MCwxNyBAQAogICAgICAgICBFZGl0b3IgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbgorICAgICAgICAgKiBiYWNrIG9uY2Uge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEVkaXRvciBvYmplY3QsIHNvIHlvdSBjYW4KKyAgICAgICAgICogY2hhaW4gcHV0IGNhbGxzIHRvZ2V0aGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpOworICAgICAgICAKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBhbiBpbnQgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbiBiYWNrIG9uY2UKICAgICAgICAgICoge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KICAgICAgICAgICogCkBAIC0xODYsNiArMTk4LDIwIEBACiAgICAgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmVmFsdWUpOwogICAgIAogICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcGFyYW0gZGVmVmFsdWVzIFZhbHVlcyB0byByZXR1cm4gaWYgdGhpcyBwcmVmZXJlbmNlIGRvZXMgbm90IGV4aXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgaWYgdGhleSBleGlzdCwgb3IgZGVmVmFsdWVzLgorICAgICAqIFRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIHdpdGggdGhpcyBuYW1lCisgICAgICogdGhhdCBpcyBub3QgYSBTZXQuCisgICAgICogCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKi8KKyAgICBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKTsKKyAgICAKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhbiBpbnQgdmFsdWUgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQppbmRleCBkMGI2N2NjLi43Zjc0OWJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTEyNiwxNCArMTI5LDEzIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaQVRJT05fVU5CSU5EX0RFTEFZX01TID0gNTAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlclN5bmNXYWtlTG9jayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfV0FLRV9MT0NLX1BSRUZJWCA9ICJTeW5jV2FrZUxvY2siOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfU1lOQ19BTEFSTV9XQUtFX0xPQ0sgPSAiU3luY01hbmFnZXJIYW5kbGVTeW5jQWxhcm1XYWtlTG9jayI7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRbXSBtQWNjb3VudHMgPSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwogCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbVN0b3JhZ2VJc0xvdyA9IGZhbHNlOwpAQCAtMTk1LDYgKzE5Nyw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwogCisgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CkBAIC0zNTYsMTUgKzM2MCwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1nciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFNZTkNfV0FLRV9MT0NLKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogCiAgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIGJldHdlZW4gdGhlIHRpbWUgdGhhdCB3ZSByZWNlaXZlCiAgICAgICAgIC8vIGEgc3luYyBhbGFybSBub3RpZmljYXRpb24gYW5kIHdoZW4gd2UgZmluaXNoIHByb2Nlc3NpbmcgaXQuIFdlIG5lZWQgdG8gZG8gdGhpcwogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRvIHRoZSB3b3JrIGluIHRoZSBhbGFybSBoYW5kbGVyLCByYXRoZXIgd2UgZG8gaXQgaW4gYSBtZXNzYWdlCiAgICAgICAgIC8vIGhhbmRsZXIuCi0gICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyk7CiAgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogCkBAIC0xMzAyLDYgKzEzMDQsOSBAQAogICAgICAgICBwdWJsaWMgZmluYWwgU3luY05vdGlmaWNhdGlvbkluZm8gbVN5bmNOb3RpZmljYXRpb25JbmZvID0gbmV3IFN5bmNOb3RpZmljYXRpb25JbmZvKCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1RpbWVUcmFja2VyIG1TeW5jVGltZVRyYWNrZXIgPSBuZXcgU3luY1RpbWVUcmFja2VyKCk7CisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgIFBvd2VyTWFuYWdlci5XYWtlTG9jaz4gbVdha2VMb2NrcyA9CisgICAgICAgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwKCk7CiAKICAgICAgICAgLy8gdXNlZCB0byB0cmFjayBpZiB3ZSBoYXZlIGluc3RhbGxlZCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgcmVpbnN0YWxsCiAgICAgICAgIC8vIGl0IGlmIHN5bmMgaXMgc3RpbGwgZmFpbGluZwpAQCAtMTMxNSw2ICsxMzIwLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBnZXRTeW5jV2FrZUxvY2soU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBQYWlyPFN0cmluZywgU3RyaW5nPiB3YWtlTG9ja0tleSA9IFBhaXIuY3JlYXRlKGFjY291bnRUeXBlLCBhdXRob3JpdHkpOworICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdha2VMb2NrID0gbVdha2VMb2Nrcy5nZXQod2FrZUxvY2tLZXkpOworICAgICAgICAgICAgaWYgKHdha2VMb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNZTkNfV0FLRV9MT0NLX1BSRUZJWCArICJfIiArIGF1dGhvcml0eSArICJfIiArIGFjY291bnRUeXBlOworICAgICAgICAgICAgICAgIHdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIG5hbWUpOworICAgICAgICAgICAgICAgIHdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja3MucHV0KHdha2VMb2NrS2V5LCB3YWtlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd2FrZUxvY2s7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHlUb1J1bigpIHsKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbVJlYWR5VG9SdW5MYXRjaDsKICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CkBAIC0xNDc3LDggKzE0OTQsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzICYmIG1TeW5jV2FrZUxvY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICBtYW5hZ2VFcnJvck5vdGlmaWNhdGlvbigpOwpAQCAtMTcwNCw3ICsxNzIyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHdha2Vsb2NrIGZvciB0aGlzIGFjY291bnQgYW5kIGF1dGhvcml0eSBhbmQgc3RvcmUgaXQgaW4gbVN5bmNXYWtlTG9jay4KKyAgICAgICAgICAgIC8vIEJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcHJldmlvdXMgd2FrZWxvY2sgc28gdGhhdCB3ZSBkb24ndCBlbmQgdXAgd2l0aCBpdCBiZWluZworICAgICAgICAgICAgLy8gaGVsZCB1bnRpbCBpdCBpcyB1c2VkIGFnYWluLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGEgY291cGxlIHRyaWNreSB0aGluZ3MgYWJvdXQgdGhpcyBjb2RlOgorICAgICAgICAgICAgLy8gLSBtYWtlIHN1cmUgdGhhdCB3ZSBhY3F1aXJlIHRoZSBuZXcgd2FrZWxvY2sgYmVmb3JlIHJlbGVhc2luZyB0aGUgb2xkIG9uZSwKKyAgICAgICAgICAgIC8vICAgb3RoZXJ3aXNlIHRoZSBkZXZpY2UgbWlnaHQgZ28gdG8gc2xlZXAgYXMgc29vbiBhcyB3ZSByZWxlYXNlIGl0LgorICAgICAgICAgICAgLy8gLSBzaW5jZSB3ZSB1c2Ugbm9uLXJlZmVyZW5jZSBjb3VudGVkIHdha2Vsb2NrcyB3ZSBoYXZlIHRvIGJlIHN1cmUgbm90IHRvIGRvCisgICAgICAgICAgICAvLyAgIHRoZSByZWxlYXNlIGlmIHRoZSB3YWtlbG9jayBkaWRuJ3QgY2hhbmdlLiBPdGhld2lzZSB3ZSB3b3VsZCBkbyBhbgorICAgICAgICAgICAgLy8gICBhY3F1aXJlIGZvbGxvd2VkIGJ5IGEgcmVsZWFzZSBvbiB0aGUgc2FtZSBsb2NrLCByZXN1bHRpbmcgaW4gbm8gbG9jaworICAgICAgICAgICAgLy8gICBiZWluZyBoZWxkLgorICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG9sZFdha2VMb2NrID0gbVN5bmNXYWtlTG9jazsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IGdldFN5bmNXYWtlTG9jayhvcC5hY2NvdW50LnR5cGUsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvbGRXYWtlTG9jayAhPSBudWxsICYmIG9sZFdha2VMb2NrICE9IG1TeW5jV2FrZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzY2hlZHVsZSBhbiBhbGFybSwgYXMgdGhhdCB3aWxsIGJlIGRvbmUgYnkgb3VyIGNhbGxlci4KIAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc3RlcCB3aWxsIG9jY3VyIHdoZW4gd2UgZ2V0IGVpdGhlciBhIHRpbWVvdXQgb3IgYQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNhZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlci5PcGVuUmVzb3VyY2VJZFJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSByZWFkLW9ubHkgY29udGVudCBwcm92aWRlciB3aGljaCBleHRyYWN0cyBkYXRhIG91dCBvZiBhbiBYTUwgZG9jdW1lbnQuCisgKgorICogPHA+QSBYUGF0aC1saWtlIHNlbGVjdGlvbiBwYXR0ZXJuIGlzIHVzZWQgdG8gc2VsZWN0IHNvbWUgbm9kZXMgaW4gdGhlIFhNTCBkb2N1bWVudC4gRWFjaCBzdWNoCisgKiBub2RlIHdpbGwgY3JlYXRlIGEgcm93IGluIHRoZSB7QGxpbmsgQ3Vyc29yfSByZXN1bHQuPC9wPgorICoKKyAqIEVhY2ggcm93IGlzIHRoZW4gcG9wdWxhdGVkIHdpdGggY29sdW1ucyB0aGF0IGFyZSBhbHNvIGRlZmluZWQgYXMgWFBhdGgtbGlrZSBwcm9qZWN0aW9ucy4gVGhlc2UKKyAqIHByb2plY3Rpb25zIGZldGNoIGF0dHJpYnV0ZXMgdmFsdWVzIG9yIHRleHQgaW4gdGhlIG1hdGNoaW5nIHJvdyBub2RlIG9yIGl0cyBjaGlsZHJlbi4KKyAqCisgKiA8cD5UbyBhZGQgdGhpcyBwcm92aWRlciBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3Ugc2hvdWxkIGFkZCBpdHMgZGVjbGFyYXRpb24gdG8geW91ciBhcHBsaWNhdGlvbgorICogbWFuaWZlc3Q6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIgYW5kcm9pZDphdXRob3JpdGllcz0ieG1sZG9jdW1lbnQiIC8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiA8aDI+Tm9kZSBzZWxlY3Rpb24gc3ludGF4PC9oMj4KKyAqIFRoZSBub2RlIHNlbGVjdGlvbiBzeW50YXggaXMgbWFkZSBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIChhdCBsZWFzdCBvbmUpIG9mCisgKiA8Y29kZT4vbm9kZV9uYW1lPC9jb2RlPiBub2RlIHNlbGVjdGlvbiBwYXR0ZXJucy4KKyAqCisgKiA8cD5UaGUgPGNvZGU+L3Jvb3QvY2hpbGQxL2NoaWxkMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPmNoaWxkMjwvY29kZT4gd2hpY2ggYXJlIGNoaWxkcmVuIG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IHdoaWNoIGFyZSB0aGVtc2VsdmVzCisgKiBjaGlsZHJlbiBvZiBhIHJvb3Qgbm9kZSBuYW1lZCA8Y29kZT5yb290PC9jb2RlPi48L3A+CisgKgorICogQW55IDxjb2RlPi88L2NvZGU+IHNlcGFyYXRvciBpbiB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSA8Y29kZT4vLzwvY29kZT4KKyAqIHNlcGFyYXRvciBpbnN0ZWFkLCB3aGljaCBpbmRpY2F0ZWQgYSA8aT5kZXNjZW5kYW50PC9pPiBpbnN0ZWFkIG9mIGEgY2hpbGQuCisgKgorICogPHA+VGhlIDxjb2RlPi8vbm9kZTEvL25vZGUyPC9jb2RlPiBwYXR0ZXJuIHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoIGFsbCBub2RlcyBuYW1lZAorICogPGNvZGU+bm9kZTI8L2NvZGU+IHdoaWNoIGFyZSBkZXNjZW5kYW50IG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5ub2RlMTwvY29kZT4gbG9jYXRlZCBhbnl3aGVyZSBpbgorICogdGhlIGRvY3VtZW50IGhpZXJhcmNoeS48L3A+CisgKgorICogTm9kZSBuYW1lcyBjYW4gY29udGFpbiBuYW1lc3BhY2VzIGluIHRoZSBmb3JtIDxjb2RlPm5hbWVzcGFjZTpub2RlPC9jb2RlPi4KKyAqCisgKiA8aDI+UHJvamVjdGlvbiBzeW50YXg8L2gyPgorICogRm9yIGV2ZXJ5IHNlbGVjdGVkIG5vZGUsIHRoZSBwcm9qZWN0aW9uIHdpbGwgdGhlbiBleHRyYWN0IGFjdHVhbCBkYXRhIGZyb20gdGhpcyBub2RlIGFuZCBpdHMKKyAqIGRlc2NlbmRhbnQuCisgKgorICogPHA+VXNlIGEgc3ludGF4IHNpbWlsYXIgdG8gdGhlIHNlbGVjdGlvbiBzeW50YXggZGVzY3JpYmVkIGFib3ZlIHRvIHNlbGVjdCB0aGUgdGV4dCBhc3NvY2lhdGVkCisgKiB3aXRoIGEgY2hpbGQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuIFRoZSBpbXBsaWNpdCByb290IG9mIHRoaXMgcHJvamVjdGlvbiBwYXR0ZXJuIGlzIHRoZSBzZWxlY3RlZAorICogbm9kZS4gPGNvZGU+LzwvY29kZT4gd2lsbCBoZW5jZSByZWZlciB0byB0aGUgdGV4dCBvZiB0aGUgc2VsZWN0ZWQgbm9kZSwgd2hpbGUKKyAqIDxjb2RlPi9jaGlsZDE8L2NvZGU+IHdpbGwgZmV0Y2ggdGhlIHRleHQgb2YgaXRzIGNoaWxkIG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4gYW5kCisgKiA8Y29kZT4vL2NoaWxkMTwvY29kZT4gd2lsbCBtYXRjaCBhbnkgPGk+ZGVzY2VuZGFudDwvaT4gbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPi4gSWYgc2V2ZXJhbAorICogbm9kZXMgbWF0Y2ggdGhlIHByb2plY3Rpb24gcGF0dGVybiwgdGhlaXIgdGV4dHMgYXJlIGFwcGVuZGVkIGFzIGEgcmVzdWx0LjwvcD4KKyAqCisgKiBBIHByb2plY3Rpb24gY2FuIGFsc28gZmV0Y2ggYW55IG5vZGUgYXR0cmlidXRlIGJ5IGFwcGVuZGluZyBhIDxjb2RlPkBhdHRyaWJ1dGVfbmFtZTwvY29kZT4KKyAqIHBhdHRlcm4gdG8gdGhlIHByZXZpb3VzbHkgZGVzY3JpYmVkIHN5bnRheC4gPGNvZGU+Ly9jaGlsZDFAcHJpY2U8L2NvZGU+IHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoCisgKiB0aGUgYXR0cmlidXRlIDxjb2RlPnByaWNlPC9jb2RlPiBvZiBhbnkgPGNvZGU+Y2hpbGQxPC9jb2RlPiBkZXNjZW5kYW50LgorICoKKyAqIDxwPklmIGEgcHJvamVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhbnkgbm9kZS9hdHRyaWJ1dGUsIGl0cyBhc3NvY2lhdGVkIHZhbHVlIHdpbGwgYmUgYW4gZW1wdHkKKyAqIHN0cmluZy48L3A+CisgKgorICogPGgyPkV4YW1wbGU8L2gyPgorICogVXNpbmcgdGhlIGZvbGxvd2luZyBYTUwgZG9jdW1lbnQ6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7bGlicmFyeSZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IkVIOTQiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgT2xkIE1hbiBhbmQgdGhlIFNlYSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgJmx0O2F1dGhvciZndDtFcm5lc3QgSGVtaW5nd2F5Jmx0Oy9hdXRob3ImZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IlhYMTAiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgQXJhYmlhbiBOaWdodHM6IFRhbGVzIG9mIDEsMDAxIE5pZ2h0cyZsdDsvdGl0bGUmZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O25vLWlkJmd0OworICogICAgICZsdDtib29rJmd0OworICogICAgICAgJmx0O3RpdGxlJmd0O0FuaW1hbCBGYXJtJmx0Oy90aXRsZSZndDsKKyAqICAgICAgICZsdDthdXRob3ImZ3Q7R2VvcmdlIE9yd2VsbCZsdDsvYXV0aG9yJmd0OworICogICAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0Oy9uby1pZCZndDsKKyAqICZsdDsvbGlicmFyeSZndDsKKyAqIDwvcHJlPgorICogQSBzZWxlY3Rpb24gcGF0dGVybiBvZiA8Y29kZT4vbGlicmFyeS8vYm9vazwvY29kZT4gd2lsbCBtYXRjaCB0aGUgdGhyZWUgYm9vayBlbnRyaWVzICh3aGlsZQorICogPGNvZGU+L2xpYnJhcnkvYm9vazwvY29kZT4gd2lsbCBvbmx5IG1hdGNoIHRoZSBmaXJzdCB0d28gb25lcykuCisgKgorICogPHA+RGVmaW5pbmcgdGhlIHByb2plY3Rpb25zIGFzIDxjb2RlPi90aXRsZTwvY29kZT4sIDxjb2RlPi9hdXRob3I8L2NvZGU+IGFuZCA8Y29kZT5AaWQ8L2NvZGU+CisgKiB3aWxsIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEuIE5vdGUgdGhhdCB0aGUgYXV0aG9yIG9mIHRoZSBzZWNvbmQgYm9vayBhcyB3ZWxsIGFzIHRoZSBpZCBvZgorICogdGhlIHRoaXJkIGFyZSBlbXB0eSBzdHJpbmdzLgorICovCitwdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgLyoKKyAgICAgKiBJZGVhcyBmb3IgaW1wcm92ZW1lbnQ6CisgICAgICogLSBFeHBhbmQgWFBhdGgtbGlrZSBzeW50YXggdG8gYWxsb3cgZm9yIFtuYl0gY2hpbGQgbnVtYmVyIHNlbGVjdG9yCisgICAgICogLSBBZGRyZXNzIHRoZSBzdGFydGluZyAuIGJ1ZyBpbiBBYnN0cmFjdEN1cnNvciB3aGljaCBwcmV2ZW50cyBhIHRydWUgWFBhdGggc3ludGF4LgorICAgICAqIC0gUHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSB0byBjb25jYXRlbmF0aW9uIHdoZW4gc2V2ZXJhbCBub2RlIG1hdGNoIChsaXN0LWxpa2UpLgorICAgICAqIC0gU3VwcG9ydCBuYW1lc3BhY2VzIGluIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICAgKiAtIEluY3JlbWVudGFsIEN1cnNvciBjcmVhdGlvbiwgcGFnaW5hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlhtbERvY3VtZW50UHJvdmlkZXIiOworICAgIHByaXZhdGUgQW5kcm9pZEh0dHBDbGllbnQgbUh0dHBDbGllbnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgZGF0YSBmcm9tIHRoZSBYTUwgZG9jdW1lbnQgcmVmZXJlbmNlZCBpbiB0aGUgVVJJLgorICAgICAqCisgICAgICogPHA+VGhlIFhNTCBkb2N1bWVudCBjYW4gYmUgYSBsb2NhbCByZXNvdXJjZSBvciBhIGZpbGUgdGhhdCB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUKKyAgICAgKiBJbnRlcm5ldC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlcXVlc3QgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaW4KKyAgICAgKiBpdHMgbWFuaWZlc3QuPC9wPgorICAgICAqCisgICAgICogVGhlIFVSSSB3aWxsIGJlIG9mIHRoZSBmb3JtIDxjb2RlPmNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/cmVzb3VyY2U9Ui54bWwubXlGaWxlPC9jb2RlPiBmb3IgYQorICAgICAqIGxvY2FsIHJlc291cmNlLiA8Y29kZT54bWxkb2N1bWVudDwvY29kZT4gc2hvdWxkIG1hdGNoIHRoZSBhdXRob3JpdHkgZGVjbGFyZWQgZm9yIHRoaXMKKyAgICAgKiBwcm92aWRlciBpbiB5b3VyIG1hbmlmZXN0LiBJbnRlcm5ldCBkb2N1bWVudHMgYXJlIHJlZmVyZW5jZWQgdXNpbmcKKyAgICAgKiA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD08L2NvZGU+IGZvbGxvd2VkIGJ5IGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgVVJMIG9mIHlvdXIKKyAgICAgKiBkb2N1bWVudCAoc2VlIHtAbGluayBVcmkjZW5jb2RlKFN0cmluZyl9KS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgcmVzdWx0aW5nIEN1cnNvciBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJvamVjdGlvbgorICAgICAqIGFycmF5IHBsdXMgb25lLCBuYW1lZCA8Y29kZT5faWQ8L2NvZGU+IHdoaWNoIHdpbGwgY29udGFpbiBhIHVuaXF1ZSByb3cgaWQgKGFsbG93aW5nIHRoZQorICAgICAqIEN1cnNvciB0byBiZSB1c2VkIHdpdGggYSB7QGxpbmsgQ3Vyc29yQWRhcHRlcn0pLiBUaGUgb3RoZXIgY29sdW1ucycgbmFtZXMgYXJlIHRoZSBwcm9qZWN0aW9uCisgICAgICogcGF0dGVybnMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHlvdXIgbG9jYWwgcmVzb3VyY2Ugb3IgSW50ZXJuZXQgZG9jdW1lbnQuCisgICAgICogQHBhcmFtIHByb2plY3Rpb24gQSBzZXQgb2YgcGF0dGVybnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gZWFjaCBzZWxlY3RlZAorICAgICAqIG5vZGUuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgc2VsZWN0aW9uIHBhdHRlcm4gd2hpY2ggd2lsbCBzZWxlY3QgdGhlIG5vZGVzIHRoYXQgd2lsbCBjcmVhdGUgdGhlCisgICAgICogQ3Vyc29yJ3Mgcm93cy4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHBhdHRlcm4gc3ludGF4LgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNvcnRPcmRlciBUaGUgcm93IG9yZGVyIGluIHRoZSByZXN1bHRpbmcgY3Vyc29yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbm9kZSBvcmRlciBpbgorICAgICAqIHRoZSBYTUwgZG9jdW1lbnQuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHJldHVybiBBIEN1cnNvciBvciBudWxsIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworCisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgbUh0dHBDbGllbnQgPSBudWxsOworCisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInVybCIpOworICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcnNlciA9IGdldFVyaVhtbFB1bGxQYXJzZXIodXJsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZSA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigicmVzb3VyY2UiKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVXJpIHJlc291cmNlVXJpID0gVXJpLnBhcnNlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRSArICI6Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHBhcnNlciA9IGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFhNTEN1cnNvciB4bWxDdXJzb3IgPSBuZXcgWE1MQ3Vyc29yKHNlbGVjdGlvbiwgcHJvamVjdGlvbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbEN1cnNvci5wYXJzZVdpdGgocGFyc2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geG1sQ3Vyc29yOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJL08gZXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChtSHR0cENsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1IdHRwQ2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgVVJMLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIgb3duIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIFhNTCBkb2N1bWVudCB0aGF0IGlzIHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcmV0dXJuIEFuIFhtbFB1bGxQYXJzZXIgb24gdGhpcyBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWG1sUHVsbFBhcnNlciBnZXRVcmlYbWxQdWxsUGFyc2VyKFN0cmluZyB1cmwpIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sUHVsbFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuYWJsZSB0byBjcmVhdGUgWG1sUHVsbFBhcnNlciIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBIdHRwR2V0IGdldCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBtSHR0cENsaWVudCA9IEFuZHJvaWRIdHRwQ2xpZW50Lm5ld0luc3RhbmNlKCJBbmRyb2lkIik7CisgICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBtSHR0cENsaWVudC5leGVjdXRlKGdldCk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgWE1MIGZpbGUgIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW5wdXRTdHJlYW0sIG51bGwpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIFhNTCBmaWxlIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgbG9jYWwgcmVzb3VyY2UuIENhbiBiZSBvdmVybG9hZGVkIHRvIHByb3ZpZGUgeW91cgorICAgICAqIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHJlc291cmNlVXJpIEEgZnVsbHkgcXVhbGlmaWVkIHJlc291cmNlIG5hbWUgcmVmZXJlbmNpbmcgYSBsb2NhbCBYTUwgcmVzb3VyY2UuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyKFVyaSByZXNvdXJjZVVyaSkgeworICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByZXNvdXJjZUlkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb3VyY2VJZCA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHJlc291cmNlVXJpKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUlkLnIuZ2V0WG1sKHJlc291cmNlSWQuaWQpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlhNTCByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyByZXNvdXJjZVVyaS50b1N0cmluZygpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWE1MQ3Vyc29yIGV4dGVuZHMgTWF0cml4Q3Vyc29yIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1TZWxlY3Rpb25QYXR0ZXJuOworICAgICAgICBwcml2YXRlIFBhdHRlcm5bXSBtUHJvamVjdGlvblBhdHRlcm5zOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1BdHRyaWJ1dGVOYW1lczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ3VycmVudFZhbHVlczsKKyAgICAgICAgcHJpdmF0ZSBCaXRTZXRbXSBtQWN0aXZlVGV4dERlcHRoTWFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU51bWJlck9mUHJvamVjdGlvbnM7CisKKyAgICAgICAgcHVibGljIFhNTEN1cnNvcihTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBwcm9qZWN0aW9ucykgeworICAgICAgICAgICAgc3VwZXIocHJvamVjdGlvbnMpOworICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGNvbHVtbiBpbiBwcm9qZWN0aW9ucyBpcyB1c2VkIGZvciB0aGUgX0lECisgICAgICAgICAgICBtTnVtYmVyT2ZQcm9qZWN0aW9ucyA9IHByb2plY3Rpb25zLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBtU2VsZWN0aW9uUGF0dGVybiA9IGNyZWF0ZVBhdHRlcm4oc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKHByb2plY3Rpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBpbnB1dCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBpbnB1dC5yZXBsYWNlQWxsKCIvLyIsICIvKC4qL3wpIikucmVwbGFjZUFsbCgiXi8iLCAiXi8iKSArICIkIjsKKyAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdGlvblBhdHRlcm4oU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIG1Qcm9qZWN0aW9uUGF0dGVybnMgPSBuZXcgUGF0dGVyblttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrID0gbmV3IEJpdFNldFttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICAvLyBBZGQgYSBjb2x1bW4gdG8gc3RvcmUgX0lECisgICAgICAgICAgICBtQ3VycmVudFZhbHVlcyA9IG5ldyBTdHJpbmdbbU51bWJlck9mUHJvamVjdGlvbnMgKyAxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXSA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdGlvbiA9IHByb2plY3Rpb25zW2kgKyAxXTsgLy8gKzEgdG8gc2tpcCB0aGUgX0lEIGNvbHVtbgorICAgICAgICAgICAgICAgIGludCBhdEluZGV4ID0gcHJvamVjdGlvbi5sYXN0SW5kZXhPZignQCcsIHByb2plY3Rpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChhdEluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzW2ldID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoYXRJbmRleCsxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDAsIGF0SW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ29uZm9ybXMgdG8gWFBhdGggc3RhbmRhcmQ6IHJlZmVyZW5jZSB0byBsb2NhbCBjb250ZXh0IHN0YXJ0cyB3aXRoIGEgLgorICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uLmNoYXJBdCgwKSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zW2ldID0gY3JlYXRlUGF0dGVybihwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlV2l0aChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBTdGFjazxJbnRlZ2VyPiBwYXRoTGVuZ3RoU3RhY2sgPSBuZXcgU3RhY2s8SW50ZWdlcj4oKTsKKworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBwYXJzaW5nIG1vZGU6IGluIHJvb3QgbW9kZSwgcm9vdFBhdGggaXMgdXBkYXRlZCBhbmQgbm9kZXMgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvblBhdHRlcm4gYXJlIHNlYXJjaGVkIGZvciBhbmQgY3VycmVudE5vZGVEZXB0aCBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICAgIC8vIFdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvblBhdHRlcm4gaXMgZm91bmQsIGN1cnJlbnROb2RlRGVwdGggaXMgc2V0IHRvIDAgYW5kCisgICAgICAgICAgICAvLyB1cGRhdGVkIGFzIGNoaWxkcmVuIGFyZSBwYXJzZWQgYW5kIHByb2plY3Rpb25QYXR0ZXJucyBhcmUgc2VhcmNoZWQgaW4gbm9kZVBhdGguCisgICAgICAgICAgICBpbnQgY3VycmVudE5vZGVEZXB0aCA9IC0xOworCisgICAgICAgICAgICAvLyBJbmRleCB3aGVyZSBsb2NhbCBzZWxlY3RlZCBub2RlIHBhdGggc3RhcnRzIGZyb20gaW4gcGF0aAorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSAwOworCisgICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgd2hpbGUgKGV2ZW50VHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcGF0aAorICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoU3RhY2sucHVzaChwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQcmVmaXggaXMgbm90IHN1cHBvcnRlZCBieSBsb2NhbCBYbWwgcmVzb3VyY2UgcGFyc2VyCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJzZXIuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHBhcnNlci5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGgrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb24gaXMgZm91bmQ6IGluaXRpYWxpemUgY2hpbGQgcGFyc2luZyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvblBhdHRlcm4ubWF0Y2hlcihwYXRoLnRvU3RyaW5nKCkpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzWzBdID0gSW50ZWdlci50b1N0cmluZyhnZXRDb3VudCgpKTsgLy8gX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHZhbHVlcyB0byBkZWZhdWx0IChlbXB0eSBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBoYXMgdG8gYmUgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIG9uZSBhcyBjdXJyZW50Tm9kZURlcHRoIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBiZSBtb2RpZmllZCBhYm92ZSAod2hlbiBhIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kKS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTm9kZVBhdGggPSBwYXRoLnN1YnN0cmluZyhjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvamVjdGlvblBhdHRlcm5zW2ldLm1hdGNoZXIobG9jYWxOb2RlUGF0aCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBtQXR0cmlidXRlTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBvcCBsYXN0IG5vZGUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwYXRoTGVuZ3RoU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguc2V0TGVuZ3RoKGxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlYXZpbmcgYSBzZWxlY3Rpb24gbWF0Y2hpbmcgbm9kZTogYWRkIGEgbmV3IHJvdyB3aXRoIHJlc3VsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSb3cobUN1cnJlbnRWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uc2V0KGN1cnJlbnROb2RlRGVwdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpICYmICghcGFyc2VyLmlzV2hpdGVzcGFjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudE5vZGVEZXB0aCA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5nZXQoY3VycmVudE5vZGVEZXB0aCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdICs9IHBhcnNlci5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKaW5kZXggMzY0YzkxZS4uZTIxY2I5NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCkBAIC0xNjYsNiArMTY2LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1FUlNJVkUgPSAweDAyMDA7CiAgICAgLyoqCisgICAgICogVmFsdWUgZm9yIHtAbGluayAjZmxhZ3N9OiB0cnVlIHdoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZAorICAgICAqIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDA0MDA7CisgICAgLyoqCiAgICAgICogT3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQgaW4gdGhlIGFjdGl2aXR5IGRlY2xhcmF0aW9uIGluIHRoZQogICAgICAqIG1hbmlmZXN0LgogICAgICAqIFRoZXNlIGluY2x1ZGU6CkBAIC0xNzUsNyArMTgwLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1RBVEVfTk9UX05FRURFRH0sIHtAbGluayAjRkxBR19FWENMVURFX0ZST01fUkVDRU5UU30sCiAgICAgICoge0BsaW5rICNGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkd9LCB7QGxpbmsgI0ZMQUdfTk9fSElTVE9SWX0sCiAgICAgICoge0BsaW5rICNGTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HU30sCi0gICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0KKyAgICAgKiB7QGxpbmsgI0ZMQUdfSU1NRVJTSVZFfSwge0BsaW5rICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEfQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKaW5kZXggNDdlNjY4ZC4uMTU1Yzg2YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKQEAgLTE2LDkgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMCwxNCArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDgsNyArNDUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIApAQCAtMTUzNSw2ICsxNTMxLDEwIEBACiAgICAgICAgICAgICBhaS5mbGFncyB8PSBBcHBsaWNhdGlvbkluZm8uRkxBR19WTV9TQUZFX01PREU7CiAgICAgICAgIH0KIAorICAgICAgICBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgZmFsc2UpOworCiAgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhc0NvZGUsCiAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKQEAgLTE2MzIsNyArMTYzMiw4IEBACiAKICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmICh0YWdOYW1lLmVxdWFscygiYWN0aXZpdHkiKSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNjQxLDcgKzE2NDIsNyBAQAogICAgICAgICAgICAgICAgIG93bmVyLmFjdGl2aXRpZXMuYWRkKGEpOwogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJyZWNlaXZlciIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNzc2LDcgKzE3NzcsOCBAQAogCiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBwYXJzZUFjdGl2aXR5KFBhY2thZ2Ugb3duZXIsIFJlc291cmNlcyByZXMsCiAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZmxhZ3MsIFN0cmluZ1tdIG91dEVycm9yLAotICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVjZWl2ZXIsIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSByZXMub2J0YWluQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eSk7CiAKQEAgLTE4ODYsOCArMTg4OCwxNCBAQAogICAgICAgICAgICAgICAgIGZhbHNlKSkgewogICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAoIXJlY2VpdmVyKSB7CisgICAgICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVBY2NlbGVyYXRlZCkpIHsKKyAgICAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGEuaW5mby5sYXVuY2hNb2RlID0gc2EuZ2V0SW50KAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9sYXVuY2hNb2RlLAogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uTEFVTkNIX01VTFRJUExFKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQppbmRleCBhMzdlNGU4Li5jY2I4NjA1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0xMjksOCArMTI5LDEyIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBmaWxlIGRlc2NyaXB0b3IgaXMgZm9yIGEgbWVtb3J5IGZpbGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVtb3J5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShtRmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzTWVtb3J5RmlsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShtRmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDAyOTU2YmEuLjJmMTEwZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTI2NiwxMSArMjY2LDE4IEBACiAgICAgICAgIHNiLmFwcGVuZCgiLyIpOwogICAgICAgICBzYi5hcHBlbmQobmF2aWdhdGlvbkhpZGRlbik7CiAgICAgICAgIHNiLmFwcGVuZCgiIG9yaWVuPSIpOwotICAgICAgICBzYi5hcHBlbmQob3JpZW50YXRpb24pOwotICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9Iik7Ci0gICAgICAgIHNiLmFwcGVuZChzY3JlZW5MYXlvdXQpOwotICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9Iik7Ci0gICAgICAgIHNiLmFwcGVuZCh1aU1vZGUpOworICAgICAgICBzd2l0Y2gob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgT1JJRU5UQVRJT05fTEFORFNDQVBFOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiTCIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1JJRU5UQVRJT05fUE9SVFJBSVQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQIik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQob3JpZW50YXRpb24pOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiIGxheW91dD0weCIpOworICAgICAgICBzYi5hcHBlbmQoamF2YS5sYW5nLkludGVnZXIudG9IZXhTdHJpbmcoc2NyZWVuTGF5b3V0KSk7CisgICAgICAgIHNiLmFwcGVuZCgiIHVpTW9kZT0weCIpOworICAgICAgICBzYi5hcHBlbmQoamF2YS5sYW5nLkludGVnZXIudG9IZXhTdHJpbmcodWlNb2RlKSk7CiAgICAgICAgIGlmIChzZXEgIT0gMCkgewogICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VxPSIpOwogICAgICAgICAgICAgc2IuYXBwZW5kKHNlcSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjZTNjMS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKgotICogWXVjay1vLiAgVGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSB0byBpbXBsZW1lbnQgdGhpcy4gIFdoZW4gdGhlIElDVSBQbHVyYWxSdWxlcwotICogb2JqZWN0IGhhcyBiZWVuIGludGVncmF0ZWQgdG8gYW5kcm9pZCwgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGF0LiAgRm9yIG5vdywgeXVjay1vLgotICovCi0KLWFic3RyYWN0IGNsYXNzIFBsdXJhbFJ1bGVzIHsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT1RIRVIgPSAweDAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9aRVJPICA9IDB4MDAwMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09ORSAgID0gMHgwMDAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfVFdPICAgPSAweDAwMDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9GRVcgICA9IDB4MDAwODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX01BTlkgID0gMHgwMDEwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7Ci0KLSAgICBhYnN0cmFjdCBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pOwotCi0gICAgZmluYWwgaW50IGF0dHJGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgcmV0dXJuIFBsdXJhbFJ1bGVzLmF0dHJGb3JRdWFudGl0eShxdWFudGl0eUZvck51bWJlcihuKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBhdHRyRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIC8vIHNlZSBpbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAotICAgICAgICBzd2l0Y2ggKHF1YW50aXR5KSB7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1pFUk86IHJldHVybiAweDAxMDAwMDA1OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzogIHJldHVybiAweDAxMDAwMDA4OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOgotICAgICAgICAgICAgICAgIHJldHVybiAiemVybyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX09ORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9uZSI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInR3byI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImZldyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX01BTlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJtYW55IjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvdGhlciI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgUGx1cmFsUnVsZXMgcnVsZUZvckxvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmICgiY3MiLmVxdWFscyhsYW5nKSkgewotICAgICAgICAgICAgaWYgKGNzID09IG51bGwpIGNzID0gbmV3IGNzKCk7Ci0gICAgICAgICAgICByZXR1cm4gY3M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZW4gPT0gbnVsbCkgZW4gPSBuZXcgZW4oKTsKLSAgICAgICAgICAgIHJldHVybiBlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBsdXJhbFJ1bGVzIGNzOwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGNzIGV4dGVuZHMgUGx1cmFsUnVsZXMgewotICAgICAgICBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobiA+PSAyICYmIG4gPD0gNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9GRVc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBlbjsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBlbiBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQppbmRleCBhNjUxM2FhLi44MTJhZjVhIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7CiAKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwpAQCAtNDIsNiArNDEsOCBAQAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgbGliY29yZS5pY3UuTmF0aXZlUGx1cmFsUnVsZXM7CisKIC8qKgogICogQ2xhc3MgZm9yIGFjY2Vzc2luZyBhbiBhcHBsaWNhdGlvbidzIHJlc291cmNlcy4gIFRoaXMgc2l0cyBvbiB0b3Agb2YgdGhlCiAgKiBhc3NldCBtYW5hZ2VyIG9mIHRoZSBhcHBsaWNhdGlvbiAoYWNjZXNzaWJsZSB0aHJvdWdoIGdldEFzc2V0cygpKSBhbmQKQEAgLTUzLDYgKzU0LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0NPTkZJRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRk9SX1BSRUxPQUQgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7CisKICAgICAvLyBVc2UgdGhlIGN1cnJlbnQgU0RLIHZlcnNpb24gY29kZS4gIElmIHdlIGFyZSBhIGRldmVsb3BtZW50IGJ1aWxkLAogICAgIC8vIGFsc28gYWxsb3cgdGhlIHByZXZpb3VzIFNESyB2ZXJzaW9uICsgMS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc1Nka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OLlNES19JTlQKQEAgLTkxLDcgKzk0LDcgQEAKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBBc3NldE1hbmFnZXIgbUFzc2V0czsKICAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIC8qcGFja2FnZSovIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1NZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBtUGx1cmFsUnVsZTsKICAgICAKICAgICBwcml2YXRlIENvbXBhdGliaWxpdHlJbmZvIG1Db21wYXRpYmlsaXR5SW5mbzsKICAgICBwcml2YXRlIERpc3BsYXkgbURlZmF1bHREaXNwbGF5OwpAQCAtMjA4LDkgKzIxMSwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgorICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KKyAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gcXVhbnRpdHkgVGhlIG51bWJlciB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MKKyAgICAgKiAgICAgICAgICAgcGx1cmFsIHJ1bGVzLgogICAgICAqCiAgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIElEIGRvZXMgbm90IGV4aXN0LgogICAgICAqCkBAIC0yMTgsMjkgKzIyOSw1MiBAQAogICAgICAqICAgICAgICAgcG9zc2libHkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRRdWFudGl0eVRleHQoaW50IGlkLCBpbnQgcXVhbnRpdHkpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgcnVsZS5hdHRyRm9yTnVtYmVyKHF1YW50aXR5KSk7CisgICAgICAgIE5hdGl2ZVBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7CisgICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwKKyAgICAgICAgICAgICAgICBhdHRyRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgUGx1cmFsUnVsZXMuSURfT1RIRVIpOworICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgSURfT1RIRVIpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJQbHVyYWwgcmVzb3VyY2UgSUQgIzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpCiAgICAgICAgICAgICAgICAgKyAiIHF1YW50aXR5PSIgKyBxdWFudGl0eQotICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBQbHVyYWxSdWxlcy5zdHJpbmdGb3JRdWFudGl0eShydWxlLnF1YW50aXR5Rm9yTnVtYmVyKHF1YW50aXR5KSkpOworICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBzdHJpbmdGb3JRdWFudGl0eUNvZGUocnVsZS5xdWFudGl0eUZvckludChxdWFudGl0eSkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFBsdXJhbFJ1bGVzIGdldFBsdXJhbFJ1bGUoKSB7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOworICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gTmF0aXZlUGx1cmFsUnVsZXMuZm9yTG9jYWxlKG1Db25maWd1cmF0aW9uLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbVBsdXJhbFJ1bGU7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYXR0ckZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAweDAxMDAwMDA1OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLkZFVzogIHJldHVybiAweDAxMDAwMDA4OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAiemVybyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk9ORTogIHJldHVybiAib25lIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuICJ0d28iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gImZldyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk1BTlk6IHJldHVybiAibWFueSI7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRC4gIEl0CiAgICAgICogd2lsbCBiZSBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCkBAIC0yOTUsNiArMzI5LDkgQEAKICAgICAgKiBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICoge0Btb3JlfQogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMzE3LDYgKzM1NCw5IEBACiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRCBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogbnVtZXJpY2FsIHF1YW50aXR5LgogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMTMxNSw3ICsxMzU1LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShjb25maWcubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShjb25maWcubG9jYWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCmluZGV4IGE1ZTVlNDYuLjliMTQ5OTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQpAQCAtMTgsMTYgKzE4LDExIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTU2LDYgKzUxLDEwIEBACiAgICAgYWJzdHJhY3QgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbik7CiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pOwogCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2V0QmxvYiBpbiBhbGwgY3Vyc29yIHR5cGVzCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCbG9iKGludCBjb2x1bW4pIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJnZXRCbG9iIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTg4LDcgKzg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUubm90aWZ5SW52YWxpZGF0ZWQoKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkgewogICAgICAgICBpZiAobVNlbGZPYnNlcnZlciAhPSBudWxsICYmIG1TZWxmT2JzZXJ2ZXJSZWdpc3RlcmVkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Ob3RpZnlVcmksIHRydWUsIG1TZWxmT2JzZXJ2ZXIpOwpAQCAtMTA5LDIyICsxMDgsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZyw/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBjdXJzb3IgaXMgc3VjY2Vzc2Z1bGx5IHNjcm9sbGVkCiAgICAgICogdG8gYSBuZXcgcG9zaXRpb24sIGdpdmluZyB0aGUgc3ViY2xhc3MgYSBjaGFuY2UgdG8gdXBkYXRlIGFueSBzdGF0ZSBpdAogICAgICAqIG1heSBoYXZlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBtb3ZlIGZ1bmN0aW9uIHdpbGwgYWxzbyBkbyBzbyBhbmQgdGhlCkBAIC0zMjAsMTM3ICszMDMsNiBAQAogICAgICAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF07CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIFNob3J0LnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBMb25nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBGbG9hdC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBEb3VibGUudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUoaW50IGNvbHVtbkluZGV4LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvbmcudmFsdWVPZigpIHJldHVybnMgbnVsbCBzb21ldGltZXMhCi0vLyAgICAgICAgTG9uZyByb3dpZCA9IExvbmcudmFsdWVPZihnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIExvbmcgcm93aWQgPSBuZXcgTG9uZyhnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIGlmIChyb3dpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIHJvd2lkLiBtUm93SWRDb2x1bW5JbmRleCA9ICIgKyBtUm93SWRDb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJvdyA9IG1VcGRhdGVkUm93cy5nZXQocm93aWQpOwotICAgICAgICAgICAgaWYgKHJvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dChyb3dpZCwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdy5wdXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0sIG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gY29tbWl0VXBkYXRlcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbVJvd0lkQ29sdW1uSW5kZXggIT0gLTE7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1Db250ZW50T2JzZXJ2YWJsZS5yZWdpc3Rlck9ic2VydmVyKG9ic2VydmVyKTsKICAgICB9CkBAIC00NzgsOSArMzMwLDkgQEAKICAgICAgICAgcmV0dXJuIG1EYXRhU2V0T2JzZXJ2YWJsZTsKICAgICAgICAgCiAgICAgfQorCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1EYXRhU2V0T2JzZXJ2YWJsZS5yZWdpc3Rlck9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKQEAgLTUzNSwzNiArMzg3LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGlzCi0gICAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSB0byBhbGxvdyBzdWJjbGFzc2VzIHRvCi0gICAgICogc3VwcG9ydCByZWFkaW5nIHVuY29tbWl0dGVkIHVwZGF0ZXMuIE5PVEU6IFRoaXMgZnVuY3Rpb24gYW5kCi0gICAgICoge0BsaW5rICNnZXRVcGRhdGVkRmllbGR9IHNob3VsZCBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEKLSAgICAgKiBibG9jayBzeW5jaHJvbml6ZWQgb24gbVVwZGF0ZWRSb3dzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBmYWxzZSBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmllbGRVcGRhdGVkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggIT0gLTEgJiYgbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgICAgICBpZiAodXBkYXRlcyAhPSBudWxsICYmIHVwZGF0ZXMuY29udGFpbnNLZXkoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5jb21taXR0ZWQgdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkCi0gICAgICogYXQgY29sdW1uSW5kZXguICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgI2lzRmllbGRVcGRhdGVkfSBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEgYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgdmFsdWUKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBudWxsIHNpbmNlIEN1cnNvcnMgZG8gbm90IHN1cHBvcnQgdXBkYXRpbmcgcm93cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRVcGRhdGVkRmllbGQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgIHJldHVybiB1cGRhdGVzLmdldChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSk7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE0LDExICs0NDksOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgSGFzaE1hcCBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBMb25nIHJvd0lEcyB0byBhbm90aGVyIE1hcAotICAgICAqIHRoYXQgbWFwcyBmcm9tIFN0cmluZyBjb2x1bW4gbmFtZXMgdG8gbmV3IHZhbHVlcy4gQSBOVUxMIHZhbHVlIG1lYW5zIHRvCi0gICAgICogcmVtb3ZlIGFuIGV4aXN0aW5nIHZhbHVlLCBhbmQgYWxsIG51bWVyaWMgdmFsdWVzIGFyZSBpbiB0aGVpciBjbGFzcwotICAgICAqIGZvcm1zLCBpLmUuIEludGVnZXIsIExvbmcsIEZsb2F0LCBldGMuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBuZXZlciB1cGRhdGVkIGJ5IHRoaXMgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgdXNlZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gbVVwZGF0ZWRSb3dzOwogCiAgICAgLyoqCkBAIC02MjgsNiArNDYxLDExIEBACiAgICAgcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleDsKIAogICAgIHByb3RlY3RlZCBpbnQgbVBvczsKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBpcyBub3QgLTEgdGhpcyBjb250YWlucyBjb250YWlucyB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgY29sdW1uIGF0IHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGZvciB0aGUgY3VycmVudCByb3cgdGhpcyBjdXJzb3IgaXMKKyAgICAgKiBwb2ludGluZyBhdC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9uZyBtQ3VycmVudFJvd0lEOwogICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKaW5kZXggMjdhMDJlMi4uOGFkZGFhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQpAQCAtMTksMjAyICsxOSwxMDUgQEAKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBDdXJzb3JzIHRoYXQgc3RvcmUgdGhlaXIgZGF0YSBpbiB7QGxpbmsgQ3Vyc29yV2luZG93fXMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IKLXsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IgewogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGVbXSlnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0QmxvYihtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0U3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKQotICAgIHsKKyAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5jb3B5U3RyaW5nVG9CdWZmZXIoY29sdW1uSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1XaW5kb3cuY29weVN0cmluZ1RvQnVmZmVyKG1Qb3MsIGNvbHVtbkluZGV4LCBidWZmZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFNob3J0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEludChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldExvbmcobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEZsb2F0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldERvdWJsZShtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc051bGwobVBvcywgY29sdW1uSW5kZXgpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBieXRlW107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Jsb2IobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9COwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzU3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIExvbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkKLSAgICB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBjaGVja1Bvc2l0aW9uKCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKSB7CiAgICAgICAgIHN1cGVyLmNoZWNrUG9zaXRpb24oKTsKICAgICAgICAgCiAgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTdGFsZURhdGFFeGNlcHRpb24oIkFjY2VzcyBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIGFjY2VzcyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCmluZGV4IGJhYTk0ZDguLmZhNjJkNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTE3LDEzICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1bGsgY3Vyc29yLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcKQEAgLTEyMCwyNiArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfUk9XU19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB3aGF0IENsYXNzTG9hZGVyIHNob3VsZCBiZSBwYXNzZWQgdG8gcmVhZEhhc2hNYXA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzd2l0Y2ggdG8gQnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzID0gZGF0YS5yZWFkSGFzaE1hcChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB1cGRhdGVSb3dzKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBERUxFVEVfUk9XX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVsZXRlUm93KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIE9OX01PVkVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTM0Myw0OCArMzIwLDYgQEAKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwIHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZU1hcCh2YWx1ZXMpOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludChwb3NpdGlvbik7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChERUxFVEVfUk9XX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQppbmRleCAxNDY5ZWEyLi4yY2IyYWVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxMiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgogICogQWRhcHRzIGFuIHtAbGluayBJQnVsa0N1cnNvcn0gdG8gYSB7QGxpbmsgQ3Vyc29yfSBmb3IgdXNlIGluIHRoZSBsb2NhbAogICogcHJvY2Vzcy4KQEAgLTE3NCwzOCArMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLmRlbGV0ZVJvdyhtUG9zKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUsIGRpc2NhcmQgaXQKLSAgICAgICAgICAgICAgICBtV2luZG93ID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXggdXAgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgbUNvdW50ID0gbUJ1bGtDdXJzb3IuY291bnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobVBvcyA8IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkUG9zID0gbVBvczsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihvbGRQb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSBtQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZGVsZXRlIHJvdyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIGlmIChtQ29sdW1ucyA9PSBudWxsKSB7CkBAIC0yMTksNDQgKzE4NSw2IEBACiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSBpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci51cGRhdGVSb3dzKG1VcGRhdGVkUm93cyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY29tbWl0IHVwZGF0ZXMgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5jMDNjNTg2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMzAsNiArMzAsMjUgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgQ3Vyc29yLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvciB7CisgICAgLyoKKyAgICAgKiBWYWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9LgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgZGVmaW5lZCBpbiBDdXJzb3JXaW5kb3cuaAorICAgICAqLworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgbnVsbCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9OVUxMID0gMDsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCAgY29sdW1uIHR5cGUgaXMgaW50ZWdlciAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9JTlRFR0VSID0gMTsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBmbG9hdCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9GTE9BVCA9IDI7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgc3RyaW5nICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX1NUUklORyA9IDM7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgYmxvYiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9CTE9CID0gNDsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlcnMgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgogICAgICAqCkBAIC0xNDYsMjIgKzE2NSw2IEBACiAgICAgYm9vbGVhbiBpc0FmdGVyTGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAgICAgKiBzdG9yZS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3Vyc29yIHdpbGwgYmUgcG9pbnRpbmcgdG8gdGhlIHJvdwotICAgICAqIGFmdGVyIHRoZSByb3cgdGhhdCBpcyBkZWxldGVkLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZGVjcmVtZW50aW5nCi0gICAgICogdGhlIHJlc3VsdCBvZiBjb3VudCgpIGJ5IG9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcXVlcnkgbXVzdCBoYXZlIHRoZSByb3cgSUQgY29sdW1uIGluIGl0cyBzZWxlY3Rpb24sIG90aGVyd2lzZSB0aGlzCi0gICAgICogY2FsbCB3aWxsIGZhaWwuCi0gICAgICogCi0gICAgICogQGhpZGUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZGVsZXRlKFVyaSwgU3RyaW5nLCBTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGRlbGV0ZVJvdygpOwotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lLCBvciAtMSBpZiB0aGUgY29sdW1uIGRvZXNuJ3QgZXhpc3QuCiAgICAgICogSWYgeW91IGV4cGVjdCB0aGUgY29sdW1uIHRvIGV4aXN0IHVzZSB7QGxpbmsgI2dldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcpfSBpbnN0ZWFkLCB3aGljaAogICAgICAqIHdpbGwgbWFrZSB0aGUgZXJyb3IgbW9yZSBjbGVhci4KQEAgLTI5NSw2ICsyOTgsMjcgQEAKICAgICBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICogVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBjb2x1bW4gaXMgcmV0dXJuZWQgYnV0IHRoZSBkYXRhIG1heSBiZSBjb252ZXJ0ZWQgdG8gb3RoZXIgdHlwZXMKKyAgICAgKiBhcyBkb2N1bWVudGVkIGluIHRoZSBnZXQtdHlwZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNnZXRJbnQoaW50KX0sIHtAbGluayAjZ2V0RmxvYXQoaW50KX0KKyAgICAgKiBldGMuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCisgICAgICogQHJldHVybiBjb2x1bW4gdmFsdWUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgpAQCAtMzAzLDE4OCArMzI3LDYgQEAKICAgICBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGhhc1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLCBhcyB3ZWxsIGFzIHRoZQotICAgICAqIHVwZGF0ZXMgaW5jbHVkZWQgaW4gdmFsdWVzLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIGZyb20gcm93IElEcyB0byBNYXBzIGFzc29jaWF0aW5nIGNvbHVtbiBuYW1lcyB3aXRoCi0gICAgICogICAgICAgICAgICAgICB1cGRhdGVkIHZhbHVlcy4gQSBudWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZmllbGQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJ0cyBhbGwgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJzb3Igc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAgICAqIGNvbW1pdFVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICB2b2lkIGFib3J0VXBkYXRlcygpOwotCi0gICAgLyoqCiAgICAgICogRGVhY3RpdmF0ZXMgdGhlIEN1cnNvciwgbWFraW5nIGFsbCBjYWxscyBvbiBpdCBmYWlsIHVudGlsIHtAbGluayAjcmVxdWVyeX0gaXMgY2FsbGVkLgogICAgICAqIEluYWN0aXZlIEN1cnNvcnMgdXNlIGZld2VyIHJlc291cmNlcyB0aGFuIGFjdGl2ZSBDdXJzb3JzLgogICAgICAqIENhbGxpbmcge0BsaW5rICNyZXF1ZXJ5fSB3aWxsIG1ha2UgdGhlIGN1cnNvciBhY3RpdmUgYWdhaW4uCkBAIC00OTYsNiArMzM4LDEwIEBACiAgICAgICogY29udGVudHMuIFRoaXMgbWF5IGJlIGRvbmUgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBhIGNhbGwgdG8ge0BsaW5rCiAgICAgICogI2RlYWN0aXZhdGV9LgogICAgICAqCisgICAgICogU2luY2UgdGhpcyBtZXRob2QgY291bGQgZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRoZSBkYXRhYmFzZSBhbmQgcG90ZW50aWFsbHkgdGFrZQorICAgICAqIGEgd2hpbGUsIGl0IGNvdWxkIGNhdXNlIEFOUiBpZiBpdCBpcyBjYWxsZWQgb24gTWFpbiAoVUkpIHRocmVhZC4KKyAgICAgKiBBIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBleGVjdXRlZCBvbiBNYWluIHRocmVhZC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVyeSBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdCwgaW4gd2hpY2ggY2FzZSB0aGUKICAgICAgKiAgICAgICAgIGN1cnNvciBiZWNvbWVzIGludmFsaWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggNzQ4ZWI5OS4uOGJjN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU1pc3VzZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogCiAvKioKICAqIFdyYXBzIGEgQnVsa0N1cnNvciBhcm91bmQgYW4gZXhpc3RpbmcgQ3Vyc29yIG1ha2luZyBpdCByZW1vdGFibGUuCkBAIC0zOCw3ICszNCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDcm9zc1Byb2Nlc3NDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEN1cnNvcldpbmRvdyBtV2luZG93OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWFkT25seTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgQ29udGVudE9ic2VydmVyIApAQCAtOTgsNyArOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAiT25seSBDcm9zc1Byb2Nlc3NDdXJzb3IgY3Vyc29ycyBhcmUgc3VwcG9ydGVkIGFjcm9zcyBwcm9jZXNzIGZvciBub3ciLCBlKTsKICAgICAgICAgfQogICAgICAgICBtUHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwotICAgICAgICBtUmVhZE9ubHkgPSAhYWxsb3dXcml0ZTsKIAogICAgICAgICBjcmVhdGVBbmRSZWdpc3Rlck9ic2VydmVyUHJveHkob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTE5NywzMSArMTkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3Vyc29yLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRFeHRyYXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjU5OTQzMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yMTcsMTggKzIxNywxMyBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNOdWxsX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNOdWxsX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqCkBAIC0yNDgsMTkgKzI0Myw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZV9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGEgZmllbGQgY29udGFpbnMgZWl0aGVyIGEgYmxvYiBvciBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgYmxvYgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCbG9iX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjksMTQgKzI4OCwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODUsMTQgKzMwMSwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgZmxvYXQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Zsb2F0X25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAxLDIwICszMTQsMTUgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBTdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTdHJpbmdfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzU3RyaW5nX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0VHlwZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKaW5kZXggZjBhYTdkNy4uM2MzYmQ0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQpAQCAtMTcsMjggKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QKKyAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0LiAgVGhlIHByaW1hcnkKKyAqIHVzZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBleHRlbmQgYSBjdXJzb3Igd2hpbGUgb3ZlcnJpZGluZyBvbmx5IGEgc3Vic2V0IG9mIGl0cyBtZXRob2RzLgogICovCi0KIHB1YmxpYyBjbGFzcyBDdXJzb3JXcmFwcGVyIGltcGxlbWVudHMgQ3Vyc29yIHsKIAorICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yIG1DdXJzb3I7CisKICAgICBwdWJsaWMgQ3Vyc29yV3JhcHBlcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBtQ3Vyc29yLmFib3J0VXBkYXRlcygpOworICAgIHB1YmxpYyBDdXJzb3IgZ2V0V3JhcHBlZEN1cnNvcigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC00OSwyMyArNDcsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0Nsb3NlZCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoCi0gICAgICAgICAgICBNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7CiAgICAgfQpAQCAtNzQsMTQgKzU1LDYgQEAKICAgICAgICAgbUN1cnNvci5kZWFjdGl2YXRlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAgICAgfQpAQCAtMTQ3LDE0ICsxMjAsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRXYW50c0FsbE9uTW92ZUNhbGxzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmhhc1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKICAgICB9CkBAIC0xNzEsNiArMTM2LDEwIEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTGFzdCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTIxOSwxNCArMTg4LDYgQEAKICAgICAgICAgbUN1cnNvci5zZXROb3RpZmljYXRpb25VcmkoY3IsIHVyaSk7ICAgICAgICAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5zdXBwb3J0c1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOyAgICAgICAgCiAgICAgfQpAQCAtMjM0LDcyICsxOTUsNSBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVEb3VibGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVGbG9hdChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlSW50KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUxvbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTaG9ydChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU3RyaW5nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlQmxvYihjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVRvTnVsbChjb2x1bW5JbmRleCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCmluZGV4IDkyMDBlODEuLjUxYzcyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQpAQCAtMjcsOCArMjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25DaGFuZ2VkKCk7CisgICAgICAgICAgICAvLyBzaW5jZSBvbkNoYW5nZWQoKSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwLCBpdCBjb3VsZCBkbyBhbnl0aGluZywgaW5jbHVkaW5nCisgICAgICAgICAgICAvLyByZW1vdmluZyBpdHNlbGYgZnJvbSB7QGxpbmsgbU9ic2VydmVyc30gLSBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZgorICAgICAgICAgICAgLy8gYW4gaXRlcmF0b3IgaXMgdXNlZCBvbiB0aGUgQXJyYXlMaXN0IHtAbGluayBtT2JzZXJ2ZXJzfS4KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGp1c3QgbWFyY2ggdGhydSB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zOSw4ICs0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25JbnZhbGlkYXRlZCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkludmFsaWRhdGVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGxldCB0aGUgYXBwcyBkZWZpbmUgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCmluZGV4IDY2NDA2Y2EuLmMwN2MzYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKQEAgLTUyLDYgKzUyLDIxIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjb3VudFByb2plY3Rpb24gPSBuZXcgU3RyaW5nW117ImNvdW50KCopIn07CiAKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9TRUxFQ1QgPSAxOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1VQREFURSA9IDI7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQVRUQUNIID0gMzsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9CRUdJTiA9IDQ7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQ09NTUlUID0gNTsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9BQk9SVCA9IDY7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfT1RIRVIgPSA3OworCiAgICAgLyoqCiAgICAgICogU3BlY2lhbCBmdW5jdGlvbiBmb3Igd3JpdGluZyBhbiBleGNlcHRpb24gcmVzdWx0IGF0IHRoZSBoZWFkZXIgb2YKICAgICAgKiBhIHBhcmNlbCwgdG8gYmUgdXNlZCB3aGVuIHJldHVybmluZyBhbiBleGNlcHRpb24gZnJvbSBhIHRyYW5zYWN0aW9uLgpAQCAtMTkzLDYgKzIwOCwzNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIHZhbHVlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSB0eXBlIGlzIHRvIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiBvYmplY3QgdmFsdWUgdHlwZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZU9mT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9CTE9COworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZsb2F0IHx8IG9iaiBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcgfHwgb2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXBwZW5kcyBhbiBTUUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBTdHJpbmdCdWlsZGVyLCBpbmNsdWRpbmcgdGhlIG9wZW5pbmcKICAgICAgKiBhbmQgY2xvc2luZyBzaW5nbGUgcXVvdGVzLiBBbnkgc2luZ2xlIHF1b3RlcyBpbnRlcm5hbCB0byBzcWxTdHJpbmcgd2lsbAogICAgICAqIGJlIGVzY2FwZWQuCkBAIC02MzIsMTQgKzY3OCw4IEBACiAgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGxvbmdGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICBpZiAoc2VsZWN0aW9uQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kT2JqZWN0VG9Qcm9ncmFtKHByb2csIGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb25nIHZhbHVlID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY2MCwxNCArNzAwLDggQEAKICAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICBpZiAoc2VsZWN0aW9uQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kT2JqZWN0VG9Qcm9ncmFtKHByb2csIGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMjgsNCArMTE2Miw1OSBAQAogICAgICAgICBkYi5zZXRWZXJzaW9uKGRiVmVyc2lvbik7CiAgICAgICAgIGRiLmNsb3NlKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aGljaCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFNRTCBzdGF0ZW1lbnQuCisgICAgICogPG9sPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1NFTEVDVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1VQREFURX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0FUVEFDSH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0JFR0lOfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQ09NTUlUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQUJPUlR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9PVEhFUn08L2xpPgorICAgICAqIDwvb2w+CisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB3aG9zZSB0eXBlIGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHZhbHVlcyBsaXN0ZWQgYWJvdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgaWYgKHNxbC5sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IHNxbC5zdWJzdHJpbmcoMCwgMykudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHMoIlNFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1NFTEVDVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJJTlMiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIlVQRCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiUkVQIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJERUwiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9VUERBVEU7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQVRUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQVRUQUNIOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkNPTSIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJFTkQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9DT01NSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiUk9MIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQUJPUlQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQkVHIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQkVHSU47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIG9uZSBzZXQgb2Ygc2VsZWN0aW9uIGFyZ3MgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBzZWxlY3Rpb24KKyAgICAgKiBhcmd1bWVudCB0byBhIHVzZXIgcHJvdmlkZWQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXBwZW5kU2VsZWN0aW9uQXJncyhTdHJpbmdbXSBvcmlnaW5hbFZhbHVlcywgU3RyaW5nW10gbmV3VmFsdWVzKSB7CisgICAgICAgIGlmIChvcmlnaW5hbFZhbHVlcyA9PSBudWxsIHx8IG9yaWdpbmFsVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWVzOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbb3JpZ2luYWxWYWx1ZXMubGVuZ3RoICsgbmV3VmFsdWVzLmxlbmd0aCBdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVmFsdWVzLCAwLCByZXN1bHQsIDAsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3VmFsdWVzLCAwLCByZXN1bHQsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCwgbmV3VmFsdWVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE5ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgdXNlZCBkZWZpbmluZyB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7CisgICAgICAgIExvZy5lKFRBRywgIkNvcnJ1cHRpb24gcmVwb3J0ZWQgYnkgc3FsaXRlIG9uIGRhdGFiYXNlOiAiICsgZGJPYmouZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBpcyB0aGUgY29ycnVwdGlvbiBkZXRlY3RlZCBldmVuIGJlZm9yZSBkYXRhYmFzZSBjb3VsZCBiZSAnb3BlbmVkJz8KKyAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgZmlsZXMgYXJlIG5vdCBldmVuIG9wZW5hYmxlLiBkZWxldGUgdGhpcyBkYXRhYmFzZSBmaWxlLgorICAgICAgICAgICAgLy8gTk9URSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjb3JydXB0LgorICAgICAgICAgICAgLy8gYW5kIG5vdCBkZWxldGluZyBhbGwgb2YgdGhlbSBjb3VsZCBjYXVzZSBjb3JydXB0ZWQgZGF0YWJhc2UgZmlsZSB0byByZW1haW4gYW5kIAorICAgICAgICAgICAgLy8gbWFrZSB0aGUgYXBwbGljYXRpb24gY3Jhc2ggb24gZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gaW1wbCBjbGFzcworICAgICAgICAgICAgLy8gdG8gZGVsZXRlIEFMTCBmaWxlcyBvZiB0aGUgZGF0YWJhc2UgKGluY2x1ZGluZyB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKS4KKyAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UsIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCwgZ2V0IHRoZSBhdHRhY2hlZCBkYXRhYmFzZSBsaXN0IGZpcnN0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYk9iai5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgZmlsZXMgb2YgdGhpcyBjb3JydXB0IGRhdGFiYXNlIGFuZC9vciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwIDogYXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKHAuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGF0dGFjaGVkRGJzID0gbnVsbCBpcyBwb3NzaWJsZSB3aGVuIHRoZSBkYXRhYmFzZSBpcyBzbyBjb3JydXB0IHRoYXQgZXZlbgorICAgICAgICAgICAgICAgIC8vICJQUkFHTUEgZGF0YWJhc2VfbGlzdDsiIGFsc28gZmFpbHMuIGRlbGV0ZSB0aGUgbWFpbiBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGF0YWJhc2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeToiKSB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgImRlbGV0aW5nIHRoZSBkYXRhYmFzZSBmaWxlOiAiICsgZmlsZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogcHJpbnQgd2FybmluZyBhbmQgaWdub3JlIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVsZXRlIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCmluZGV4IDQ2NzkwYTMuLjI0NGM4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG93LWxldmVsIHdheSB0byBwYXNzIGJ1bGsgY3Vyc29yIGRhdGEgYWNyb3NzCi0gKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKKyAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRhcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKICAqIGludGVyZmFjZSBkaXJlY3RseS4KICAqCiAgKiB7QGhpZGV9CkBAIC01NCwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTc2LDggKzcwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DVVJTT1JfV0lORE9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NPTFVNTl9OQU1FU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CiAgICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKaW5kZXggZDVjM2EzMi4uNWMxYjk2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKQEAgLTI3Miw2ICsyNzIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0KGNvbHVtbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKSB7CiAgICAgICAgIHJldHVybiBnZXQoY29sdW1uKSA9PSBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCmluZGV4IDcyMmQ3MDcuLjJjMjVkYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQpAQCAtOTIsMzIgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKQEAgLTE1NSw2ICsxMjksMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIGludm9raW5nIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBvbiBNYWluIHRocmVhZCBjb3VsZCBjYXVzZSBBTlIuCisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgZW5jb3VyYWdlIGFwcHMgdG8gaW52b2tlIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoIkluICIgKyBwYWNrYWdlTmFtZSArICIgUmVxdWVyeSBpcyBleGVjdXRpbmcgb24gbWFpbiAoVUkpIHRocmVhZC4gY291bGQgY2F1c2UgQU5SLiAiICsKKyAgICAgICAgICAgICAgICAiZG8gaXQgaW4gYmFja2dyb3VuZCB0aHJlYWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMDYwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIGNvbm5lY3Rpb24gcG9vbCB0byBiZSB1c2VkIGJ5IHJlYWRlcnMuCisgKiBOb3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBiZSB1c2VkIGJ5IG9ubHkgb25lIHJlYWRlciBhdCBhIHRpbWUuCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2wiOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcG9vbCBzaXplLiBJdCBpcyBzZXQgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhlIGRldmljZSBoYXMuCisgICAgICogVE9ETzogc2V0IHRoaXMgd2l0aCAnYSBzeXN0ZW0gY2FsbCcgd2hpY2ggcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTsKKworICAgIC8qKiB0aGUgcG9vbCBzaXplIHNldCBmb3IgdGhpcyB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9ICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbU1heFBvb2xTaXplID0gREVGQVVMVF9DT05ORUNUSU9OX1BPT0xfU0laRTsKKworICAgIC8qKiBUaGUgY29ubmVjdGlvbiBwb29sIG9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGlzIG1lbWJlci4KKyAgICAgKiBUT0RPOiByZXZpc2l0IHRoaXMgZGF0YSBzdHJ1Y3QgYXMgdGhlIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgaW5jcmVhc2UgYmV5b25kCisgICAgICogc2luZ2xlLWRpZ2l0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQb29sT2JqPiBtUG9vbCA9IG5ldyBBcnJheUxpc3Q8UG9vbE9iaj4obU1heFBvb2xTaXplKTsKKworICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CisKKyAgICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byBwaWNrIGEgZnJlZSBjb25uZWN0aW9uIG91dCBvZiB0aGUgcG9vbCAqLworICAgIHByaXZhdGUgUmFuZG9tIHJhbmQ7IC8vIGxhemlseSBpbml0aWFsaXplZAorCisgICAgLyogcGFja2FnZSAqLyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHRoaXMubVBhcmVudERiT2JqID0gZGI7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIk1heCBQb29sIFNpemU6ICIgKyBtTWF4UG9vbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2UgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIC0gZXZlbiBpZiB0aGV5IGFyZSBpbiB1c2UhCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBwb29sIG9uICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsgdG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtUG9vbC5nZXQoaSkubURiLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9vbC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgZnJlZSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgaWYgbm90IG51bGwsIHRyeSB0byBmaW5kIGEgY29ubmVjdGlvbiBpbnRoZSBwb29sIHdoaWNoIGFscmVhZHkgaGFzIGNhY2hlZAorICAgICAqIHRoZSBjb21waWxlZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc3FsLgorICAgICAqIEByZXR1cm4gdGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldChTdHJpbmcgc3FsKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaW50IHBvb2xTaXplID0gbVBvb2wuc2l6ZSgpOworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBzcWwgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRGcmVlUG9vbFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gZnJlZSAoID0gYXZhaWxhYmxlKSBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gcG9vbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4ZWQgb3V0LiBjYW4ndCBvcGVuIGFueSBtb3JlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGNhbGxlciB3YWl0IG9uIG9uZSBvZiB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhQb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5tRGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBubyBkYXRhYmFzZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rIHRvIHJldHVybiBhbnkgb2YgdGhlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KHJhbmQubmV4dEludChtTWF4UG9vbFNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wsIHNpbmNlIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgICAgICAgICAgICAgICAgICAvLyBtYXggcG9vbCBzaXplIGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgZGIgPSBtUGFyZW50RGJPYmouY3JlYXRlUG9vbENvbm5lY3Rpb24oKHNob3J0KShwb29sU2l6ZSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG5ldyBQb29sT2JqKGRiKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvb2wuYWRkKHBvb2xTaXplLCBwb29sT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZS4gcGljayBvbmUKKyAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSAmJiBtUG9vbC5nZXQoaSkubURiLmlzU3FsSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGZyZWUgZGF0YWJhc2UgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQuIHJldHVybiBhIGZyZWUgY29ubmVjdGlvbiAodGhpcyBtZWFucywgdGhlIHNhbWUgU1FMIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZCBvbiBtb3JlIHRoYW4gb25lIGRhdGFiYXNlIGNvbm5lY3Rpb24uIHBvdGVudGlhbCB3YXN0ZWQgbWVtb3J5LikKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgcG9vbE9iaiAhPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IHBvb2xPYmoubURiID09IGRiOworCisgICAgICAgICAgICBwb29sT2JqLmFjcXVpcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVORCBnZXQtY29ubmVjdGlvbjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYjsKKyAgICAgICAgLy8gVE9ETyBpZiBhIHRocmVhZCBhY3F1aXJlcyBhIGNvbm5lY3Rpb24gYW5kIGRpZXMgd2l0aG91dCByZWxlYXNpbmcgdGhlIGNvbm5lY3Rpb24sIHRoZW4KKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYSBjb25uZWN0aW9uIGxlYWsuCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVsZWFzZSB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgorICAgICAqIEBwYXJhbSBkYiB0aGUgY29ubmVjdGlvbiB0byBiZSByZWxlYXNlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWxlYXNlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIFBvb2xPYmogcG9vbE9iajsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBkYi5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLm1EYiA9PSBkYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpOworCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQkVHSU4gcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb29sT2JqLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsZWFzaW5nIG9iamVjdCBhbHJlYWR5IGZyZWVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iai5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgKGJvdGggZnJlZSBhbmQgYnVzeSBjb25uZWN0aW9ucykuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuICJhZGIgYnVncmVwb3J0IiBpcyBkb25lLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBnZXRDb25uZWN0aW9uTGlzdCgpIHsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQobVBvb2wuZ2V0KGkpLm1EYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFja2FnZSBsZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gb3RoZXJ3aXNlLCBwcml2YXRlIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8UG9vbE9iaj4gZ2V0UG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCJkYjogIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1QYXJlbnREYk9iai5nZXRQYXRoKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCB0b3RhbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobVBvb2wuc2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgI2ZyZWUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCBtYXhwb29sc2l6ZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChtTWF4UG9vbFNpemUpOworICAgICAgICBmb3IgKFBvb2xPYmogcCA6IG1Qb29sKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Qb29sLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkudmVyaWZ5KCk7CisgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGkpLm1EYi5tQ29ubmVjdGlvbk51bSA9PSAoaSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldE1heFBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIG1NYXhQb29sU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRNYXhQb29sU2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhQb29sU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzRGF0YWJhc2VPYmpGcmVlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5pc0ZyZWUoKTsKKyAgICB9CisKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwcmVzZW50cyBvYmplY3RzIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogcGFja2FnZS1sZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQb29sT2JqIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSRUUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEJVU1kgPSBmYWxzZTsKKworICAgICAgICAvKiogdGhlIG51bWJlciBvZiB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIGludCBtTnVtSG9sZGVycyA9IDA7CisKKyAgICAgICAgLyoqIGNvbnRhaW5zIHRoZSB0aHJlYWRJZHMgb2YgdGhlIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICAqIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgSGFzaFNldDxMb25nPiBtSG9sZGVySWRzID0gbmV3IEhhc2hTZXQ8TG9uZz4oKTsKKworICAgICAgICBwdWJsaWMgUG9vbE9iaihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgbURiID0gZGI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFjcXVpcmUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzRnJlZSgpOworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLmFkZChpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzKys7CisgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLnNpemUoKSA9PSBtTnVtSG9sZGVyczsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycy0tOworICAgICAgICAgICAgaWYgKG1OdW1Ib2xkZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGcmVlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgICAgICBpZiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID09IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUhvbGRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUhvbGRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBjb25uICMgIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgbUNvdW50SG9sZGVycyA9ICIpOworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtTnVtSG9sZGVycyk7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZnJlZUJ1c3lGbGFnID0gIik7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobUZyZWVCdXN5RmxhZyk7CisgICAgICAgICAgICAgICAgZm9yIChMb25nIGwgOiBtSG9sZGVySWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGlkID0gIiArIGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDhhYzRjMGYuLmYyOGM3MGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxMyArMjEsMTEgQEAKICAqIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgY2xvc2VkCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17CitwdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcyA9ICJBcHBsaWNhdGlvbiBkaWQgbm90IGNsb3NlIHRoZSBjdXJzb3Igb3IgZGF0YWJhc2Ugb2JqZWN0ICIgKwogICAgICAgICAgICAgInRoYXQgd2FzIG9wZW5lZCBoZXJlIjsKIAotICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgdXNlZCB3aGVuIHNxbGl0ZSBjYW4ndCBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZpbGUKKyAqIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zIG9uIHRoZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMmY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgdGhlIHRoZSBiaW5kIG9yIGNvbHVtbiBwYXJhbWV0ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjY3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAxNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQppbmRleCAyNWFhOWIzLi5hYTBhNTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQpAQCAtNzgsMjAgKzc4LDEzIEBACiAgICAgICogIGV4aXN0aW5nIGNvbXBpbGVkIFNRTCBwcm9ncmFtIGFscmVhZHkgYXJvdW5kCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGUoU3RyaW5nIHNxbCwgYm9vbGVhbiBmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5TG9ja093bmVyKCk7CiAgICAgICAgIC8vIE9ubHkgY29tcGlsZSBpZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3RhdGVtZW50IGFscmVhZHkgb3IgdGhlIGNhbGxlciBoYXMKICAgICAgICAgLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYSByZWNvbXBpbGUuCiAgICAgICAgIGlmIChmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hdGl2ZV9jb21waWxlKCkgdGFrZXMgY2FyZSBvZiBkZXN0cm95aW5nIGFueSBwcmV2aW91c2x5Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgotICAgICAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmF0aXZlX2NvbXBpbGUoKSB0YWtlcyBjYXJlIG9mIGRlc3Ryb3lpbmcgYW55IHByZXZpb3VzbHkKKyAgICAgICAgICAgIC8vIGV4aXN0aW5nIHByb2dyYW1zIGJlZm9yZSBpdCBjb21waWxlcy4KKyAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMiwxMyArOTUsOCBAQAogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2xvc2VkIGFuZCBkZWFsbG9jYXRlZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyIpIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5maW5hbGl6ZVN0YXRlbWVudExhdGVyKG5TdGF0ZW1lbnQpOworICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNCw2ICsxMjIsMTAgQEAKICAgICAgICAgbUluVXNlID0gZmFsc2U7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gbUluVXNlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBuYXRpdmUgcmVzb3VyY2UgaXMgY2xlYW5lZCB1cC4KICAgICAgKi8KQEAgLTE0Miw5ICsxMzQsNiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgLy8gZmluYWxpemVyIHNob3VsZCBORVZFUiBnZXQgY2FsbGVkCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiB3YXJuaW5nICoqIEZpbmFsaXplZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyAiKSIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbiA9IG1TcWxTdG10Lmxlbmd0aCgpOwogICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVsZWFzaW5nIHN0YXRlbWVudCBpbiBhIGZpbmFsaXplci4gUGxlYXNlIGVuc3VyZSAiICsKICAgICAgICAgICAgICAgICAgICAgInRoYXQgeW91IGV4cGxpY2l0bHkgY2FsbCBjbG9zZSgpIG9uIHlvdXIgY3Vyc29yOiAiICsKQEAgLTE2Miw1ICsxNTEsNCBAQAogICAgICAqIEBwYXJhbSBzcWwgVGhlIFNRTCB0byBjb21waWxlLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXBpbGUoU3RyaW5nIHNxbCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQppbmRleCBjN2U1OGZhLi40M2RkNWQ3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCkBAIC0xNiwyMCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RXaW5kb3dlZEN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKLQoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogCkBAIC00NSwxOSArNDQsMTYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE5PX0NPVU5UID0gLTE7CiAKICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGVkaXQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtRWRpdFRhYmxlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1FZGl0VGFibGU7CiAKICAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSByb3dzICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1Db2x1bW5zOwogCiAgICAgLyoqIFRoZSBxdWVyeSBvYmplY3QgZm9yIHRoZSBjdXJzb3IgKi8KICAgICBwcml2YXRlIFNRTGl0ZVF1ZXJ5IG1RdWVyeTsKIAotICAgIC8qKiBUaGUgZGF0YWJhc2UgdGhlIGN1cnNvciB3YXMgY3JlYXRlZCBmcm9tICovCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7Ci0KICAgICAvKiogVGhlIGNvbXBpbGVkIHF1ZXJ5IHRoaXMgY3Vyc29yIGNhbWUgZnJvbSAqLwotICAgIHByaXZhdGUgU1FMaXRlQ3Vyc29yRHJpdmVyIG1Ecml2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcjsKIAogICAgIC8qKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnNvciAqLwogICAgIHByaXZhdGUgaW50IG1Db3VudCA9IE5PX0NPVU5UOwpAQCAtNjYsNyArNjIsNyBAQAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbUNvbHVtbk5hbWVNYXA7CiAKICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSBhIGN1cnNvciB3YXMgYWxsb2NhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IHJlbGVhc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogICAgIAogICAgIC8qKiAKICAgICAgKiAgbU1heFJlYWQgaXMgdGhlIG1heCBpdGVtcyB0aGF0IGVhY2ggY3Vyc29yIHdpbmRvdyByZWFkcyAKQEAgLTc3LDYgKzczLDExIEBACiAgICAgcHJpdmF0ZSBpbnQgbUN1cnNvclN0YXRlID0gMDsKICAgICBwcml2YXRlIFJlZW50cmFudExvY2sgbUxvY2sgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0RhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNyZXF1ZXJ5KCl9IHRvIHJlbWVtYmVyIGZvciB3aGljaCBkYXRhYmFzZSB3ZSd2ZSBhbHJlYWR5IHNob3duIHRoZSB3YXJuaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBzQWxyZWFkeVdhcm5lZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICAvKioKICAgICAgKiAgc3VwcG9ydCBmb3IgYSBjdXJzb3IgdmFyaWFudCB0aGF0IGRvZXNuJ3QgYWx3YXlzIHJlYWQgYWxsIHJlc3VsdHMKQEAgLTEzNiw3ICsxMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbVF1ZXJ5LmZpbGxXaW5kb3coY3csIG1NYXhSZWFkLCBtQ291bnQpOworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBnZXRRdWVyeSgpLmZpbGxXaW5kb3coY3csIG1NYXhSZWFkLCBtQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gLTEgbWVhbnMgbm90IGZpbmlzaGVkCiAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewpAQCAtMjAxLDI0ICsyMDIsNDYgQEAKICAgICAgKiBoYXMgcGFja2FnZSBzY29wZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBkYiBhIHJlZmVyZW5jZSB0byBhIERhdGFiYXNlIG9iamVjdCB0aGF0IGlzIGFscmVhZHkgY29uc3RydWN0ZWQKLSAgICAgKiAgICAgYW5kIG9wZW5lZAorICAgICAqICAgICBhbmQgb3BlbmVkLiBUaGlzIHBhcmFtIGlzIG5vdCB1c2VkIGFueSBsb25nZXIKICAgICAgKiBAcGFyYW0gZWRpdFRhYmxlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB1c2VkIGZvciB0aGlzIHF1ZXJ5CiAgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSByZXN0IG9mIHRoZSBxdWVyeSB0ZXJtcwogICAgICAqICAgICBjdXJzb3IgaXMgZmluYWxpemVkCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciwgU3RyaW5nLCBTUUxpdGVRdWVyeSl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBTUUxpdGVDdXJzb3IoU1FMaXRlRGF0YWJhc2UgZGIsIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsCiAgICAgICAgICAgICBTdHJpbmcgZWRpdFRhYmxlLCBTUUxpdGVRdWVyeSBxdWVyeSkgeworICAgICAgICB0aGlzKGRyaXZlciwgZWRpdFRhYmxlLCBxdWVyeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHF1ZXJ5IGFuZCBwcm92aWRlIGFjY2VzcyB0byBpdHMgcmVzdWx0IHNldCB0aHJvdWdoIGEgQ3Vyc29yCisgICAgICogaW50ZXJmYWNlLiBGb3IgYSBxdWVyeSBzdWNoIGFzOiB7QGNvZGUgU0VMRUNUIG5hbWUsIGJpcnRoLCBwaG9uZSBGUk9NCisgICAgICogbXlUYWJsZSBXSEVSRSAuLi4gTElNSVQgMSwyMCBPUkRFUiBCWS4uLn0gdGhlIGNvbHVtbiBuYW1lcyAobmFtZSwgYmlydGgsCisgICAgICogcGhvbmUpIHdvdWxkIGJlIGluIHRoZSBwcm9qZWN0aW9uIGFyZ3VtZW50IGFuZCBldmVyeXRoaW5nIGZyb20KKyAgICAgKiB7QGNvZGUgRlJPTX0gb253YXJkIHdvdWxkIGJlIGluIHRoZSBwYXJhbXMgYXJndW1lbnQuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBoYXMgcGFja2FnZSBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlZGl0VGFibGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHRoaXMgcXVlcnkKKyAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHtAbGluayBTUUxpdGVRdWVyeX0gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGN1cnNvciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFNRTGl0ZUN1cnNvcihTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyLCBTdHJpbmcgZWRpdFRhYmxlLCBTUUxpdGVRdWVyeSBxdWVyeSkgewogICAgICAgICAvLyBUaGUgQWJzdHJhY3RDdXJzb3IgY29uc3RydWN0b3IgbmVlZHMgdG8gZG8gc29tZSBzZXR1cC4KICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IG9iamVjdCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeS5tRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkubURhdGFiYXNlIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KICAgICAgICAgbVN0YWNrVHJhY2UgPSBuZXcgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKS5maWxsSW5TdGFja1RyYWNlKCk7Ci0gICAgICAgIG1EYXRhYmFzZSA9IGRiOwogICAgICAgICBtRHJpdmVyID0gZHJpdmVyOwogICAgICAgICBtRWRpdFRhYmxlID0gZWRpdFRhYmxlOwogICAgICAgICBtQ29sdW1uTmFtZU1hcCA9IG51bGw7CiAgICAgICAgIG1RdWVyeSA9IHF1ZXJ5OwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYi5sb2NrKCk7CisgICAgICAgICAgICBxdWVyeS5tRGF0YWJhc2UubG9jaygpOwogCiAgICAgICAgICAgICAvLyBTZXR1cCB0aGUgbGlzdCBvZiBjb2x1bW5zCiAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQgPSBtUXVlcnkuY29sdW1uQ291bnRMb2NrZWQoKTsKQEAgLTIzOSw3ICsyNjIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICAgICAgcXVlcnkubURhdGFiYXNlLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDcsNyArMjcwLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBTUUxpdGVEYXRhYmFzZSB0aGF0IHRoaXMgY3Vyc29yIGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YWJhc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1RdWVyeS5tRGF0YWJhc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI4Myw3ICszMDgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOwotICAgICAgICBtQ291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhtV2luZG93LCBtSW5pdGlhbFJlYWQsIDApOworICAgICAgICBtQ291bnQgPSBnZXRRdWVyeSgpLmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAogICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKXsKICAgICAgICAgICAgIG1Db3VudCA9IHN0YXJ0UG9zICsgbUluaXRpYWxSZWFkOwpAQCAtMjkyLDYgKzMxNywxMCBAQAogICAgICAgICB9IAogICAgIH0KIAorICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNRTGl0ZVF1ZXJ5IGdldFF1ZXJ5KCkgeworICAgICAgICByZXR1cm4gbVF1ZXJ5OworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoU3RyaW5nIGNvbHVtbk5hbWUpIHsKICAgICAgICAgLy8gQ3JlYXRlIG1Db2x1bW5OYW1lTWFwIG9uIGRlbWFuZApAQCAtMzIxLDE2NiArMzUwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgLy8gT25seSBhbGxvdyBkZWxldGVzIGlmIHRoZXJlIGlzIGFuIElEIGNvbHVtbiwgYW5kIHRoZSBJRCBoYXMgYmVlbiByZWFkIGZyb20gaXQKLSAgICAgICAgaWYgKG1Sb3dJZENvbHVtbkluZGV4ID09IC0xIHx8IG1DdXJyZW50Um93SUQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRlbGV0ZSByb3cgYmVjYXVzZSBlaXRoZXIgdGhlIHJvdyBJRCBjb2x1bW4gaXMgbm90IGF2YWlsYWJsZSBvciBpdCIgKwotICAgICAgICAgICAgICAgICAgICAiaGFzIG5vdCBiZWVuIHJlYWQuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHN1Y2Nlc3M7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRW5zdXJlIHdlIGRvbid0IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlIHdoZW4gYW5vdGhlcgotICAgICAgICAgKiB0aHJlYWQgaXMgaG9sZGluZyB0aGUgZGF0YWJhc2UgbG9jay4gcmVxdWVyeSgpIGFuZCBtb3ZlVG8oKSBhcmUgYWxzbwotICAgICAgICAgKiBzeW5jaHJvbml6ZWQgaGVyZSB0byBtYWtlIHN1cmUgdGhleSBnZXQgdGhlIHN0YXRlIG9mIHRoZSBkYXRhYmFzZQotICAgICAgICAgKiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIERFTEVURS4KLSAgICAgICAgICovCi0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUobUVkaXRUYWJsZSwgbUNvbHVtbnNbbVJvd0lkQ29sdW1uSW5kZXhdICsgIj0/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7bUN1cnJlbnRSb3dJRC50b1N0cmluZygpfSk7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHBvcyA9IG1Qb3M7Ci0gICAgICAgICAgICByZXF1ZXJ5KCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBFbnN1cmUgcHJvcGVyIGN1cnNvciBzdGF0ZS4gTm90ZSB0aGF0IG1DdXJyZW50Um93SUQgY2hhbmdlcwotICAgICAgICAgICAgICogaW4gdGhpcyBjYWxsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihwb3MpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuc3VwcG9ydHNVcGRhdGVzKCkgJiYgIVRleHRVdGlscy5pc0VtcHR5KG1FZGl0VGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZywKLSAgICAgICAgICAgID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSAiCi0gICAgICAgICAgICAgICAgICAgICsgImluY2x1ZGUgdGhlIF9pZCBjb2x1bW4/Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBQcmV2ZW50IG90aGVyIHRocmVhZHMgZnJvbSBjaGFuZ2luZyB0aGUgdXBkYXRlZCByb3dzIHdoaWxlIHRoZXkncmUKLSAgICAgICAgICogYmVpbmcgcHJvY2Vzc2VkIGhlcmUuCi0gICAgICAgICAqLwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSBkYXRhYmFzZSBzdGF0ZSB3aGlsZQotICAgICAgICAgICAgICogd2UgcHJvY2VzcyB0aGUgdXBkYXRlZCByb3dzLCBhbmQgcHJldmVudHMgdXMgZnJvbSBjaGFuZ2luZyB0aGUKLSAgICAgICAgICAgICAqIGRhdGFiYXNlIGJlaGluZCB0aGUgYmFjayBvZiBhbm90aGVyIHRocmVhZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwotCi0gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggcm93IHRoYXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd0VudHJ5IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzID0gcm93RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9uZyByb3dJZE9iaiA9IHJvd0VudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyb3dJZE9iaiA9PSBudWxsIHx8IHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIHJvd0lkIG9yIHZhbHVlcyBmb3VuZCEgcm93SWQgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm93SWRPYmogKyAiLCB2YWx1ZXMgPSAiICsgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IHJvd0lkT2JqLmxvbmdWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0l0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3FsLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiVVBEQVRFICIgKyBtRWRpdFRhYmxlICsgIiBTRVQgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggY29sdW1uIHZhbHVlIHRoYXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBiaW5kaW5ncyA9IG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gdmFsdWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIj0/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nc1tpXSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIgKyBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc9JyArIHJvd0lkKTsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTChzcWwudG9TdHJpbmcoKSwgYmluZGluZ3MpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uucm93VXBkYXRlZChtRWRpdFRhYmxlLCByb3dJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGV0IGFueSBjaGFuZ2Ugb2JzZXJ2ZXJzIGtub3cgYWJvdXQgdGhlIHVwZGF0ZQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZUNvbW1vbigpIHsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICI8PDwgUmVsZWFzaW5nIGN1cnNvciAiICsgdGhpcyk7CiAgICAgICAgIG1DdXJzb3JTdGF0ZSA9IDA7CkBAIC01MDEsOSArMzc1LDMyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGVDb21tb24oKTsKLSAgICAgICAgbVF1ZXJ5LmNsb3NlKCk7Ci0gICAgICAgIG1Ecml2ZXIuY3Vyc29yQ2xvc2VkKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZGVhY3RpdmF0ZUNvbW1vbigpOworICAgICAgICAgICAgbVF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBtRHJpdmVyLmN1cnNvckNsb3NlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdyBhIHdhcm5pbmcgYWdhaW5zdCB0aGUgdXNlIG9mIHJlcXVlcnkoKSBpZiBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAqIFRoaXMgd2FybmluZyBpcyBzaG93biBwZXIgZGF0YWJhc2UgcGVyIHByb2Nlc3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdhcm5JZlVpVGhyZWFkKCkgeworICAgICAgICBpZiAoTG9vcGVyLmdldE1haW5Mb29wZXIoKSA9PSBMb29wZXIubXlMb29wZXIoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlUGF0aCA9IGdldFF1ZXJ5KCkubURhdGFiYXNlLmdldFBhdGgoKTsKKyAgICAgICAgICAgIC8vIFdlIHNob3cgdGhlIHdhcm5pbmcgb25jZSBwZXIgZGF0YWJhc2UgaW4gb3JkZXIgbm90IHRvIHNwYW0gbG9nY2F0LgorICAgICAgICAgICAgaWYgKCFzQWxyZWFkeVdhcm5lZC5jb250YWluc0tleShkYXRhYmFzZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgc0FscmVhZHlXYXJuZWQucHV0KGRhdGFiYXNlUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gQWN0aXZpdHlUaHJlYWQuY3VycmVudFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOworICAgICAgICAgICAgICAgIC8vIEJFR0lOIFNUT1BTSElQIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUKKyAgICAgICAgICAgICAgICB0ID0gbmV3IFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBFTkQgU1RPUFNISVAKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG91bGQgbm90IGF0dGVtcHQgcmVxdWVyeSBvbiBtYWluIChVSSkgdGhyZWFkOiBhcHAgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID09IG51bGwgPyAiJ3Vua25vd24nIiA6IHBhY2thZ2VOYW1lLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTExLDIwICs0MDgsMzAgQEAKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICB3YXJuSWZVaVRocmVhZCgpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IDA7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewogICAgICAgICAgICAgdGltZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3luY2hyb25pemUgb24gdGhlIGRhdGFiYXNlIGxvY2sgdG8gZW5zdXJlIHRoYXQgbUNvdW50IG1hdGNoZXMgdGhlCi0gICAgICAgICAqIHJlc3VsdHMgb2YgbVF1ZXJ5LnJlcXVlcnkoKS4KLSAgICAgICAgICovCi0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBvcyA9IC0xOworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtUXVlcnkubURhdGFiYXNlLmdldERhdGFiYXNlSGFuZGxlKG1RdWVyeS5tU3FsKTsKKyAgICAgICAgICAgIGlmICghZGIuZXF1YWxzKG1RdWVyeS5tRGF0YWJhc2UpKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUsCisgICAgICAgICAgICAgICAgLy8gcmUtY29tcGlsZSB0aGUgcXVlcnkKKyAgICAgICAgICAgICAgICBkYi5sb2NrKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG9sZCBtUXVlcnkgb2JqZWN0IGFuZCBvcGVuIGEgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KGRiLCBtUXVlcnkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRoaXMgb25lIHdpbGwgcmVjcmVhdGUgdGhlIHRlbXAgdGFibGUsIGFuZCBnZXQgaXRzIGNvdW50CiAgICAgICAgICAgICBtRHJpdmVyLmN1cnNvclJlcXVlcmllZCh0aGlzKTsKICAgICAgICAgICAgIG1Db3VudCA9IE5PX0NPVU5UOwpAQCAtNTM1LDggKzQ0Miw2IEBACiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHF1ZXJ5VGhyZWFkVW5sb2NrKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKQEAgLTU4NCwxNCArNDg5LDE0IEBACiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW50IGxlbiA9IG1RdWVyeS5tU3FsLmxlbmd0aCgpOwogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZpbmFsaXppbmcgYSBDdXJzb3IgdGhhdCBoYXMgbm90IGJlZW4gZGVhY3RpdmF0ZWQgb3IgY2xvc2VkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiwgdGFibGUgPSAiICsgbUVkaXRUYWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YWJhc2UgPSAiICsgbVF1ZXJ5Lm1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHF1ZXJ5ID0gIiArIG1RdWVyeS5tU3FsLnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhY2tUcmFjZSk7CiAgICAgICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgICAgICBTUUxpdGVEZWJ1Zy5ub3RpZnlBY3RpdmVDdXJzb3JGaW5hbGl6ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmFsaXppbmcgY3Vyc29yIG9uIGRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaW5hbGl6aW5nIGN1cnNvciBvbiBkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgdGFibGUgPSAiICsgbUVkaXRUYWJsZSArICIsIHF1ZXJ5ID0gIiArIG1RdWVyeS5tU3FsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKaW5kZXggZWRhMWI3OC4uYjM5NjNmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQpAQCAtNDAsOCArNDAsNiBAQAogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGEgU1FMaXRlQ3Vyc29yIHdoZW4gaXQgaXMgcmVxdWVyeWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5ldyBjb3VudCB2YWx1ZS4KICAgICAgKi8KICAgICB2b2lkIGN1cnNvclJlcXVlcmllZChDdXJzb3IgY3Vyc29yKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQppbmRleCBjZGM5YmJiLi5kYzNiNDY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YQpAQCAtMTYsMTYgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQXBwR2xvYmFsczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEZWJ1Zy5EYlN0YXRzOwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5TdGF0RnM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTM4LDE1ICszOCwxNCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKQEAgLTY3LDcgKzY2LDcgQEAKICAqIGlzIHRoZSBVbmljb2RlIENvbGxhdGlvbiBBbGdvcml0aG0gYW5kIG5vdCB0YWlsb3JlZCB0byB0aGUgY3VycmVudCBsb2NhbGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZSBleHRlbmRzIFNRTGl0ZUNsb3NhYmxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZURhdGFiYXNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJfT1BFUkFUSU9OID0gNTIwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCX0NPUlJVUFQgPSA3NTAwNDsKIApAQCAtMTkyLDYgKzE5MSwxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciBtVHJhbnNhY3Rpb25MaXN0ZW5lcjsKIAorICAgIC8qKgorICAgICAqIHRoaXMgbWVtYmVyIGlzIHNldCBpZiB7QGxpbmsgI2V4ZWNTUUwoU3RyaW5nKX0gaXMgdXNlZCB0byBiZWdpbiBhbmQgZW5kIHRyYW5zYWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworCiAgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlICovCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIG1Mb2NrID0gbmV3IFJlZW50cmFudExvY2sodHJ1ZSk7CiAKQEAgLTIzMyw0OCArMjM3LDc4IEBACiAgICAgLy8gbG9jayBhY3F1aXN0aW9ucyBvZiB0aGUgZGF0YWJhc2UuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9MT0NLX0xPR19QUkVGSVggPSAiR0VUTE9DSzoiOwogCi0gICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUgKi8KLSAgICAvKiBwYWNrYWdlICovIGludCBtTmF0aXZlSGFuZGxlID0gMDsKKyAgICAvKiogVXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IHJlbmFtZS4gbWFrZSBpdCB2b2xhdGlsZSwgc28gaXQgaXMgdGhyZWFkLXNhZmUuICovCisgICAgLyogcGFja2FnZSAqLyB2b2xhdGlsZSBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CiAKLSAgICAvKiogVXNlZCB0byBtYWtlIHRlbXAgdGFibGUgbmFtZXMgdW5pcXVlICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbVRlbXBUYWJsZVNlcXVlbmNlID0gMDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgYmxvY2sgb24gIi9kYXRhIi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVW5peAorICAgICAqIHN0YXRmcy5mX2JzaXplIGZpZWxkLiBub3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNCbG9ja1NpemUgPSAwOwogCiAgICAgLyoqIFRoZSBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOwogCiAgICAgLyoqIFRoZSBhbm9ueW1pemVkIHBhdGggZm9yIHRoZSBkYXRhYmFzZSBmaWxlIGZvciBsb2dnaW5nIHB1cnBvc2VzICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGhGb3JMb2dzID0gbnVsbDsgIC8vIGxhemlseSBwb3B1bGF0ZWQKIAogICAgIC8qKiBUaGUgZmxhZ3MgcGFzc2VkIHRvIG9wZW4vY3JlYXRlICovCi0gICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKIAogICAgIC8qKiBUaGUgb3B0aW9uYWwgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgQ3Vyc29ycyAqLwotICAgIHByaXZhdGUgQ3Vyc29yRmFjdG9yeSBtRmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CiAKLSAgICBwcml2YXRlIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKIAogICAgIC8qKgotICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgY2FjaGUgaXMgbWFpbnRhaW5lZCB0byBzdG9yZQorICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgTFJVIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKICAgICAgKiB0aGUgY29tcGlsZWQgcXVlcnkgc3RhdGVtZW50IGlkcyByZXR1cm5lZCBieSBzcWxpdGUgZGF0YWJhc2UuCi0gICAgICogICAgIGtleSA9IHNxbCBzdGF0ZW1lbnQgd2l0aCAiPyIgZm9yIGJpbmQgYXJncworICAgICAqICAgICBrZXkgPSBTUUwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKICAgICAgKiAgICAgdmFsdWUgPSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9CiAgICAgICogSWYgYW4gYXBwbGljYXRpb24gb3BlbnMgdGhlIGRhdGFiYXNlIGFuZCBrZWVwcyBpdCBvcGVuIGR1cmluZyBpdHMgZW50aXJlIGxpZmUsIHRoZW4KLSAgICAgKiB0aGVyZSB3aWxsIG5vdCBiZSBhbiBvdmVyaGVhZCBvZiBjb21waWxhdGlvbiBvZiBzcWwgc3RhdGVtZW50cyBieSBzcWxpdGUuCisgICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2YgU1FMIHN0YXRlbWVudHMgYnkgc3FsaXRlLgogICAgICAqCiAgICAgICogd2h5IGlzIHRoaXMgY2FjaGUgTk9UIHN0YXRpYz8gYmVjYXVzZSBzcWxpdGUgYXR0YWNoZXMgY29tcGlsZWRzcWwgc3RhdGVtZW50cyB0byB0aGUKICAgICAgKiBzdHJ1Y3QgY3JlYXRlZCB3aGVuIHtAbGluayBTUUxpdGVEYXRhYmFzZSNvcGVuRGF0YWJhc2UoU3RyaW5nLCBDdXJzb3JGYWN0b3J5LCBpbnQpfSBpcwogICAgICAqIGludm9rZWQuCiAgICAgICoKICAgICAgKiB0aGlzIGNhY2hlIGhhcyBhbiB1cHBlciBsaW1pdCBvZiBtTWF4U3FsQ2FjaGVTaXplIChzZXR0YWJsZSBieSBjYWxsaW5nIHRoZSBtZXRob2QKLSAgICAgKiAoQGxpbmsgc2V0TWF4Q2FjaGVTaXplKGludCl9KS4gaXRzIGRlZmF1bHQgaXMgMCAtIGkuZS4sIG5vIGNhY2hpbmcgYnkgZGVmYXVsdCBiZWNhdXNlCi0gICAgICogbW9zdCBvZiB0aGUgYXBwcyBkb24ndCB1c2UgIj8iIHN5bnRheCBpbiB0aGVpciBzcWwsIGNhY2hpbmcgaXMgbm90IHVzZWZ1bCBmb3IgdGhlbS4KKyAgICAgKiAoQGxpbmsgc2V0TWF4U3FsQ2FjaGVTaXplKGludCl9KS4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBtQ29tcGlsZWRRdWVyaWVzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgLy8gZGVmYXVsdCBzdGF0ZW1lbnQtY2FjaGUgc2l6ZSBwZXIgZGF0YWJhc2UgY29ubmVjdGlvbiAoID0gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcykKKyAgICBwcml2YXRlIGludCBtTWF4U3FsQ2FjaGVTaXplID0gMjU7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+KG1NYXhTcWxDYWNoZVNpemUgKyAxLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnk8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgLy8gZWxkZXN0ID0gbGVhc3QtcmVjZW50bHkgdXNlZCBlbnRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IG5lZWRzIHRvIGJlIHJlbW92ZWQgdG8gYWNjb21tb2RhdGUgYSBuZXcgZW50cnksCisgICAgICAgICAgICAgICAgLy8gICAgIGNsb3NlIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSwgaWYgbm90IGluIHVzZQorICAgICAgICAgICAgICAgIC8vICAgICBhbmQgdGhlbiBsZXQgaXQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIGNhbGxlciBtdXN0IGJlIHRyeWluZyB0byBhZGQgYSBqdXN0LWNvbXBpbGVkIHN0bXQKKyAgICAgICAgICAgICAgICAvLyB0byBjYWNoZTsgaS5lLiwgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYWNxdWlyZWQgZGF0YWJhc2UgbG9jayBBTkQKKyAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBvbiBtQ29tcGlsZWRRdWVyaWVzLiBkbyBhcyBhc3NlcnQgb2YgdGhlc2UgdHdvIDIgZmFjdHMuCisgICAgICAgICAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpIDw9IG1NYXhTcWxDYWNoZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgbm90IGZ1bGwuIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIGZ1bGwuIGVsZGVzdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgZW50cnkgPSBlbGRlc3QuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaXMgbm90IGluIHVzZS4gcmVsZWFzZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVsZWFzZVNxbFN0YXRlbWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSwgc28gdGhhdCB0aGlzIGVudHJ5IGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogYWJzb2x1dGUgbWF4IHZhbHVlIHRoYXQgY2FuIGJlIHNldCBieSB7QGxpbmsgI3NldE1heFNxbENhY2hlU2l6ZShpbnQpfQorICAgICAqIHNpemUgb2YgZWFjaCBwcmVwYXJlZC1zdGF0ZW1lbnQgaXMgYmV0d2VlbiAxSyAtIDZLLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisgICAgICogU1FMIHN0YXRlbWVudCAmIHNjaGVtYS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAyNTA7Ci0gICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IE1BWF9TUUxfQ0FDSEVfU0laRTsgLy8gbWF4IGNhY2hlIHNpemUgcGVyIERhdGFiYXNlIGluc3RhbmNlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMTAwOwogICAgIHByaXZhdGUgaW50IG1DYWNoZUZ1bGxXYXJuaW5nczsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gPSAxOwogCkBAIC0yODIsNDUgKzMxNiw1OSBAQAogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZUhpdHM7CiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlTWlzc2VzOwogCi0gICAgLyoqIHRoZSBmb2xsb3dpbmcgMiBtZW1iZXJzIG1haW50YWluIHRoZSB0aW1lIHdoZW4gYSBkYXRhYmFzZSBpcyBvcGVuZWQgYW5kIGNsb3NlZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lT3BlbmVkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtVGltZUNsb3NlZCA9IG51bGw7Ci0KICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZCBpbiBjYXNlIGl0IG5ldmVyIGdvdCBjbG9zZWQuICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbVN0YWNrVHJhY2UgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogCiAgICAgLy8gU3lzdGVtIHByb3BlcnR5IHRoYXQgZW5hYmxlcyBsb2dnaW5nIG9mIHNsb3cgcXVlcmllcy4gU3BlY2lmeSB0aGUgdGhyZXNob2xkIGluIG1zLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZID0gImRiLmxvZy5zbG93X3F1ZXJ5X3RocmVzaG9sZCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNsb3dRdWVyeVRocmVzaG9sZDsKIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbG9zYWJsZQorICAgIC8qKiBzdG9yZXMgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50IGlkcyB0aGF0IG5lZWQgdG8gYmUgZmluYWxpemVkIGJ5IHNxbGl0ZSAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DbG9zZWRTdGF0ZW1lbnRJZHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICAvKioge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gU1FMaXRlIHJldHVybnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzCisgICAgICogICAgQ29ycnVwdGlvbgorICAgICAqICovCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOworCisgICAgLyoqIFRoZSBEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wge0BsaW5rIERhdGFiYXNlQ29ubmVjdGlvblBvb2x9LgorICAgICAqIFZpc2liaWxpdHkgaXMgcGFja2FnZS1wcml2YXRlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBvdGhlcndpc2UsIHByaXZhdGUgdmlzaWJpbGl0eSBpcyBlbm91Z2guCiAgICAgICovCi0gICAgdm9pZCBhZGRTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUHJvZ3JhbXMucHV0KGNsb3NhYmxlLCBudWxsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgLyogcGFja2FnZSAqLyB2b2xhdGlsZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisKKyAgICAvKiogRWFjaCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUgcG9vbCBpcyBhc3NpZ25lZCBhIG51bWJlciAxLi5OLCB3aGVyZSBOIGlzIHRoZQorICAgICAqIHNpemUgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiBUaGUgbWFpbiBjb25uZWN0aW9uIGhhbmRsZSB0byB3aGljaCB0aGUgcG9vbCBpcyBhdHRhY2hlZCBpcyBhc3NpZ25lZCBhIHZhbHVlIG9mIDAuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzaG9ydCBtQ29ubmVjdGlvbk51bTsKKworICAgIC8qKiBvbiBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMsIHRoaXMgbWVtYmVyIHBvaW50cyB0byB0aGUgcGFyZW50ICggPSBtYWluKQorICAgICAqIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLgorICAgICAqIHBhY2thZ2UgdmlzaWJpbGl0eSBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBtUGFyZW50Q29ubk9iaiA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNT1JZX0RCX1BBVEggPSAiOm1lbW9yeToiOworCisgICAgLyoqIHN0b3JlcyByZWZlcmVuY2UgdG8gYWxsIGRhdGFiYXNlcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKKworICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIC8vIG1Qcm9ncmFtcyBpcyBwZXIgaW5zdGFuY2Ugb2YgU1FMaXRlRGF0YWJhc2UgYW5kIGl0IGRvZXNuJ3QgYWN0dWFsbHkgdG91Y2ggdGhlIGRhdGFiYXNlCisgICAgICAgIC8vIGl0c2VsZi4gc28sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9jaygpLgorICAgICAgICBtUHJvZ3JhbXMucHV0KGNsb3NhYmxlLCBudWxsKTsKICAgICB9CiAKLSAgICB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgeworICAgICAgICBtUHJvZ3JhbXMucmVtb3ZlKGNsb3NhYmxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpIHsKICAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYmNsb3NlKCk7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2Ugd2hpY2ggd2lsbCBjbG9zZSBhbGwgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhbHNvCisgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTAsMTkgKzM5OCw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NraW5nRW5hYmxlZCA9IHRydWU7CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgb25Db3JydXB0aW9uKCkgewotICAgICAgICBMb2cuZShUQUcsICJSZW1vdmluZyBjb3JydXB0IGRhdGFiYXNlOiAiICsgbVBhdGgpOwogICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIG1QYXRoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSAoaWYgd2UgY2FuKSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgdGhlIGNvcnJ1cHQgZmlsZS4gIERvbid0IHJlLWNyZWF0ZSBpdCBub3cgLS0gdGhhdCB3b3VsZCBqdXN0IGNvbmZ1c2UgcGVvcGxlCi0gICAgICAgICAgICAvLyAtLSBidXQgdGhlIG5leHQgdGltZSBzb21lb25lIHRyaWVzIHRvIG9wZW4gaXQsIHRoZXkgY2FuIHNldCBpdCB1cCBmcm9tIHNjcmF0Y2guCi0gICAgICAgICAgICBpZiAoIW1QYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUobVBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1FcnJvckhhbmRsZXIub25Db3JydXB0aW9uKHRoaXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzc0LDYgKzQxMSw3IEBACiAgICAgICogQHNlZSAjdW5sb2NrKCkKICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgbG9jaygpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgaWYgKCFtTG9ja2luZ0VuYWJsZWQpIHJldHVybjsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfTE9DS19USU1FX1RSQUNLSU5HKSB7CkBAIC0zOTQsNiArNDMyLDcgQEAKICAgICAgKiBAc2VlICN1bmxvY2tGb3JjZWQoKQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBsb2NrRm9yY2VkKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKICAgICAgICAgICAgIGlmIChtTG9jay5nZXRIb2xkQ291bnQoKSA9PSAxKSB7CkBAIC00NjAsMTEgKzQ5OSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ3OCwxNSArNTIwLDQyIEBACiAgICAgICogPC9wcmU+CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbigpIHsKLSAgICAgICAgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8pOworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLywgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAqICAgdHJ5IHsKKyAgICAgKiAgICAgLi4uCisgICAgICogICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAqICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgKiAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCkgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIEVYQ0xVU0lWRSBtb2RlLgorICAgICAqIDxwPgorICAgICAqIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLgorICAgICAqIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgogICAgICAqIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yCiAgICAgICogcm9sbGVkIGJhY2suIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKICAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBjb21taXR0ZWQuCi0gICAgICoKKyAgICAgKiA8L3A+CiAgICAgICogPHA+SGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKICAgICAgKgogICAgICAqIDxwcmU+CkBAIC00OTgsMTUgKzU2Nyw0OCBAQAogICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAqICAgfQogICAgICAqIDwvcHJlPgorICAgICAqCiAgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gYmVnaW5zLAogICAgICAqIGNvbW1pdHMsIG9yIGlzIHJvbGxlZCBiYWNrLCBlaXRoZXIgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8KICAgICAgKiB7QGxpbmsgI3lpZWxkSWZDb250ZW5kZWRTYWZlbHl9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIoU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gSU1NRURJQVRFIG1vZGUuIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuCisgICAgICogdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24KKyAgICAgKiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLiBUaGUKKyAgICAgKiBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKKyAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkKKyAgICAgKiB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBIZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIGRiLmJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUobGlzdGVuZXIpOworICAgICAqICAgdHJ5IHsKKyAgICAgKiAgICAgLi4uCisgICAgICogICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAqICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgKiAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlCisgICAgICogICAgICAgICAgICB0cmFuc2FjdGlvbiBiZWdpbnMsIGNvbW1pdHMsIG9yIGlzIHJvbGxlZCBiYWNrLCBlaXRoZXIKKyAgICAgKiAgICAgICAgICAgIGV4cGxpY2l0bHkgb3IgYnkgYSBjYWxsIHRvIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZSgKKyAgICAgICAgICAgIFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uTGlzdGVuZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5UcmFuc2FjdGlvbihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBsb2NrRm9yY2VkKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBvayA9IGZhbHNlOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBoYWQgdGhlIGxvY2sgdGhlbiBnZXQgb3V0CkBAIC01MjQsNyArNjI2LDExIEBACiAKICAgICAgICAgICAgIC8vIFRoaXMgdGhyZWFkIGRpZG4ndCBhbHJlYWR5IGhhdmUgdGhlIGxvY2ssIHNvIGJlZ2luIGEgZGF0YWJhc2UKICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uIG5vdy4KLSAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIGlmIChleGNsdXNpdmUgJiYgbUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBFWENMVVNJVkU7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIElNTUVESUFURTsiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UcmFuc2FjdGlvbkxpc3RlbmVyID0gdHJhbnNhY3Rpb25MaXN0ZW5lcjsKICAgICAgICAgICAgIG1UcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IHRydWU7CiAgICAgICAgICAgICBtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IGZhbHNlOwpAQCAtNTUxLDEyICs2NTcsNyBAQAogICAgICAqIGFyZSBjb21taXR0ZWQgYW5kIHJvbGxlZCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFRyYW5zYWN0aW9uKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCkgewogICAgICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01ODEsNiArNjgyLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgZXhlY1NRTChDT01NSVRfU1FMKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB3cml0ZS1haGVhZCBsb2dnaW5nIGlzIHVzZWQsIHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGNoZWNrcG9pbnQuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGFwcGxpY2F0aW9ucyBiZSBnaXZlbiB0aGUgZmxleGliaWxpdHkgb2YgY2hvb3Npbmcgd2hlbiB0bworICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgY2hlY2twb2ludD8KKyAgICAgICAgICAgICAgICAvLyBmb3Igbm93LCBkbyBjaGVja3BvaW50IGFmdGVyIGV2ZXJ5IENPTU1JVCBiZWNhdXNlIHRoYXQgaXMgdGhlIGZhc3Rlc3QKKyAgICAgICAgICAgICAgICAvLyB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgcmVhZGVycyB3aWxsIHNlZSBsYXRlc3QgZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBidXQgdGhpcyBpcyB0aGUgc2xvd2VzdCB3YXkgdG8gcnVuIHNxbGl0ZSB3aXRoIGluIHdyaXRlLWFoZWFkIGxvZ2dpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5tQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJQUkFHTUEgd2FsX2NoZWNrcG9pbnQ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUFJBR01BIHdhbF9DaGVja3BvaW50IGRvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZXhlY1NRTCgiUk9MTEJBQ0s7Iik7CkBAIC02MTQsOSArNzI3LDcgQEAKICAgICAgKiB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IG1hcmtlZCBhcyBzdWNjZXNzZnVsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBpZiAoIW1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyB0cmFuc2FjdGlvbiBwZW5kaW5nIik7CiAgICAgICAgIH0KQEAgLTYzMSw3ICs3NDIsNTAgQEAKICAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHBlbmRpbmcKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpblRyYW5zYWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUxvY2suZ2V0SG9sZENvdW50KCkgPiAwOworICAgICAgICByZXR1cm4gbUxvY2suZ2V0SG9sZENvdW50KCkgPiAwIHx8IG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnYmVnaW4gdHJhbnNhY3Rpb24nKSIpOworICAgICAgICB9CisgICAgICAgIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCA9IHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgaWYgKG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImZvdW5kIGV4ZWNTUUwoJ2NvbW1pdCBvciBlbmQgb3Igcm9sbGJhY2snKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgaWYgYW55LgorICAgICAqIDxwPgorICAgICAqIENhbGxlciBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlmIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWUKKyAgICAgKiA8b2w+CisgICAgICogICA8bGk+SWYgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCBieSBjYWxsaW5nIGJlZ2luVHJhbnNhY3Rpb24oKSBtZXRob2RzIEFORCBpZiB0aGUgY2FsbGVyIGlzCisgICAgICogICBpbiB0aGUgc2FtZSB0aHJlYWQgYXMgdGhlIHRocmVhZCB0aGF0IHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqICAgPC9saT4KKyAgICAgKiAgIDxsaT5JZiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCBieSBjYWxsaW5nIHtAbGluayAjZXhlY1NRTChTdHJpbmcpfSBsaWtlIHRoaXM6CisgICAgICogICBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLiBJbiB0aGlzIGNhc2UsIGV2ZXJ5IHRocmVhZCBpbiB0aGUgcHJvY2VzcyBpcyBjb25zaWRlcmVkCisgICAgICogICBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gYW1JSW5UcmFuc2FjdGlvbigpIHsKKyAgICAgICAgLy8gYWx3YXlzIGRvIHRoaXMgdGVzdCBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIC0gTk9UIG9uIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIC8vIHNpbmNlIHRyYW5zYWN0aW9ucyBhbHdheXMgb2NjdXIgb24gdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbnMgb25seS4KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAoaXNQb29sZWRDb25uZWN0aW9uKCkpID8gbVBhcmVudENvbm5PYmogOiB0aGlzOworICAgICAgICBib29sZWFuIGIgPSAoIWRiLmluVHJhbnNhY3Rpb24oKSkgPyBmYWxzZSA6CisgICAgICAgICAgICAgICAgZGIubVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsIHx8IGRiLm1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJhbUlpblRyYW5zYWN0aW9uOiAiICsgYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzUsNTQgKzg4OSwxMiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvKiogTWFwcyB0YWJsZSBuYW1lcyB0byBpbmZvIGFib3V0IHdoYXQgdG8gd2hpY2ggX3N5bmNfdGltZSBjb2x1bW4gdG8gc2V0Ci0gICAgICogdG8gTlVMTCBvbiBhbiB1cGRhdGUuIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHN5bmNpbmcuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4gbVN5bmNVcGRhdGVJbmZvID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3luY1VwZGF0ZUluZm8+KCk7Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtU3luY1VwZGF0ZUluZm8pIHsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHRhYmxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdGFibGUgOiBtU3luY1VwZGF0ZUluZm8ua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbVN5bmNVcGRhdGVJbmZvLmdldCh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8uZGVsZXRlZFRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFibGVzLnB1dCh0YWJsZSwgaW5mby5kZWxldGVkVGFibGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0YWJsZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIGtlZXAgdHJhY2sgd2hhdCBuZWVkcyB0byBiZSBtYXJrZWQgYXMgY2hhbmdlZAotICAgICAqIHdoZW4gYW4gdXBkYXRlIG9jY3Vycy4gVGhpcyBpcyB1c2VkIGZvciBzeW5jaW5nLCBzbyB0aGUgc3luYyBlbmdpbmUKLSAgICAgKiBrbm93cyB3aGF0IGRhdGEgaGFzIGJlZW4gdXBkYXRlZCBsb2NhbGx5LgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFN5bmNVcGRhdGVJbmZvIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgdGhlIFN5bmNVcGRhdGVJbmZvIGNsYXNzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFzdGVyVGFibGUgVGhlIHRhYmxlIHRvIHNldCBfc3luY190aW1lIHRvIE5VTEwgaW4KLSAgICAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAgICAgKiAgICAgICAgICBtYXN0ZXIgdGFibGUKLSAgICAgICAgICogQHBhcmFtIGZvcmVpZ25LZXkgVGhlIGtleSB0aGF0IHJlZmVycyB0byB0aGUgcHJpbWFyeSBrZXkgaW4gdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIFN5bmNVcGRhdGVJbmZvKFN0cmluZyBtYXN0ZXJUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9yZWlnbktleSkgewotICAgICAgICAgICAgdGhpcy5tYXN0ZXJUYWJsZSA9IG1hc3RlclRhYmxlOwotICAgICAgICAgICAgdGhpcy5kZWxldGVkVGFibGUgPSBkZWxldGVkVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBfc3luY190aW1lIGNvbHVtbiAqLwotICAgICAgICBTdHJpbmcgbWFzdGVyVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1hc3RlciB0YWJsZSAqLwotICAgICAgICBTdHJpbmcgZGVsZXRlZFRhYmxlOwotCi0gICAgICAgIC8qKiBUaGUga2V5IGluIHRoZSBsb2NhbCB0YWJsZSB0aGUgcm93IGluIHRhYmxlLiBJdCBtYXkgYmUgX2lkLCBpZiB0YWJsZQotICAgICAgICAgKiBpcyB0aGUgbG9jYWwgdGFibGUuICovCi0gICAgICAgIFN0cmluZyBmb3JlaWduS2V5OworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3luY2VkVGFibGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDApOwogICAgIH0KIAogICAgIC8qKgpAQCAtODE0LDMwICs5MjYsODAgQEAKICAgICAgKiBAdGhyb3dzIFNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgY2Fubm90IGJlIG9wZW5lZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBzcWxpdGVEYXRhYmFzZSA9IG51bGw7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGF0YWJhc2UgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyB7QGxpbmsgI09QRU5fUkVBRFdSSVRFfQorICAgICAqIHtAbGluayAjT1BFTl9SRUFET05MWX0ge0BsaW5rICNDUkVBVEVfSUZfTkVDRVNTQVJZfSBhbmQvb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4KKyAgICAgKgorICAgICAqIDxwPlNldHMgdGhlIGxvY2FsZSBvZiB0aGUgZGF0YWJhc2UgdG8gdGhlICB0aGUgc3lzdGVtJ3MgY3VycmVudCBsb2NhbGUuCisgICAgICogQ2FsbCB7QGxpbmsgI3NldExvY2FsZX0gaWYgeW91IHdvdWxkIGxpa2Ugc29tZXRoaW5nIGVsc2UuPC9wPgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdG8gZGF0YWJhc2UgZmlsZSB0byBvcGVuIGFuZC9vciBjcmVhdGUKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiBvcHRpb25hbCBmYWN0b3J5IGNsYXNzIHRoYXQgaXMgY2FsbGVkIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgKiAgICAgICAgICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZCwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBmbGFncyB0byBjb250cm9sIGRhdGFiYXNlIGFjY2VzcyBtb2RlCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBvYmogdG8gYmUgdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbgorICAgICAqIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IG9wZW5lZCBkYXRhYmFzZQorICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgKHNob3J0KSAwIC8qIHRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlICovKTsKKworICAgICAgICAvLyBzZXQgc3FsaXRlIHBhZ2VzaXplIHRvIG1CbG9ja1NpemUKKyAgICAgICAgaWYgKHNCbG9ja1NpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogIi9kYXRhIiBzaG91bGQgYmUgYSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnN0YW50IHNvbWV3aGVyZS4gaXQgaXMgaGFyZGNvZGVkCisgICAgICAgICAgICAvLyBpbiBzZXZlcmFsIHBsYWNlcyByaWdodCBub3cuCisgICAgICAgICAgICBzQmxvY2tTaXplID0gbmV3IFN0YXRGcygiL2RhdGEiKS5nZXRCbG9ja1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBzcWxpdGVEYXRhYmFzZS5zZXRQYWdlU2l6ZShzQmxvY2tTaXplKTsKKyAgICAgICAgLy9TVE9QU0hJUCAtIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUKKyAgICAgICAgLy9zcWxpdGVEYXRhYmFzZS5zZXRKb3VybmFsTW9kZShwYXRoLCAiVFJVTkNBVEUiKTsKKyAgICAgICAgLy8gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZXMKKyAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIEVORCBTVE9QU0hJUAorCisgICAgICAgIC8vIGFkZCB0aGlzIGRhdGFiYXNlIHRvIHRoZSBsaXN0IG9mIGRhdGFiYXNlcyBvcGVuZWQgaW4gdGhpcyBwcm9jZXNzCisgICAgICAgIHN5bmNocm9uaXplZChtQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgICAgICBtQWN0aXZlRGF0YWJhc2VzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4oc3FsaXRlRGF0YWJhc2UpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJvcGVuaW5nIHRoZSBkYiA6ICIgKyBwYXRoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIE9wZW4gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIuZGJvcGVuKHBhdGgsIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFRyYWNpbmcocGF0aCk7CisgICAgICAgICAgICAgICAgZGIuZW5hYmxlU3FsVHJhY2luZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfVElNRSkgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxQcm9maWxpbmcocGF0aCwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGI7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVjb3ZlciBmcm9tIHRoaXMsIGlmIHdlIGNhbi4KLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkbyB0aGlzIGZvciBvdGhlciBvcGVuIGZhaWx1cmVzPwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGVsZXRpbmcgYW5kIHJlLWNyZWF0aW5nIGNvcnJ1cHQgZGF0YWJhc2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBwYXRoKTsKLSAgICAgICAgICAgIGlmICghcGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKHBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIubUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24oZGIpOworICAgICAgICAgICAgcmV0dXJuIFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBvcGVuIHRoZSBkYXRhYmFzZS4gY2xvc2luZyBpdC4iLCBlKTsKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9Ci0gICAgICAgIEFjdGl2ZURhdGFiYXNlcy5nZXRJbnN0YW5jZSgpLm1BY3RpdmVEYXRhYmFzZXMuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOwotICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NTUsNiArMTAxNywyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlksIGVycm9ySGFuZGxlcikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Sm91cm5hbE1vZGUoZmluYWwgU3RyaW5nIGRiUGF0aCwgZmluYWwgU3RyaW5nIG1vZGUpIHsKKyAgICAgICAgLy8gam91cm5hbCBtb2RlIGNhbiBiZSBzZXQgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZXMKKyAgICAgICAgaWYgKCFkYlBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gRGF0YWJhc2VVdGlscy5zdHJpbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIGpvdXJuYWxfbW9kZT0iICsgbW9kZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZShtb2RlKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNldHRpbmcgam91cm5hbF9tb2RlIHRvICIgKyBtb2RlICsgIiBmYWlsZWQgZm9yIGRiOiAiICsgZGJQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKG9uIHByYWdtYSBzZXQgam91cm5hbF9tb2RlLCBzcWxpdGUgcmV0dXJuZWQ6IiArIHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbWVtb3J5IGJhY2tlZCBTUUxpdGUgZGF0YWJhc2UuICBJdHMgY29udGVudHMgd2lsbCBiZSBkZXN0cm95ZWQKICAgICAgKiB3aGVuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQuCiAgICAgICoKQEAgLTg2Nyw3ICsxMDQ4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZShDdXJzb3JGYWN0b3J5IGZhY3RvcnkpIHsKICAgICAgICAgLy8gVGhpcyBpcyBhIG1hZ2ljIHN0cmluZyB3aXRoIHNwZWNpYWwgbWVhbmluZyBmb3IgU1FMaXRlLgotICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKCI6bWVtb3J5OiIsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKE1FTU9SWV9EQl9QQVRILCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NywxOCArMTA1OCwzMSBAQAogICAgICAgICBpZiAoIWlzT3BlbigpKSB7CiAgICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgY2xvc2VkCiAgICAgICAgIH0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY2xvc2luZyBkYjogIiArIG1QYXRoICsgIiAoY29ubmVjdGlvbiAjICIgKyBtQ29ubmVjdGlvbk51bSk7CisgICAgICAgIH0KICAgICAgICAgbG9jaygpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOworICAgICAgICAgICAgLy8gZmluYWxpemUgQUxMIHN0YXRlbWVudHMgcXVldWVkIHVwIHNvIGZhcgorICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgcmVsZWFzZUN1c3RvbUZ1bmN0aW9ucygpOwogICAgICAgICAgICAgLy8gY2xvc2UgdGhpcyBkYXRhYmFzZSBpbnN0YW5jZSAtIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlZmVyZW5jZSBjb3VudCB2YWx1ZQotICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIG1Db25uZWN0aW9uUG9vbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB1bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbG9zZUNsb3NhYmxlKCkgewotICAgICAgICAvKiBkZWFsbG9jYXRlIGFsbCBjb21waWxlZCBzcWwgc3RhdGVtZW50IG9iamVjdHMgZnJvbSBtQ29tcGlsZWRRdWVyaWVzIGNhY2hlLgorICAgICAgICAvKiBkZWFsbG9jYXRlIGFsbCBjb21waWxlZCBTUUwgc3RhdGVtZW50IG9iamVjdHMgZnJvbSBtQ29tcGlsZWRRdWVyaWVzIGNhY2hlLgogICAgICAgICAgKiB0aGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBkZS1yZWZlcmVuY2luZyBhbGwge0BsaW5rIFNRTGl0ZUNsb3NhYmxlfSBvYmplY3RzCiAgICAgICAgICAqIGZyb20gdGhpcyBkYXRhYmFzZSBvYmplY3QgYmVjYXVzZSBjYWxsaW5nCiAgICAgICAgICAqIHtAbGluayBTUUxpdGVDbG9zYWJsZSNvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKX0gY291bGQgY2F1c2UgdGhlIGRhdGFiYXNlCkBAIC05MTMsMjQgKzExMDcsNjAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRiY2xvc2UoKTsKIAogICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhIGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20KKyAgICAgKiBzcWxpdGUzIGRhdGFiYXNlIHRyaWdnZXJzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDdXN0b21GdW5jdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxiYWNrKFN0cmluZ1tdIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIEN1c3RvbUZ1bmN0aW9uIGNhbGxiYWNrIGFzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20KKyAgICAgKiBzcWxpdGUzIGRhdGFiYXNlIHRyaWdnZXJzLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzcWxpdGUzIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIG51bUFyZ3MgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBmdW5jdGlvbiBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b21GdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IG51bUFyZ3MsIEN1c3RvbUZ1bmN0aW9uIGZ1bmN0aW9uKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUN1c3RvbUZ1bmN0aW9ucykgeworICAgICAgICAgICAgaW50IHJlZiA9IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihuYW1lLCBudW1BcmdzLCBmdW5jdGlvbik7CisgICAgICAgICAgICBpZiAocmVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBmb3IgY2xlYW51cCBsYXRlcgorICAgICAgICAgICAgICAgIG1DdXN0b21GdW5jdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHJlZikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMaXRlRXhjZXB0aW9uKCJmYWlsZWQgdG8gYWRkIGN1c3RvbSBmdW5jdGlvbiAiICsgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUN1c3RvbUZ1bmN0aW9ucygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ3VzdG9tRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DdXN0b21GdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGZ1bmN0aW9uID0gbUN1c3RvbUZ1bmN0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbihmdW5jdGlvbi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXN0b21GdW5jdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGxpc3Qgb2YgQ3VzdG9tRnVuY3Rpb24gcmVmZXJlbmNlcyBzbyB3ZSBjYW4gY2xlYW4gdXAgd2hlbiB0aGUgZGF0YWJhc2UgY2xvc2VzCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbUN1c3RvbUZ1bmN0aW9ucyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgbnVtQXJncywgQ3VzdG9tRnVuY3Rpb24gZnVuY3Rpb24pOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbihpbnQgZnVuY3Rpb24pOworCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YWJhc2UgdmVyc2lvbi4KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHZlcnNpb24KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiKTsKLSAgICAgICAgICAgIGxvbmcgdmVyc2lvbiA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmVyc2lvbjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiAoKExvbmcpIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgdXNlcl92ZXJzaW9uOyIsIG51bGwpKS5pbnRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTQ4LDIwICsxMTc4LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbWF4aW11bSBkYXRhYmFzZSBzaXplCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TWF4aW11bVNpemUoKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIpOwotICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHBhZ2VDb3VudCAqIGdldFBhZ2VTaXplKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIHBhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQ7IiwgbnVsbCk7CisgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTcyLDI2ICsxMTkwLDE1IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNldE1heGltdW1TaXplKGxvbmcgbnVtQnl0ZXMpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7CisgICAgICAgIGxvbmcgcGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOworICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKKyAgICAgICAgLy8gSWYgbnVtQnl0ZXMgaXNuJ3QgYSBtdWx0aXBsZSBvZiBwYWdlU2l6ZSwgYnVtcCB1cCBhIHBhZ2UKKyAgICAgICAgaWYgKChudW1CeXRlcyAlIHBhZ2VTaXplKSAhPSAwKSB7CisgICAgICAgICAgICBudW1QYWdlcysrOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgICAgIGxvbmcgbnVtUGFnZXMgPSBudW1CeXRlcyAvIHBhZ2VTaXplOwotICAgICAgICAgICAgLy8gSWYgbnVtQnl0ZXMgaXNuJ3QgYSBtdWx0aXBsZSBvZiBwYWdlU2l6ZSwgYnVtcCB1cCBhIHBhZ2UKLSAgICAgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG51bVBhZ2VzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIG1heF9wYWdlX2NvdW50ID0gIiArIG51bVBhZ2VzKTsKLSAgICAgICAgICAgIGxvbmcgbmV3UGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGxvbmcgbmV3UGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcywKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgcmV0dXJuIG5ld1BhZ2VDb3VudCAqIHBhZ2VTaXplOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAwMCwyMCArMTIwNyw3IEBACiAgICAgICogQHJldHVybiB0aGUgZGF0YWJhc2UgcGFnZSBzaXplLCBpbiBieXRlcwogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldFBhZ2VTaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBwYWdlX3NpemU7Iik7Ci0gICAgICAgICAgICBsb25nIHNpemUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBwYWdlX3NpemU7IiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDM0LDkgKzEyMjgsMTAgQEAKICAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIG1hcmsgYXMgc3luY2FibGUKICAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCiAgICAgICogICAgICAgICAgc3luY2FibGUgdGFibGUKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBubyBsb25nZXIgc2VydmVzIGFueSB1c2VmdWwgcHVycG9zZSBhbmQgaGFzIGJlZW4gZGVwcmVjYXRlZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSkgewotICAgICAgICBtYXJrVGFibGVTeW5jYWJsZSh0YWJsZSwgIl9pZCIsIHRhYmxlLCBkZWxldGVkVGFibGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA0OSw2MCArMTI0NCwxMCBAQAogICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IHRoaXMgaXMgdGhlIGNvbHVtbiBpbiB0YWJsZSB3aG9zZSB2YWx1ZSBpcyBhbiBfaWQgaW4KICAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQogICAgICAqIEBwYXJhbSB1cGRhdGVUYWJsZSB0aGlzIGlzIHRoZSB0YWJsZSB0aGF0IHdpbGwgaGF2ZSBpdHMgX3N5bmNfZGlydHkKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBubyBsb25nZXIgc2VydmVzIGFueSB1c2VmdWwgcHVycG9zZSBhbmQgaGFzIGJlZW4gZGVwcmVjYXRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LAotICAgICAgICAgICAgU3RyaW5nIHVwZGF0ZVRhYmxlKSB7Ci0gICAgICAgIG1hcmtUYWJsZVN5bmNhYmxlKHRhYmxlLCBmb3JlaWduS2V5LCB1cGRhdGVUYWJsZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFyayB0aGlzIHRhYmxlIGFzIHN5bmNhYmxlLCB3aXRoIHRoZSBfc3luY19kaXJ0eSByZXNpZGluZyBpbiBhbm90aGVyCi0gICAgICogdGFibGUuIFdoZW4gYW4gdXBkYXRlIG9jY3VycyBpbiB0aGlzIHRhYmxlIHRoZSBfc3luY19kaXJ0eSBmaWVsZCBvZiB0aGUKLSAgICAgKiByb3cgaW4gdXBkYXRlVGFibGUgd2l0aCB0aGUgX2lkIGluIGZvcmVpZ25LZXkgd2lsbCBiZSBzZXQgdG8KLSAgICAgKiBlbnN1cmUgcHJvcGVyIHN5bmNpbmcgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhYmxlIGFuIHVwZGF0ZSBvbiB0aGlzIHRhYmxlIHdpbGwgdHJpZ2dlciBhIHN5bmMgdGltZSByZW1vdmFsCi0gICAgICogQHBhcmFtIGZvcmVpZ25LZXkgdGhpcyBpcyB0aGUgY29sdW1uIGluIHRhYmxlIHdob3NlIHZhbHVlIGlzIGFuIF9pZCBpbgotICAgICAqICAgICAgICAgIHVwZGF0ZVRhYmxlCi0gICAgICogQHBhcmFtIHVwZGF0ZVRhYmxlIHRoaXMgaXMgdGhlIHRhYmxlIHRoYXQgd2lsbCBoYXZlIGl0cyBfc3luY19kaXJ0eQotICAgICAqIEBwYXJhbSBkZWxldGVkVGFibGUgVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LAotICAgICAgICAgICAgU3RyaW5nIHVwZGF0ZVRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjU1FMKCJTRUxFQ1QgX3N5bmNfZGlydHkgRlJPTSAiICsgdXBkYXRlVGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIExJTUlUIDAiKTsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjU1FMKCJTRUxFQ1QgIiArIGZvcmVpZ25LZXkgKyAiIEZST00gIiArIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBMSU1JVCAwIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm8gPSBuZXcgU3luY1VwZGF0ZUluZm8odXBkYXRlVGFibGUsIGRlbGV0ZWRUYWJsZSwKLSAgICAgICAgICAgICAgICBmb3JlaWduS2V5KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3luY1VwZGF0ZUluZm8pIHsKLSAgICAgICAgICAgIG1TeW5jVXBkYXRlSW5mby5wdXQodGFibGUsIGluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCBmb3IgZWFjaCByb3cgdGhhdCBpcyB1cGRhdGVkIGluIGEgY3Vyc29yLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0aGUgcm93IGlzIGluCi0gICAgICogQHBhcmFtIHJvd0lkIHRoZSByb3cgSUQgb2YgdGhlIHVwZGF0ZWQgcm93Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIHJvd1VwZGF0ZWQoU3RyaW5nIHRhYmxlLCBsb25nIHJvd0lkKSB7Ci0gICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm87Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBpbmZvID0gbVN5bmNVcGRhdGVJbmZvLmdldCh0YWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgZXhlY1NRTCgiVVBEQVRFICIgKyBpbmZvLm1hc3RlclRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBTRVQgX3N5bmNfZGlydHk9MSBXSEVSRSBfaWQ9KFNFTEVDVCAiICsgaW5mby5mb3JlaWduS2V5Ci0gICAgICAgICAgICAgICAgICAgICsgIiBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgX2lkPSIgKyByb3dJZCArICIpIik7Ci0gICAgICAgIH0KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGZvcmVpZ25LZXksIFN0cmluZyB1cGRhdGVUYWJsZSkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMTEzNCw2ICsxMjc5LDggQEAKICAgICAgKiBzdGF0ZW1lbnQgYW5kIGZpbGwgaW4gdGhvc2UgdmFsdWVzIHdpdGgge0BsaW5rIFNRTGl0ZVByb2dyYW0jYmluZFN0cmluZ30KICAgICAgKiBhbmQge0BsaW5rIFNRTGl0ZVByb2dyYW0jYmluZExvbmd9IGVhY2ggdGltZSB5b3Ugd2FudCB0byBydW4gdGhlCiAgICAgICogc3RhdGVtZW50LiBTdGF0ZW1lbnRzIG1heSBub3QgcmV0dXJuIHJlc3VsdCBzZXRzIGxhcmdlciB0aGFuIDF4MS4KKyAgICAgKjxwPgorICAgICAqIE5vIHR3byB0aHJlYWRzIHNob3VsZCBiZSB1c2luZyB0aGUgc2FtZSB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fSBhdCB0aGUgc2FtZSB0aW1lLgogICAgICAqCiAgICAgICogQHBhcmFtIHNxbCBUaGUgcmF3IFNRTCBzdGF0ZW1lbnQsIG1heSBjb250YWluID8gZm9yIHVua25vd24gdmFsdWVzIHRvIGJlCiAgICAgICogICAgICAgICAgICBib3VuZCBsYXRlci4KQEAgLTExNDEsMTUgKzEyODgsOCBAQAogICAgICAqIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9cyBhcmUgbm90IHN5bmNocm9uaXplZCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZVN0YXRlbWVudCBjb21waWxlU3RhdGVtZW50KFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIyNiw5ICsxMzY2LDcgQEAKICAgICAgICAgICAgIGJvb2xlYW4gZGlzdGluY3QsIFN0cmluZyB0YWJsZSwgU3RyaW5nW10gY29sdW1ucywKICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBncm91cEJ5LAogICAgICAgICAgICAgU3RyaW5nIGhhdmluZywgU3RyaW5nIG9yZGVyQnksIFN0cmluZyBsaW1pdCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIFN0cmluZyBzcWwgPSBTUUxpdGVRdWVyeUJ1aWxkZXIuYnVpbGRRdWVyeVN0cmluZygKICAgICAgICAgICAgICAgICBkaXN0aW5jdCwgdGFibGUsIGNvbHVtbnMsIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLCBvcmRlckJ5LCBsaW1pdCk7CiAKQEAgLTEzMzksOSArMTQ3Nyw3IEBACiAgICAgcHVibGljIEN1cnNvciByYXdRdWVyeVdpdGhGYWN0b3J5KAogICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBjdXJzb3JGYWN0b3J5LCBTdHJpbmcgc3FsLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAogICAgICAgICAgICAgU3RyaW5nIGVkaXRUYWJsZSkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSAwOwogCkBAIC0xMzQ5LDcgKzE0ODUsOCBAQAogICAgICAgICAgICAgdGltZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIH0KIAotICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcih0aGlzLCBzcWwsIGVkaXRUYWJsZSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIgPSBuZXcgU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyKGRiLCBzcWwsIGVkaXRUYWJsZSk7CiAKICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xMzc1LDYgKzE1MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjxudWxsPiIpICArICIsIGNvdW50IGlzICIgKyBjb3VudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZURiQ29ubmVjdGlvbihkYik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGN1cnNvcjsKICAgICB9CkBAIC0xNTAxLDg0ICsxNjM5LDQxIEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgaW5zZXJ0V2l0aE9uQ29uZmxpY3QoU3RyaW5nIHRhYmxlLCBTdHJpbmcgbnVsbENvbHVtbkhhY2ssCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMsIGludCBjb25mbGljdEFsZ29yaXRobSkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1lYXN1cmVtZW50cyBzaG93IG1vc3Qgc3FsIGxlbmd0aHMgPD0gMTUyCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoMTUyKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzcWwuYXBwZW5kKCJJTlNFUlQiKTsKICAgICAgICAgc3FsLmFwcGVuZChDT05GTElDVF9WQUxVRVNbY29uZmxpY3RBbGdvcml0aG1dKTsKICAgICAgICAgc3FsLmFwcGVuZCgiIElOVE8gIik7CiAgICAgICAgIHNxbC5hcHBlbmQodGFibGUpOwotICAgICAgICAvLyBNZWFzdXJlbWVudHMgc2hvdyBtb3N0IHZhbHVlcyBsZW5ndGhzIDwgNDAKLSAgICAgICAgU3RyaW5nQnVpbGRlciB2YWx1ZXMgPSBuZXcgU3RyaW5nQnVpbGRlcig0MCk7CisgICAgICAgIHNxbC5hcHBlbmQoJygnKTsKIAotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQgPSBudWxsOwotICAgICAgICBpZiAoaW5pdGlhbFZhbHVlcyAhPSBudWxsICYmIGluaXRpYWxWYWx1ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZW50cnlTZXQgPSBpbml0aWFsVmFsdWVzLnZhbHVlU2V0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKCcoJyk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gbmVlZFNlcGFyYXRvciA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChuZWVkU2VwYXJhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5lZWRTZXBhcmF0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgnPycpOworICAgICAgICBPYmplY3RbXSBiaW5kQXJncyA9IG51bGw7CisgICAgICAgIGludCBzaXplID0gKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCAmJiBpbml0aWFsVmFsdWVzLnNpemUoKSA+IDApID8gaW5pdGlhbFZhbHVlcy5zaXplKCkgOiAwOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGJpbmRBcmdzID0gbmV3IE9iamVjdFtzaXplXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbE5hbWUgOiBpbml0aWFsVmFsdWVzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiwiIDogIiIpOworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoY29sTmFtZSk7CisgICAgICAgICAgICAgICAgYmluZEFyZ3NbaSsrXSA9IGluaXRpYWxWYWx1ZXMuZ2V0KGNvbE5hbWUpOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzcWwuYXBwZW5kKCcpJyk7CisgICAgICAgICAgICBzcWwuYXBwZW5kKCIgVkFMVUVTICgiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLD8iIDogIj8iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNxbC5hcHBlbmQoIigiICsgbnVsbENvbHVtbkhhY2sgKyAiKSAiKTsKLSAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoIk5VTEwiKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQobnVsbENvbHVtbkhhY2sgKyAiKSBWQUxVRVMgKE5VTEwiKTsKICAgICAgICAgfQorICAgICAgICBzcWwuYXBwZW5kKCcpJyk7CiAKLSAgICAgICAgc3FsLmFwcGVuZCgiIFZBTFVFUygiKTsKLSAgICAgICAgc3FsLmFwcGVuZCh2YWx1ZXMpOwotICAgICAgICBzcWwuYXBwZW5kKCIpOyIpOwotCi0gICAgICAgIGxvY2soKTsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbC50b1N0cmluZygpLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQmluZCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBpZiAoZW50cnlTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gZW50cnlTZXQuc2l6ZSgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBpICsgMSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSdW4gdGhlIHByb2dyYW0gYW5kIHRoZW4gY2xlYW51cAotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKLQotICAgICAgICAgICAgbG9uZyBpbnNlcnRlZFJvd0lkID0gbGFzdEluc2VydFJvdygpOwotICAgICAgICAgICAgaWYgKGluc2VydGVkUm93SWQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbnNlcnRpbmcgIiArIGluaXRpYWxWYWx1ZXMgKyAiIHVzaW5nICIgKyBzcWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QgJiYgTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiSW5zZXJ0aW5nIHJvdyAiICsgaW5zZXJ0ZWRSb3dJZCArICIgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbml0aWFsVmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ZWRSb3dJZDsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhlY3V0ZUluc2VydCgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTkzLDMyICsxNjg4LDE1IEBACiAgICAgICogICAgICAgICB3aGVyZUNsYXVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGRlbGV0ZShTdHJpbmcgdGFibGUsIFN0cmluZyB3aGVyZUNsYXVzZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAgbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCAiREVMRVRFIEZST00gIiArIHRhYmxlICsKKyAgICAgICAgICAgICAgICAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKSA/ICIgV0hFUkUgIiArIHdoZXJlQ2xhdXNlIDogIiIpLCB3aGVyZUFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudCgiREVMRVRFIEZST00gIiArIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkKLSAgICAgICAgICAgICAgICAgICAgPyAiIFdIRVJFICIgKyB3aGVyZUNsYXVzZSA6ICIiKSk7Ci0gICAgICAgICAgICBpZiAod2hlcmVBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgbnVtQXJncyA9IHdoZXJlQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIHdoZXJlQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0Q2hhbmdlQ291bnQoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjQ5LDggKzE3MjcsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgdXBkYXRlV2l0aE9uQ29uZmxpY3QoU3RyaW5nIHRhYmxlLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSwgU3RyaW5nW10gd2hlcmVBcmdzLCBpbnQgY29uZmxpY3RBbGdvcml0aG0pIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaW50IHNldFZhbHVlc1NpemUgPSB2YWx1ZXMuc2l6ZSgpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgc2V0VmFsdWVzU2l6ZSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbXB0eSB2YWx1ZXMiKTsKICAgICAgICAgfQogCkBAIC0xNjYwLDk4ICsxNzM4LDY4IEBACiAgICAgICAgIHNxbC5hcHBlbmQodGFibGUpOwogICAgICAgICBzcWwuYXBwZW5kKCIgU0VUICIpOwogCi0gICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IHZhbHVlcy52YWx1ZVNldCgpOwotICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAvLyBtb3ZlIGFsbCBiaW5kIGFyZ3MgdG8gb25lIGFycmF5CisgICAgICAgIGludCBiaW5kQXJnc1NpemUgPSAod2hlcmVBcmdzID09IG51bGwpID8gc2V0VmFsdWVzU2l6ZSA6IChzZXRWYWx1ZXNTaXplICsgd2hlcmVBcmdzLmxlbmd0aCk7CisgICAgICAgIE9iamVjdFtdIGJpbmRBcmdzID0gbmV3IE9iamVjdFtiaW5kQXJnc1NpemVdOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoU3RyaW5nIGNvbE5hbWUgOiB2YWx1ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsIiA6ICIiKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoY29sTmFtZSk7CisgICAgICAgICAgICBiaW5kQXJnc1tpKytdID0gdmFsdWVzLmdldChjb2xOYW1lKTsKICAgICAgICAgICAgIHNxbC5hcHBlbmQoIj0/Iik7Ci0gICAgICAgICAgICBpZiAoZW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2hlcmVBcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHNldFZhbHVlc1NpemU7IGkgPCBiaW5kQXJnc1NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGJpbmRBcmdzW2ldID0gd2hlcmVBcmdzW2kgLSBzZXRWYWx1ZXNTaXplXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpKSB7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgIik7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKHdoZXJlQ2xhdXNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLnRvU3RyaW5nKCksIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBCaW5kIHRoZSB2YWx1ZXMKLSAgICAgICAgICAgIGludCBzaXplID0gZW50cnlTZXQuc2l6ZSgpOwotICAgICAgICAgICAgZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgaW50IGJpbmRBcmcgPSAxOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGJpbmRBcmcsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGJpbmRBcmcrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IHdoZXJlQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRTdHJpbmcoYmluZEFyZywgd2hlcmVBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgYmluZEFyZysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIGNsZWFudXAKLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBpbnQgbnVtQ2hhbmdlZFJvd3MgPSBsYXN0Q2hhbmdlQ291bnQoKTsKLSAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCAmJiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlVwZGF0ZWQgIiArIG51bUNoYW5nZWRSb3dzICsgIiB1c2luZyAiICsgdmFsdWVzICsgIiBhbmQgIiArIHNxbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVtQ2hhbmdlZFJvd3M7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHVwZGF0aW5nICIgKyB2YWx1ZXMgKyAiIHVzaW5nICIgKyBzcWwpOwotICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIG5vdCBhIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgQ1JFQVRFCi0gICAgICogVEFCTEUsIERFTEVURSwgSU5TRVJULCBldGMuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IDtzIGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQuIGl0IHRha2VzIGEgd3JpdGUgbG9jaworICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIE5PVCBhIFNFTEVDVAorICAgICAqIG9yIGFueSBvdGhlciBTUUwgc3RhdGVtZW50IHRoYXQgcmV0dXJucyBkYXRhLgorICAgICAqIDxwPgorICAgICAqIEl0IGhhcyBubyBtZWFucyB0byByZXR1cm4gYW55IGRhdGEgKHN1Y2ggYXMgdGhlIG51bWJlciBvZiBhZmZlY3RlZCByb3dzKS4KKyAgICAgKiBJbnN0ZWFkLCB5b3UncmUgZW5jb3VyYWdlZCB0byB1c2Uge0BsaW5rICNpbnNlcnQoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfSwKKyAgICAgKiB7QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfSwgZXQgYWwsIHdoZW4gcG9zc2libGUuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdXNpbmcge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfSwgam91cm5hbF9tb2RlIGlzCisgICAgICogYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIFNvLCBkbyBub3Qgc2V0IGpvdXJuYWxfbW9kZQorICAgICAqIHVzaW5nICJQUkFHTUEgam91cm5hbF9tb2RlJzx2YWx1ZT4iIHN0YXRlbWVudCBpZiB5b3VyIGFwcCBpcyB1c2luZworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0KKyAgICAgKiA8L3A+CiAgICAgICoKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3Igc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjU1FMKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKKyAgICAgICAgaW50IHN0bXRUeXBlID0gRGF0YWJhc2VVdGlscy5nZXRTcWxTdGF0ZW1lbnRUeXBlKHNxbCk7CisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9BVFRBQ0gpIHsKKyAgICAgICAgICAgIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBsb2dUaW1lU3RhdChtTGFzdFNxbFN0YXRlbWVudCwgdGltZVN0YXJ0LCBHRVRfTE9DS19MT0dfUFJFRklYKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjU1FMKHNxbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBleGVjdXRlU3FsKHNxbCwgbnVsbCk7CiAKICAgICAgICAgLy8gTG9nIGNvbW1pdCBzdGF0ZW1lbnRzIGFsb25nIHdpdGggdGhlIG1vc3QgcmVjZW50bHkgZXhlY3V0ZWQKLSAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uICBOb3RlIHRoYXQgaW5zdGFuY2UKLSAgICAgICAgLy8gZXF1YWxpdHkgdG8gQ09NTUlUX1NRTCBpcyBzYWZlIGhlcmUuCi0gICAgICAgIGlmIChzcWwgPT0gQ09NTUlUX1NRTCkgeworICAgICAgICAvLyBTUUwgc3RhdGVtZW50IGZvciBkaXNhbWJpZ3VhdGlvbi4KKyAgICAgICAgaWYgKHN0bXRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCkgewogICAgICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgQ09NTUlUX1NRTCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsb2dUaW1lU3RhdChzcWwsIHRpbWVTdGFydCwgbnVsbCk7CkBAIC0xNzU5LDY1ICsxODA3LDk4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLCBDUkVBVEUKLSAgICAgKiBUQUJMRSwgREVMRVRFLCBJTlNFUlQsIGV0Yy4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgO3MgYXJlIG5vdAotICAgICAqIHN1cHBvcnRlZC4gaXQgdGFrZXMgYSB3cml0ZSBsb2NrLAorICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIE5PVCBhIFNFTEVDVC9JTlNFUlQvVVBEQVRFL0RFTEVURS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgSU5TRVJUIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydE9yVGhyb3coU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnRXaXRoT25Db25mbGljdChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcywgaW50KX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIFVQREFURSBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjdXBkYXRlV2l0aE9uQ29uZmxpY3QoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgREVMRVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2RlbGV0ZShTdHJpbmcsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBhcmUgZ29vZCBjYW5kaWRhdGVzIGZvciB1c2luZyB0aGlzIG1ldGhvZDoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUxURVIgVEFCTEU8L2xpPgorICAgICAqICAgPGxpPkNSRUFURSBvciBEUk9QIHRhYmxlIC8gdHJpZ2dlciAvIHZpZXcgLyBpbmRleCAvIHZpcnR1YWwgdGFibGU8L2xpPgorICAgICAqICAgPGxpPlJFSU5ERVg8L2xpPgorICAgICAqICAgPGxpPlJFTEVBU0U8L2xpPgorICAgICAqICAgPGxpPlNBVkVQT0lOVDwvbGk+CisgICAgICogICA8bGk+UFJBR01BIHRoYXQgcmV0dXJucyBubyBkYXRhPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVzaW5nIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0sIGpvdXJuYWxfbW9kZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGlzIGNsYXNzLiBTbywgZG8gbm90IHNldCBqb3VybmFsX21vZGUKKyAgICAgKiB1c2luZyAiUFJBR01BIGpvdXJuYWxfbW9kZSc8dmFsdWU+IiBzdGF0ZW1lbnQgaWYgeW91ciBhcHAgaXMgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9CisgICAgICogPC9wPgogICAgICAqCi0gICAgICogQHBhcmFtIHNxbAorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCisgICAgICogbm90IHN1cHBvcnRlZC4KICAgICAgKiBAcGFyYW0gYmluZEFyZ3Mgb25seSBieXRlW10sIFN0cmluZywgTG9uZyBhbmQgRG91YmxlIGFyZSBzdXBwb3J0ZWQgaW4gYmluZEFyZ3MuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3Igc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjU1FMKFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CiAgICAgICAgIGlmIChiaW5kQXJncyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbXB0eSBiaW5kQXJncyIpOwogICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVTcWwoc3FsLCBiaW5kQXJncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVTcWwoU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbCwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwpOwotICAgICAgICAgICAgaWYgKGJpbmRBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgbnVtQXJncyA9IGJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBpICsgMSwgYmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIGxvZ1RpbWVTdGF0KHNxbCwgdGltZVN0YXJ0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjbG9zZSgpIHdhcyBuZXZlciBleHBsaWNpdGx5IGNhbGxlZCBvbiBkYXRhYmFzZSAnIiArCi0gICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOwotICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOwotICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGggKyAiJyAiLCBtU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOworICAgICAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUN1c3RvbUZ1bmN0aW9ucygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuIFNlZSB7QGxpbmsgI2NyZWF0ZX0gYW5kIHtAbGluayAjb3BlbkRhdGFiYXNlfS4KKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKICAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBjdXJzb3JzLCBtYXkgYmUgTlVMTC4KICAgICAgKiBAcGFyYW0gZmxhZ3MgMCBvciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LiAgSWYgdGhlIGRhdGFiYXNlIGZpbGUgYWxyZWFkeQogICAgICAqICAgICAgICAgICAgICBleGlzdHMsIG1GbGFncyB3aWxsIGJlIHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIFRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIG1heSBiZSBOVUxMLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIDAgZm9yIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuIDEuLk4gZm9yIHBvb2xlZCBkYXRhYmFzZQorICAgICAqIGNvbm5lY3Rpb24gaGFuZGxlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CiAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhdGggc2hvdWxkIG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE4MjYsMjUgKzE5MDcsMTEgQEAKICAgICAgICAgbVNsb3dRdWVyeVRocmVzaG9sZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFksIC0xKTsKICAgICAgICAgbVN0YWNrVHJhY2UgPSBuZXcgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKS5maWxsSW5TdGFja1RyYWNlKCk7CiAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgZGJvcGVuKG1QYXRoLCBtRmxhZ3MpOwotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICBtVGltZU9wZW5lZCA9IGdldFRpbWUoKTsKLSAgICAgICAgfQogICAgICAgICBtUHJvZ3JhbXMgPSBuZXcgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsT2JqZWN0PigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzZXRMb2NhbGUoKSB3aGVuIGNvbnN0cnVjdGluZywgY2xvc2luZyB0aGUgZGF0YWJhc2UiLCBlKTsKLSAgICAgICAgICAgIGRiY2xvc2UoKTsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUaW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MuU1NTICIpLmZvcm1hdChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIC8vIFNldCB0aGUgRGF0YWJhc2VFcnJvckhhbmRsZXIgdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXBvcnRzIGNvcnJ1cHRpb24uCisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc2V0cyBlcnJvckhhbmRsZXIgPSBudWxsLCB0aGVuIHVzZSBkZWZhdWx0IGVycm9yaGFuZGxlci4KKyAgICAgICAgbUVycm9ySGFuZGxlciA9IChlcnJvckhhbmRsZXIgPT0gbnVsbCkgPyBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgOiBlcnJvckhhbmRsZXI7CisgICAgICAgIG1Db25uZWN0aW9uTnVtID0gY29ubmVjdGlvbk51bTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MDEsNyArMTk2OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGR1cmF0aW9uTWlsbGlzID49IHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IDEwMDsKLSAgICAgICAgfSBlbHNlIHs7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzYW1wbGVQZXJjZW50ID0gKGludCkgKDEwMCAqIGR1cmF0aW9uTWlsbGlzIC8gc1F1ZXJ5TG9nVGltZUluTWlsbGlzKSArIDE7CiAgICAgICAgICAgICBpZiAobVJhbmRvbS5uZXh0SW50KDEwMCkgPj0gc2FtcGxlUGVyY2VudCkgcmV0dXJuOwogICAgICAgICB9CkBAIC0xOTcwLDYgKzIwMzcsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB2ZXJpZnlEYklzT3BlbigpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIGdldFBhdGgoKSArICIgKGNvbm4jICIgKworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbk51bSArICIpIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5TG9ja093bmVyKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBpZiAobUxvY2tpbmdFbmFibGVkICYmICFpc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvbid0IGhhdmUgZGF0YWJhc2UgbG9jayEiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qCiAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAqCkBAIC0xOTc3LDIyICsyMDU4LDE0IEBACiAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAqLwogICAgIC8qKgotICAgICAqIGFkZHMgdGhlIGdpdmVuIHNxbCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gU1FMIGFuZCBpdHMgY29tcGlsZWQtc3RhdGVtZW50LWlkLXJldHVybmVkLWJ5LXNxbGl0ZSB0byB0aGUKICAgICAgKiBjYWNoZSBvZiBjb21waWxlZFF1ZXJpZXMgYXR0YWNoZWQgdG8gJ3RoaXMnLgotICAgICAqCi0gICAgICogaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaW4gY29tcGlsZWRRdWVyaWVzIGZvciB0aGUgZ2l2ZW4gc3FsLAorICAgICAqIDxwPgorICAgICAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIFNRTCwKICAgICAgKiB0aGUgbmV3IHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gb2JqZWN0IGlzIE5PVCBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSAoaS5lLix0aGUgY3VycmVudAogICAgICAqIG1hcHBpbmcgaXMgTk9UIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBtYXBwaW5nKS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgYWRkVG9Db21waWxlZFF1ZXJpZXMoU3RyaW5nIHNxbCwgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQpIHsKLSAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Tk9UIGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA9IG51bGw7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICAvLyBkb24ndCBpbnNlcnQgdGhlIG5ldyBtYXBwaW5nIGlmIGEgbWFwcGluZyBhbHJlYWR5IGV4aXN0cwpAQCAtMjAwMCwzNiArMjA3MywzMiBAQAogICAgICAgICAgICAgaWYgKGNvbXBpbGVkU3FsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGQgdGhpcyA8c3FsLCBjb21waWxlZFN0YXRlbWVudD4gdG8gdGhlIGNhY2hlCisKICAgICAgICAgICAgIGlmIChtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSA9PSBtTWF4U3FsQ2FjaGVTaXplKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBjYWNoZSBzaXplIG9mIHtAbGluayAjbU1heFNxbENhY2hlU2l6ZX0gaXMgbm90IGVub3VnaCBmb3IgdGhpcyBhcHAuCi0gICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZyBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiB0aW1lcwotICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIHNvIGNhY2hpbmcgaXMgdXNlbGVzcy4KLSAgICAgICAgICAgICAgICAgKiBUT0RPOiBlaXRoZXIgbGV0IHRoZSBjYWxsZXJzIHNldCBtYXggY2NoZXNpemUgZm9yIHRoZWlyIGFwcCwgb3IgaW50ZWxsaWdlbnRseQotICAgICAgICAgICAgICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBzaG91bGQgYmUgY2FjaGVkIGZvciBhIGdpdmVuIGFwcC4KKyAgICAgICAgICAgICAgICAgKiBsb2cgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIG9yIGNhY2hlc2l6ZSBpcyB0b28gc21hbGwuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCsrbUNhY2hlRnVsbFdhcm5pbmdzID09IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICI7IGkuZS4sIE5PIHNwYWNlIGZvciB0aGlzIHNxbCBzdGF0ZW1lbnQgaW4gY2FjaGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbCArICIuIFBsZWFzZSBjaGFuZ2UgeW91ciBzcWwgc3RhdGVtZW50cyB0byB1c2UgJz8nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluZGFyZ3MsIGluc3RlYWQgb2YgdXNpbmcgYWN0dWFsIHZhbHVlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICIuIENvbnNpZGVyIGluY3JlYXNpbmcgY2FjaGVzaXplLiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgdGhpcyBlbnRyeSB0byBjYWNoZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBOT1QgZnVsbC4gYWRkIHRoaXMgdG8gY2FjaGUuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIC8qIGFkZCB0aGUgZ2l2ZW4gU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgdG8gY2FjaGUuCisgICAgICAgICAgICAgKiBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjYWNoZSBzaXplIC0gYmVjYXVzZSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9CisgICAgICAgICAgICAgKiBzZWxmLWxpbWl0cyBpdHMgc2l6ZSB0byB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnB1dChzcWwsIGNvbXBpbGVkU3RhdGVtZW50KTsKKyAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsgInwiICsgc3FsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm47CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHZvaWQgZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKSB7CisgICAgLyoqIHBhY2thZ2UtbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIGZvciAoU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgOiBtQ29tcGlsZWRRdWVyaWVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgY29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwpAQCAtMjAzOSwyMCArMjEwOCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gc3FsLgotICAgICAqIHJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KKyAgICAgKiBGcm9tIHRoZSBjb21waWxlZFF1ZXJpZXMgY2FjaGUsIHJldHVybnMgdGhlIGNvbXBpbGVkLXN0YXRlbWVudC1pZCBmb3IgdGhlIGdpdmVuIFNRTC4KKyAgICAgKiBSZXR1cm5zIG51bGwsIGlmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVDb21waWxlZFNxbCBnZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChTdHJpbmcgc3FsKSB7CiAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50ID0gbnVsbDsKICAgICAgICAgYm9vbGVhbiBjYWNoZUhpdDsKICAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBkYXRhYmFzZSwgdGhlcmUgaXMgbm8gY2FjaGUgb2YgY29tcGlsZWQgc3FsLgotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlIE5PVCBmb3VuZHwiICsgZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBjYWNoZUhpdCA9IChjb21waWxlZFN0YXRlbWVudCA9IG1Db21waWxlZFF1ZXJpZXMuZ2V0KHNxbCkpICE9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNhY2hlSGl0KSB7CkBAIC0yMDY1LDYzICsyMTI3LDI0IEBACiAgICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGVfc3RhdHN8IiArCiAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICJ8IiArIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsKICAgICAgICAgICAgICAgICAgICAgInwiICsgbU51bUNhY2hlSGl0cyArICJ8IiArIG1OdW1DYWNoZU1pc3NlcyArCi0gICAgICAgICAgICAgICAgICAgICJ8IiArIGNhY2hlSGl0ICsgInwiICsgbVRpbWVPcGVuZWQgKyAifCIgKyBtVGltZUNsb3NlZCArICJ8IiArIHNxbCk7CisgICAgICAgICAgICAgICAgICAgICJ8IiArIGNhY2hlSGl0ICsgInwiICsgc3FsKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY29tcGlsZWRTdGF0ZW1lbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzcWwgaXMgY2FjaGVkIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db21waWxlZFNxbENhY2hlKFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zS2V5KHNxbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwdXJnZXMgdGhlIGdpdmVuIHNxbCBmcm9tIHRoZSBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXJnZUZyb21Db21waWxlZFNxbENhY2hlKFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucmVtb3ZlKHNxbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBjb21waWxlZCBzcWwgY2FjaGUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0Q29tcGlsZWRTcWxDYWNoZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aGUgY3VycmVudCBtYXhDYWNoZVNxbENhY2hlU2l6ZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TWF4U3FsQ2FjaGVTaXplKCkgewotICAgICAgICByZXR1cm4gbU1heFNxbENhY2hlU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIG1heCBzaXplIG9mIHRoZSBjb21waWxlZCBzcWwgY2FjaGUgZm9yIHRoaXMgZGF0YWJhc2UgYWZ0ZXIgcHVyZ2luZyB0aGUgY2FjaGUuCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBwcmVwYXJlZC1zdGF0ZW1lbnQgY2FjaGUgZm9yIHRoaXMgZGF0YWJhc2UuCiAgICAgICogKHNpemUgb2YgdGhlIGNhY2hlID0gbnVtYmVyIG9mIGNvbXBpbGVkLXNxbC1zdGF0ZW1lbnRzIHN0b3JlZCBpbiB0aGUgY2FjaGUpLgorICAgICAqPHA+CisgICAgICogTWF4aW11bSBjYWNoZSBzaXplIGNhbiBPTkxZIGJlIGluY3JlYXNlZCBmcm9tIGl0cyBjdXJyZW50IHNpemUgKGRlZmF1bHQgPSAxMCkuCisgICAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSwKKyAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICo8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQtc2FmZS4KICAgICAgKgotICAgICAqIG1heCBjYWNoZSBzaXplIGNhbiBPTkxZIGJlIGluY3JlYXNlZCBmcm9tIGl0cyBjdXJyZW50IHNpemUgKGRlZmF1bHQgPSAwKS4KLSAgICAgKiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBzbWFsbGVyIHNpemUgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBtTWF4U3FsQ2FjaGVTaXplLAotICAgICAqIHRoZW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bgotICAgICAqCi0gICAgICogc3luY2hyb25pemVkIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0IHRocmVhZHMgdG8gY2hhbmdlIGNhY2hlIHNpemUgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgKiBAcGFyYW0gY2FjaGVTaXplIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gY2FuIGJlICgwIHRvIE1BWF9TUUxfQ0FDSEVfU0laRSkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpbnB1dCBjYWNoZVNpemUgPiBNQVhfU1FMX0NBQ0hFX1NJWkUgb3IgPCAwIG9yCi0gICAgICogPCB0aGUgdmFsdWUgc2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4KLSAgICAgKgotICAgICAqIEBoaWRlCisgICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byB7QGxpbmsgI01BWF9TUUxfQ0FDSEVfU0laRX0pCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9IG9yCisgICAgICogPiB0aGUgdmFsdWUgc2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TWF4U3FsQ2FjaGVTaXplKGludCBjYWNoZVNpemUpIHsKICAgICAgICAgaWYgKGNhY2hlU2l6ZSA+IE1BWF9TUUxfQ0FDSEVfU0laRSB8fCBjYWNoZVNpemUgPCAwKSB7CkBAIC0yMTMzLDYwICsyMTU2LDMwNSBAQAogICAgICAgICBtTWF4U3FsQ2FjaGVTaXplID0gY2FjaGVTaXplOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVEYXRhYmFzZXMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY3RpdmVEYXRhYmFzZXMgYWN0aXZlRGF0YWJhc2VzID0gbmV3IEFjdGl2ZURhdGFiYXNlcygpOwotICAgICAgICBwcml2YXRlIEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7Ci0gICAgICAgIHByaXZhdGUgQWN0aXZlRGF0YWJhc2VzKCkge30gLy8gZGlzYWJsZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgc3RhdGljIEFjdGl2ZURhdGFiYXNlcyBnZXRJbnN0YW5jZSgpIHtyZXR1cm4gYWN0aXZlRGF0YWJhc2VzO30KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTcWxJblN0YXRlbWVudENhY2hlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGZpbmFsaXplU3RhdGVtZW50TGF0ZXIoaW50IGlkKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIGRhdGFiYXNlIGFscmVhZHkgY2xvc2VkLiB0aGlzIHN0YXRlbWVudCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGZpbmFsaXplZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQobUNsb3NlZFN0YXRlbWVudElkcykgeworICAgICAgICAgICAgaWYgKG1DbG9zZWRTdGF0ZW1lbnRJZHMuY29udGFpbnMoaWQpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzdGF0ZW1lbnQgaWQgaXMgYWxyZWFkeSBxdWV1ZWQgdXAgZm9yIGZpbmFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmFkZChpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBkYXRhYmFzZSBpcyBhbHJlYWR5IGNsb3NlZCwgbm8gbmVlZCB0byBmaW5hbGl6ZSBhbnl0aGluZy4KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKKyAgICAgICAgLyogdG8gbWluaW1pemUgc3luY2hyb25pemF0aW9uIG9uIG1DbG9zZWRTdGF0ZW1lbnRJZHMsIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0ICovCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPihtQ2xvc2VkU3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBsaXN0LmFkZEFsbChtQ2xvc2VkU3RhdGVtZW50SWRzKTsKKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5hbGl6ZSBhbGwgdGhlIHN0YXRlbWVudHMgZnJvbSB0aGUgY29waWVkIGxpc3QKKyAgICAgICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZShsaXN0LmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmb3IgdGVzdGluZyBvbmx5CisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8SW50ZWdlcj4gZ2V0UXVldWVkVXBTdG10TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1DbG9zZWRTdGF0ZW1lbnRJZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBwYXJhbGxlbCBleGVjdXRpb24gb2YgcXVlcmllcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICogSXQgZG9lcyB0aGlzIGJ5IG9wZW5pbmcgbXVsdGlwbGUgaGFuZGxlcyB0byB0aGUgZGF0YWJhc2UgYW5kIHVzaW5nIGEgZGlmZmVyZW50CisgICAgICogZGF0YWJhc2UgaGFuZGxlIGZvciBlYWNoIHF1ZXJ5LgorICAgICAqIDxwPgorICAgICAqIElmIGEgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3Mgb24gb25lIGNvbm5lY3Rpb24gaGFuZGxlIGFuZCBzYXksIGEgdGFibGUgaXMgdXBkYXRlZCBpbiB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiwgdGhlbiBxdWVyeSBvbiB0aGUgc2FtZSB0YWJsZSBvbiBhbm90aGVyIGNvbm5lY3Rpb24gaGFuZGxlIHdpbGwgYmxvY2sgZm9yIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlLiBCdXQgdGhpcyBtZXRob2QgZW5hYmxlcyBzdWNoIHF1ZXJpZXMgdG8gZXhlY3V0ZSBieSBoYXZpbmcgdGhlbQorICAgICAqIHJldHVybiBvbGQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmcm9tIHRoZSB0YWJsZS4gTW9zdCBvZnRlbiBpdCBpcyB0aGUgZGF0YSB0aGF0IGV4aXN0ZWQgaW4gdGhlCisgICAgICogdGFibGUgcHJpb3IgdG8gdGhlIGFib3ZlIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gdGhhdCB0YWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgaGFuZGxlcyB1c2VkIHRvIGV4ZWN1dGUgcXVlcmllcyBpbiBwYXJhbGxlbCBpcworICAgICAqIGRlcGVuZGVudCB1cG9uIHRoZSBkZXZpY2UgbWVtb3J5IGFuZCBwb3NzaWJseSBvdGhlciBwcm9wZXJ0aWVzLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsIGlzIGVuYWJsZWQgYXMgbG9uZyBhcyB0aGlzCisgICAgICogZGF0YWJhc2UgaGFuZGxlIGlzIG9wZW4uIFRvIGRpc2FibGUgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwsIGRhdGFiYXNlIHNob3VsZAorICAgICAqIGJlIGNsb3NlZCBhbmQgcmVvcGVuZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBxdWVyeSBpcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24sIHRoZW4gaXQgaXMgZXhlY3V0ZWQgb24gdGhlIHNhbWUgZGF0YWJhc2UgaGFuZGxlIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHdhcyBiZWd1bi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZGF0YWJhc2UgaGFzIGFueSBhdHRhY2hlZCBkYXRhYmFzZXMsIHRoZW4gZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxlbCBpcyBOT1QKKyAgICAgKiBwb3NzaWJsZS4gSW4gc3VjaCBjYXNlcywgYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgOm1lbW9yeTogZGF0YWJhc2VzLiBJbiBzdWNoIGNhc2VzLAorICAgICAqIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogQSB0eXBpY2FsIHdheSB0byB1c2UgdGhpcyBtZXRob2QgaXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZSgiZGJfZmlsZW5hbWUiLCBjdXJzb3JGYWN0b3J5LAorICAgICAqICAgICAgICAgICAgIENSRUFURV9JRl9ORUNFU1NBUlksIG15RGF0YWJhc2VFcnJvckhhbmRsZXIpOworICAgICAqICAgICBkYi5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwPgorICAgICAqIFdyaXRlcnMgc2hvdWxkIHVzZSB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKX0gb3IKKyAgICAgKiB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUoU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lcil9CisgICAgICogdG8gc3RhcnQgYSB0cnNuc2FjdGlvbi4KKyAgICAgKiBOb24tZXhjbHVzaXZlIG1vZGUgYWxsb3dzIGRhdGFiYXNlIGZpbGUgdG8gYmUgaW4gcmVhZGFibGUgYnkgdGhyZWFkcyBleGVjdXRpbmcgcXVlcmllcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGUtYWhlYWQtbG9nZ2luZyBpcyBzZXQuIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgaWYgKG1QYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjYW4ndCBlbmFibGUgV0FMIGZvciBtZW1vcnkgZGF0YWJhc2VzLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgZGF0YWJhc2UgaGFzIE5PIGF0dGFjaGVkIGRhdGFiYXNlcyBiZWNhdXNlIHNxbGl0ZSdzIHdyaXRlLWFoZWFkLWxvZ2dpbmcKKyAgICAgICAgLy8gZG9lc24ndCB3b3JrIGZvciBkYXRhYmFzZXMgd2l0aCBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgaWYgKGdldEF0dGFjaGVkRGJzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGRhdGFiYXNlOiAiICsgbVBhdGggKyAiIGhhcyBhdHRhY2hlZCBkYXRhYmFzZXMuIGNhbid0ICBlbmFibGUgV0FMLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wodGhpcyk7CisgICAgICAgICAgICBzZXRKb3VybmFsTW9kZShtUGF0aCwgIldBTCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRpc2FibGVzIHRoZSBmZWF0dXJlcyBlbmFibGVkIGJ5IHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworICAgICAgICAgICAgc2V0Sm91cm5hbE1vZGUobVBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZUhhbmRsZShTdHJpbmcgc3FsKSB7CisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyB1c2UgaXQgaWYgaXQgaXMgb3BlbiBBTkQgaWYgSSBhbSBub3QgY3VycmVudGx5IHBhcnQgb2YgYSB0cmFuc2FjdGlvbgorICAgICAgICAgICAgaWYgKGlzT3BlbigpICYmICFhbUlJblRyYW5zYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYW5vdGhlciBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGluIHVzZSBieSBzb21lIG90aGVyIHRocmVhZAorICAgICAgICAgICAgICAgIC8vIEFORCBpZiB0aGVyZSBhcmUgZnJlZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbAorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgcG9vbGVkIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4hIGNvdWxkIGhhdmUgYmVlbiBjbG9zZWQgZWl0aGVyIGR1ZQorICAgICAgICAgICAgICAgIC8vIHRvIGNvcnJ1cHRpb24gb24gdGhpcyBvciBzb21lIG90aGVyIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gT1IsIG1heWJlIHRoZSBjb25uZWN0aW9uIHBvb2wgaXMgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBjb25uZWN0aW9uIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIHRvIG1lLiB0cnkgdG8gZ2V0IHNvbWUgb3RoZXIgcG9vbGVkIG9yIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnREYkNvbm5PYmooKS5nZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgTk9UIGEgcG9vbGVkIGNvbm5lY3Rpb24uIGNhbiB3ZSBnZXQgb25lPworICAgICAgICAgICAgcmV0dXJuIGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzaXplIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBEYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIGlzIGVuYWJsZWQgd2hlbiB0aGUgYXBwIGNhbGxzCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIGhhbmRsZSBwb29sIGlzIHNldCBieSB0aGUgc3lzdGVtIGJ5IHRha2luZyBpbnRvIGFjY291bnQgdmFyaW91cworICAgICAqIGFzcGVjdHMgb2YgdGhlIGRldmljZSwgc3VjaCBhcyBtZW1vcnksIG51bWJlciBvZiBjb3JlcyBldGMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQKKyAgICAgKiBhcHBsaWNhdGlvbnMgdXNlIHRoZSBkZWZhdWx0IHBvb2wgc2l6ZSBzZXQgYnkgdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIHRoZSB2YWx1ZSB0aGUgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvbm5lY3Rpb25Qb29sU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbm5lY3Rpb24gcG9vbCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgICAgIGludCBpID0gbUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCk7CisgICAgICAgIGlmIChzaXplIDwgaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzZXQgbWF4IHBvb2wgc2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBtYXggdmFsdWUoPSIgKworICAgICAgICAgICAgICAgICAgICBpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvblBvb2wuc2V0TWF4UG9vbFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBjcmVhdGVQb29sQ29ubmVjdGlvbihzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gb3BlbkRhdGFiYXNlKG1QYXRoLCBtRmFjdG9yeSwgbUZsYWdzLCBtRXJyb3JIYW5kbGVyLCBjb25uZWN0aW9uTnVtKTsKKyAgICAgICAgZGIubVBhcmVudENvbm5PYmogPSB0aGlzOworICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0UGFyZW50RGJDb25uT2JqKCkgeworICAgICAgICByZXR1cm4gbVBhcmVudENvbm5PYmo7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUG9vbGVkQ29ubmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubUNvbm5lY3Rpb25OdW0gPiAwOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0RGJDb25uZWN0aW9uKFN0cmluZyBzcWwpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIC8vIE5FVkVSIHdpdGggcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5jb3JyZWN0IGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYW5kbGUgaWYKKyAgICAgICAgLy8gMS4gaWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIHRoZSBvbmdvaW5nIHRyYW5zYWN0aW9uLCBpZiBhbnkKKyAgICAgICAgLy8gMi4gT1IsIGlmIHRoZXJlIGlzIE5PIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2V0dXAKKyAgICAgICAgaWYgKGFtSUluVHJhbnNhY3Rpb24oKSB8fCBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uIGhhbmRsZSBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uUG9vbC5nZXQoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRGJDb25uZWN0aW9uKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aGlzIHJlbGVhc2UgY2FsbCBpZgorICAgICAgICAvLyAxLiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIC8vIDIuIE9SLCBpZiBkYiBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZSBkYXRhYmFzZSBiZWluZyByZWxlYXNlZCBpcyBzYW1lIGFzICd0aGlzJyAodGhpcyBjb25kaXRpb24gbWVhbnMKKyAgICAgICAgLy8gICAgIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBiZSByZWxlYXNpbmcgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUgYnkgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLyAgICAgZnJvbSB0aGUgJ21haW4nIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmICghaXNPcGVuKCkgfHwgIWRiLmlzUG9vbGVkQ29ubmVjdGlvbigpIHx8IChkYiA9PSB0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1Bvb2xlZENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2VEYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVsZWFzaW5nICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnJlbGVhc2UoZGIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IEFMTCBvcGVuIGRhdGFiYXNlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgotICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLiAKKyAgICAgKiBidWdyZXBvcnQgaXMgYSB1c2VyIG9mIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBBcnJheUxpc3Q8RGJTdGF0cz4gZ2V0RGJTdGF0cygpIHsKICAgICAgICAgQXJyYXlMaXN0PERiU3RhdHM+IGRiU3RhdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxEYlN0YXRzPigpOwotICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+IHcgOiBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IG9mIG1BY3RpdmVEYXRhYmFzZXMgLSBzbyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjb21wZXRpbmcKKyAgICAgICAgLy8gZm9yIHN5bmNocm9uaXphdGlvbiBsb2NrIG9uIG1BY3RpdmVEYXRhYmFzZXMKKyAgICAgICAgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiB0ZW1wTGlzdCA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmNvcHkodGVtcExpc3QsIG1BY3RpdmVEYXRhYmFzZXMpOworICAgICAgICB9CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IHRlbXBMaXN0KSB7CiAgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IHcuZ2V0KCk7CiAgICAgICAgICAgICBpZiAoZGIgPT0gbnVsbCB8fCAhZGIuaXNPcGVuKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgotICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRiKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCisgICAgICAgICAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicyhkYik7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBnZXRQcmFnbWFWYWwoZGIsIHAuZmlyc3QgKyAiLnBhZ2VfY291bnQ7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOwogCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOwotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCi0gICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgIlBSQUdNQSAiICsgcC5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIucGFnZV9jb3VudDsiLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkLCBkYi5tTnVtQ2FjaGVIaXRzLCBkYi5tTnVtQ2FjaGVNaXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5tQ29tcGlsZWRRdWVyaWVzLnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBwb29sZWQgY29ubmVjdGlvbnMsIHJldHVybiB0aGUgY2FjaGUgc3RhdHMgZm9yIHRoZW0gYWxzby4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRiLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFNRTGl0ZURhdGFiYXNlIHBEYiA6IGRiLm1Db25uZWN0aW9uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKCIocG9vbGVkICMgIiArIHBEYi5tQ29ubmVjdGlvbk51bSArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdG5vZGUsIDAsIDAsIDAsIHBEYi5tTnVtQ2FjaGVIaXRzLCBwRGIubU51bUNhY2hlTWlzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERiLm1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUuIHdlIGRvbid0IGNhcmUgYWJvdXQgZXhjZXB0aW9ucyB3aGVuIHdlIGFyZSB0YWtpbmcgYWRiCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1Z3JlcG9ydCEKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxOTQsNDQgKzI0NjIsNzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBnZXQgdGhlIHNwZWNpZmllZCBwcmFnbWEgdmFsdWUgZnJvbSBzcWxpdGUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UuCi0gICAgICogb25seSBoYW5kbGVzIHByYWdtYSdzIHRoYXQgcmV0dXJuIGludC9sb25nLgotICAgICAqIE5PIEpBVkEgbG9ja3MgYXJlIGhlbGQgaW4gdGhpcyBtZXRob2QuCi0gICAgICogVE9ETzogdXNlIHRoaXMgdG8gZG8gYWxsIHByYWdtYSdzIGluIHRoaXMgY2xhc3MKKyAgICAgKiBSZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcyBpbmNsdWRpbmcgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiBieSBleGVjdXRpbmcgJ3ByYWdtYSBkYXRhYmFzZV9saXN0JyBvbiB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBvZiBwYWlycyBvZiAoZGF0YWJhc2UgbmFtZSwgZGF0YWJhc2UgZmlsZSBwYXRoKSBvciBudWxsIGlmIHRoZSBkYXRhYmFzZQorICAgICAqIGlzIG5vdCBvcGVuLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0UHJhZ21hVmFsKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgcHJhZ21hKSB7Ci0gICAgICAgIGlmICghZGIuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KGRiLCAiUFJBR01BICIgKyBwcmFnbWEpOwotICAgICAgICAgICAgbG9uZyB2YWwgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgbGlzdCBvZiBmdWxsIHBhdGhuYW1lcyBvZiBhbGwgYXR0YWNoZWQgZGF0YWJhc2VzCi0gICAgICogaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICogVE9ETzogbW92ZSB0aGlzIHRvIHtAbGluayBEYXRhYmFzZVV0aWxzfQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0QXR0YWNoZWREYnMoU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKLSAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgQ3Vyc29yIGMgPSBkYk9iai5yYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oYy5nZXRTdHJpbmcoMSksIGMuZ2V0U3RyaW5nKDIpKSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSByYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7CisgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzcWxpdGUgcmV0dXJucyBhIHJvdyBmb3IgZWFjaCBkYXRhYmFzZSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBvZiBkYXRhYmFzZXMuCisgICAgICAgICAgICAgICAgLy8gICBpbiBlYWNoIHJvdywKKyAgICAgICAgICAgICAgICAvLyAgICAgICAxc3QgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBuYW1lIHN1Y2ggYXMgbWFpbiwgb3IgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHNwZWNpZmllZCBvbiB0aGUgIkFUVEFDSCIgY29tbWFuZAorICAgICAgICAgICAgICAgIC8vICAgICAgIDJuZCBjb2x1bW4gaXMgdGhlIGRhdGFiYXNlIGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjLmNsb3NlKCk7CiAgICAgICAgIHJldHVybiBhdHRhY2hlZERiczsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSdW5zICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgdGhlIGF0dGFjaGVkIGRhdGFiYXNlcykKKyAgICAgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICo8cD4KKyAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCB0aGVuIHRoaXMgbWV0aG9kIGxvZ3MgdGhlIGVycm9ycyByZXBvcnRlZCBieSB0aGUgaW50ZWdyaXR5X2NoZWNrCisgICAgICogY29tbWFuZCBleGVjdXRpb24uCisgICAgICo8cD4KKyAgICAgKiBOb3RlIHRoYXQgJ3ByYWdtYSBpbnRlZ3JpdHlfY2hlY2snIG9uIGEgZGF0YWJhc2UgY2FuIHRha2UgYSBsb25nIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMpIHBhc3MgaW50ZWdyaXR5X2NoZWNrLAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFiYXNlSW50ZWdyaXR5T2soKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicygpOworICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2VsaXN0IGZvcjogIiArIGdldFBhdGgoKSArICIgY291bGRuJ3QgIiArCisgICAgICAgICAgICAgICAgICAgICJiZSByZXRyaWV2ZWQuIHByb2JhYmx5IGJlY2F1c2UgdGhlIGRhdGFiYXNlIGlzIGNsb3NlZCIpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaXNEYXRhYmFzZUNvcnJ1cHQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvZyA9IGNvbXBpbGVTdGF0ZW1lbnQoIlBSQUdNQSAiICsgcC5maXJzdCArICIuaW50ZWdyaXR5X2NoZWNrKDEpOyIpOworICAgICAgICAgICAgICAgIFN0cmluZyByc2x0ID0gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghcnNsdC5lcXVhbHNJZ25vcmVDYXNlKCJvayIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGludGVncml0eV9jaGVja2VyIGZhaWxlZCBvbiBtYWluIG9yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgICAgICAgICBpc0RhdGFiYXNlQ29ycnVwdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2sgb24gIiArIHAuc2Vjb25kICsgIiByZXR1cm5lZDogIiArIHJzbHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0RhdGFiYXNlQ29ycnVwdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBvcGVuIHRoZSBkYXRhYmFzZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCkBAIC0yMjM5LDUxICsyNTM5LDM0IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYm9wZW4oU3RyaW5nIHBhdGgsIGludCBmbGFncyk7CiAKICAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cworICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHRyYWNpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIGNvbm5lY3Rpb24gbnVtYmVyOiAwIC0gTiwgd2hlcmUgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG51bWJlcmVkIDAgYW5kIHRoZSBjb25uZWN0aW9uIGhhbmRsZXMgaW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHBvb2wgYXJlIG51bWJlcmVkIDEuLk4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFRyYWNpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cy4KKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCBwcm9maWxpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzLgogICAgICAqIGN1cnJlbnRseSwgc3FsaXRlJ3MgcHJvZmlsaW5nID0gcHJpbnRpbmcgb2YgZXhlY3V0aW9uLXRpbWUKLSAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBzcWwgc3RhdGVtZW50cywgYXMgdGhleQorICAgICAqICh3YWxsLWNsb2NrIHRpbWUpIG9mIGVhY2ggb2YgdGhlIFNRTCBzdGF0ZW1lbnRzLCBhcyB0aGV5CiAgICAgICogYXJlIGV4ZWN1dGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIGV4ZWN1dGUgYSByYXcgU1FMIHN0YXRlbWVudC4ge0BsaW5rICNsb2NrfSBtdXN0IGJlIGhlbGQKLSAgICAgKiB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3FsIFRoZSByYXcgU1FMIHN0cmluZwotICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgdm9pZCBuYXRpdmVfZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgogICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldCB0aGUgbG9jYWxlLiAge0BsaW5rICNsb2NrfSBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nCiAgICAgICogdGhpcyBtZXRob2QuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRMb2NhbGUoU3RyaW5nIGxvYywgaW50IGZsYWdzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvdyBJRCBvZiB0aGUgbGFzdCByb3cgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByb3cgSUQgb2YgdGhlIGxhc3Qgcm93IGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFkZSBpbiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKFN0cmluZyBsb2MsIGludCBmbGFncyk7CiAKICAgICAvKioKICAgICAgKiByZXR1cm4gdGhlIFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBkb2N1bWVudGVkIGhlcmUKQEAgLTIyOTEsNCArMjU3NCwxMSBAQAogICAgICAqIEByZXR1cm4gaW50IHZhbHVlIG9mIFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKKworICAgIC8qKgorICAgICAqIGZpbmFsaXplcyB0aGUgZ2l2ZW4gc3RhdGVtZW50IGlkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlbWVudElkIHN0YXRlbWVudCB0byBiZSBmaW56bGllZCBieSBzcWxpdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZShpbnQgc3RhdGVtZW50SWQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUyZDgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhyb3duIGlmICB0aGUgZGF0YWJhc2UgZW5naW5lIHdhcyB1bmFibGUgdG8gYWNxdWlyZSB0aGUKKyAqIGRhdGFiYXNlIGxvY2tzIGl0IG5lZWRzIHRvIGRvIGl0cyBqb2IuICBJZiB0aGUgc3RhdGVtZW50IGlzIGEgW0NPTU1JVF0KKyAqIG9yIG9jY3VycyBvdXRzaWRlIG9mIGFuIGV4cGxpY2l0IHRyYW5zYWN0aW9uLCB0aGVuIHlvdSBjYW4gcmV0cnkgdGhlCisgKiBzdGF0ZW1lbnQuICBJZiB0aGUgc3RhdGVtZW50IGlzIG5vdCBhIFtDT01NSVRdIGFuZCBvY2N1cnMgd2l0aGluIGEKKyAqIGV4cGxpY2l0IHRyYW5zYWN0aW9uIHRoZW4geW91IHNob3VsZCByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24gYmVmb3JlCisgKiBjb250aW51aW5nLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjgyNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQppbmRleCA4OWMzZjk2Li45NDk2MDc5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKQEAgLTEzMiwxMSArMTMyLDE2IEBACiAgICAgICAgIC8qKiBkb2N1bWVudGVkIGhlcmUgaHR0cDovL3d3dy5zcWxpdGUub3JnL2MzcmVmL2NfZGJzdGF0dXNfbG9va2FzaWRlX3VzZWQuaHRtbCAqLwogICAgICAgICBwdWJsaWMgaW50IGxvb2thc2lkZTsKIAotICAgICAgICBwdWJsaWMgRGJTdGF0cyhTdHJpbmcgZGJOYW1lLCBsb25nIHBhZ2VDb3VudCwgbG9uZyBwYWdlU2l6ZSwgaW50IGxvb2thc2lkZSkgeworICAgICAgICAvKiogc3RhdGVtZW50IGNhY2hlIHN0YXRzOiBoaXRzL21pc3Nlcy9jYWNoZXNpemUgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBjYWNoZTsKKworICAgICAgICBwdWJsaWMgRGJTdGF0cyhTdHJpbmcgZGJOYW1lLCBsb25nIHBhZ2VDb3VudCwgbG9uZyBwYWdlU2l6ZSwgaW50IGxvb2thc2lkZSwKKyAgICAgICAgICAgIGludCBoaXRzLCBpbnQgbWlzc2VzLCBpbnQgY2FjaGVzaXplKSB7CiAgICAgICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTsKLSAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZSAvIDEwMjQ7CiAgICAgICAgICAgICBkYlNpemUgPSAocGFnZUNvdW50ICogcGFnZVNpemUpIC8gMTAyNDsKICAgICAgICAgICAgIHRoaXMubG9va2FzaWRlID0gbG9va2FzaWRlOworICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGhpdHMgKyAiLyIgKyBtaXNzZXMgKyAiLyIgKyBjYWNoZXNpemU7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQppbmRleCAyMTQ0ZmMzLi5kZTJmY2E5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCkBAIC0zOSwxOCArMzksMTYgQEAKIAogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CiAgICAgICAgIC8vIENvbXBpbGUgdGhlIHF1ZXJ5Ci0gICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQXJnIGJpbmRpbmcKLSAgICAgICAgICAgIGludCBudW1BcmdzID0gc2VsZWN0aW9uQXJncyA9PSBudWxsID8gMCA6IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBxdWVyeS5iaW5kU3RyaW5nKGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgcXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkobURhdGFiYXNlLCBtU3FsLCAwLCBzZWxlY3Rpb25BcmdzKTsKIAogICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXJzb3IKICAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbmV3IFNRTGl0ZUN1cnNvcihtRGF0YWJhc2UsIHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbmV3IFNRTGl0ZUN1cnNvcih0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBmYWN0b3J5Lm5ld0N1cnNvcihtRGF0YWJhc2UsIHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKICAgICAgICAgICAgIH0KQEAgLTYxLDYgKzU5LDcgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBpcyBjbGVhbmVkIHVwIGlmIHNvbWV0aGluZyBoYXBwZW5zCiAgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgcXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjksMTAgKzY4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRCaW5kQXJndW1lbnRzKFN0cmluZ1tdIGJpbmRBcmdzKSB7Ci0gICAgICAgIGZpbmFsIGludCBudW1BcmdzID0gYmluZEFyZ3MubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgbVF1ZXJ5LmJpbmRTdHJpbmcoaSArIDEsIGJpbmRBcmdzW2ldKTsKLSAgICAgICAgfQorICAgICAgICBtUXVlcnkuYmluZEFsbEFyZ3NBc1N0cmluZ3MoYmluZEFyZ3MpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGN1cnNvckRlYWN0aXZhdGVkKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKaW5kZXggYjQ2MTVlYi4uZDhjY2UyMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTUxLDYgKzUzLDcgQEAKIAogICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5pdGlhbGl6aW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KQEAgLTY1LDEyICs2OCwzNyBAQAogICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbikgeworICAgICAgICB0aGlzKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KKyAgICAgKiBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgb3Igb3BlbmVkIHVudGlsIG9uZSBvZgorICAgICAqIHtAbGluayAjZ2V0V3JpdGFibGVEYXRhYmFzZX0gb3Ige0BsaW5rICNnZXRSZWFkYWJsZURhdGFiYXNlfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0byB1c2UgdG8gb3BlbiBvciBjcmVhdGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGZpbGUsIG9yIG51bGwgZm9yIGFuIGluLW1lbW9yeSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IHRvIHVzZSBmb3IgY3JlYXRpbmcgY3Vyc29yIG9iamVjdHMsIG9yIG51bGwgZm9yIHRoZSBkZWZhdWx0CisgICAgICogQHBhcmFtIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSAoc3RhcnRpbmcgYXQgMSk7IGlmIHRoZSBkYXRhYmFzZSBpcyBvbGRlciwKKyAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgIGlmICh2ZXJzaW9uIDwgMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVyc2lvbiBtdXN0IGJlID49IDEsIHdhcyAiICsgdmVyc2lvbik7CisgICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YWJhc2VFcnJvckhhbmRsZXIgcGFyYW0gdmFsdWUgY2FuJ3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbU5hbWUgPSBuYW1lOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CiAgICAgICAgIG1OZXdWZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTExNSwxMCArMTQzLDE0IEBACiAgICAgICAgICAgICBpZiAobU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2UuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnksIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGRiLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID4gbU5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEYXRhYmFzZSAiICsgbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgZG93bmdyYWRlZC4gaW5zdGVhZCwgcGxlYXNlIHVuaW5zdGFsbCBuZXcgdmVyc2lvbiBmaXJzdC4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xOTQsNyArMjI2LDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1Jc0luaXRpYWxpemluZyA9IHRydWU7CiAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG1Db250ZXh0LmdldERhdGFiYXNlUGF0aChtTmFtZSkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFkpOworICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFksCisgICAgICAgICAgICAgICAgICAgIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgaWYgKGRiLmdldFZlcnNpb24oKSAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oIkNhbid0IHVwZ3JhZGUgcmVhZC1vbmx5IGRhdGFiYXNlIGZyb20gdmVyc2lvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldFZlcnNpb24oKSArICIgdG8gIiArIG1OZXdWZXJzaW9uICsgIjogIiArIHBhdGgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNlOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCmluZGV4IDRkOTZmMTIuLjIzMWQ4ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQpAQCAtMTYsMTEgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgY29tcGlsZWQgU1FMaXRlIHByb2dyYW1zLgotICoKKyAqPHA+CiAgKiBTUUxpdGVQcm9ncmFtIGlzIG5vdCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlUHJvZ3JhbSBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVByb2dyYW0uCiAgKi8KQEAgLTQzLDcgKzQ3LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAotICAgIHByb3RlY3RlZCBpbnQgbkhhbmRsZSA9IDA7CisgICAgcHJvdGVjdGVkIGludCBuSGFuZGxlOwogCiAgICAgLyoqCiAgICAgICogdGhlIFNRTGl0ZUNvbXBpbGVkU3FsIG9iamVjdCBmb3IgdGhlIGdpdmVuIHNxbCBzdGF0ZW1lbnQuCkBAIC01Niw0MCArNjAsNzkgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAotICAgIHByb3RlY3RlZCBpbnQgblN0YXRlbWVudCA9IDA7CisgICAgcHJvdGVjdGVkIGludCBuU3RhdGVtZW50OworCisgICAgLyoqCisgICAgICogSW4gdGhlIGNhc2Ugb2Yge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0sIHRoaXMgbWVtYmVyIHN0b3JlcyB0aGUgYmluZGFyZ3MgcGFzc2VkCisgICAgICogdG8gdGhlIGZvbGxvd2luZyBtZXRob2RzLCBpbnN0ZWFkIG9mIGFjdHVhbGx5IGRvaW5nIHRoZSBiaW5kaW5nLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmRCbG9iKGludCwgYnl0ZVtdKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZERvdWJsZShpbnQsIGRvdWJsZSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmRMb25nKGludCwgbG9uZyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmROdWxsKGludCl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmRTdHJpbmcoaW50LCBTdHJpbmcpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIFBhaXIgb2YKKyAgICAgKiA8b2w+CisgICAgICogICA8bGk+YmluZCBhcmcgcG9zaXRpb24gbnVtYmVyPC9saT4KKyAgICAgKiAgIDxsaT50aGUgdmFsdWUgdG8gYmUgYm91bmQgdG8gdGhlIGJpbmRhcmc8L2xpPgorICAgICAqIDwvb2w+CisgICAgICogPHA+CisgICAgICogSXQgaXMgbGF6aWx5IGluaXRpYWxpemVkIGluIHRoZSBhYm92ZSBiaW5kIG1ldGhvZHMKKyAgICAgKiBhbmQgaXQgaXMgY2xlYXJlZCBpbiB7QGxpbmsgI2NsZWFyQmluZGluZ3MoKX0gbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIHByb3RlY3RlZCAoaW4gbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQpIGJ5IHtAbGluayBTUUxpdGVQcm9ncmFtfS50aGlzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBIYXNoTWFwPEludGVnZXIsIE9iamVjdD4gbUJpbmRBcmdzID0gbnVsbDsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIGludCBtU3RhdGVtZW50VHlwZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgewotICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgdGhpcyhkYiwgc3FsLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVByb2dyYW0oU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzLAorICAgICAgICAgICAgYm9vbGVhbiBjb21waWxlRmxhZykgewogICAgICAgICBtU3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgbVN0YXRlbWVudFR5cGUgPSBEYXRhYmFzZVV0aWxzLmdldFNxbFN0YXRlbWVudFR5cGUobVNxbCk7CiAgICAgICAgIGRiLmFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgZGIuYWRkU1FMaXRlQ2xvc2FibGUodGhpcyk7Ci0gICAgICAgIHRoaXMubkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBuSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgaWYgKGJpbmRBcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYmluZEFyZ3MubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZFRvQmluZEFyZ3MoaSArIDEsIGJpbmRBcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcGlsZUZsYWcpIHsKKyAgICAgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOworICAgICAgICB9CisgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGVTcWwoKSB7CiAgICAgICAgIC8vIG9ubHkgY2FjaGUgQ1JVRCBzdGF0ZW1lbnRzCi0gICAgICAgIFN0cmluZyBwcmVmaXhTcWwgPSBtU3FsLnN1YnN0cmluZygwLCA2KTsKLSAgICAgICAgaWYgKCFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiSU5TRVJUIikgJiYgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJVUERBVEUiKSAmJgotICAgICAgICAgICAgICAgICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiUkVQTEFDIikgJiYKLSAgICAgICAgICAgICAgICAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIkRFTEVURSIpICYmICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiU0VMRUNUIikpIHsKLSAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlICE9IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1NFTEVDVCAmJgorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlICE9IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAgICAgICAgICAgICBuU3RhdGVtZW50ID0gbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQ7CiAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGNhY2hlLCBubyBuZWVkIHRvIGFjcXVpcmUoKSBpdC4KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGl0IGlzIG5vdCBwcmFnbWEKLSAgICAgICAgbUNvbXBpbGVkU3FsID0gZGIuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoc3FsKTsKKyAgICAgICAgbUNvbXBpbGVkU3FsID0gbURhdGFiYXNlLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKG1TcWwpOwogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb21waWxlZC1zcWwgb2JqCi0gICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKIAogICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZSBvZiBjb21waWxlZC1zcWxzCiAgICAgICAgICAgICAvLyBidXQgYmVmb3JlIGFkZGluZyBpdCBhbmQgdGh1cyBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBhbnlvbmUgZWxzZSB0byB1c2UgaXQsCiAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgaXQgaXMgYWNxdWlyZWQgYnkgbWUuCiAgICAgICAgICAgICBtQ29tcGlsZWRTcWwuYWNxdWlyZSgpOwotICAgICAgICAgICAgZGIuYWRkVG9Db21waWxlZFF1ZXJpZXMoc3FsLCBtQ29tcGlsZWRTcWwpOworICAgICAgICAgICAgbURhdGFiYXNlLmFkZFRvQ29tcGlsZWRRdWVyaWVzKG1TcWwsIG1Db21waWxlZFNxbCk7CiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJDcmVhdGVkIERiT2JqIChpZCMiICsgbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIHNxbDogIiArIHNxbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3Igc3FsOiAiICsgbVNxbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBpdCBpcyBhbHJlYWR5IGluIGNvbXBpbGVkLXNxbCBjYWNoZS4KQEAgLTEwMCwxMiArMTQzLDEyIEBACiAgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgaGF2ZSB0d28gZGlmZmVyZW50IFNRTGl0ZVByb2dhbSBvYmplY3RzIGNhbid0IHNoYXJlIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgLy8gQ29tcGlsZWRTcWwgb2JqZWN0LiBjcmVhdGUgYSBuZXcgb25lLgogICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplIGl0IHdoZW4gSSBhbSBkb25lIHdpdGggaXQgaW4gInRoaXMiIG9iamVjdC4KLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIioqIHBvc3NpYmxlIGJ1ZyAqKiBDcmVhdGVkIE5FVyBEYk9iaiAoaWQjIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBEYk9iaiAoaWQjIiArIGxhc3QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHdhcyBub3QgcmVsZWFzZWQgZm9yIHNxbDoiICsgc3FsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IHJlbGVhc2VkIGZvciBzcWw6IiArIG1TcWwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGNhY2hlLCBubyBuZWVkIHRvIGFjcXVpcmUoKSBpdC4KICAgICAgICAgICAgIH0KQEAgLTExNiw4ICsxNTksOCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewogICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKLSAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICAgICAgbURhdGFiYXNlLnJlbW92ZVNRTGl0ZUNsb3NhYmxlKHRoaXMpOworICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTI2LDcgKzE2OSw3IEBACiAgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpIHsKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpIHsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEzNSwyMiArMTc4LDM0IEBACiAgICAgICAgICAgICAgICAgLy8gaXQgaXMgTk9UIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4gaS5lLiwgcmVzcG9uc2liaWxpdHkgb2YKICAgICAgICAgICAgICAgICAvLyByZWxlYXNpbmcgdGhpcyBzdGF0ZW1lbnQgaXMgb24gbWUuCiAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBudWxsOwotICAgICAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBpdCBpcyBpbiBjb21waWxlZC1zcWwgY2FjaGUuIHJlc2V0IGl0cyBDb21waWxlZFNxbCNtSW5Vc2UgZmxhZwogICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5yZWxlYXNlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgbUNvbXBpbGVkU3FsID0gbnVsbDsKKyAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZ3JhbQorICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyBtZXRob2QuIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGFjcm9zcyBleGVjdXRpb25zIG9mCisgICAgICogdGhlIFNRTCBzdGF0ZW1lbnQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRVbmlxdWVJZCgpIHsKLSAgICAgICAgcmV0dXJuIG5TdGF0ZW1lbnQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXNlZCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0U3FsU3RhdGVtZW50SWQoKSB7CisgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICByZXR1cm4gKG1Db21waWxlZFNxbCA9PSBudWxsKSA/IDAgOiBuU3RhdGVtZW50OworICAgICAgfQogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldFNxbFN0cmluZygpIHsKQEAgLTE2OSw2ICsyMjQsMzkgQEAKICAgICAgICAgLy8gVE9ETyBpcyB0aGVyZSBhIG5lZWQgZm9yIHRoaXM/CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGJpbmQoaW50IHR5cGUsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGFkZFRvQmluZEFyZ3MoaW5kZXgsICh0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEwpID8gbnVsbCA6IHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChuU3RhdGVtZW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIGJpbmQgb25seSBpZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBjb21waWxlZAorICAgICAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCAoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgKERvdWJsZSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIChMb25nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCAoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmluZCBhIE5VTEwgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCkBAIC0xNzYsMzQgKzI2NCwxOCBAQAogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQgbnVsbCB0bwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9OVUxMLCBpbmRleCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQmluZCBhIGxvbmcgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCi0gICAgICoKKyAgICAgKmFkZFRvQmluZEFyZ3MKICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIHBhcmFtZXRlciB0byBiaW5kCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE0LDE1ICsyODYsNyBAQAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmluZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzYsMTUgKzMwMCw3IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTgsMjkgKzMxNCwyNSBAQAogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0JMT0IsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIGFsbCBleGlzdGluZyBiaW5kaW5ncy4gVW5zZXQgYmluZGluZ3MgYXJlIHRyZWF0ZWQgYXMgTlVMTC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckJpbmRpbmdzKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0aGlzLm5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yODgsMTQgKzM0MCw2OCBAQAogICAgICAqIFJlbGVhc2UgdGhpcyBwcm9ncmFtJ3MgcmVzb3VyY2VzLCBtYWtpbmcgaXQgaW52YWxpZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKG5IYW5kbGUgPT0gMCB8fCAhbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUb0JpbmRBcmdzKGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChtQmluZEFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIG1CaW5kQXJncy5wdXQoaW5kZXgsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpIHsKKyAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBpcyBub3QgY29tcGlsZWQgeWV0LiBjb21waWxlIGl0IG5vdy4KKyAgICAgICAgICAgIGNvbXBpbGVTcWwoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBmb3IgKGludCBpbmRleCA6IG1CaW5kQXJncy5rZXlTZXQoKSkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJpbmRBcmdzLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCAoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsICgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICBCb29sZWFuIGJvb2wgPSAoQm9vbGVhbil2YWx1ZTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoYm9vbCkgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgaWYgKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSl7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgKGJ5dGVbXSkgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYW4gYXJyYXkgb2YgU3RyaW5nIGJpbmRBcmdzLCB0aGlzIG1ldGhvZCBiaW5kcyBhbGwgb2YgdGhlbSBpbiBvbmUgc2luZ2xlIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZEFyZ3MgdGhlIFN0cmluZyBhcnJheSBvZiBiaW5kIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZEFsbEFyZ3NBc1N0cmluZ3MoU3RyaW5nW10gYmluZEFyZ3MpIHsKKyAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IGJpbmRBcmdzLmxlbmd0aDsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmluZFN0cmluZyhpICsgMSwgYmluZEFyZ3NbaV0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCmluZGV4IDkwNWI2NmIuLjYzYThjZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQSBTUUxpdGUgcHJvZ3JhbSB0aGF0IHJlcHJlc2VudHMgYSBxdWVyeSB0aGF0IHJlYWRzIHRoZSByZXN1bHRpbmcgcm93cyBpbnRvIGEgQ3Vyc29yV2luZG93LgpAQCAtMjgsMjggKzI3LDM3IEBACiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVF1ZXJ5LgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlUXVlcnkgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1cnNvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVRdWVyeSI7CiAKICAgICAvKiogVGhlIGluZGV4IG9mIHRoZSB1bmJvdW5kIE9GRlNFVCBwYXJhbWV0ZXIgKi8KLSAgICBwcml2YXRlIGludCBtT2Zmc2V0SW5kZXg7Ci0gICAgCi0gICAgLyoqIEFyZ3MgdG8gYmluZCBvbiByZXF1ZXJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtQmluZEFyZ3M7CisgICAgcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4ID0gMDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBwZXJzaXN0ZW50IHF1ZXJ5IG9iamVjdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UgdGhhdCB0aGlzIHF1ZXJ5IG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIFNRTCBzdHJpbmcgZm9yIHRoaXMgcXVlcnkuIAogICAgICAqIEBwYXJhbSBvZmZzZXRJbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgT0ZGU0VUIHBhcmFtZXRlciwgCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHF1ZXJ5LCBpbnQgb2Zmc2V0SW5kZXgsIFN0cmluZ1tdIGJpbmRBcmdzKSB7CiAgICAgICAgIHN1cGVyKGRiLCBxdWVyeSk7Ci0KICAgICAgICAgbU9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7Ci0gICAgICAgIG1CaW5kQXJncyA9IGJpbmRBcmdzOworICAgICAgICBiaW5kQWxsQXJnc0FzU3RyaW5ncyhiaW5kQXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlIHRvIHJlcGxhY2UgYSBnaXZlbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHRoZSBjdXJyZW50IFF1ZXJ5IG9iamVjdCBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50CisgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlIHRoYXQgdGhpcyBxdWVyeSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgU1FMaXRlUXVlcnl9IHRvIGJlIHJlcGxhY2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgc3VwZXIoZGIsIHF1ZXJ5Lm1TcWwpOworICAgICAgICB0aGlzLm1CaW5kQXJncyA9IHF1ZXJ5Lm1CaW5kQXJnczsKICAgICB9CiAKICAgICAvKioKQEAgLTcyLDExICs4MCw2IEBACiAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHNhZmUgaW4gdGhpcyBzaXR1YXRpb24uIHRoZSBuYXRpdmUgY29kZSB3aWxsIGlnbm9yZSBtYXhSZWFkCiAgICAgICAgICAgICAgICAgaW50IG51bVJvd3MgPSBuYXRpdmVfZmlsbF93aW5kb3cod2luZG93LCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpLCBtT2Zmc2V0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWFkLCBsYXN0UG9zKTsKLQotICAgICAgICAgICAgICAgIC8vIExvZ2dpbmcKLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmlsbFdpbmRvdygpOiAiICsgbVNxbCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwogICAgICAgICAgICAgICAgIHJldHVybiBudW1Sb3dzOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpewpAQCAtMTQxLDUxICsxNDQsMTMgQEAKICAgICAgKiBDYWxsZWQgYnkgU1FMaXRlQ3Vyc29yIHdoZW4gaXQgaXMgcmVxdWVyaWVkLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXF1ZXJ5KCkgewotICAgICAgICBpZiAobUJpbmRBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW4gPSBtQmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLmJpbmRTdHJpbmcoaSArIDEsIG1CaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJtU3FsICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChtQmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGxlYWtQcm9ncmFtID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBsZWFrUHJvZ3JhbTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZXF1ZXJ5aW5nIGEgY2xvc2VkIGN1cnNvciIpOwogICAgICAgICB9CisgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IG51bGw7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZE51bGwoaW5kZXgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmRMb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IERvdWJsZS50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZERvdWJsZShpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRTdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSB2YWx1ZTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kU3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCAKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2ZpbGxfd2luZG93KEN1cnNvcldpbmRvdyB3aW5kb3csCiAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsIGludCBvZmZzZXRQYXJhbSwgaW50IG1heFJlYWQsIGludCBsYXN0UG9zKTsKIAogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfY29sdW1uX2NvdW50KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYzM2M2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQppbmRleCA5ZTQyNWMzLi45N2UzOWQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uQmxvY2tHdWFyZDsKQEAgLTI1LDQ0ICsyNiw2MiBAQAogICogVGhlIHN0YXRlbWVudCBjYW5ub3QgcmV0dXJuIG11bHRpcGxlIHJvd3MsIGJ1dCAxeDEgcmVzdWx0IHNldHMgYXJlIGFsbG93ZWQuCiAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfQotICoKKyAqPHA+CiAgKiBTUUxpdGVTdGF0ZW1lbnQgaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVTdGF0ZW1lbnQgZnJvbSBtdWx0aXBsZQogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVTdGF0ZW1lbnQuCiAgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiBwdWJsaWMgY2xhc3MgU1FMaXRlU3RhdGVtZW50IGV4dGVuZHMgU1FMaXRlUHJvZ3JhbQogeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVBRCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBXUklURSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtT3JpZ0RiOworICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKKyAgICAvKiogcG9zc2libGUgdmFsdWUgZm9yIHtAbGluayAjbVN0YXRlfS4gaW5kaWNhdGVzIHRoYXQgYSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkLn0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNfU1RBUlRFRCA9IDE7CisgICAgLyoqIHBvc3NpYmxlIHZhbHVlIGZvciB7QGxpbmsgI21TdGF0ZX0uIGluZGljYXRlcyB0aGF0IGEgbG9jayBpcyBhY3F1aXJlZC59ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfQUNRVUlSRUQgPSAyOworCiAgICAgLyoqCiAgICAgICogRG9uJ3QgdXNlIFNRTGl0ZVN0YXRlbWVudCBjb25zdHJ1Y3RvciBkaXJlY3RseSwgcGxlYXNlIHVzZQogICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9CiAgICAgICogQHBhcmFtIGRiCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN1cGVyKGRiLCBzcWwpOworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgeworICAgICAgICBzdXBlcihkYiwgc3FsLCBiaW5kQXJncywgZmFsc2UgLyogZG9uJ3QgY29tcGlsZSBzcWwgc3RhdGVtZW50ICovKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoaXMgU1FMIHN0YXRlbWVudCwgaWYgaXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLAotICAgICAqIENSRUFURSBUQUJMRSwgREVMVEUsIElOU0VSVCwgZXRjLgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBTRUxFQ1QgLyBJTlNFUlQgLyBERUxFVEUgLyBVUERBVEUsIGZvciBleGFtcGxlCisgICAgICogQ1JFQVRFIC8gRFJPUCB0YWJsZSwgdmlldywgdHJpZ2dlciwgaW5kZXggZXRjLgogICAgICAqCiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvcgogICAgICAqICAgICAgICAgc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIGV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKKyAgICB9CiAKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGUoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiB0aGUgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGV4ZWN0aW9uIG9mIHRoaXMgU1FMCisgICAgICogc3RhdGVtZW50IGlzIG9mIGFueSBpbXBvcnRhbmNlIHRvIHRoZSBjYWxsZXIgLSBmb3IgZXhhbXBsZSwgVVBEQVRFIC8gREVMRVRFIFNRTCBzdGF0ZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgdGhpcyBTUUwgc3RhdGVtZW50IGV4ZWN1dGlvbi4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCisgICAgICogICAgICAgICBzb21lIHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soV1JJVEUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ2hhbmdlcyA9IG5hdGl2ZV9leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bUNoYW5nZXM7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzYsMjEgKzk1LDE1IEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGV4ZWN1dGVJbnNlcnQoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gKG1EYXRhYmFzZS5sYXN0Q2hhbmdlQ291bnQoKSA+IDApID8gbURhdGFiYXNlLmxhc3RJbnNlcnRSb3coKSA6IC0xOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbGFzdEluc2VydGVkUm93SWQgPSBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0SW5zZXJ0ZWRSb3dJZDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMsMjEgKzExNiwxNSBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzaW1wbGVRdWVyeUZvckxvbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMCwyNSArMTM3LDExMSBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBtZXRob2QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZXhlY3V0aW5nIGEgU1FMIHN0YXRlbWVudCwKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPm1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgb3BlbjwvbGk+CisgICAgICogICA8bGk+Z2V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wsaWYgcG9zc2libGU8L2xpPgorICAgICAqICAgPGxpPm5vdGlmaWVzIHtAbGluayBCbG9ja0d1YXJkfSBvZiByZWFkL3dyaXRlPC9saT4KKyAgICAgKiAgIDxsaT5pZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiB1cGRhdGUsIHN0YXJ0IHRyYW5zYWN0aW9uIGlmIG5vdCBhbHJlYWR5IGluIG9uZS4KKyAgICAgKiAgIG90aGVyd2lzZSwgZ2V0IGxvY2sgb24gdGhlIGRhdGFiYXNlPC9saT4KKyAgICAgKiAgIDxsaT5hY3F1aXJlIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdDwvbGk+CisgICAgICogICA8bGk+YW5kIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgX2JlZm9yZV8gdGhlIGRhdGFiYXNlIGxvY2sgd2FzIGFjcXVpcmVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgbVN0YXRlID0gMDsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUKSA/IG1EYXRhYmFzZQorICAgICAgICAgICAgICAgIDogbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbihtU3FsKTsKKyAgICAgICAgLy8gdXNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9idGFpbmVkIGFib3ZlCisgICAgICAgIG1PcmlnRGIgPSBtRGF0YWJhc2U7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIGlmIChyd0ZsYWcgPT0gV1JJVEUpIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mIFNRTGl0ZURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqIHdlIGtub3cgaXQgaXMgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKSBmcm9tIHRoZSBjYWxsZXIgSUYgdGhlcmUgaXMgbm8gbG9jayBoZWxkLgorICAgICAgICAgKiBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbiBTUUxpdGVEYXRhYmFzZSBjYWxsIGxvY2tGb3JjZWQoKSBiZWZvcmUKKyAgICAgICAgICogY2FsbGluZyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0JFR0lOKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBpcyAgTk9UIHN0YXJ0ZWQgYnkgY2FsbGluZyBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbgorICAgICAgICAgICAgICAgIC8vIFNRTGl0ZURhdGFiYXNlCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgLy8gZ290IHVwZGF0ZSBTUUwgc3RhdGVtZW50LiBpZiB0aGVyZSBpcyBOTyBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzdGFydCBvbmUKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVFJBTlNfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBJIGhhdmUgZGF0YWJhc2UgbG9jaz8gaWYgbm90LCBncmFiIGl0LgorICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICB9CisKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG1ldGhvZCByZWxlYXNlcyBsb2NrcyBhbmQgcmVmZXJlbmNlcyBhY3F1aXJlZCBpbiB7QGxpbmsgI2FjcXVpcmVBbmRMb2NrKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gVFJBTlNfU1RBUlRFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCB8fAorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FCT1JUKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UucmVzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhckJpbmRpbmdzKCk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgc28gdGhhdCB0aGUgY2FsbGVyJ3MgU1FMaXRlU3RhdGVtZW50IG5vIGxvbmdlcgorICAgICAgICAvLyBoYXMgYSBoYXJkIHJlZmVyZW5jZSB0byBhIGRhdGFiYXNlIG9iamVjdCB0aGF0IG1heSBnZXQgZGVhbGxvY2F0ZWQgYXQgYW55IHBvaW50LgorICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKKyAgICAgICAgLy8gcmVzdG9yZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCisgICAgICAgIG1EYXRhYmFzZSA9IG1PcmlnRGI7CisgICAgICAgIG5IYW5kbGUgPSBtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIG5hdGl2ZV9leGVjdXRlSW5zZXJ0KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfMXgxX2xvbmcoKTsKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmF0aXZlXzF4MV9zdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3OGRmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuamF2YQppbmRleCA3MDUxOWZmLi5hYWYzODk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50LmphdmEKQEAgLTg0LDE0ICs4NCwxNCBAQAogICAgICAqIHNlbnNvciBpdHNlbGYgKDxiPkZzPC9iPikgdXNpbmcgdGhlIHJlbGF0aW9uOgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiA8Yj48Y2VudGVyPkFkID0gLSC3RnMgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtICYjODcyMTtGcyAvIG1hc3M8L2NlbnRlcj48L2I+CiAgICAgICogCiAgICAgICogPHA+CiAgICAgICogSW4gcGFydGljdWxhciwgdGhlIGZvcmNlIG9mIGdyYXZpdHkgaXMgYWx3YXlzIGluZmx1ZW5jaW5nIHRoZSBtZWFzdXJlZAogICAgICAqIGFjY2VsZXJhdGlvbjoKICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogPGI+PGNlbnRlcj5BZCA9IC1nIC0gt0YgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtZyAtICYjODcyMTtGIC8gbWFzczwvY2VudGVyPjwvYj4KICAgICAgKiAKICAgICAgKiA8cD4KICAgICAgKiBGb3IgdGhpcyByZWFzb24sIHdoZW4gdGhlIGRldmljZSBpcyBzaXR0aW5nIG9uIGEgdGFibGUgKGFuZCBvYnZpb3VzbHkgbm90CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCmluZGV4IDU3MjcxZDQuLjEwMjhmOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCkBAIC01NSw2ICs1NSwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfU1RBVEUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSI7CiAKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBhdHRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QgVVNCIGJ1cy4KKyAgICAgKiBUaGUgaW50ZW50J3MgZGF0YSBjb250YWlucyBhIFVyaSBmb3IgdGhlIGRldmljZSBpbiB0aGUgTVRQIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIjsKKworICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogIEEgYnJvYWRjYXN0IGZvciBVU0IgY2FtZXJhIGRldGFjaGVkIGV2ZW50LgorICAgICAqCisgICAgICogVGhpcyBpbnRlbnQgaXMgc2VudCB3aGVuIGEgVVNCIGRldmljZSBzdXBwb3J0aW5nIFBUUCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9ERVRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCI7CisKICAgICAvKioKICAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCmluZGV4IDRiNDg0MDkuLmFiNWM3OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKQEAgLTExMjgsNyArMTEyOCw5IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gb25Nb2RpZmllZFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgbWUsIGJvb2xlYW4gcG9zc2libGVQb2x5KSB7CiAgICAgICAgIGludCB0b3VjaFggPSAoaW50KSBtZS5nZXRYKCkgLSBtUGFkZGluZ0xlZnQ7Ci0gICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgKyBtVmVydGljYWxDb3JyZWN0aW9uIC0gbVBhZGRpbmdUb3A7CisgICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaWYgKHRvdWNoWSA+PSAtbVZlcnRpY2FsQ29ycmVjdGlvbikKKyAgICAgICAgICAgIHRvdWNoWSArPSBtVmVydGljYWxDb3JyZWN0aW9uOwogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gbWUuZ2V0QWN0aW9uKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gbWUuZ2V0RXZlbnRUaW1lKCk7CiAgICAgICAgIG1PbGRFdmVudFRpbWUgPSBldmVudFRpbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCAyODBkZWQ2Li42MzM1Mjk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTUyNCw1ICs1MjQsMjAgQEAKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBURVRIRVJfRVJST1JfU0VSVklDRV9VTkFWQUlMOwogICAgICAgICB9Ci0gICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoZSBkZXZpY2Ugc3RheXMgYXdha2UgdW50aWwgd2UgY29ubmVjdCB3aXRoIHRoZSBuZXh0IG5ldHdvcmsKKyAgICAgKiBAcGFyYW0gZm9yV2hvbWUgVGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgZ29pbmcgZG93biBmb3IgbG9nZ2luZyBwdXJwb3NlcworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soZm9yV2hvbSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQppbmRleCBmZDMzNzgxLi5kZGRlNWMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCkBAIC00MzAsMTEgKzQzMCwxMCBAQAogCiAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVyaSwgRE9XTkxPQURTX1BST0pFQ1RJT04sIG51bGwgLyogc2VsZWN0aW9uICovLCBudWxsIC8qIHNlbGVjdGlvbiBhcmdzICovLAotICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOworICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShkb3dubG9hZFVyaSwgRE9XTkxPQURTX1BST0pFQ1RJT04sIG51bGwgLyogc2VsZWN0aW9uICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNlbGVjdGlvbiBhcmdzICovLCBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCAhYy5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKaW5kZXggYjA1YzJlZC4uNWExNGNjOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKQEAgLTcyLDQgKzcyLDYgQEAKICAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlVXNiUmVnZXhzKCk7CiAKICAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOworCisgICAgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhpbiBTdHJpbmcgZm9yV2hvbSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAyMTQ1MTBkLi5lZmJjY2QyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTIyLDEyICsyMiwxNSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOSw3ICs0Miw3IEBACiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9iaWxlRGF0YVN0YXRlVHJhY2tlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwpAQCAtNDgsMTAgKzUxLDE5IEBACiAgICAgcHJpdmF0ZSBJVGVsZXBob255IG1QaG9uZVNlcnZpY2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZVRvV2F0Y2hGb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwbk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTmV0d29ya1Byb3BlcnRpZXMgbU5ldHdvcmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHYXRld2F5QWRkciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKKworICAgIC8vIERFRkFVTFQgYW5kIEhJUFJJIGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uLiAgSWYgd2UncmUgb25lIG9mIHRoZXNlIHdlIG5lZWQgdG8gY2hlY2sgaWYKKyAgICAvLyB0aGUgb3RoZXIgaXMgYWxzbyBkaXNjb25uZWN0ZWQgYmVmb3JlIHdlIHJlc2V0IHNvY2tldHMKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGVmYXVsdE9ySGlwcmkgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyCkBAIC02MiwyNCArNzQsMjAgQEAKICAgICAgKiBAcGFyYW0gdGFnIHRoZSBuYW1lIG9mIHRoaXMgbmV0d29yawogICAgICAqLwogICAgIHB1YmxpYyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQsIGludCBuZXRUeXBlLCBTdHJpbmcgdGFnKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHRhcmdldCwgbmV0VHlwZSwKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0VHlwZSwKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZSgpLCB0YWcsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGVOYW1lKCkpOwogICAgICAgICBtQXBuVHlwZSA9IG5ldHdvcmtUeXBlVG9BcG5UeXBlKG5ldFR5cGUpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhtQXBuVHlwZSwgUGhvbmUuQVBOX1RZUEVfSElQUkkpKSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gbUFwblR5cGU7CisgICAgICAgIGlmIChuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUgfHwKKyAgICAgICAgICAgICAgICBuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkpIHsKKyAgICAgICAgICAgIG1Jc0RlZmF1bHRPckhpcHJpID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIG1QaG9uZVNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZihuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KIAotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5ldGgwLmRuczEiLApAQCAtOTAsNyArOTgsNDUgQEAKICAgICAgICAgICAgICAgICAibmV0LmdwcnMuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5wcHAwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMyIn07CisgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCisgICAgICogbmV0d29yayBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zUHJvcE5hbWVzKCkgeworICAgICAgICByZXR1cm4gc0Ruc1Byb3BOYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdEdhdGV3YXlBZGRyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMiwxMzMgKzE0OCwxMzkgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRUQpOwogCi0gICAgICAgIG1TdGF0ZVJlY2VpdmVyID0gbmV3IE1vYmlsZURhdGFTdGF0ZVJlY2VpdmVyKCk7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gZ2V0TW9iaWxlRGF0YVN0YXRlKGludGVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpLCBmaWx0ZXIpOworICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICB9CiAKLSAgICBwcml2YXRlIFBob25lLkRhdGFTdGF0ZSBnZXRNb2JpbGVEYXRhU3RhdGUoSW50ZW50IGludGVudCkgewotICAgICAgICBTdHJpbmcgc3RyID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSk7Ci0gICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICBpZiAoaXNBcG5UeXBlSW5jbHVkZWQoYXBuVHlwZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVudW0udmFsdWVPZihQaG9uZS5EYXRhU3RhdGUuY2xhc3MsIHN0cik7Ci0gICAgICAgICAgICB9CisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSByb2FtaW5nIHN0YXR1cyBvZiB0aGUgZGV2aWNlLCBhbmQgaWYgaXQgaXMgYSBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMKKyAgICAgKiBzdGF0dXMsIHNlbmQgYSBub3RpZmljYXRpb24gdG8gYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gaXNSb2FtaW5nIHtAY29kZSB0cnVlfSBpZiB0aGUgZGV2aWNlIGlzIG5vdyByb2FtaW5nLCB7QGNvZGUgZmFsc2V9CisgICAgICogaWYgaXQgaXMgbm8gbG9uZ2VyIHJvYW1pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFJvYW1pbmdTdGF0dXMoYm9vbGVhbiBpc1JvYW1pbmcpIHsKKyAgICAgICAgaWYgKGlzUm9hbWluZyAhPSBtTmV0d29ya0luZm8uaXNSb2FtaW5nKCkpIHsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRSb2FtaW5nKGlzUm9hbWluZyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9ST0FNSU5HX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUluY2x1ZGVkKFN0cmluZyB0eXBlTGlzdCkgewotICAgICAgICAvKiBjb21tYSBzZXBlcmF0ZWQgbGlzdCAtIHNwbGl0IGFuZCBjaGVjayAqLwotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBTdHJpbmdbXSBsaXN0ID0gdHlwZUxpc3Quc3BsaXQoIiwiKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKGxpc3RbaV0sIG1BcG5UeXBlVG9XYXRjaEZvcikgfHwKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGxpc3RbaV0sIFBob25lLkFQTl9UWVBFX0FMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBwcml2YXRlIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CisgICAgICAgIGlmIChtTmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgaW50IG9sZFN1YnR5cGUgPSBtTmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOworICAgICAgICAgICAgaWYgKHN1YnR5cGUgIT0gb2xkU3VidHlwZSkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRTdWJ0eXBlKHN1YnR5cGUsIHN1YnR5cGVOYW1lKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VELCBvbGRTdWJ0eXBlLCAwLCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgSUNvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gZ2V0TW9iaWxlRGF0YVN0YXRlKGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZUxpc3QgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgbUFwbk5hbWUgPSBhcG5OYW1lOworICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwblR5cGVMaXN0LiAgSXQncyBhbGwgdGhlIHNhbWUgcmFkaW8vbmV0d29yawotICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcm5lYXRoCi0gICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghdW5hdmFpbGFibGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBlbmFibGVkIGJ1dCB0aGUgQVBOIFR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNvcmQgdGhlIGludGVyZmFjZSBuYW1lIGlmIG9uZSdzIHByb3ZpZGVkLiAgSWYgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiB0aGlzIG5ldHdvcmsgd2Ugd2lsbCBuZWVkIHRoZSBpbnRlcmZhY2VuYW1lIGJ1dCB3b24ndCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZyZXNoIGNvbm5lY3RlZCBtZXNzYWdlIC0gVE9ETyBmaXggdGhpcyB3aGVuIHdlIGdldCBwZXItQVBOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInJlcGxhY2luZyBvbGQgbUludGVyZmFjZU5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIG1BcG5UeXBlICsgIiBSZWNlaXZlZCBzdGF0ZT0gIiArIHN0YXRlICsgIiwgb2xkPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhcG5UeXBlTGlzdD0gIiArIGFwblR5cGVMaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1vYmlsZURhdGFTdGF0ZSAhPSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGRvIHRoaXMgaGVyZSAtIENvbm5lY3Rpdml0eVNlcnZpY2UgbmVlZHMgaXQgdG8gY2xlYXIgc3R1ZmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoREJHKSBMb2cuZChUQUcsICJjbGVhcmluZyBtSW50ZXJmYWNlTmFtZSBmb3IgIisgbUFwblR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbURlZmF1bHRHYXRld2F5QWRkciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuU1VTUEVOREVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgaW50ZXJmYWNlIG5hbWUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKyAiIGJyb2FkY2FzdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgc2V0Um9hbWluZ1N0YXR1cyh0bS5pc05ldHdvcmtSb2FtaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldFN1YnR5cGUodG0uZ2V0TmV0d29ya1R5cGUoKSwgdG0uZ2V0TmV0d29ya1R5cGVOYW1lKCkpOworICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IEVudW0udmFsdWVPZihQaG9uZS5EYXRhU3RhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfS0VZKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKKworICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghdW5hdmFpbGFibGUpOworCisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOworCisgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NoZWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0Nvbm5lY3RlZCgpID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9SZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZ28gYWhlYWQgd2l0aCB0aGUgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY29udGFjdCBDb25uU2VydmljZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc2V0ICYmIG1OZXR3b3JrUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IG1OZXR3b3JrUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBjaGVjayB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgdGhvdWdoIC0ganVzdCBsZWF2ZSBpdCB0byBiZSByZWZyZXNoZWQgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICIgYXMgaXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuREFUQV9ORVRXT1JLX1BST1BFUlRJRVNfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU5ldHdvcmtQcm9wZXJ0aWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgbmV0d29yayBwcm9wZXJ0aWVzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnJvYWRjYXN0IiArIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOworICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIHJlYXNvbiwgYXBuTmFtZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBzZXRSb2FtaW5nU3RhdHVzKHRtLmlzTmV0d29ya1JvYW1pbmcoKSk7CisgICAgICAgICAgICBzZXRTdWJ0eXBlKHRtLmdldE5ldHdvcmtUeXBlKCksIHRtLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzIwLDcwICszNzIsODggQEAKICAgICAvKioKICAgICAgKiBUZWFyIGRvd24gbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LCBpLmUuLCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZQogICAgICAqIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb25zLgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCByZXR1cm4gbm90aGluZz8KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgLy8gc2luY2Ugd2Ugd29uJ3QgZ2V0IGEgbm90aWZpY2F0aW9uIGN1cnJlbnRseSAoVE9ETyAtIHBlciBBUE4gbm90aWZpY2F0aW9ucykKLSAgICAgICAgLy8gd2Ugd29uJ3QgZ2V0IGEgZGlzY29ubmVjdCBtZXNzYWdlIHVudGlsIGFsbCBBUE4ncyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uJ3MKLSAgICAgICAgLy8gQVBOIGxpc3QgYXJlIGRpc2FibGVkLiAgVGhhdCBtZWFucyBwcml2YXRlUm91dGVzIGZvciBETlMgYW5kIHN1Y2ggd2lsbCByZW1haW4gb24gLQotICAgICAgICAvLyBub3QgYSBwcm9ibGVtIHNpbmNlIHRoYXQncyBhbGwgc2hhcmVkIHdpdGggd2hhdGV2ZXIgb3RoZXIgQVBOIGlzIHN0aWxsIG9uLCBidXQKLSAgICAgICAgLy8gdWdseS4KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQodHJ1ZSk7CiAgICAgICAgIHJldHVybiAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCBmYWxzZSkgIT0gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCisgICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCisgICAgICogYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKKyAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIKKyAgICAgICAgICAgICAgICArIG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgKyAiIGFuZCBuZXcgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KKyAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQorICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlLWVuYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCBhbHdheXMgZ2V0IGEgbm90aWZpY2F0aW9uPwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOyAvL2Nvbm5lY3RlZCBvciBleHBlY3QgdG8gYmU/CiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgc3dpdGNoIChzZXRFbmFibGVBcG4obUFwblR5cGUsIHRydWUpKSB7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9BTFJFQURZX0FDVElWRToKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBnZXQgcGVyLWFwbiBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2V0IHNlbGYgdG8gQ09OTkVDVElORyBzbyB0aGUgYmVsb3cgbWVzc2FnZSBpcyBoYW5kbGVkLgotICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VELCBudWxsKTsKLSAgICAgICAgICAgICAgICAvL3NlbmQgb3V0IGEgY29ubmVjdGVkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0tFWSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVksIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgbUFwblR5cGVUb1dhdGNoRm9yKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBtQXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlUmVjZWl2ZXIgIT0gbnVsbCkgbVN0YXRlUmVjZWl2ZXIub25SZWNlaXZlKG1Db250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyAtIHdlJ3JlIGFscmVhZHkgZHVlIHNvbWUgc3RhdHVzIHVwZGF0ZSBpbnRlbnRzCisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCAmJiBtQXBuVHlwZSA9PSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9uIHN0YXJ0dXAgd2UgbWF5IHRyeSB0byB0YWxrIHRvIHRoZSBwaG9uZSBiZWZvcmUgaXQncyByZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGhvbmUgd2lsbCBjb21lIHVwIGVuYWJsZWQsIGdvIHdpdGggdGhhdC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgYWxzbyBjb21lcyB1cCBvbiB0ZWxlcGhvbnkgY3Jhc2g6IGlmIHdlIHRoaW5rIG1vYmlsZSBkYXRhIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhbmQgdGhlIHRlbGVwaG9ueSBzdHVmZiBjcmFzaGVzIGFuZCBoYXMgdG8gcmVzdGFydCBpdCB3aWxsIGNvbWUgdXAKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCAobWFraW5nIGEgZGF0YSBjb25uZWN0aW9uKS4gIFdlIHdpbGwgdGhlbiBiZSBvdXQgb2Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgLy8gQSBwb3NzaWJsZSBzb2x1dGlvbiBpcyBhIGJyb2FkY2FzdCB3aGVuIHRlbGVwaG9ueSByZXN0YXJ0cy4KLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQgbWF5IGJlIG9mZiBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBBaXJwbGFuZU1vZGUgb3IgRS1DYWxsIG9yIHdoYXRldmVyLi4KLSAgICAgICAgICAgICAgICBpZiAobUFwblR5cGUgIT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVjb25uZWN0IC0gdW5leHBlY3RlZCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU2LDI2ICs1MjYsNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgSW50ZWdlci50b0hleFN0cmluZyhob3N0QWRkcmVzcykgKwotICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUgKyAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgaG9zdEFkZHJlc3MgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcykgPT0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1vYmlsZSBkYXRhIHN0YXRlOiAiKTsKQEAgLTUzNyw0ICs1ODcsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbU5ldHdvcmtQcm9wZXJ0aWVzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKaW5kZXggNjQ5Y2I4Yy4uNWY1ZTExYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCBTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBpbnQgbU5ldHdvcmtUeXBlOwogICAgIHByaXZhdGUgaW50IG1TdWJ0eXBlOwogICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlTmFtZTsKQEAgLTEyMSw3ICsxMjEsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUpIHt9CiAKLSAgICBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewogICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKHR5cGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5ldHdvcmsgdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CkBAIC0xNDEsNyArMTQ0LDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya1R5cGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1OZXR3b3JrVHlwZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTUwLDEyICsxNTUsMTYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHN1YnR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBtU3VidHlwZSA9IHN1YnR5cGU7Ci0gICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlID0gc3VidHlwZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQsNyArMTczLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Miw3ICsxODMsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgc3VidHlwZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VidHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTg1LDcgKzE5OCw5IEBACiAgICAgICogb2YgYmVpbmcgZXN0YWJsaXNoZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTk0LDcgKzIwOSw5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV0d29yayBjb25uZWN0aXZpdHkgZXhpc3RzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxMCw3ICsyMjcsOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXR3b3JrIGlzIGF2YWlsYWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0F2YWlsYWJsZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzQXZhaWxhYmxlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjAsNyArMjM5LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzQXZhaWxhYmxlKGJvb2xlYW4gaXNBdmFpbGFibGUpIHsKLSAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIzMSw3ICsyNTIsOSBAQAogICAgICAqIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxvdmVyKCkgewotICAgICAgICByZXR1cm4gbUlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsNyArMjY0LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvdmVyKGJvb2xlYW4gaXNGYWlsb3ZlcikgewotICAgICAgICBtSXNGYWlsb3ZlciA9IGlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzRmFpbG92ZXIgPSBpc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTEsMTEgKzI3NiwxNSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJvYW1pbmcgaXMgaW4gZWZmZWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvYW1pbmcoKSB7Ci0gICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRSb2FtaW5nKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIG1Jc1JvYW1pbmcgPSBpc1JvYW1pbmc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzUm9hbWluZyA9IGlzUm9hbWluZzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjYzLDcgKzI5Miw5IEBACiAgICAgICogQHJldHVybiB0aGUgY29hcnNlLWdyYWluZWQgc3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjcxLDcgKzMwMiw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmluZS1ncmFpbmVkIHN0YXRlCiAgICAgICovCiAgICAgcHVibGljIERldGFpbGVkU3RhdGUgZ2V0RGV0YWlsZWRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXRhaWxlZFN0YXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjgxLDEyICszMTQsMTUgQEAKICAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBleHRyYUluZm8gYW4gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGFkZGRpdGlvbmFsIG5ldHdvcmsgc3RhdGUKICAgICAgKiBpbmZvcm1hdGlvbiBwYXNzZWQgdXAgZnJvbSB0aGUgbG93ZXIgbmV0d29ya2luZyBsYXllcnMuCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOwotICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKLSAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOwotICAgICAgICB0aGlzLm1FeHRyYUluZm8gPSBleHRyYUluZm87CisgICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB0aGlzLm1EZXRhaWxlZFN0YXRlID0gZGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOworICAgICAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOworICAgICAgICAgICAgdGhpcy5tRXh0cmFJbmZvID0gZXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTUsNyArMzMxLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZWFzb24gZm9yIGZhaWx1cmUsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgewotICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzA1LDIwICszNDMsMjQgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRFeHRyYUluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5ldHdvcmtJbmZvOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInR5cGU6ICIpLmFwcGVuZChnZXRUeXBlTmFtZSgpKS5hcHBlbmQoIlsiKS5hcHBlbmQoZ2V0U3VidHlwZU5hbWUoKSkuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJdLCBzdGF0ZTogIikuYXBwZW5kKG1TdGF0ZSkuYXBwZW5kKCIvIikuYXBwZW5kKG1EZXRhaWxlZFN0YXRlKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGV4dHJhOiAiKS5hcHBlbmQobUV4dHJhSW5mbyA9PSBudWxsID8gIihub25lKSIgOiBtRXh0cmFJbmZvKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcm9hbWluZzogIikuYXBwZW5kKG1Jc1JvYW1pbmcpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgaXNBdmFpbGFibGU6ICIpLmFwcGVuZChtSXNBdmFpbGFibGUpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOZXR3b3JrSW5mbzogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKGdldFR5cGVOYW1lKCkpLmFwcGVuZCgiWyIpLmFwcGVuZChnZXRTdWJ0eXBlTmFtZSgpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiXSwgc3RhdGU6ICIpLmFwcGVuZChtU3RhdGUpLmFwcGVuZCgiLyIpLmFwcGVuZChtRGV0YWlsZWRTdGF0ZSkuCisgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCisgICAgICAgICAgICBhcHBlbmQoIiwgZXh0cmE6ICIpLmFwcGVuZChtRXh0cmFJbmZvID09IG51bGwgPyAiKG5vbmUpIiA6IG1FeHRyYUluZm8pLgorICAgICAgICAgICAgYXBwZW5kKCIsIHJvYW1pbmc6ICIpLmFwcGVuZChtSXNSb2FtaW5nKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBpc0F2YWlsYWJsZTogIikuYXBwZW5kKG1Jc0F2YWlsYWJsZSk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzQsMTcgKzM3NiwxOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobU5ldHdvcmtUeXBlKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVR5cGVOYW1lKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU5hbWUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1EZXRhaWxlZFN0YXRlLm5hbWUoKSk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRmFpbG92ZXIgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1JvYW1pbmcgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVJlYXNvbik7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUludChtTmV0d29ya1R5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UeXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRGV0YWlsZWRTdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNGYWlsb3ZlciA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNSb2FtaW5nID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUmVhc29uKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQcm9wZXJ0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5haWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK3BhcmNlbGFibGUgTmV0d29ya1Byb3BlcnRpZXM7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyYTJkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXR3b3JrIGludGVyZmFjZSBvciBzaW5nbGUgYWRkcmVzcworICogb2YgYW4gaW50ZXJmYWNlLgorICogVE9ETyAtIGNvbnNpZGVyIGFkZGluZyBvcHRpb25hbCBmaWVsZHMgbGlrZSBBcG4gYW5kIEFwblR5cGUKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrUHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIG1JZmFjZTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IG1BZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtRG5zZXM7CisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtR2F0ZXdheTsKKyAgICBwcml2YXRlIFByb3h5UHJvcGVydGllcyBtSHR0cFByb3h5OworCisgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzKCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbnRlcmZhY2UoTmV0d29ya0ludGVyZmFjZSBpZmFjZSkgeworICAgICAgICBtSWZhY2UgPSBpZmFjZTsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBOZXR3b3JrSW50ZXJmYWNlIGdldEludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JZmFjZTsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChtSWZhY2UgPT0gbnVsbCA/IG51bGwgOiBtSWZhY2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQWRkcmVzcyhJbmV0QWRkcmVzcyBhZGRyZXNzKSB7CisgICAgICAgIG1BZGRyZXNzZXMuYWRkKGFkZHJlc3MpOworICAgIH0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGdldEFkZHJlc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRyZXNzZXM7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZERucyhJbmV0QWRkcmVzcyBkbnMpIHsKKyAgICAgICAgbURuc2VzLmFkZChkbnMpOworICAgIH0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGdldERuc2VzKCkgeworICAgICAgICByZXR1cm4gbURuc2VzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRHYXRld2F5KEluZXRBZGRyZXNzIGdhdGV3YXkpIHsKKyAgICAgICAgbUdhdGV3YXkgPSBnYXRld2F5OworICAgIH0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEluZXRBZGRyZXNzIGdldEdhdGV3YXkoKSB7CisgICAgICAgIHJldHVybiBtR2F0ZXdheTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SHR0cFByb3h5KFByb3h5UHJvcGVydGllcyBwcm94eSkgeworICAgICAgICBtSHR0cFByb3h5ID0gcHJveHk7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJveHlQcm9wZXJ0aWVzIGdldEh0dHBQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIG1IdHRwUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSWZhY2UgPSBudWxsOworICAgICAgICBtQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbURuc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbUdhdGV3YXkgPSBudWxsOworICAgICAgICBtSHR0cFByb3h5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgaWZhY2VOYW1lID0gKG1JZmFjZSA9PSBudWxsID8gIiIgOiAiSW50ZXJmYWNlTmFtZTogIiArIG1JZmFjZS5nZXROYW1lKCkgKyAiICIpOworCisgICAgICAgIFN0cmluZyBpcCA9ICJJcEFkZHJlc3NlczogWyI7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IG1BZGRyZXNzZXMpIGlwICs9ICBhZGRyLnRvU3RyaW5nKCkgKyAiLCI7CisgICAgICAgIGlwICs9ICJdICI7CisKKyAgICAgICAgU3RyaW5nIGRucyA9ICJEbnNBZGRyZXNzZXM6IFsiOworICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGFkZHIgOiBtRG5zZXMpIGRucyArPSBhZGRyLnRvU3RyaW5nKCkgKyAiLCI7CisgICAgICAgIGRucyArPSAiXSAiOworCisgICAgICAgIFN0cmluZyBwcm94eSA9IChtSHR0cFByb3h5ID09IG51bGwgPyAiIiA6ICJIdHRwUHJveHk6ICIgKyBtSHR0cFByb3h5LnRvU3RyaW5nKCkgKyAiICIpOworICAgICAgICBTdHJpbmcgZ2F0ZXdheSA9IChtR2F0ZXdheSA9PSBudWxsID8gIiIgOiAiR2F0ZXdheTogIiArIG1HYXRld2F5LnRvU3RyaW5nKCkgKyAiICIpOworCisgICAgICAgIHJldHVybiBpZmFjZU5hbWUgKyBpcCArIGdhdGV3YXkgKyBkbnMgKyBwcm94eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGdldEludGVyZmFjZU5hbWUoKSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUFkZHJlc3Nlcy5zaXplKCkpOworICAgICAgICAvL1RPRE86IGV4cGxvcmUgYW4gZWFzeSBhbHRlcm5hdGl2ZSB0byBwcmVzZXJ2ZSBob3N0bmFtZQorICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGEgbG9va3VwCisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBhIDogbUFkZHJlc3NlcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShhLmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZUludChtRG5zZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yKEluZXRBZGRyZXNzIGQgOiBtRG5zZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkoZC5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtR2F0ZXdheSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkobUdhdGV3YXkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgICAgIGlmIChtSHR0cFByb3h5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobUh0dHBQcm94eSwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPE5ldHdvcmtQcm9wZXJ0aWVzPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IENyZWF0b3I8TmV0d29ya1Byb3BlcnRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgbmV0UHJvcCA9IG5ldyBOZXR3b3JrUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRJbnRlcmZhY2UoTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoaWZhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhZGRyZXNzQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZHJlc3NDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyZXNzQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZHJlc3NDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEh0dHBQcm94eSgoUHJveHlQcm9wZXJ0aWVzKWluLnJlYWRQYXJjZWxhYmxlKG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldFByb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrUHJvcGVydGllc1tzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCmluZGV4IDFmYjAxNDQuLjgyNzM1ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsMzUzICsxNiwxMDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQogLyoqCi0gKiBFYWNoIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlIG9mIGNvbm5lY3Rpdml0eQotICogb2YgYSBuZXR3b3JrIGludGVyZmFjZS4gQWxsIHN0YXRlIGluZm9ybWF0aW9uIGZvciBhIG5ldHdvcmsgc2hvdWxkCi0gKiBiZSBrZXB0IGluIGEgVHJhY2tlciBjbGFzcy4gVGhpcyBzdXBlcmNsYXNzIG1hbmFnZXMgdGhlCi0gKiBuZXR3b3JrLXR5cGUtaW5kZXBlbmRlbnQgYXNwZWN0cyBvZiBuZXR3b3JrIHN0YXRlLgorICogSW50ZXJmYWNlIGZvciBjb25uZWN0aXZpdHkgc2VydmljZSB0byBhY3Qgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIEFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXR3b3JrIHNob3VsZCBiZSBrZXB0IGluIGEgVHJhY2tlciBjbGFzcy4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgbmV0d29yay10eXBlLWluZGVwZW5kZW50IGZ1bmN0aW9ucyB0aGF0IHNob3VsZAorICogYmUgaW1wbGVtZW50ZWQgYnkgdGhlIFRyYWNrZXIgY2xhc3MuCiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV0d29ya1N0YXRlVHJhY2tlciBleHRlbmRzIEhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtVGFyZ2V0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1EbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKK3B1YmxpYyBpbnRlcmZhY2UgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVEFURV9DSEFOR0VEID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFID0gMjsKICAgICAvKioKICAgICAgKiBhcmcxOiAxIHRvIHNob3csIDAgdG8gaGlkZQogICAgICAqIGFyZzI6IElEIG9mIHRoZSBub3RpZmljYXRpb24KICAgICAgKiBvYmo6IE5vdGlmaWNhdGlvbiAoaWYgc2hvd2luZykKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX0NIQU5HRUQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUk9BTUlOR19DSEFOR0VEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUksgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLID0gNzsKIAotICAgIHB1YmxpYyBOZXR3b3JrU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIEhhbmRsZXIgdGFyZ2V0LAotICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlLAotICAgICAgICAgICAgaW50IHN1YlR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBOZXR3b3JrSW5mbyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKTsKIAotICAgICAgICB0aGlzLm1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhuZXR3b3JrVHlwZSwgc3ViVHlwZSwgdHlwZU5hbWUsIHN1YnR5cGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya0luZm87Ci0gICAgfQorICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtQcm9wZXJ0aWVzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcwogICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgbW9iaWxlIGRhdGEKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lU2VydmVyTGlzdChtRG5zUHJvcE5hbWVzKTsKLSAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoaXMKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcwotICAgICAqIGdpdmUgdGhlIElQIGFkZHJlc3Nlcy4gUHJvcGVydGllcyB3aXRoIG5vIHZhbHVlcyBhcmUgc2tpcHBlZC4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAY29kZSBTdHJpbmd9cyBjb250YWluaW5nIHRoZSBJUCBhZGRyZXNzZXMKLSAgICAgKiBvZiB0aGUgRE5TIHNlcnZlcnMsIGluIGRvdC1ub3RhdGlvbi4gVGhpcyBtYXkgaGF2ZSBmZXdlcgotICAgICAqIG5vbi1udWxsIGVudHJpZXMgdGhhbiB0aGUgbGlzdCBvZiBuYW1lcyBwYXNzZWQgaW4sIHNpbmNlCi0gICAgICogc29tZSBvZiB0aGUgcGFzc2VkLWluIG5hbWVzIG1heSBoYXZlIGVtcHR5IHZhbHVlcy4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCBTdHJpbmdbXSBnZXROYW1lU2VydmVyTGlzdChTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGRuc0FkZHJlc3NlcyA9IG5ldyBTdHJpbmdbcHJvcGVydHlOYW1lcy5sZW5ndGhdOwotICAgICAgICBpbnQgaSwgajsKLQotICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZXNbaV0pOwotICAgICAgICAgICAgLy8gVGhlIEdTTSBsYXllciBzb21ldGltZXMgc2V0cyBhIGJvZ3VzIEROUyBzZXJ2ZXIgYWRkcmVzcyBvZgotICAgICAgICAgICAgLy8gMC4wLjAuMAotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkgJiYgIVRleHRVdGlscy5lcXVhbHModmFsdWUsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNbaisrXSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkbnNBZGRyZXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIHRoaXMgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIrbVByaXZhdGVEbnNSb3V0ZVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIW1Qcml2YXRlRG5zUm91dGVTZXQpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJTdHJpbmcgOiBnZXROYW1lU2VydmVycygpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFkZHIgPSBOZXR3b3JrVXRpbHMubG9va3VwSG9zdChhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkciAhPSAtMSAmJiBhZGRyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiICBhZGRpbmcgIithZGRyU3RyaW5nKyIgKCIrYWRkcisiKSIpOwotICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBhZGRyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAotICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAoKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChtRGVmYXVsdEdhdGV3YXlBZGRyICE9IDApICYmCi0gICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgbURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuc2V0RGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBtRGVmYXVsdFJvdXRlU2V0ID09IHRydWUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBtRGVmYXVsdFJvdXRlU2V0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcwotICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQotICAgICAqIHdpZGUgdXNlCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7Ci0KLSAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCi0gICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOwotICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpOwogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgd2FrZWxvY2ssIGlmIGFueSwgdGhhdCBtYXkgYmUgaGVsZCB3aGlsZSBoYW5kbGluZyBhCi0gICAgICogZGlzY29ubmVjdCBvcGVyYXRpb24uCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCi0gICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCi0gICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKLSAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBJbmRpY2F0ZSB0ZWFyIGRvd24gcmVxdWVzdGVkIGZyb20gY29ubmVjdGl2aXR5CiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKTsKIAogICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICogQ2hlY2sgaWYgdGVhciBkb3duIHdhcyByZXF1ZXN0ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKTsKIAotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9Ci0gICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCi0gICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIrbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSsiIGFuZCBuZXcgc3RhdGU9IitzdGF0ZSk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCi0gICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKLSAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOwotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgewotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgewotICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZW5kIGEgIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSByZXN1bHRzIG9mIGEgc2NhbiBmb3IgbmV0d29yayBhY2Nlc3MKLSAgICAgKiBwb2ludHMgaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIHJvYW1pbmcgc3RhdHVzIG9mIHRoZSBkZXZpY2UsIGFuZCBpZiBpdCBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cwotICAgICAqIHN0YXR1cywgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBpc1JvYW1pbmcge0Bjb2RlIHRydWV9IGlmIHRoZSBkZXZpY2UgaXMgbm93IHJvYW1pbmcsIHtAY29kZSBmYWxzZX0KLSAgICAgKiBpZiBpdCBpcyBubyBsb25nZXIgcm9hbWluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSb2FtaW5nU3RhdHVzKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIGlmIChpc1JvYW1pbmcgIT0gbU5ldHdvcmtJbmZvLmlzUm9hbWluZygpKSB7Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0Um9hbWluZyhpc1JvYW1pbmcpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfUk9BTUlOR19DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIGlmIChtTmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaW50IG9sZFN1YnR5cGUgPSBtTmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOwotICAgICAgICAgICAgaWYgKHN1YnR5cGUgIT0gb2xkU3VidHlwZSkgewotICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRTdWJ0eXBlKHN1YnR5cGUsIHN1YnR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VELCBvbGRTdWJ0eXBlLCAwLCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOwogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB0ZWFyZG93biBvY2N1cnJlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGUKICAgICAgKiB0ZWFyZG93biBkaWQgbm90IG9jY3VyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRlYXJkb3duKCk7CisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKTsKIAogICAgIC8qKgogICAgICAqIFJlZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdlJ3JlIGNvbm5lY3RlZCBvciBleHBlY3QgdG8gYmUgY29ubmVjdGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCk7CiAKICAgICAvKioKICAgICAgKiBUdXJuIHRoZSB3aXJlbGVzcyByYWRpbyBvZmYgZm9yIGEgbmV0d29yay4KICAgICAgKiBAcGFyYW0gdHVybk9uIHtAY29kZSB0cnVlfSB0byB0dXJuIHRoZSByYWRpbyBvbiwge0Bjb2RlIGZhbHNlfQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGlzIG5ldHdvcmsgaXMgYXZhaWxhYmxlIGZvcgogICAgICAqIGNvbm5lY3Rpb25zLiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gbWVhbnMgdGhhdCBzb21lIHF1YXNpLXBlcm1hbmVudAogICAgICAqIGNvbmRpdGlvbiBwcmV2ZW50cyBjb25uZWN0aXZpdHkgdG8gdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bwpAQCAtMzc2LDcgKzEzMCw3IEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKQEAgLTM5MCwyMyArMTQ0LDYgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJwcmV0cyBzY2FuIHJlc3VsdHMuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYSBzYWZlIHRpbWUgZm9yCi0gICAgICogcHJvY2Vzc2luZywgYW5kIGZyb20gYSBzYWZlIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICB9CisgICAgcHVibGljIGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCmluZGV4IGEzYWUwMWIuLjU2NGJjMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKQEAgLTMyLDEzICszMiwzNyBAQAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBkaXNhYmxlSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKIAogICAgIC8qKiBBZGQgYSByb3V0ZSB0byB0aGUgc3BlY2lmaWVkIGhvc3QgdmlhIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGFkZEhvc3RSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGhvc3RhZGRyKTsKKyAgICBwdWJsaWMgc3RhdGljIGludCBhZGRIb3N0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIEluZXRBZGRyZXNzIGhvc3RhZGRyKSB7CisgICAgICAgIGludCB2NEludCA9IHY0U3RyaW5nVG9JbnQoaG9zdGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgIGlmICh2NEludCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUsIHY0SW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGFkZEhvc3RSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGhvc3RhZGRyKTsKIAogICAgIC8qKiBBZGQgYSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBzZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBnd2F5QWRkcik7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBJbmV0QWRkcmVzcyBnd2F5QWRkcikgeworICAgICAgICBpbnQgdjRJbnQgPSB2NFN0cmluZ1RvSW50KGd3YXlBZGRyLmdldEhvc3RBZGRyZXNzKCkpOworICAgICAgICBpZiAodjRJbnQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldERlZmF1bHRSb3V0ZU5hdGl2ZShpbnRlcmZhY2VOYW1lLCB2NEludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBzZXREZWZhdWx0Um91dGVOYXRpdmUoU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBob3N0YWRkcik7CiAKICAgICAvKiogUmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisgICAgICAgIGludCBhZGRyID0gZ2V0RGVmYXVsdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyh2NEludFRvQXJyYXkoYWRkcikpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKICAgICAvKiogUmVtb3ZlIGhvc3Qgcm91dGVzIHRoYXQgdXNlcyB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCByZW1vdmVIb3N0Um91dGVzKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKQEAgLTEwNSwyNyArMTI5LDMwIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGJvb2xlYW4gY29uZmlndXJlTmF0aXZlKAogICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGlwQWRkcmVzcywgaW50IG5ldG1hc2ssIGludCBnYXRld2F5LCBpbnQgZG5zMSwgaW50IGRuczIpOwogCi0gICAgLyoqCi0gICAgICogTG9vayB1cCBhIGhvc3QgbmFtZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYW4gaW50LiBXb3JrcyBpZiB0aGUgYXJndW1lbnQKLSAgICAgKiBpcyBhbiBJUCBhZGRyZXNzIGluIGRvdCBub3RhdGlvbi4gT2J2aW91c2x5LCB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIElQdjQKLSAgICAgKiBhZGRyZXNzZXMuCi0gICAgICogQHBhcmFtIGhvc3RuYW1lIHRoZSBuYW1lIG9mIHRoZSBob3N0IChvciB0aGUgSVAgYWRkcmVzcykKLSAgICAgKiBAcmV0dXJuIHRoZSBJUCBhZGRyZXNzIGFzIGFuIHtAY29kZSBpbnR9IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvb2t1cEhvc3QoU3RyaW5nIGhvc3RuYW1lKSB7Ci0gICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzOworICAgIC8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgZ2x1ZSB0byB0aWUgdGhlIG9sZCBpbnQtYmFzZWQgYWRkcmVzcyBzY2hlbWUKKyAgICAvLyB0byB0aGUgbmV3IEluZXRBZGRyZXNzIHNjaGVtZS4gIFRoZXkgc2hvdWxkIGdvIGF3YXkgd2hlbiB3ZSBnbyBmdWxseSB0byBJbmV0QWRkcmVzcworICAgIC8vIFRPRE8gLSByZW1vdmUgd2hlbiB3ZSBzd2l0Y2ggZnVsbHkgdG8gSW5ldEFkZHJlc3MKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB2NEludFRvQXJyYXkoaW50IGFkZHIpIHsKKyAgICAgICAgYnl0ZVtdIGFkZHJCeXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgICBhZGRyQnl0ZXNbMF0gPSAoYnl0ZSkoYWRkciAmIDB4ZmYpOworICAgICAgICBhZGRyQnl0ZXNbMV0gPSAoYnl0ZSkoKGFkZHIgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgYWRkckJ5dGVzWzJdID0gKGJ5dGUpKChhZGRyID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBhZGRyQnl0ZXNbM10gPSAoYnl0ZSkoKGFkZHIgPj4gMjQpICYgMHhmZik7CisgICAgICAgIHJldHVybiBhZGRyQnl0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgdjRTdHJpbmdUb0ludChTdHJpbmcgc3RyKSB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBTdHJpbmdbXSBhcnJheSA9IHN0ci5zcGxpdCgiXFwuIik7CisgICAgICAgIGlmIChhcnJheS5sZW5ndGggIT0gNCkgcmV0dXJuIDA7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQoYXJyYXlbM10pOworICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMl0pOworICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMV0pOworICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMF0pOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGFkZHJCeXRlczsKLSAgICAgICAgaW50IGFkZHI7Ci0gICAgICAgIGFkZHJCeXRlcyA9IGluZXRBZGRyZXNzLmdldEFkZHJlc3MoKTsKLSAgICAgICAgYWRkciA9ICgoYWRkckJ5dGVzWzNdICYgMHhmZikgPDwgMjQpCi0gICAgICAgICAgICAgICAgfCAoKGFkZHJCeXRlc1syXSAmIDB4ZmYpIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKChhZGRyQnl0ZXNbMV0gJiAweGZmKSA8PCA4KQotICAgICAgICAgICAgICAgIHwgIChhZGRyQnl0ZXNbMF0gJiAweGZmKTsKLSAgICAgICAgcmV0dXJuIGFkZHI7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQppbmRleCAyMmMzMGE1Li5lMmU0ZDJjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQpAQCAtMTYsMzIgKzE2LDE2MiBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CisKIC8qKgogICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgYWNjZXNzaW5nIHRoZSB1c2VyIGFuZCBkZWZhdWx0IHByb3h5CiAgKiBzZXR0aW5ncy4KICAqLwotZmluYWwgcHVibGljIGNsYXNzIFByb3h5IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm94eSB7CiAKICAgICAvLyBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgZXh0cmEgZGVidWdnaW5nLgotICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBQUk9YWV9DSEFOR0VfQUNUSU9OID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DSEFOR0VfQUNUSU9OID0KICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QUk9YWV9DSEFOR0UiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVhZFdyaXRlTG9jayBzUHJveHlJbmZvTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXR0aW5nc09ic2VydmVyIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm94eVNwZWMgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisKKyAgICAvLyBIb3N0bmFtZSAvIElQIFJFR0VYIHZhbGlkYXRpb24KKyAgICAvLyBNYXRjaGVzIGJsYW5rIGlucHV0LCBpcHMsIGFuZCBkb21haW4gbmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9JUF9SRUdFWCA9CisgICAgICAgICJbYS16QS1aMC05XSsoXFwtW2EtekEtWjAtOV0rKSooXFwuW2EtekEtWjAtOV0rKFxcLVthLXpBLVowLTldKykqKSoiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1ROQU1FX1JFR0VYUCA9ICJeJHxeIiArIE5BTUVfSVBfUkVHRVggKyAiJCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEhPU1ROQU1FX1BBVFRFUk47CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTExJU1RfUkVHRVhQID0gIiR8XiguPyIgKyBOQU1FX0lQX1JFR0VYCisgICAgICAgICsgIikrKCwoLj8iICsgTkFNRV9JUF9SRUdFWCArICIpKSokIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRVhDTExJU1RfUEFUVEVSTjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEhPU1ROQU1FX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoSE9TVE5BTUVfUkVHRVhQKTsKKyAgICAgICAgRVhDTExJU1RfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShFWENMTElTVF9SRUdFWFApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5U3BlYyB7CisgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwcm94eUFkZHJlc3MgPSBudWxsOworICAgICAgICBwdWJsaWMgUHJveHlTcGVjKCkgeyB9OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVUkxJbkV4Y2x1c2lvbkxpc3RSZWFkTG9ja2VkKFN0cmluZyB1cmwsIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgIFN0cmluZyB1cmxEb21haW4gPSB1LmdldEhvc3QoKTsKKyAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBpcyBkZWZpbmVkIGFzICIuYW5kcm9pZC5jb20iIG9yICJhbmRyb2lkLmNvbSIsIHdlIHdpc2ggdG8gbWF0Y2gKKyAgICAgICAgLy8gaHR0cDovL2FuZHJvaWQuY29tIGFzIHdlbGwgYXMgaHR0cDovL3h4eC5hbmRyb2lkLmNvbSAsIGJ1dCBub3QKKyAgICAgICAgLy8gaHR0cDovL215YW5kcm9pZC5jb20gLiBUaGlzIGNvZGUgd29ya3Mgb3V0IHRoZSBsb2dpYy4KKyAgICAgICAgZm9yIChTdHJpbmcgZXhjbHVkZWREb21haW4gOiBleGNsdXNpb25MaXN0KSB7CisgICAgICAgICAgICBTdHJpbmcgZG90RG9tYWluID0gIi4iICsgZXhjbHVkZWREb21haW47CisgICAgICAgICAgICBpZiAodXJsRG9tYWluLmVxdWFscyhleGNsdWRlZERvbWFpbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZW5kc1dpdGgoZG90RG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIG1hdGNoCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2VIb3N0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3h5U3BlYy5zdWJzdHJpbmcoMCwgaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlUG9ydChTdHJpbmcgcHJveHlTcGVjKSB7CisgICAgICAgIGludCBpID0gcHJveHlTcGVjLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByb3h5U3BlYy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGkgPCBwcm94eVNwZWMubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHByb3h5U3BlYy5zdWJzdHJpbmcoaSsxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdGhlIFVSTCBnaXZlbiBhcyBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgaG9zdC4KKyAgICAgKiBAcGFyYW0gdXJsIEEgVVJMIHRvIGJlIGFjY2Vzc2VkLiBVc2VkIHRvIGV2YWx1YXRlIGV4Y2x1c2lvbiBsaXN0LgorICAgICAqIEByZXR1cm4gUHJveHkgKGphdmEubmV0KSBvYmplY3QgY29udGFpbmluZyB0aGUgaG9zdCBuYW1lLiBJZiB0aGUKKyAgICAgKiAgICAgICAgIHVzZXIgZGlkIG5vdCBzZXQgYSBob3N0bmFtZSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IGhvc3QuCisgICAgICogICAgICAgICBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCBubyBob3N0IGlzIHRvIGJlIHVzZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0UHJveHkoQ29udGV4dCBjdHgsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGphdmEubmV0LlByb3h5IHJldHZhbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBQcm94eSBkZWZpbmVkIC0gQXBwbHkgZXhjbHVzaW9uIHJ1bGVzCisgICAgICAgICAgICAgICAgaWYgKGlzVVJMSW5FeGNsdXNpb25MaXN0UmVhZExvY2tlZCh1cmwsIHNHbG9iYWxQcm94eVNwZWMuZXhjbHVzaW9uTGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIG5vIHByb3h5CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5uZXQuUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZS5IVFRQLCBzR2xvYmFsUHJveHlTcGVjLnByb3h5QWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBuZXR3b3JrIGlzIFdpRmksIHJldHVybiBubyBwcm94eS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgTW9iaWxlIE9wZXJhdG9yIHByb3h5LgorICAgICAgICAgICAgICAgIGlmICghaXNOZXR3b3JrV2lmaShjdHgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGdldERlZmF1bHRQcm94eSh1cmwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXR2YWwgIT0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFkpICYmIChpc0xvY2FsSG9zdCh1cmwpKSkgeworICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJveHkgaG9zdCBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgaG9zdC4KQEAgLTQ5LDYwICsxNzksNTUgQEAKICAgICAgKiAgICAgICAgIG5hbWUgaXQgcmV0dXJucyB0aGUgZGVmYXVsdCBob3N0LiBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCBubwogICAgICAqICAgICAgICAgaG9zdCBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldEhvc3QoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRIb3N0KENvbnRleHQgY3R4KSB7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDAsIGkpOworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gc0dsb2JhbFByb3h5U3BlYy5wcm94eUFkZHJlc3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEhvc3QoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRIb3N0KCk7CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHByb3h5IHBvcnQgc2V0IGJ5IHRoZSB1c2VyLgogICAgICAqIEBwYXJhbSBjdHggQSBDb250ZXh0IHVzZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIHByb3h5IHBvcnQuCiAgICAgICogQHJldHVybiBUaGUgcG9ydCBudW1iZXIgdG8gdXNlIG9yIC0xIGlmIG5vIHByb3h5IGlzIHRvIGJlIHVzZWQuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBpbnQgZ2V0UG9ydChDb250ZXh0IGN0eCkgewotICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb250ZW50UmVzb2x2ZXIpOwotICAgICAgICBTdHJpbmcgaG9zdCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGkgPSBob3N0LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhvc3QubGVuZ3RoKCkgPT0gMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRQb3J0KENvbnRleHQgY3R4KSB7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IGhvc3QubGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gc0dsb2JhbFByb3h5U3BlYy5wcm94eUFkZHJlc3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhLmdldFBvcnQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKGkrMSkpOworICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRQb3J0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0UG9ydCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IGhvc3Qgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhvc3QgbmFtZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHByb3h5IGZvcgogICAgICAqIHRoaXMgY2Fycmllci4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKICAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgIGlmICgoaG9zdCAhPSBudWxsKSAmJiAoaG9zdC5sZW5ndGgoKSAhPSAwKSkgewogICAgICAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UoaG9zdCk7CiAgICAgICAgICAgICBob3N0ID0gdS5nZXRIb3N0KCk7CiAgICAgICAgICAgICByZXR1cm4gaG9zdDsKQEAgLTExMSwxNCArMjM2LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBwcm94eSBwb3J0IHNwZWNpZmllZCBieSB0aGUgY2Fycmllci4KICAgICAgKiBAcmV0dXJuIFRoZSBwb3J0IG51bWJlciB0byBiZSB1c2VkIHdpdGggdGhlIHByb3h5IGhvc3Qgb3IgLTEgaWYgdGhlcmUgaXMKICAgICAgKiBubyBwcm94eSBmb3IgdGhpcyBjYXJyaWVyLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgaW50IGdldERlZmF1bHRQb3J0KCkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldERlZmF1bHRQb3J0KCkgewogICAgICAgICBTdHJpbmcgaG9zdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJuZXQuZ3Bycy5odHRwLXByb3h5Iik7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpICE9IDApKSB7CiAgICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKICAgICAgICAgICAgIHJldHVybiB1LmdldFBvcnQoKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNiw2ICsyNTIsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5IGdldERlZmF1bHRQcm94eShTdHJpbmcgdXJsKSB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgd2lsbCBnbyBhd2F5IHdoZW4gaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkIGZyb20gQ29ubmVjdGl2aXR5TWFuYWdlci4uLgorICAgICAgICAvLyBUaGVyZSBhcmUgYnJvYWRjYXN0IG9mIG5ldHdvcmsgcHJveGllcywgc28gdGhleSBhcmUgcGFyc2UgbWFudWFsbHkuCisgICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpICE9IDApKSB7CisgICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgamF2YS5uZXQuUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZS5IVFRQLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3ModS5nZXRIb3N0KCksIHUuZ2V0UG9ydCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmdW5jdGlvbiAvIGRlcHJlY2F0ZQogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMuIFRoaXMgaXMgYSB3cmFwcGVyCiAgICAgICogYXJvdW5kIHtAbGluayBhbmRyb2lkLm5ldC5Qcm94eSNnZXRIb3N0KCl9LiBDdXJyZW50bHkgbm8gcHJveHkgd2lsbApAQCAtMTM4LDI2ICsyNzgsMjMgQEAKICAgICAgKiBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUKICAgICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgcHJveHkgdG8gYmUgdXNlZCBieSBjbGllbnRzLCBvciBudWxsIGlmIHRoZXJlCiAgICAgICogaXMgbm8gcHJveHkuCi0gICAgICoKICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBIdHRwSG9zdCBnZXRQcmVmZXJyZWRIdHRwSG9zdChDb250ZXh0IGNvbnRleHQsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIdHRwSG9zdCBnZXRQcmVmZXJyZWRIdHRwSG9zdChDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICghaXNMb2NhbEhvc3QodXJsKSAmJiAhaXNOZXR3b3JrV2lmaShjb250ZXh0KSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3h5SG9zdCA9IFByb3h5LmdldEhvc3QoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBIb3N0KHByb3h5SG9zdCwgUHJveHkuZ2V0UG9ydChjb250ZXh0KSwgImh0dHAiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgamF2YS5uZXQuUHJveHkgcHJlZlByb3h5ID0gZ2V0UHJveHkoY29udGV4dCwgdXJsKTsKKyAgICAgICAgaWYgKHByZWZQcm94eS5lcXVhbHMoamF2YS5uZXQuUHJveHkuTk9fUFJPWFkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gKEluZXRTb2NrZXRBZGRyZXNzKXByZWZQcm94eS5hZGRyZXNzKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBIb3N0KHNhLmdldEhvc3ROYW1lKCksIHNhLmdldFBvcnQoKSwgImh0dHAiKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNMb2NhbEhvc3QoU3RyaW5nIHVybCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNMb2NhbEhvc3QoU3RyaW5nIHVybCkgewogICAgICAgICBpZiAodXJsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSh1cmwpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhvc3QgPSB1cmkuZ2V0SG9zdCgpOwpAQCAtMTc0LDE1ICszMTEsMTMgQEAKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlleCkgewogICAgICAgICAgICAgLy8gSWdub3JlIChVUkkuY3JlYXRlKQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTmV0d29ya1dpZmkoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotCiAgICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgY29ubmVjdGl2aXR5ID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpCiAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIGlmIChjb25uZWN0aXZpdHkgIT0gbnVsbCkgewpAQCAtMTkyLDcgKzMyNywxMjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci19OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIFNldHRpbmdzT2JzZXJ2ZXIoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKGN0eC5nZXRNYWluTG9vcGVyKCkpKTsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY3R4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQobUNvbnRleHQpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChDb250ZXh0IGN0eCkgeworICAgICAgICBVcmkgdXJpR2xvYmFsUHJveHkgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKKyAgICAgICAgVXJpIHVyaUdsb2JhbEV4Y2xMaXN0ID0KKyAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QpOworCisgICAgICAgIC8vIE5vIGxvY2sgdXBncmFkaW5nIChmcm9tIHJlYWQgdG8gd3JpdGUpIGFsbG93ZWQKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIoY3R4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERvd25ncmFkaW5nIGxvY2tzIChmcm9tIHdyaXRlIHRvIHJlYWQpIGlzIGFsbG93ZWQKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHVyaUdsb2JhbFByb3h5LCBmYWxzZSwKKyAgICAgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIpOworICAgICAgICBjdHguZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpR2xvYmFsRXhjbExpc3QsIGZhbHNlLAorICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgU3RyaW5nIHByb3h5SG9zdCA9ICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7CisgICAgICAgIGlmICgocHJveHlIb3N0ID09IG51bGwpIHx8IChwcm94eUhvc3QubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHNpZ25hbAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdFNwZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisgICAgICAgIFN0cmluZyBob3N0ID0gcGFyc2VIb3N0KHByb3h5SG9zdCk7CisgICAgICAgIGludCBwb3J0ID0gcGFyc2VQb3J0KHByb3h5SG9zdCk7CisgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG5ldyBQcm94eVNwZWMoKTsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMucHJveHlBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpOworICAgICAgICAgICAgaWYgKChleGNsdXNpb25MaXN0U3BlYyAhPSBudWxsKSAmJiAoZXhjbHVzaW9uTGlzdFNwZWMubGVuZ3RoKCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBleGNsdXNpb25MaXN0RW50cmllcyA9IGV4Y2x1c2lvbkxpc3RTcGVjLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9jZXNzZWRFbnRyaWVzID0gbmV3IFN0cmluZ1tleGNsdXNpb25MaXN0RW50cmllcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVzaW9uTGlzdEVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5ID0gZXhjbHVzaW9uTGlzdEVudHJpZXNbaV0udHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiLiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFbnRyaWVzW2ldID0gZW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMuZXhjbHVzaW9uTGlzdCA9IHByb2Nlc3NlZEVudHJpZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMuZXhjbHVzaW9uTGlzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHN5bnRheCBvZiBob3N0bmFtZSwgcG9ydCBhbmQgZXhjbHVzaW9uIGxpc3QgZW50cmllcworICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoU3RyaW5nIGhvc3RuYW1lLCBTdHJpbmcgcG9ydCwgU3RyaW5nIGV4Y2xMaXN0KSB7CisgICAgICAgIE1hdGNoZXIgbWF0Y2ggPSBIT1NUTkFNRV9QQVRURVJOLm1hdGNoZXIoaG9zdG5hbWUpOworICAgICAgICBNYXRjaGVyIGxpc3RNYXRjaCA9IEVYQ0xMSVNUX1BBVFRFUk4ubWF0Y2hlcihleGNsTGlzdCk7CisKKyAgICAgICAgaWYgKCFtYXRjaC5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGlzdE1hdGNoLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvc3RuYW1lLmxlbmd0aCgpID4gMCAmJiBwb3J0Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3J0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKGhvc3RuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcG9ydFZhbCA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwb3J0VmFsID0gSW50ZWdlci5wYXJzZUludChwb3J0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3J0VmFsIDw9IDAgfHwgcG9ydFZhbCA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eVByb3BlcnRpZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eVByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI4ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKKy8qKgorICogQSBjb250YWluZXIgY2xhc3MgZm9yIHRoZSBodHRwIHByb3h5IGluZm8KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eVByb3BlcnRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIHByaXZhdGUgSW5ldEFkZHJlc3MgbVByb3h5OworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1FeGNsdXNpb25MaXN0OworCisgICAgcHVibGljIFByb3h5UHJvcGVydGllcygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBtUHJveHk7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBZGRyZXNzKEluZXRBZGRyZXNzIHByb3h5KSB7CisgICAgICAgIG1Qcm94eSA9IHByb3h5OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiBtUG9ydDsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgbVBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEV4Y2x1c2lvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtRXhjbHVzaW9uTGlzdDsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEV4Y2x1c2lvbkxpc3QoU3RyaW5nIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVByb3h5LmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShtUHJveHkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVBvcnQpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeGNsdXNpb25MaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPFByb3h5UHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPFByb3h5UHJvcGVydGllcz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5UHJvcGVydGllcyA9IG5ldyBQcm94eVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4ucmVhZFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0UG9ydChpbi5yZWFkSW50KCkpOworICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRFeGNsdXNpb25MaXN0KGluLnJlYWRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5UHJvcGVydGllczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eVByb3BlcnRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKK307CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKaW5kZXggNDdmYWFiYS4uNjNhZGNkMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQpAQCAtMTU2OCw3ICsxNTY4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKICAgICAgICAgfQogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOwpAQCAtMTYwOCw2ICsxNjA4LDI0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNlYXJjaGVzIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSBmaXJzdCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIGludGVycHJldHMgaXQKKyAgICAgKiBhcyBhIGJvb2xlYW4gdmFsdWUuICJmYWxzZSIgYW5kICIwIiBhcmUgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBldmVyeXRoaW5nCisgICAgICogZWxzZSBpcyBpbnRlcnByZXRlZCBhcyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBkZWNvZGVkCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gcXVlcnkgcGFyYW1ldGVyIGZvciBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIGludGVycHJldGF0aW9uIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIga2V5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIFN0cmluZyBmbGFnID0gZ2V0UXVlcnlQYXJhbWV0ZXIoa2V5KTsKKyAgICAgICAgaWYgKGZsYWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBmbGFnID0gZmxhZy50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gKCEiZmFsc2UiLmVxdWFscyhmbGFnKSAmJiAhIjAiLmVxdWFscyhmbGFnKSk7CisgICAgfQorCiAgICAgLyoqIElkZW50aWZpZXMgYSBudWxsIHBhcmNlbGxlZCBVcmkuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTExfVFlQRV9JRCA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCmluZGV4IGUwN2VlNTkuLjkxNWUzNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLm5ldC5TU0xTZXNzaW9uQ2FjaGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkJhc2U2NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKQEAgLTgxLDYgKzgyLDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFuZHJvaWRIdHRwQ2xpZW50IjsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgInRleHQvIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iCisgICAgfTsKIAogICAgIC8qKiBJbnRlcmNlcHRvciB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpbmcgdGhyZWFkIGlzIGJsb2NrZWQgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIdHRwUmVxdWVzdEludGVyY2VwdG9yIHNUaHJlYWRDaGVja0ludGVyY2VwdG9yID0KQEAgLTM1OCw3ICszNjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChsZXZlbCA8IExvZy5WRVJCT1NFIHx8IGxldmVsID4gTG9nLkFTU0VSVCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGV2ZWwgaXMgb3V0IG9mIHJhbmdlIFsiCi0gICAgICAgICAgICAgICAgKyBMb2cuVkVSQk9TRSArICIuLiIgKyBMb2cuQVNTRVJUICsgIl0iKTsgICAgCisgICAgICAgICAgICAgICAgKyBMb2cuVkVSQk9TRSArICIuLiIgKyBMb2cuQVNTRVJUICsgIl0iKTsKICAgICAgICAgfQogCiAgICAgICAgIGN1cmxDb25maWd1cmF0aW9uID0gbmV3IExvZ2dpbmdDb25maWd1cmF0aW9uKG5hbWUsIGxldmVsKTsKQEAgLTQzMSwxMiArNDM3LDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5nZXRDb250ZW50TGVuZ3RoKCkgPCAxMDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgIGVudGl0eS53cml0ZVRvKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHlTdHJpbmcgPSBzdHJlYW0udG9TdHJpbmcoKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0aGUgY29udGVudCB0eXBlLCB0b28uCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWFzY2lpIFwiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudGl0eVN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnlDb250ZW50KHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZTY0ID0gQmFzZTY0LmVuY29kZVRvU3RyaW5nKHN0cmVhbS50b0J5dGVBcnJheSgpLCBCYXNlNjQuTk9fV1JBUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmluc2VydCgwLCAiZWNobyAnIiArIGJhc2U2NCArICInIHwgYmFzZTY0IC1kID4gL3RtcC8kJC5iaW47ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYmluYXJ5IEAvdG1wLyQkLmJpbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudGl0eVN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgW1RPTyBNVUNIIERBVEEgVE8gSU5DTFVERV0iKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NDYsNiArNDU3LDMwIEBACiAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JpbmFyeUNvbnRlbnQoSHR0cFVyaVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBIZWFkZXJbXSBoZWFkZXJzOworICAgICAgICBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORyk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoImd6aXAiLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX1RZUEUpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY29udGVudFR5cGUgOiB0ZXh0Q29udGVudFR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0VmFsdWUoKS5zdGFydHNXaXRoKGNvbnRlbnRUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRhdGUgb2YgdGhlIGdpdmVuIEhUVFAgZGF0ZSBzdHJpbmcuIFRoaXMgbWV0aG9kIGNhbiBpZGVudGlmeQogICAgICAqIGFuZCBwYXJzZSB0aGUgZGF0ZSBmb3JtYXRzIGVtaXR0ZWQgYnkgY29tbW9uIEhUVFAgc2VydmVycywgc3VjaCBhcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCmluZGV4IGM1MjdmZTQuLmMzNmFkMzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKQEAgLTgwLDE0ICs4MCwxMCBAQAogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gc2VydmVyQ2VydGlmaWNhdGVzID0gbnVsbDsKIAotICAgICAgICAvLyBzdGFydCBoYW5kc2hha2UsIGNsb3NlIHRoZSBzb2NrZXQgaWYgd2UgZmFpbAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3NsU29ja2V0LnNldFVzZUNsaWVudE1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc3RhcnRIYW5kc2hha2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY2xvc2VTb2NrZXRUaHJvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBzc2xTb2NrZXQsIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGVyZm9ybSBTU0wgaGFuZHNoYWtlIik7CisgICAgICAgIC8vIGdldCBhIHZhbGlkIFNTTFNlc3Npb24sIGNsb3NlIHRoZSBzb2NrZXQgaWYgd2UgZmFpbAorICAgICAgICBTU0xTZXNzaW9uIHNzbFNlc3Npb24gPSBzc2xTZXNzaW9uID0gc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKCFzc2xTZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY2xvc2VTb2NrZXRUaHJvd0V4Y2VwdGlvbihzc2xTb2NrZXQsICJmYWlsZWQgdG8gcGVyZm9ybSBTU0wgaGFuZHNoYWtlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyByZXRyaWV2ZSB0aGUgY2hhaW4gb2YgdGhlIHNlcnZlciBwZWVyIGNlcnRpZmljYXRlcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQppbmRleCBkMjgxNDhjLi5hYWRhY2FiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQpAQCAtMTYsMTYgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vczsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKioKQEAgLTM2LDggKzM2LDggQEAKICAqIDxwPkFuIGFzeW5jaHJvbm91cyB0YXNrIGlzIGRlZmluZWQgYnkgYSBjb21wdXRhdGlvbiB0aGF0IHJ1bnMgb24gYSBiYWNrZ3JvdW5kIHRocmVhZCBhbmQKICAqIHdob3NlIHJlc3VsdCBpcyBwdWJsaXNoZWQgb24gdGhlIFVJIHRocmVhZC4gQW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSAzIGdlbmVyaWMKICAqIHR5cGVzLCBjYWxsZWQgPGNvZGU+UGFyYW1zPC9jb2RlPiwgPGNvZGU+UHJvZ3Jlc3M8L2NvZGU+IGFuZCA8Y29kZT5SZXN1bHQ8L2NvZGU+LAotICogYW5kIDQgc3RlcHMsIGNhbGxlZCA8Y29kZT5iZWdpbjwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKLSAqIDxjb2RlPnByb2Nlc3NQcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4uPC9wPgorICogYW5kIDQgc3RlcHMsIGNhbGxlZCA8Y29kZT5vblByZUV4ZWN1dGU8L2NvZGU+LCA8Y29kZT5kb0luQmFja2dyb3VuZDwvY29kZT4sCisgKiA8Y29kZT5vblByb2dyZXNzVXBkYXRlPC9jb2RlPiBhbmQgPGNvZGU+b25Qb3N0RXhlY3V0ZTwvY29kZT4uPC9wPgogICoKICAqIDxoMj5Vc2FnZTwvaDI+CiAgKiA8cD5Bc3luY1Rhc2sgbXVzdCBiZSBzdWJjbGFzc2VkIHRvIGJlIHVzZWQuIFRoZSBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIGF0IGxlYXN0CkBAIC0xNzUsNiArMTc1LDExIEBACiAgICAgICAgIEZJTklTSEVELAogICAgIH0KIAorICAgIC8qKiBAaGlkZSBVc2VkIHRvIGZvcmNlIHN0YXRpYyBoYW5kbGVyIHRvIGJlIGNyZWF0ZWQuICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHNIYW5kbGVyLmdldExvb3BlcigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgYXN5bmNocm9ub3VzIHRhc2suIFRoaXMgY29uc3RydWN0b3IgbXVzdCBiZSBpbnZva2VkIG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICovCkBAIC0xODcsNiArMTkyLDE3IEBACiAgICAgICAgIH07CiAKICAgICAgICAgbUZ1dHVyZSA9IG5ldyBGdXR1cmVUYXNrPFJlc3VsdD4obVdvcmtlcikgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldChSZXN1bHQgdikgeworICAgICAgICAgICAgICAgIHN1cGVyLnNldCh2KTsKKyAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9DQU5DRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxSZXN1bHQ+KEFzeW5jVGFzay50aGlzLCAoUmVzdWx0W10pIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CkBAIC00MDIsMTQgKzQxOCwxOSBAQAogICAgICAqIHN0aWxsIHJ1bm5pbmcuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGV4ZWN1dGlvbiBvZgogICAgICAqIHtAbGluayAjb25Qcm9ncmVzc1VwZGF0ZX0gb24gdGhlIFVJIHRocmVhZC4KICAgICAgKgorICAgICAqIHtAbGluayAjb25Qcm9ncmVzc1VwZGF0ZX0gd2lsbCBub3RlIGJlIGNhbGxlZCBpZiB0aGUgdGFzayBoYXMgYmVlbgorICAgICAqIGNhbmNlbGVkLgorICAgICAqCiAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgcHJvZ3Jlc3MgdmFsdWVzIHRvIHVwZGF0ZSB0aGUgVUkgd2l0aC4KICAgICAgKgogICAgICAqIEBzZWUgI29uUHJvZ3Jlc3NVcGRhdGUKICAgICAgKiBAc2VlICNkb0luQmFja2dyb3VuZAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHB1Ymxpc2hQcm9ncmVzcyhQcm9ncmVzcy4uLiB2YWx1ZXMpIHsKLSAgICAgICAgc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfUFJPR1JFU1MsCi0gICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UHJvZ3Jlc3M+KHRoaXMsIHZhbHVlcykpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaChSZXN1bHQgcmVzdWx0KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQppbmRleCBmZGQzNTczLi43OGVjNjM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKQEAgLTE5Niw2ICsxOTYsMTcgQEAKICAgICAgICAgICogPC91bD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdJTkdFUkJSRUFEID0gQ1VSX0RFVkVMT1BNRU5UOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOZXh0IG5leHQgdmVyc2lvbiBvZiBBbmRyb2lkLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5BcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIHRoaXMgb3IgYSBsYXRlciByZWxlYXNlIHdpbGwgZ2V0IHRoZXNlCisgICAgICAgICAqIG5ldyBjaGFuZ2VzIGluIGJlaGF2aW9yOjwvcD4KKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IEFsZXJ0cyBVSSBjaGFuZ2U/CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT05FWUNPTUIgPSBDVVJfREVWRUxPUE1FTlQ7CiAgICAgfQogICAgIAogICAgIC8qKiBUaGUgdHlwZSBvZiBidWlsZCwgbGlrZSAidXNlciIgb3IgImVuZyIuICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQppbmRleCA4NmY5YTZiLi5hNThlNzBiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgd2lsbCBjYXVzZSBhIEdDLgorICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUgRnVsbCBwYXRobmFtZSBvZiBvdXRwdXQgZmlsZSAoZS5nLiAiL3NkY2FyZC9kdW1wLmhwcm9mIikuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVk0gd2FzIGJ1aWx0IHdpdGhvdXQKQEAgLTc0MywxMSArNzQzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29sbGVjdCAiaHByb2YiIGFuZCBzZW5kIGl0IHRvIERETVMuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBMaWtlIGR1bXBIcHJvZkRhdGEoU3RyaW5nKSwgYnV0IHRha2VzIGFuIGFscmVhZHktb3BlbmVkCisgICAgICogRmlsZURlc2NyaXB0b3IgdG8gd2hpY2ggdGhlIHRyYWNlIGlzIHdyaXR0ZW4uICBUaGUgZmlsZSBuYW1lIGlzIGFsc28KKyAgICAgKiBzdXBwbGllZCBzaW1wbHkgZm9yIGxvZ2dpbmcuICBNYWtlcyBhIGR1cCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogUHJpbWFyaWx5IGZvciB1c2UgYnkgdGhlICJhbSIgc2hlbGwgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGEoU3RyaW5nIGZpbGVOYW1lLCBGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZNRGVidWcuZHVtcEhwcm9mRGF0YShmaWxlTmFtZSwgZmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyBtYXkgY2F1c2UgYSBHQy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CiAgICAgICogICAgICAgICBIUFJPRiBzdXBwb3J0LgotICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YURkbXMoKSB7CkBAIC03NTUsNiArNzY4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIG5hdGl2ZSBoZWFwIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZHVtcE5hdGl2ZUhlYXAoRmlsZURlc2NyaXB0b3IgZmQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlbnQgdHJhbnNhY3Rpb25zIGZyb20gdGhpcyBwcm9jZXNzLgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBvciAtMSBpZiBpdCBjb3VsZCBub3QgcmVhZCB0LgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQppbmRleCBhMTdiN2ZlLi43MmUyMWRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQpAQCAtODUsNiArODUsOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFBlcm1pc3Npb25zKFN0cmluZyBmaWxlLCBpbnRbXSBvdXRQZXJtaXNzaW9ucyk7CiAKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0VU1hc2soaW50IG1hc2spOworCiAgICAgLyoqIHJldHVybnMgdGhlIEZBVCBmaWxlIHN5c3RlbSB2b2x1bWUgSUQgZm9yIHRoZSB2b2x1bWUgbW91bnRlZCAKICAgICAgKiBhdCB0aGUgZ2l2ZW4gbW91bnQgcG9pbnQsIG9yIC0xIGZvciBmYWlsdXJlCiAgICAgICogQHBhcmFtIG1vdW50IHBvaW50IGZvciBGQVQgdm9sdW1lCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQppbmRleCA5ZDIxM2IzLi5kODUzZjEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKQEAgLTEzNCw2ICsxMzQsMjUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0KFNvY2tldCBzb2NrZXQpOwogCiAgICAgLyoqCisgICAgICogQ3JlYXRlIHR3byBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgc3RydWN0dXJlZCBhcyBhIGRhdGEgcGlwZS4gIFRoZSBmaXJzdAorICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGluIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgcmVhZCBzaWRlOyB0aGUgc2Vjb25kCisgICAgICogaXMgdGhlIHdyaXRlIHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIGNyZWF0ZVBpcGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlRGVzY3JpcHRvcltdIGZkcyA9IG5ldyBGaWxlRGVzY3JpcHRvclsyXTsKKyAgICAgICAgaW50IHJlcyA9IGNyZWF0ZVBpcGVOYXRpdmUoZmRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZHMgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgICAgICBwZmRzWzBdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1swXSk7CisgICAgICAgICAgICBwZmRzWzFdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1sxXSk7CisgICAgICAgICAgICByZXR1cm4gcGZkczsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgcGlwZTogZXJybm89IiArIC1yZXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY3JlYXRlUGlwZU5hdGl2ZShGaWxlRGVzY3JpcHRvcltdIG91dEZkcyk7CisKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQppbmRleCA3Yjg4M2E3Li5kM2QzOWQ2ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogCiAvKioKICAqIFVzZWQgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGZyb20gdGhlIFN0b3JhZ2VNYW5hZ2VyCi0gKiBAaGlkZQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RvcmFnZUV2ZW50TGlzdGVuZXIgewogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCmluZGV4IDk2YmYyZDUuLjYxY2RhY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGJ5IGNhbGxpbmcKICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlKGphdmEubGFuZy5TdHJpbmcpfSB3aXRoIGFuIGFyZ3VtZW50CiAgKiBvZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjU1RPUkFHRV9TRVJWSUNFfS4KKyAqCiAgKi8KIAogcHVibGljIGNsYXNzIFN0b3JhZ2VNYW5hZ2VyCkBAIC0yMDYsNyArMjA3LDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIHtAbGluayBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIgU3RvcmFnZUV2ZW50TGlzdGVuZXJ9IG9iamVjdC4KICAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMjIzLDcgKzIyMyw2IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSB7QGxpbmsgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIFN0b3JhZ2VFdmVudExpc3RlbmVyfSBvYmplY3QuCiAgICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMjQ0LDggKzI0Myw2IEBACiAKICAgICAvKioKICAgICAgKiBFbmFibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5hYmxlVXNiTWFzc1N0b3JhZ2UoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0yNTcsOCArMjU0LDYgQEAKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzYWJsZVVzYk1hc3NTdG9yYWdlKCkgewogICAgICAgICB0cnkgewpAQCAtMjcxLDggKzI2Niw2IEBACiAgICAgLyoqCiAgICAgICogUXVlcnkgaWYgYSBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIGhvc3QgaXMgY29ubmVjdGVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBjb25uZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0yODYsOCArMjc5LDYgQEAKICAgICAvKioKICAgICAgKiBRdWVyeSBpZiBhIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgaXMgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCgpIHsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQppbmRleCAwNzVmNDdmLi4wN2Q5NWRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAvKioKICAqIENsYXNzIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGNvbnN0YW50cyByZXR1cm5lZCBmcm9tIFN0b3JhZ2VNYW5hZ2VyCiAgKiBhbmQgbG93ZXIgbGV2ZWwgTW91bnRTZXJ2aWNlIEFQSXMuCi0gKgotICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIFN0b3JhZ2VSZXN1bHRDb2RlCiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQppbmRleCA2MzUzMjNlLi4yODI0MTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKQEAgLTE4MSw3ICsxODEsOSBAQAogICAgICAgICBib29sZWFuIGluVXRjID0gc3RhcnQucGFyc2UoZHRzdGFydCk7CiAgICAgICAgIGJvb2xlYW4gYWxsRGF5ID0gc3RhcnQuYWxsRGF5OwogCi0gICAgICAgIGlmIChpblV0YykgeworICAgICAgICAvLyBXZSBmb3JjZSBUaW1lWm9uZSB0byBVVEMgZm9yICJhbGwgZGF5IHJlY3VycmluZyBldmVudHMiIGFzIHRoZSBzZXJ2ZXIgaXMgc2VuZGluZyBubworICAgICAgICAvLyBUaW1lWm9uZSBpbiBEVFNUQVJUIGZvciB0aGVtCisgICAgICAgIGlmIChpblV0YyB8fCBhbGxEYXkpIHsKICAgICAgICAgICAgIHR6aWQgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICAgICAgICAgIApAQCAtMjA0LDEwICsyMDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBpZiAoYWxsRGF5KSB7Ci0gICAgICAgIAkvLyBUT0RPOiBhbHNvIGNoYW5nZSB0emlkIHRvIGJlIFVUQz8gIHRoYXQgd291bGQgYmUgY29uc2lzdGVudCwgYnV0Ci0gICAgICAgIAkvLyB0aGF0IHdvdWxkIG5vdCByZWZsZWN0IHRoZSBvcmlnaW5hbCB0aW1lem9uZSB2YWx1ZSBiYWNrIHRvIHRoZQotICAgICAgICAJLy8gc2VydmVyLgotICAgICAgICAJc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKKyAgICAgICAgICAgIHN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CiAgICAgICAgIH0KICAgICAgICAgbG9uZyBtaWxsaXMgPSBzdGFydC50b01pbGxpcyhmYWxzZSAvKiB1c2UgaXNEc3QgKi8pOwogICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5EVFNUQVJULCBtaWxsaXMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWMyOWUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGV4dFV0aWxzIGVzcGVjaWFsbHkgZm9yIEphcGFuZXNlLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIEphcGFuZXNlVXRpbHMgewotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4gc0hhbGZXaWR0aE1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPENoYXJhY3RlciwgU3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBsb2dpY2FsIG1hcHBpbmcgcnVsZSBpbiBVbmljb2RlLiBTaWdoLgotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAxJywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAyJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBDJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBEJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDFDJywgIn4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QicsICJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QycsICJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNCcsICJcdUZGNzNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNScsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNicsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQicsICJcdUZGNjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQycsICJcdUZGNzAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMScsICIhIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDInLCAiXCIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMycsICIjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDQnLCAiJCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA1JywgIiUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNicsICImIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDcnLCAiJyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA4JywgIigiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwOScsICIpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEEnLCAiKiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBCJywgIisiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQycsICIsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEQnLCAiLSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBFJywgIi4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRicsICIvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTAnLCAiMCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjExJywgIjEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMicsICIyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTMnLCAiMyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE0JywgIjQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNScsICI1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTYnLCAiNiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE3JywgIjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOCcsICI4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTknLCAiOSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFBJywgIjoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQicsICI7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUMnLCAiPCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFEJywgIj0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRScsICI+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUYnLCAiPyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIwJywgIkAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMScsICJBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjInLCAiQiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIzJywgIkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNCcsICJEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjUnLCAiRSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI2JywgIkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNycsICJHIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjgnLCAiSCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI5JywgIkkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQScsICJKIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkInLCAiSyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJDJywgIkwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRCcsICJNIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkUnLCAiTiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJGJywgIk8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMCcsICJQIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzEnLCAiUSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMyJywgIlIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMycsICJTIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzQnLCAiVCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM1JywgIlUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNicsICJWIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzcnLCAiVyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM4JywgIlgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzOScsICJZIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0EnLCAiWiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNCJywgIlsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQycsICJcXCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNEJywgIl0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRScsICJeIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0YnLCAiXyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQxJywgImEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MicsICJiIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDMnLCAiYyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ0JywgImQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NScsICJlIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDYnLCAiZiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ3JywgImciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OCcsICJoIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDknLCAiaSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRBJywgImoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QicsICJrIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEMnLCAibCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjREJywgIm0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RScsICJuIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEYnLCAibyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUwJywgInAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MScsICJxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTInLCAiciIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUzJywgInMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NCcsICJ0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTUnLCAidSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU2JywgInYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NycsICJ3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTgnLCAieCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU5JywgInkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QScsICJ6Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUInLCAieyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVDJywgInwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RCcsICJ9Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUUnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYxJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYyJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYzJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY0JywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY1JywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY2JywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY3JywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY4JywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY5JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZBJywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZCJywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZDJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZEJywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZFJywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZGJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcwJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcxJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcyJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjczJywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc0JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc1JywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc2JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc3JywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc4JywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc5JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdBJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdCJywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdDJywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdEJywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdFJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdGJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgwJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgyJywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgzJywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg0JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg1JywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg2JywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg3JywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg4JywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg5JywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhBJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhCJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhDJywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhEJywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhFJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhGJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkwJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkxJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkyJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkzJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk1JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk2JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk3JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk4JywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk5JywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlBJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlCJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlDJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlEJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlFJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlGJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRkU1JywgIlx1MDA1Q1x1MDA1QyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBoYWxmLXdpZHRoIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIgaWYgcG9zc2libGUuIFJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZQotICAgICAqIEBwYXJhbSBjaCBpbnB1dCBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIENoYXJTZXF1ZW5jZSBvYmplY3QgaWYgdGhlIG1hcHBpbmcgZm9yIGNoIGV4aXN0cy4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyeUdldEhhbGZXaWR0aFRleHQoY2hhciBjaCkgewotICAgICAgICBpZiAoc0hhbGZXaWR0aE1hcC5jb250YWluc0tleShjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzSGFsZldpZHRoTWFwLmdldChjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhNmQ3YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyB3aGljaCBsZXRzIHVzZXJzIGNyZWF0ZSB0aGVpciBvd24gdkNhcmQgU3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRCdWlsZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEJ1aWxkZXIiOwotCi0gICAgLy8gSWYgeW91IGFkZCB0aGUgb3RoZXIgZWxlbWVudCwgcGxlYXNlIGNoZWNrIGFsbCB0aGUgY29sdW1ucyBhcmUgYWJsZSB0byBiZQotICAgIC8vIGNvbnZlcnRlZCB0byBTdHJpbmcuCi0gICAgLy8KLSAgICAvLyBlLmcuIEJMT0IgaXMgbm90IHdoYXQgd2UgY2FuIGhhbmRsZSBoZXJlIG5vdy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSE9ORV9UWVBFID0gUGhvbmUuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEFMX1RZUEUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VNQUlMX1RZUEUgPSBFbWFpbC5UWVBFX09USEVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfVkNBUkQgPSAiVkNBUkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1BVQkxJQyA9ICJQVUJMSUMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfRU5EX09GX0xJTkUgPSAiXHJcbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfU0VQQVJBVE9SID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9JVEVNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfV1MgPSAiICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VRVUFMID0gIj0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQID0gIkVOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEgPSAiRU5DT0RJTkc9QkFTRTY0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YzMCA9ICJFTkNPRElORz1iIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNWMzA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNBbmRyb2lkUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzRGVmYWN0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzVXRmODsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNTaGlmdEppczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUFwcGVuZFR5cGVQYXJhbU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmc7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGFyc2V0U3RyaW5nOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmRBcHBlbmRlZDsKLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotCi0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgPSBWQ2FyZENvbmZpZy5zaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUlzSmFwYW5lc2VNb2JpbGVQaG9uZSA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLSAgICAgICAgbU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSA9IFZDYXJkQ29uZmlnLm9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0FuZHJvaWRQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0RlZmFjdFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0RlZmFjdFByb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzVXRmOCA9IFZDYXJkQ29uZmlnLnVzZXNVdGY4KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzU2hpZnRKaXMgPSBWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKTsKLSAgICAgICAgbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzID0gVkNhcmRDb25maWcuc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyh2Y2FyZFR5cGUpOwotICAgICAgICBtQXBwZW5kVHlwZVBhcmFtTmFtZSA9IFZDYXJkQ29uZmlnLmFwcGVuZFR5cGVQYXJhbU5hbWUodmNhcmRUeXBlKTsKLSAgICAgICAgbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0KLSAgICAgICAgbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSA9ICEobUlzVjMwICYmIG1Vc2VzVXRmOCk7Ci0KLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgbUNoYXJzZXRTdHJpbmcgYmVsbG93IHNpbmNlIGl0IGlzIGRpZmZlcmVudCBmcm9tICJTSElGVF9KSVMiIGJ1dAotICAgICAgICAgICAgLy8gbWF5IGJlICJET0NPTU9fU0hJRlRfSklTIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0IChpbnRlcm5hbCBleHByZXNzaW9uIHVzZWQgaW4KLSAgICAgICAgICAgIC8vIEFuZHJvaWQsIG5vdCBzaG93biB0byB0aGUgcHVibGljKS4KLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgU0hJRlRfSklTOwotICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzU2hpZnRKaXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWZW5kb3Itc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgU0hJRlRfSklTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBVVEZfODsKLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRW5kQXBwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CRUdJTiwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNOb25FbXB0eU5hbWUoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotICAgICAgICByZXR1cm4gIShUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXMgZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBDb250ZW50VmFsdWVzIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkgIT0gbnVsbCAmJiBpc1N1cGVyUHJpbWFyeSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCAicHJpbWFyeSIgQ29udGVudFZhbHVlcwotICAgICAgICAgICAgICAgIC8vIGlmICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSAhPSBudWxsICYmIGlzUHJpbWFyeSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGJyZWFrLCBzaW5jZSB0aGVyZSBtYXkgYmUgQ29udGVudFZhbHVlcyB3aXRoICJzdXBlciBwcmltYXJ5IgotICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndvcmQuCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCBDb250ZW50VmFsdWVzIGlmIGFueSAicHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IHN1YnByaW1hcnlDb250ZW50VmFsdWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWxsIENvbnRlbnRWYWx1ZXMgZ2l2ZW4gZnJvbSBkYXRhYmFzZSBpcyBlbXB0eS4iKTsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHNhZmV0eSwgd2UnbGwgZW1pdCBqdXN0IG9uZSB2YWx1ZSBhcm91bmQgU3RydWN0dXJlZE5hbWUsIGFzIGV4dGVybmFsIGltcG9ydGVycwotICAgICAqIG1heSBnZXQgY29uZnVzZWQgd2l0aCBtdWx0aXBsZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcywgdGhvdWdoIGl0IGlzIHZhbGlkIGluCi0gICAgICogdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCByZXF1aXJlcyAiTiIgYW5kICJGTiIgcHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IGdldFByaW1hcnlDb250ZW50VmFsdWUoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgfHwgIVRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmYW1pbHlOYW1lLCBnaXZlbk5hbWUsIG1pZGRsZU5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShnaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoc3VmZml4KSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZShtVkNhcmRUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgICFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZvcm1hdHRlZE5hbWUpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZhbWlseTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkR2l2ZW47Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE1pZGRsZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUHJlZml4OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdWZmaXg7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlc2NhcGVDaGFyYWN0ZXJzKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZXNjYXBlQ2hhcmFjdGVycyhtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZm9ybWF0dGVkTmFtZSkgOiBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgLy8gRG9Db01vIHBob25lcyByZXF1aXJlIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEdpdmVuKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkTWlkZGxlKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgICAgIC8vIEZOIHByb3BlcnR5Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkbmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShkaXNwbGF5TmFtZSkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWREaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShkaXNwbGF5TmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVDaGFyYWN0ZXJzKGRpc3BsYXlOYW1lKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0KLSAgICAgICAgICAgIC8vIE5vdGU6ICJDSEFSU0VUIiBwYXJhbSBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAsIGJ1dCB3ZSBtYXkgYWRkIGl0Ci0gICAgICAgICAgICAvLyAgICAgICB3aGVuIGl0IHdvdWxkIGJlIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgaW1wb3J0ZXJzLCBhc3N1bWluZyBubyBleHRlcm5hbAotICAgICAgICAgICAgLy8gICAgICAgaW1wb3J0ZXIgYWxsb3dzIHRoaXMgdmlvcmF0aW9uLgotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhlc2UgZmllbGRzLgotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgaWYgKG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSB0bXBQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gdG1wUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gdG1wUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyeSB0byBlbWl0IHRoZSBmaWVsZChzKSByZWxhdGVkIHRvIHBob25ldGljIG5hbWUuCi0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3J0U3RyaW5nID0gVkNhcmRVdGlscwotICAgICAgICAgICAgICAgICAgICAuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSwgcGhvbmV0aWNNaWRkbGVOYW1lLCBwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShzb3J0U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlQ2hhcmFjdGVycyhzb3J0U3RyaW5nKSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IFRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIHByb3BlcnR5IGZvciBleHByZXNzaW5nCi0gICAgICAgICAgICAvLyAgICAgICBwaG9uZXRpYyBuYW1lIGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4KLSAgICAgICAgICAgIC8vICAgICAgIHZDYXJkIDMuMCAoU09SVC1TVFJJTkcpLgotICAgICAgICAgICAgLy8gICAgICAgV2UgY2hvc2UgdG8gdXNlIERvQ29NbydzIHdheSB3aGVuIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2Ugb25lCi0gICAgICAgICAgICAvLyAgICAgICBzaW5jZSBpdCBpcyBzdXBwb3J0ZWQgYnkKLSAgICAgICAgICAgIC8vICAgICAgIGEgbG90IG9mIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMuIFRoaXMgaXMgIlgtIiBwcm9wZXJ0eSwgc28KLSAgICAgICAgICAgIC8vICAgICAgIGFueSBwYXJzZXIgaG9wZWZ1bGx5IHdvdWxkIG5vdCBnZXQgY29uZnVzZWQgd2l0aCB0aGlzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgIEFsc28sIERvQ29NbydzIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdkNhcmQgY29tcG9zZXIgdG8gdXNlIGp1c3QgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAgICAgICBjb2x1bW4uCi0gICAgICAgICAgICAvLyAgICAgICBpLmUuCi0gICAgICAgICAgICAvLyAgICAgICBvICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YSBEYWlzdWtlOzs7OwotICAgICAgICAgICAgLy8gICAgICAgeCAgU09VTkQ7WC1JUk1DLU46TWl5YWthd2E7RGFpc3VrZTs7OwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSkpKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSwgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVVzZXNEZWZhY3RQcm9wZXJ0eSkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljR2l2ZW5OYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNNaWRkbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY0ZhbWlseU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROaWNrTmFtZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmaW5hbCBib29sZWFuIHVzZUFuZHJvaWRQcm9wZXJ0eTsKLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgIHVzZUFuZHJvaWRQcm9wZXJ0eSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHdheSB0byBhZGQgdGhpcyBmaWVsZC4KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5pY2tuYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOaWNrbmFtZS5OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmlja25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodXNlQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSwgbmlja25hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob25lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gcGhvbmVMaW5lRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwaG9uZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFBob25lLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTEFCRUwpOwotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTlVNQkVSKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlciA9IHBob25lTnVtYmVyLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQQUdFUiBudW1iZXIgbmVlZHMgdW5mb3JtYXR0ZWQgInBob25lIG51bWJlciIuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzT2JqZWN0ICE9IG51bGwgPyB0eXBlQXNPYmplY3QgOiBERUZBVUxUX1BIT05FX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLnJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhwaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBwaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZU51bWJlckxpc3QgPSBzcGxpdEFuZFRyaW1QaG9uZU51bWJlcnMocGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGhvbmVTZXQuY29udGFpbnMoYWN0dWFsUGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdCA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZFBob25lTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKGFjdHVhbFBob25lTnVtYmVyLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChhY3R1YWxQaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGVsTGluZSh0eXBlLCBsYWJlbCwgZm9ybWF0dGVkUGhvbmVOdW1iZXIsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gIC8vIGZvciAoU3RyaW5nIGFjdHVhbFBob25lTnVtYmVyIDogcGhvbmVOdW1iZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwaG9uZUxpbmVFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRUZWxMaW5lKFBob25lLlRZUEVfSE9NRSwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgZXhwcmVzc2luZyBwaG9uZSBudW1iZXJzIGludG8gc2V2ZXJhbCBzdHJpbmdzLCBhbmQgcmVtb3ZlCi0gICAgICogdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlbS4gVGhlIHNpemUgb2YgYSByZXR1cm5lZCBsaXN0IGJlY29tZXMgMSB3aGVuCi0gICAgICogbm8gc3BsaXQgaXMgbmVlZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2l2ZW4gbnVtYmVyICJtYXkiIGhhdmUgc2V2ZXJhbCBwaG9uZSBudW1iZXJzIHdoZW4gdGhlIGNvbnRhY3QgZW50cnkgaXMgY29ycnVwdGVkCi0gICAgICogYmVjYXVzZSBvZiBpdHMgb3JpZ2luYWwgc291cmNlLgotICAgICAqIGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpXG40NDQtNTU1LTY2NjYgKEJyb3dhcmQ7IDMwNS02NTMtNjc5NiAoTWlhbWkpIgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGtpbmQgb2YgInBob25lIG51bWJlcnMiIHdpbGwgbm90IGJlIGNyZWF0ZWQgd2l0aCBBbmRyb2lkIHZDYXJkIGltcGxlbWVudGF0aW9uLAotICAgICAqIGJ1dCB3ZSBtYXkgZW5jb3VudGVyIHRoZW0gaWYgdGhlIHNvdXJjZSBvZiB0aGUgaW5wdXQgZGF0YSBoYXMgYWxyZWFkeSBjb3JydXB0ZWQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVG8gaGFuZGxlIHRoaXMgY2FzZSwgdGhpcyBtZXRob2QgZmlyc3Qgc3BsaXRzIGl0cyBpbnB1dCBpbnRvIG11bHRpcGxlIHBhcnRzCi0gICAgICogKGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpIiwgIjQ0NC01NTUtNjY2NiAoQnJvd2FyZCIsIGFuZCAzMDU2NTMtNjc5NiAoTWlhbWkpIikgYW5kCi0gICAgICogcmVtb3ZlcyB1bm5lY2Vzc2FyeSBzdHJpbmdzIGxpa2UgIihNaWFtaSkiLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRyaW1taW5nIGlzIGluYXBwcm9wcmlhdGUgZm9yIGl0cyByZWNlaXZlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhmaW5hbCBTdHJpbmcgcGhvbmVOdW1iZXIpIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHBob25lTnVtYmVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjaCkgfHwgY2ggPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPT0gJzsnIHx8IGNoID09ICdcbicpICYmIGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEVtYWlscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gZW1haWxBZGRyZXNzRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhZGRyZXNzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEVtYWlsLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3MudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW50ZWdlciB0eXBlQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNPYmplY3QgOiBERUZBVUxUX0VNQUlMX1RZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuTEFCRUwpOwotICAgICAgICAgICAgICAgIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRW1haWwuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzc0V4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2V0LmNvbnRhaW5zKGVtYWlsQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NldC5hZGQoZW1haWxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kRW1haWxMaW5lKHR5cGUsIGxhYmVsLCBlbWFpbEFkZHJlc3MsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlbWFpbEFkZHJlc3NFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUoRW1haWwuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUG9zdGFscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yRG9Db01vKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXA7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUsIDApOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSywgMSk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUiwgMik7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00sIDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGFwcGVuZCBqdXN0IG9uZSBsaW5lLiBJZiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFkZHJlc3MKLSAgICAgKiBpbmZvcm1hdGlvbiwgYXBwZW5kIGFuIGVtcHR5IGxpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpbnQgY3VycmVudFByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBjdXJyZW50VHlwZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBDb250ZW50VmFsdWVzIGN1cnJlbnRDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJpb3JpdHlBc0ludGVnZXIgPSBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLmdldCh0eXBlQXNJbnRlZ2VyKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgIChwcmlvcml0eUFzSW50ZWdlciAhPSBudWxsID8gcHJpb3JpdHlBc0ludGVnZXIgOiBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHkgPCBjdXJyZW50UHJpb3JpdHkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50UHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2hvdWxkIG5vdCBjb21lIGhlcmUuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcG9zdGFsIGRhdGEuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjdXJyZW50Q29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgYXBwZW5kUG9zdGFsTGluZShjdXJyZW50VHlwZSwgbGFiZWwsIGN1cnJlbnRDb250ZW50VmFsdWVzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JHZW5lcmljKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc0ludGVnZXIgOiBERUZBVUxUX1BPU1RBTF9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCk7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgYXBwZW5kUG9zdGFsTGluZSh0eXBlLCBsYWJlbCwgY29udGVudFZhbHVlcywgaXNQcmltYXJ5LCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0YWxTdHJ1Y3QgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGE7Ci0gICAgICAgIHB1YmxpYyBQb3N0YWxTdHJ1Y3QoZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0LCBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGEpIHsKLSAgICAgICAgICAgIHRoaXMucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGFyc2V0ID0gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RhdGEgPSBhZGRyZXNzRGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gbnVsbCB3aGVuIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGNvbnN0cnVjdCB0aGUgZGF0YS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBvc3RhbFN0cnVjdCB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UG9Cb3ggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TmVpZ2hib3Job29kID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdTdHJlZXQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVUKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0xvY2FsaXR5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkNJVFkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UmVnaW9uID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb3N0YWxDb2RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0NvdW50cnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHJhd0FkZHJlc3NBcnJheSA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICByYXdQb0JveCwgcmF3TmVpZ2hib3Job29kLCByYXdTdHJlZXQsIHJhd0xvY2FsaXR5LAotICAgICAgICAgICAgICAgIHJhd1JlZ2lvbiwgcmF3UG9zdGFsQ29kZSwgcmF3Q291bnRyeX07Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3QWRkcmVzc0FycmF5KTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9Cb3g7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN0cmVldDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTG9jYWxpdHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFJlZ2lvbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9zdGFsQ29kZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkQ291bnRyeTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTmVpZ2hib3Job29kOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkyOwotICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBpbmVmZmljaWVudCBzaW5jZSB3ZSBlbmNvZGUgcmF3TG9jYWxpdHkgYW5kIHJhd05laWdoYm9yaG9vZCB0d2ljZSwKLSAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIGludGVudGlvbmFsLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFFQIGVuY29kaW5nIG1heSBhZGQgbGluZSBmZWVkcyB3aGVuIG5lZWRlZCBhbmQgdGhlIHJlc3VsdCBvZgotICAgICAgICAgICAgLy8gLSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2QpCi0gICAgICAgICAgICAvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20KLSAgICAgICAgICAgIC8vIC0gZW5jb2RlZExvY2FsaXR5ICsgIiAiICsgZW5jb2RlZE5laWdoYm9yaG9vZC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB1c2Ugc2FmZXIgd2F5LgotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0xvY2FsaXR5KSkgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9ICIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd05laWdoYm9yaG9vZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5ICsgIiAiICsgcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9Cb3ggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkyKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUmVnaW9uID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Q291bnRyeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1N0cmVldCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZExvY2FsaXR5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1Bvc3RhbENvZGUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRDb3VudHJ5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTmVpZ2hib3Job29kID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdOZWlnaGJvcmhvb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGFkZHJlc3NCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUG9Cb3gpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFN0cmVldCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkTG9jYWxpdHkpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFJlZ2lvbik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkQ291bnRyeSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgeyAgLy8gVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpID09IHRydWUKLSAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgRk9STUFUVEVEX0FERFJFU1MgaW5zdGVhZC4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdGb3JtYXR0ZWRBZGRyZXNzID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0Zvcm1hdHRlZEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdGb3JtYXR0ZWRBZGRyZXNzKSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyA9IGVzY2FwZUNoYXJhY3RlcnMocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc2Vjb25kIHZhbHVlICgiRXh0ZW5kZWQgQWRkcmVzcyIpIGp1c3QgYmVjYXVzZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzCi0gICAgICAgICAgICAvLyBkbyBzby4gSWYgdGhlIG90aGVyIGltcG9ydGVyIGV4cGVjdHMgdGhlIHZhbHVlIGJlIGluIHRoZSBvdGhlciBmaWVsZCwgc29tZSBmbGFnIG1heQotICAgICAgICAgICAgLy8gYmUgbmVlZGVkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGFkZHJlc3NCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRJbXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJvdG9jb2xBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xBc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gVkNhcmRVdGlscy5nZXRQcm9wZXJ0eU5hbWVGb3JJbShwcm90b2NvbEFzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUFzSW50ZWdlciAhPSBudWxsID8gdHlwZUFzSW50ZWdlciA6IEltLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gKGxhYmVsICE9IG51bGwgPyAiWC0iICsgbGFiZWwgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9PVEhFUjogIC8vIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFdlYnNpdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2Vic2l0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoV2Vic2l0ZS5VUkwpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJzaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZSA9IHdlYnNpdGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBhbnkgcGFyYW1ldGVyIGFkZGl0aW9uIHRvd2FyZCAiVVJMIgotICAgICAgICAgICAgICAgIC8vICAgICAgIHByb3BlcnR5LCB3aGlsZSB0aGVyZSdzIG5vIGRvY3VtZW50IGluIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdlYnNpdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kT3JnYW5pemF0aW9ucyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5DT01QQU5ZKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhbnkgPSBjb21wYW55LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlcGFydG1lbnQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwYXJ0bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQgPSBkZXBhcnRtZW50LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3JnQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb21wYW55KSkgewotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChjb21wYW55KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3JnQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvcmdsaW5lID0gb3JnQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHLCBvcmdsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkob3JnbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkob3JnbGluZSkpKTsKLQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUsIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHRpdGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHRpdGxlKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob3RvcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzQnl0ZUFycmF5KFBob3RvLlBIT1RPKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlID0gVkNhcmRVdGlscy5ndWVzc0ltYWdlVHlwZShkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVua25vd24gcGhvdG8gdHlwZS4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1N0cmluZyA9IG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZUJhc2U2NChkYXRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG90b1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kUGhvdG9MaW5lKHBob3RvU3RyaW5nLCBwaG90b1R5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5vdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBub3RlQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm90ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub3RlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKG5vdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gbm90ZUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHNjYW4gbm90ZVN0ciBjb21wbGV0ZWx5IHR3aWNlLCB3aGljaCBpcyByZWR1bmRhbnQuCi0gICAgICAgICAgICAgICAgLy8gQnV0IGZvciBub3csIHdlIGFzc3VtZSB0aGlzIGlzIG5vdCBzbyB0aW1lLWNvbnN1bWluZy4uCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUsIG5vdGVTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm90ZVN0ciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShub3RlU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8sIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRFdmVudHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHByaW1hcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5QmlydGhkYXkgPSBudWxsOwotICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgZXZlbnRUeXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlQXNJbnRlZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlQXNJbnRlZ2VyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IEV2ZW50LlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnQuVFlQRV9CSVJUSERBWSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmlydGhkYXlDYW5kaWRhdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEV2ZW50LlNUQVJUX0RBVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmlydGhkYXlDYW5kaWRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N1cGVyUHJpbWFyeSA9IChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTdXBlclByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3VwZXJQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAic3VwZXIgcHJpbWFyeSIgYmlydGhkYXkgc2hvdWxkIHRoZSBwcmVmZXJlZCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBicmVhayBoZXJlIHNpbmNlICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBtYXkgZXhpc3QgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBlbnRyeSBpcyBzZXQgdG8gdGhlICJzZWNvbmRhcnkiIGNhbmRpZGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIG90aGVyIHRoYW4gQmlydGhkYXkgaXMgbm90IHN1cHBvcnRlZCBieSB2Q2FyZC4KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmltYXJ5QmlydGhkYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5QmlydGhkYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5LnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRSZWxhdGlvbihmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSAmJiBjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFBvc3RhbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5LCBmaW5hbCBib29sZWFuIGVtaXRMaW5lRXZlcnlUaW1lKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzVmFsdWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFBvc3RhbFN0cnVjdCBwb3N0YWxTdHJ1Y3QgPSB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICBpZiAocG9zdGFsU3RydWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW1pdExpbmVFdmVyeVRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcG9zdGFsU3RydWN0LnJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gcG9zdGFsU3RydWN0LmFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gcG9zdGFsU3RydWN0LmFkZHJlc3NEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBsYWJlbCBpcyB2YWxpZCBpbiB0aGUgc3BlYwotICAgICAgICAgICAgICAgICAgICAvLyAoIklBTkEtdG9rZW4iIGluIHRoZSB2Q2FyZCAzLjAgaXMgdW5jbGVhci4uLikKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCAgZm9yIHNhZmV0eSwgd2UgYWRkICJYLSIgYXQgdGhlIGJlZ2dpbmluZyBvZiBlYWNoIGxhYmVsLgotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGNoZWNrcyB0aGUgbGFiZWwgb2JleXMgd2l0aCB2Q2FyZCAzLjAgc3BlYy4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIFN0cnVjdHVyZWRQb3N0YWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgIGlmICghcGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcGVuZENoYXJzZXQpIHsKLSAgICAgICAgICAgIC8vIFN0cmljdGx5LCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgZXhwb3J0ZXJzIHRvIGVtaXQgY2hhcnNldCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIGFkZCBpdCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wb3J0ZXJzLAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEFzc3VtZSBubyBwYXJzZXIgZG9lcyBub3QgZW1pdCBlcnJvciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHZDYXJkIDMuMC4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoYWRkcmVzc1ZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRFbWFpbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9ICJYLSIgKyBsYWJlbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBFbWFpbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlbExpbmUoZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIGlmICh0eXBlQXNJbnRlZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSByZWFzb24sIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCAiVk9JQ0UiIGluc3RlYWQgb2YgIlBBR0VSIgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DQVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByZWxldmFudCBmaWVsZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSVNETjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTUFJTjogewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVJfRkFYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RFTEVYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9UTFgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19QQUdFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlLgotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01NUzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBjdXN0b20gdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXBwZXJMYWJlbCA9IGxhYmVsLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKHVwcGVyTGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh1cHBlckxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBTdHJpY3RseSwgdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93ICJYLSIgcGFyYW1ldGVyIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICJUWVBFPSIgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9SQURJTzoKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9UVFlfVEREOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUobUJ1aWxkZXIsIHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHBob25lIHR5cGUgc3RyaW5nIHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBEb0NvTW8gaGFkIGJlZW4gY29uc2VydmF0aXZlCi0gICAgICAgICAgICAvLyBhYm91dCBtaXNjZWxsYW5lb3VzIHR5cGVzLgotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGhvbmVUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZVR5cGVTdHJpbmcodHlwZSk7Ci0gICAgICAgICAgICBpZiAocGhvbmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHBob25lVHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIChieSB2Q2FyZCkgUGhvbmUgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuY29kZWRWYWx1ZSBNdXN0IGJlIGVuY29kZWQgYnkgQkFTRTY0IAotICAgICAqIEBwYXJhbSBwaG90b1R5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQaG90b0xpbmUoZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgZmluYWwgU3RyaW5nIHBob3RvVHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTyk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0bXBCdWlsZGVyLCBwaG90b1R5cGUpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRtcFN0ciA9IHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdG1wU3RyLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtRm9yRmlyc3RMaW5lID0gVkNhcmRDb25zdGFudHMuTUFYX0NIQVJBQ1RFUl9OVU1TX0JBU0U2NF9WMzAKLSAgICAgICAgICAgICAgICAtIFZDQVJEX0VORF9PRl9MSU5FLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtSW5HZW5lcmFsID0gbWF4TnVtRm9yRmlyc3RMaW5lIC0gVkNBUkRfV1MubGVuZ3RoKCk7Ci0gICAgICAgIGludCBtYXhOdW0gPSBtYXhOdW1Gb3JGaXJzdExpbmU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKHRtcFN0ci5jaGFyQXQoaSkpOwotICAgICAgICAgICAgbGluZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAobGluZUNvdW50ID4gbWF4TnVtKSB7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1dTKTsKLSAgICAgICAgICAgICAgICBtYXhOdW0gPSBtYXhOdW1JbkdlbmVyYWw7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQodG1wQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoIXNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoImRhdGEiICsgaSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYXdWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKTsKLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlKTsgIC8vIFNob3VsZCBub3QgYmUgZW5jb2RlZC4KLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgb25lIGxpbmUgd2l0aCBhIGdpdmVuIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWVMaXN0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgc3BlYywgdGhvdWdoCi0gICAgICAgICAgICAvLyAgICAgICBzZXZlcmFsIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCwgbmVlZENoYXJzZXQsIG5lZWRRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHR5cGVzKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIG1ha2UgdGhpcyBjb21tYSBzZXBhcmF0ZWQgZm9ybSBsaWtlICJUWVBFPURPTSxXT1JLIiBpbiB0aGUgZnV0dXJlLAotICAgICAgICAvLyB3aGljaCB3b3VsZCBiZSByZWNvbW1lbmRlZCB3YXkgaW4gdmNhcmQgMy4wIHRob3VnaCBub3QgdmFsaWQgaW4gdkNhcmQgMi4xLgotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZVZhbHVlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBzcGVjaWZpZXMgdGhlIGRpZmZlcmVudCB0eXBlIG9mIGFjY2VwdGFibGUgdHlwZSBTdHJpbmdzLCBidXQKLSAgICAgICAgICAgIC8vICAgICAgIHdlIGRvbid0IGVtaXQgdGhhdCBraW5kIG9mIHZDYXJkIDMuMCBzcGVjaWZpYyB0eXBlIHNpbmNlIHRoZXJlIHNob3VsZCBiZQotICAgICAgICAgICAgLy8gICAgICAgaGlnaCBwcm9iYWJpbHl0eSBpbiB3aGljaCBleHRlcm5hbCBpbXBvcnRlcnMgY2Fubm90IHVuZGVyc3RhbmQgdGhlbS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBlLmcuIFRZUEU9Ilx1NTc4Qlx1MzA2Qlx1MzA4NyIgKHZDYXJkIDMuMCBhbGxvd3Mgbm9uLUFzY2lpIGNoYXJhY3RlcnMgaWYgdGhleQotICAgICAgICAgICAgLy8gICAgICBhcmUgcXVvdGVkLikKLSAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5pc1YyMVdvcmQodHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHR5cGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIobUJ1aWxkZXIsIHR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgLy8gUmVmcmFpbiBmcm9tIHVzaW5nIGFwcGVuZFR5cGUoKSBzbyB0aGF0ICJUWVBFPSIgaXMgbm90IGJlIGFwcGVuZGVkIHdoZW4gdGhlCi0gICAgICAgIC8vIGRldmljZSBpcyBEb0NvTW8ncyAoanVzdCBmb3Igc2FmZXR5KS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogSW4gdkNhcmQgMy4wLCBUeXBlIHN0cmluZ3MgYWxzbyBjYW4gYmUgbGlrZSB0aGlzOiAiVFlQRT1IT01FLFBSRUYiCi0gICAgICAgIGlmICgobUlzVjMwIHx8IG1BcHBlbmRUeXBlUGFyYW1OYW1lKSAmJiAhbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKS5hcHBlbmQoVkNBUkRfUEFSQU1fRVFVQUwpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBsaW5lIHNob3VsZCBjb250YWluIGNoYXJzZXQgcGFyYW1ldGVyCi0gICAgICogaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gdHJ1ZSBldmVuIHdoZW4gdkNhcmQgdmVyc2lvbiBpcyAzLjAuCi0gICAgICoKLSAgICAgKiBTdHJpY3RseSwgYWRkaW5nIGNoYXJzZXQgaW5mb3JtYXRpb24gaXMgaW52YWxpZCBpbiBWQ2FyZCAzLjAuCi0gICAgICogSG93ZXZlciB3ZSdsbCBhZGQgdGhlIGluZm8gb25seSB3aGVuIGNoYXJzZXQgd2UgdXNlIGlzIG5vdCBVVEYtOAotICAgICAqIGluIHZDYXJkIDMuMCBmb3JtYXQsIHNpbmNlIHBhcnNlciBzaWRlIG1heSBiZSBhYmxlIHRvIHVzZSB0aGUgY2hhcnNldAotICAgICAqIHZpYSB0aGlzIGZpZWxkLCB0aG91Z2ggd2UgbWF5IGVuY291bnRlciBhbm90aGVyIHByb2JsZW0gYnkgYWRkaW5nIGl0LgotICAgICAqCi0gICAgICogZS5nLiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSBTaGlmdF9KaXMgd2hpbGUgUkZDIDI0MjYKLSAgICAgKiByZWNvbW1lbmRzIFVURi04LiBCeSBhZGRpbmcgdGhpcyBmaWVsZCwgcGFyc2VycyBtYXkgYmUgYWJsZQotICAgICAqIHRvIGtub3cgdGhpcyB0ZXh0IGlzIE5PVCBVVEYtOCBidXQgU2hpZnRfSmlzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oU3RyaW5nLi4ucHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgaWYgKCFtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlWYWx1ZSA6IHByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBieXRlW10gc3RyQXJyYXkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcyhtQ2hhcnNldFN0cmluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNoYXJzZXQgIiArIG1DaGFyc2V0U3RyaW5nICsgIiBjYW5ub3QgYmUgdXNlZC4gIgotICAgICAgICAgICAgICAgICAgICArICJUcnkgZGVmYXVsdCBjaGFyc2V0Iik7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpbmRleCA8IHN0ckFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPSUwMlgiLCBzdHJBcnJheVtpbmRleF0pKTsKLSAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICBsaW5lQ291bnQgKz0gMzsKLQotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+PSA2NykgewotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYXRpb24gcmVxdWlyZXMgQ1JMRiBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIG1vcmUgdGhhbiA3Ni4KLSAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lCi0gICAgICAgICAgICAgICAgLy8gNiBieXRlcy4KLSAgICAgICAgICAgICAgICAvLyA3NiAtIDYgLSAzID0gNjcKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVxyXG4iKTsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgJ1wnIHRvIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBiZSBlc2NhcGVkLiBUaGUgY2hhcmFjdGVyIHNldCBpcyBkaWZmZXJlbnQKLSAgICAgKiBub3Qgb25seSBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGJ1dCBhbHNvIGFtb25nIGVhY2ggZGV2aWNlLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IFF1b3RlZC1QcmludGFibGUgc3RyaW5nIG11c3Qgbm90IGJlIGlucHV0IGhlcmUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVDaGFyYWN0ZXJzKGZpbmFsIFN0cmluZyB1bmVzY2FwZWQpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHVuZXNjYXBlZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB1bmVzY2FwZWQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICAgIGNhc2UgJzsnOiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogewotICAgICAgICAgICAgICAgICAgICAvLyBJbiB2Q2FyZCAyLjEsIHRoZXJlJ3Mgbm8gc3BlY2lmaWNhdGlvbiBhYm91dCB0aGlzLCB3aGlsZQotICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgZXhwbGljaXRseSByZXF1aXJlcyB0aGlzIHNob3VsZCBiZSBlbmNvZGVkIHRvICJcbiIuCi0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcLCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKCFtRW5kQXBwZW5kZWQpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQ0xBU1MsIFZDQVJEX0RBVEFfUFVCTElDKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUkVEVUNUSU9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05PLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTkQsIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICAgICAgbUVuZEFwcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4YjY2NS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHkuTmFtZWRDb250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZm9yIGNvbXBvc2luZyBWQ2FyZCBmcm9tIENvbnRhY3RzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpcwotICogY29tcGxldGVseSBkaWZmZXJudCBpbXBsZW1lbnRhdGlvbiBmcm9tCi0gKiBhbmRyb2lkLnN5bmNtbC5waW0udmNhcmQuVkNhcmRDb21wb3Nlciwgd2hpY2ggaXMgbm90IG1haW50YWluZWQgYW55bW9yZS4KLSAqIDwvcD4KLSAqCi0gKiA8cD4KLSAqIFVzdWFsbHksIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzLgotICogPC9wPgotICoKLSAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5WQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0gbnVsbDsKLSAqIHRyeSB7Ci0gKiAgICAgY29tcG9zZXIgPSBuZXcgVkNhcmRDb21wb3Nlcihjb250ZXh0KTsKLSAqICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKAotICogICAgICAgICAgICAgY29tcG9zZXIubmV3IEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0gKiAgICAgaWYgKCFjb21wb3Nlci5pbml0KCkpIHsKLSAqICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBzaXR1YXRpb24uCi0gKiAgICAgICAgIHJldHVybjsKLSAqICAgICB9Ci0gKiAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gKiAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAqICAgICAgICAgICAgIC8vIEFzc3VtZSBhIHVzZXIgbWF5IGNhbmNlbCB0aGlzIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGV4cG9ydC4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgICAgICBpZiAoIWNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KCkpIHsKLSAqICAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgZXJyb3Igc2l0dWF0aW9uLgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgfQotICogfSBmaW5hbGx5IHsKLSAqICAgICBpZiAoY29tcG9zZXIgIT0gbnVsbCkgewotICogICAgICAgICBjb21wb3Nlci50ZXJtaW5hdGUoKTsKLSAqICAgICB9Ci0gKiB9IDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb21wb3NlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb21wb3NlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BIT05FX1RZUEUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1NUQUxfVFlQRSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU1BSUxfVFlQRSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk8gPQotICAgICAgICAiRmFpbGVkIHRvIGdldCBkYXRhYmFzZSBpbmZvcm1hdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWSA9Ci0gICAgICAgICJUaGVyZSdzIG5vIGV4cG9ydGFibGUgaW4gdGhlIGRhdGFiYXNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRCA9Ci0gICAgICAgICJUaGUgdkNhcmQgY29tcG9zZXIgb2JqZWN0IGlzIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQiOwotCi0gICAgLyoqIFNob3VsZCBiZSB2aXNpYmxlIG9ubHkgZnJvbSBkZXZlbG9wZXJzLi4uIChubyBuZWVkIHRvIHRyYW5zbGF0ZSwgaG9wZWZ1bGx5KSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX1VOU1VQUE9SVEVEX1VSSSA9Ci0gICAgICAgICJUaGUgVXJpIHZDYXJkIGNvbXBvc2VyIHJlY2VpdmVkIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvc2VyLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19FUlJPUiA9ICJObyBlcnJvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1NUUklOR19ET0NPTU8gPSAiZG9jb21vIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBVUkkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVEVTVF9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQudW5pdF90ZXN0cy52Y2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIFZDQVJEX1RFU1RfQVVUSE9SSVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJID0KLSAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJLCAiY29udGFjdHMiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNJbU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICAvLyBHb29nbGUgdGFsayBpcyBhIHNwZWNpYWwgY2FzZS4KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiB1c2VmdWwgZXhhbXBsZSBoYW5kbGVyLCB3aGljaCBlbWl0cyBWQ2FyZCBTdHJpbmcgdG8gb3V0cHV0c3RyZWFtIG9uZSBieSBvbmUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBpbnB1dCBPdXRwdXRTdHJlYW0gb2JqZWN0IGlzIGNsb3NlZCgpIG9uIHtAbGluayAjb25UZXJtaW5hdGUoKX0uCi0gICAgICogTXVzdCBub3QgY2xvc2UgdGhlIHN0cmVhbSBvdXRzaWRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgSGFuZGxlckZvck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJ2Y2FyZC5WQ2FyZENvbXBvc2VyLkhhbmRsZXJGb3JPdXRwdXRTdHJlYW0iOwotCi0gICAgICAgIGZpbmFsIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07IC8vIG1Xcml0ZXIgd2lsbCBjbG9zZSB0aGlzLgotICAgICAgICBwcml2YXRlIFdyaXRlciBtV3JpdGVyOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgb24gdGhlIGRldHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGFuZGxlckZvck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLCBtQ2hhcnNldFN0cmluZykpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbnN1cHBvcnRlZCBjaGFyc2V0OiAiICsgbUNoYXJzZXRTdHJpbmcpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJFbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IHRoaXMgZG9lcyBub3QgaGFwcGVuISk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNoYXJzZXRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBlbXB0eSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZShjcmVhdGVPbmVFbnRyeUludGVybmFsKCItMSIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9uIEluaXQoKTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUodmNhcmQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIHN5bmMgdGhlIGRhdGEgc28gdGhhdCBhIHVzZXIgaXMgYWJsZSB0byBwdWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTRENhcmQganVzdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhwb3J0LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtT3V0cHV0U3RyZWFtIGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRmlsZU91dHB1dFN0cmVhbSkgbU91dHB1dFN0cmVhbSkuZ2V0RkQoKS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGR1cmluZyBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgICAgICBpZiAoIW1PblRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICAgICAgb25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQ2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzU2hpZnRKaXM7Ci0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICBwcml2YXRlIGludCBtSWRDb2x1bW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldFN0cmluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlcm1pbmF0ZUlzQ2FsbGVkOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IG1IYW5kbGVyTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvclJlYXNvbiA9IE5PX0VSUk9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbnRhY3RzUHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ERUZBVUxULCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHZjYXJkVHlwZVN0ciwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIFZDYXJkQ29uZmlnLmdldFZDYXJkVHlwZUZyb21TdHJpbmcodmNhcmRUeXBlU3RyKSwgY2FyZUhhbmRsZXJFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBmb3Igc3VwcG9ydGluZyBjYWxsIGxvZyBlbnRyeSB2Q2FyZCBjb21wb3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1DYXJlSGFuZGxlckVycm9ycyA9IGNhcmVIYW5kbGVyRXJyb3JzOwotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc1NoaWZ0SmlzID0gVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1IYW5kbGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNTaGlmdEppcykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZlbmRvci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBVVEZfODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2luaXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlckxpc3QuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZCBhbGwgdGhlIG90aGVyCi0gICAgICogICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgewotICAgICAgICByZXR1cm4gaW5pdChudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGluaXQoQ29udGFjdHMuQ09OVEVOVF9VUkksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5zdGFibGUgaW50ZXJmYWNlLCBtYXkgYmUgZGVsZXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgVXJpIGNvbnRlbnRVcmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkluaXQobUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGZpbmlzaGVkIDogZmluaXNoZWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZC5vblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgZmFsc2UgcmV0dXJuZWQgZnJvbSBvbkluaXQoKS4KLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uSW5pdChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0aW9uOwotICAgICAgICBpZiAoQ29udGFjdHMuQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpIHx8Ci0gICAgICAgICAgICAgICAgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkpIHsKLSAgICAgICAgICAgIHByb2plY3Rpb24gPSBzQ29udGFjdHNQcm9qZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIGNvbnRlbnRVcmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLQotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk87Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Q291bnQoKSA9PSAwIHx8ICFtQ3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZENvbHVtbiA9IG1DdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ29udGFjdHMuX0lEKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9uZUVudHJ5KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCBGb3IgRGVwZW5kZW5jeSBJbmplY3Rpb24uCi0gICAgICogQGhpZGUganVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeShNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCB8fCBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmNhcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlkQ29sdW1uID49IDApIHsKLSAgICAgICAgICAgICAgICB2Y2FyZCA9IGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwobUN1cnNvci5nZXRTdHJpbmcobUlkQ29sdW1uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBtSWRDb2x1bW46ICIgKyBtSWRDb2x1bW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSBzb21lIGRhdGEgKGUuZy4gcGhvdG8pIGlzIHRvbyBiaWcgdG8gaGF2ZSBpbiBtZW1vcnkuIEJ1dCBpdAotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJhcmUuCi0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBvY2N1cmVkLiBJZ25vcmUgdGhlIGVudHJ5LiIpOwotICAgICAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGVsbCB1c2VycyB3aGF0IGhhcHBlbmVkPwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB0aGUgT3V0T2ZNZW1vcnlFcnJvciBvbiB0aGUgaGFuZGxlciBzaWRlCi0gICAgICAgIC8vIDotUAotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVPbmVFbnRyeUludGVybmFsKGZpbmFsIFN0cmluZyBjb250YWN0SWQsCi0gICAgICAgICAgICBNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIC8vIFRoZSByZXNvbHZlciBtYXkgcmV0dXJuIHRoZSBlbnRpdHkgaXRlcmF0b3Igd2l0aCBubyBkYXRhLiBJdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgLy8gZS5nLiBJZiBhbGwgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3Qgb2YgdGhlIGdpdmVuIGNvbnRhY3QgaWQgYXJlIG5vdCBleHBvcnRhYmxlIG9uZXMsCi0gICAgICAgIC8vICAgICAgdGhleSBhcmUgaGlkZGVuIGZyb20gdGhlIHZpZXcgb2YgdGhpcyBtZXRob2QsIHRob3VnaCBjb250YWN0IGlkIGl0c2VsZiBleGlzdHMuCi0gICAgICAgIEVudGl0eUl0ZXJhdG9yIGVudGl0eUl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBSYXdDb250YWN0c0VudGl0eS5DT05URU5UX1VSSS5idWlsZFVwb24oKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGF0YS5GT1JfRVhQT1JUX09OTFksICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uID0gRGF0YS5DT05UQUNUX0lEICsgIj0/IjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10ge2NvbnRhY3RJZH07Ci0gICAgICAgICAgICBpZiAoZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgYnkgc29tZSB0ZXN0cyBvbmx5Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSAoRW50aXR5SXRlcmF0b3IpZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIpOwotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2VFbGVtZW50cyA9IGUuZ2V0Q2F1c2UoKS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHN0YWNrVHJhY2VFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIiAgICBhdCAiICsgZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gUmF3Q29udGFjdHMubmV3RW50aXR5SXRlcmF0b3IobUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVudGl0eUl0ZXJhdG9yIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRhdGEgZG9lcyBub3QgZXhpc3QuIGNvbnRhY3RJZDogIiArIGNvbnRhY3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IGVudGl0eUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE5hbWVkQ29udGVudFZhbHVlcyBuYW1lZENvbnRlbnRWYWx1ZXMgOiBlbnRpdHkuZ2V0U3ViVmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmFtZWRDb250ZW50VmFsdWVzLnZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5wdXQoa2V5LCBjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBWQ2FyZEJ1aWxkZXIobVZDYXJkVHlwZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTmFtZVByb3BlcnRpZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kTmlja05hbWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFBob25lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFbWFpbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUG9zdGFscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZE9yZ2FuaXphdGlvbnMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFdlYnNpdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIGlmICgobVZDYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQpID09IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUGhvdG9zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG90by5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTm90ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFdmVudHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFJlbGF0aW9uKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgaGFuZGxlci5vblRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmICghbVRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICB0ZXJtaW5hdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5pc0FmdGVyTGFzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJuIHRoZSBlcnJvciByZWFzb24gaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1FcnJvclJlYXNvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5ODQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIFZDYXJkIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIFVzZWZ1bCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluIHRoaXMgY2xhc3MKLSAqIGJ1dCBpbiBWQ2FyZFV0aWxzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25maWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29uZmlnIjsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfTk9ORSA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCA9IDB4MTsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1NIT1dfV0FSTklORyA9IDB4MjsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1ZFUkJPU0UgPQotICAgICAgICBMT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQgfCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTCA9IExPR19MRVZFTF9OT05FOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfQVBQTEUgPSAxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUCA9IDI7ICAvLyBGb3IgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9GT01BID0gMzsgIC8vIEZvciBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMuCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfSlAgPSA0OwotCi0gICAgLy8gQXNzdW1lcyB0aGF0ICJpc28tODg1OS0xIiBpcyBhYmxlIHRvIG1hcCAiYWxsIiA4Yml0IGNoYXJhY3RlcnMgdG8gc29tZSB1bmljb2RlIGFuZAotICAgIC8vIGRlY29kZSB0aGUgdW5pY29kZSB0byB0aGUgb3JpZ2luYWwgY2hhcnNldC4gSWYgbm90LCB0aGlzIHNldHRpbmcgd2lsbCBjYXVzZSBzb21lIGJ1Zy4gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUID0gImlzby04ODU5LTEiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVjIxID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1YzMCA9IDE7Ci0KLSAgICAvLyAweDIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUgdXNlIC4uLgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9ERUZBVUxUID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0VVUk9QRSA9IDB4NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0pBUEFORVNFID0gMHg4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX01BU0sgPSAweEM7Ci0KLSAgICAvLyAweDEwIGlzIHJlc2VydmVkIGZvciBzYWZldHkKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DSEFSU0VUX1VURjggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTID0gMHgxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hBUlNFVF9NQVNLID0gMHhGMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyB1c2VkIG9ubHkgaW4gQW5kcm9pZAotICAgICAqIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGF0IGRhdGEuCi0gICAgICogCi0gICAgICogRm9yIGV4YW1wbGUsIEFuZHJvaWQgYWNjZXB0cyBuaWNrbmFtZSBpbmZvcm1hdGlvbiB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgb24sIHZDYXJkIGNvbXBvc2VyIGVtaXRzIGFsdGVybmF0aXZlICJYLSIgcHJvcGVydHkgKGxpa2UgIlgtTklDS05BTUUiKQotICAgICAqIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyBpdC4KLSAgICAgKiAKLSAgICAgKiB2Q2FyZCBwYXJzZXIgY29kZSBhdXRvbWF0aWNhbGx5IHBhcnNlcyB0aGUgZmllbGQgZW1pdHRlZCBldmVuIHdoZW4gdGhpcyBmbGFnIGlzIG9mZi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBmbGFnIGRvZXMgbm90IGFzc3VyZSBhbGwgdGhlIGluZm9ybWF0aW9uIG11c3QgYmUgaG9sZCBpbiB0aGUgZW1pdHRlZCB2Q2FyZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSA9IDB4ODAwMDAwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgc2VlbiBpbiB0aGUKLSAgICAgKiB2Q2FyZCBkYXRhIGVtaXR0ZWQgYnkgdGhlIG90aGVyIHNvZnR3YXJlcy9kZXZpY2VzIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uCi0gICAgICogZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZChzKSBmb3IgdGhhdCBkYXRhLiAKLSAgICAgKiAKLSAgICAgKiBPbmUgZXhhbXBsZSBpcyBYLVBIT05FVElDLUZJUlNULU5BTUUvWC1QSE9ORVRJQy1NSURETEUtTkFNRS9YLVBIT05FVElDLUxBU1QtTkFNRSwgd2hpY2ggYXJlCi0gICAgICogZm9yIHBob25ldGljIG5hbWUgKGhvdyB0aGUgbmFtZSBpcyBwcm9ub3VuY2VkKSwgc2VlbiBpbiB0aGUgdkNhcmQgZW1pdHRlZCBieSBzb21lIG90aGVyCi0gICAgICogbm9uLUFuZHJvaWQgZGV2aWNlcy9zb2Z0d2FyZXMuIFdlIGNob3NlIHRvIGVuYWJsZSB0aGUgdkNhcmQgY29tcG9zZXIgdG8gdXNlIHRob3NlCi0gICAgICogZGVmYWN0IHByb3BlcnRpZXMgc2luY2UgdGhleSBhcmUgYWxzbyB1c2VmdWwgZm9yIEFuZHJvaWQgZGV2aWNlcy4KLSAgICAgKiAKLSAgICAgKiBOb3RlIGZvciBkZXZlbG9wZXJzOiBvbmx5ICJYLSIgcHJvcGVydGllcyBzaG91bGQgYmUgYWRkZWQgd2l0aCB0aGlzIGZsYWcuIHZDYXJkIDIuMS8zLjAKLSAgICAgKiBhbGxvd3MgYW55IGtpbmQgb2YgIlgtIiBwcm9wZXJ0aWVzIGJ1dCBkb2VzIG5vdCBhbGxvdyBub24tIlgtIiBwcm9wZXJ0aWVzIChleGNlcHQgSUFOQSB0b2tlbnMKLSAgICAgKiBpbiB2Q2FyZCAzLjApLiBTb21lIGV4dGVybmFsIHBhcnNlcnMgbWF5IGdldCBjb25mdXNlZCB3aXRoIG5vbi12YWxpZCwgbm9uLSJYLSIgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZID0gMHg0MDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgc29tZSBzcGVjaWZpYyBkaWFsZWN0IHNlZW4gaW4gdmNhcmQgb2YgRG9Db01vIChvbmUgb2YgSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgY2FyZWVycykgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIGFueSBvdGhlciBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICogdGhhdCAidGhlIHZDYXJkIGlzIGZvciBKYXBhbmVzZSIuIFNvIGl0IGlzICJwb3NzaWJsZSIgdGhhdCAidGhlIHZDYXJkIHNob3VsZCBoYXZlIERvQ29NbydzCi0gICAgICogZGlhbGVjdCBidXQgdGhlIG5hbWUgb3JkZXIgc2hvdWxkIGJlIEV1cm9wZWFuIiwgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NPTU8gPSAweDIwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyAiTk9UIiB1c2UgUXVvdGVkLVByaW50YWJsZSB0b3dhcmQgInByaW1hcnkiCi0gICAgICogcHJvcGVydGllcyBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEgKFFQIGlzIHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgYWN0dWFsbHkgY2Fubm90IGRlZmluZSB3aGF0IGlzIHRoZSAicHJpbWFyeSIgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGlzIGlzIE5PVCBkZWZpbmVkCi0gICAgICogaW4gdkNhcmQgc3BlY2lmaWNhdGlvbiBlaXRoZXIuIEFsc28gYmUgYXdhcmUgdGhhdCBpdCBpcyBOT1QgcmVsYXRlZCB0byAicHJpbWFyeSIgbm90aW9uCi0gICAgICogdXNlZCBpbiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBUaGlzIG5vdGlvbiBpcyBqdXN0IGZvciB2Q2FyZCBjb21wb3NpdGlvbiBpbiBBbmRyb2lkLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSBhZGRlZCB0aGlzIEFuZHJvaWQtc3BlY2lmaWMgbm90aW9uIHNpbmNlIHNvbWUgKGluY29tcGxldGUpIHZDYXJkIGV4cG9ydGVycyBmb3IgdkNhcmQgMi4xCi0gICAgICogZG8gTk9UIHVzZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nIHRvd2FyZCBzb21lIHByb3BlcnRpZXMgcmVsYXRlZCBuYW1lcyBsaWtlICJOIiwgIkZOIiwgZXRjLgotICAgICAqIGV2ZW4gd2hlbiB0aGVpciB2YWx1ZXMgY29udGFpbiBub24tYXNjaWkgb3IvYW5kIENSL0xGLCB3aGlsZSB0aGV5IHVzZSB0aGUgZW5jb2RpbmcgaW4gdGhlCi0gICAgICogb3RoZXIgcHJvcGVydGllcyBsaWtlICJBRFIiLCAiT1JHIiwgZXRjLgotICAgICAqIDxQPgotICAgICAqIFdlIGFyZSBhZnJhaWQgb2YgdGhlIGNhc2Ugd2hlcmUgc29tZSB2Q2FyZCBpbXBvcnRlciBhbHNvIGZvcmdldCBoYW5kbGluZyBRUCBwcmVzdW1pbmcgUVAgaXMKLSAgICAgKiBub3QgdXNlZCBpbiBzdWNoIGZpZWxkcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWZ1bCB3aGVuIHNvbWUgdGFyZ2V0IGltcG9ydGVyIHlvdSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gZG9lcyBub3QgYWNjZXB0Ci0gICAgICogc3VjaCBwcm9wZXJ0aWVzIHdpdGggUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogQWdhaW4sIHdlIHNob3VsZCBub3QgdXNlIHRoaXMgZmxhZyBhdCBhbGwgZm9yIGNvbXBseWluZyB2Q2FyZCAyLjEgc3BlYy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSW4gdkNhcmQgMy4wLCBRdW90ZWQtUHJpbnRhYmxlIGlzIGV4cGxpY2l0bHkgInByb2hpYml0dGVkIiwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIHRoaXMKLSAgICAgKiBraW5kIG9mIHByb2JsZW0gKGhvcGVmdWxseSkuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMgPSAweDEwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHBob25ldGljIG5hbWUgcmVsYXRlZCBmaWVsZHMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgKiBhcHByb3ByaWF0ZSBmb3JtLiBOb3RlIHRoYXQgImFwcHJvcHJpYXRlIiBpcyBub3QgZGVmaW5lZCBpbiBhbnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGlzIGlzIEFuZHJvaWQtc3BlY2lmaWMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE9uZSB0eXBpY2FsIChhbmQgY3VycmVudGx5IHNvbGUpIGV4YW1wbGUgd2hlcmUgd2UgbmVlZCB0aGlzIGZsYWcgaXMgdGhlIHRpbWUgd2hlbgotICAgICAqIHdlIG5lZWQgdG8gZW1pdCBKYXBhbmVzZSBwaG9uZXRpYyBuYW1lcyBpbnRvIHZDYXJkIGVudHJpZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgKiBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIGhhbGYtd2lkdGgga2F0YWthbmEgd2hlbiB0aGUgdGFyZ2V0IGltcG9ydGVyIGlzIEphcGFuZXNlIG1vYmlsZQotICAgICAqIHBob25lcycsIHdoaWNoIGFyZSBwcm9iYWJseSBub3QgYWJsZSB0byBwYXJzZSBmdWxsLXdpZHRoIGhpcmFnYW5hL2thdGFrYW5hIGZvcgotICAgICAqIGhpc3RvcmljYWwgcmVhc29ucywgd2hpbGUgdGhlIHZDYXJkIGltcG9ydGVycyBlbWJlZGRlZCB0byBzb2Z0d2FyZXMgZm9yIFBDIHNob3VsZCBiZQotICAgICAqIGFibGUgdG8gcGFyc2UgdGhlbSBhcyB3ZSBleHBlY3QuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgPSAweDA4MDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciAiZm9yIDIuMSIgZW1pdHMgIlRZUEU9IiBzdHJpbmcgdG93YXJkIFRZUEUgcGFyYW1zCi0gICAgICogZXZlcnkgdGltZSBwb3NzaWJsZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZG9lcyBub3QgZW1pdCBpdCBhbmQgaXMgdmFsaWQgaW4gdGhlIHNwZWMuCi0gICAgICogSW4gdkNyYWQgMy4wLCB0aGlzIGZsYWcgaXMgdW5uZWNlc3NhcnksIHNpbmNlICJUWVBFPSIgaXMgTVVTVCBpbiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIEhvdyBtb3JlIHRoYW4gb25lIFRZUEUgZmllbGRzIGFyZSBleHByZXNzZWQgaXMgZGlmZmVyZW50IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIGUuZy48QlIgLz4KLSAgICAgKiAxKSBQcm9iYWJseSB2YWxpZCBpbiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wOiAiQURSO1RZUEU9RE9NO1RZUEU9SE9NRTouLi4iPEJSIC8+Ci0gICAgICogMikgVmFsaWQgaW4gdkNhcmQgMi4xIGJ1dCBub3QgaW4gdkNhcmQgMy4wOiAiQURSO0RPTTtIT01FOi4uLiI8QlIgLz4KLSAgICAgKiAzKSBWYWxpZCBpbiB2Q2FyZCAzLjAgYnV0IG5vdCBpbiB2Q2FyZCAyLjE6ICJBRFI7VFlQRT1ET00sSE9NRTouLi4iPEJSIC8+Ci0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIDIpIGhhZCBiZWVuIHRoZSBkZWZhdWx0IG9mIFZDYXJkIGV4cG9ydGVyL2ltcG9ydGVyIGluIEFuZHJvaWQsIGJ1dCBpdCBpcyBmb3VuZCB0aGF0Ci0gICAgICogc29tZSBleHRlcm5hbCBleHBvcnRlciBpcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgdHlwZSBmb3JtYXQgbGlrZSAyKSBidXQgb25seSAzKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSWYgeW91IGFyZSB0YXJnZXRpbmcgdG8gdGhlIGltcG9ydGVyIHdoaWNoIGNhbm5vdCBhY2NlcHQgVFlQRSBwYXJhbXMgd2l0aG91dCAiVFlQRT0iCi0gICAgICogc3RyaW5ncyAod2hpY2ggc2hvdWxkIGJlIHJhcmUgdGhvdWdoKSwgcGxlYXNlIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIEV4YW1wbGUgdXNhZ2U6IGludCB2Y2FyZFR5cGUgPSAoVkNBUkRfVFlQRV9WMjFfR0VORVJJQyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pOwotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNID0gMHgwNDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGFza2luZyBleHBvcnRlciB0byByZWZyYWluIGltYWdlIGV4cG9ydC4KLSAgICAgKiA8L1A+Ci0gICAgICogQGhpZGUgd2lsbCBiZSBkZWxldGVkIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUID0gMHgwMjAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgdG91Y2ggbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVyIFN0cmluZ3MKLSAgICAgKiBidXQgbGVhdmUgaXQgYXMgaXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCBzcGVjaWZpY2F0aW9ucyBtZW50aW9uIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlcnMsIHdoaWxlIHNvbWUgZGV2aWNlcwotICAgICAqIGRvICh3cm9uZ2x5LCBidXQgd2l0aCBpbm5ldml0YWJsZSByZWFzb25zKS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLSAgICAgKiBqdXN0IG51bWJlcnMsIGh5cGVucywgcGx1cywgZXRjLiBidXQgbm90IHVzdWFsIGFscGhhYmV0cywgd2hpbGUgVVMgbW9iaWxlIHBob25lcwotICAgICAqIHNob3VsZCBnZXQgc3VjaCBjaGFyYWN0ZXJzLiBUbyBtYWtlIGV4cG9ydGVkIHZDYXJkIHNpbXBsZSBmb3IgZXh0ZXJuYWwgcGFyc2VycywKLSAgICAgKiB3ZSBoYXZlIHVzZWQge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKFN0cmluZyl9IGR1cmluZyBleHBvcnQsIGFuZAotICAgICAqIHJlbW92ZWQgdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlIG51bWJlciAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiCi0gICAgICogYmVjb21lcyAiMTExLTIyMi0zMzMzIikuCi0gICAgICogVW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgdGhhdCB1c2Ugd2FzIHNvbWUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIG90aGVyCi0gICAgICogYXJlYXMgbWF5IGJlIGJhZGx5IGFmZmVjdGVkIGJ5IHRoZSBmb3JtYXR0aW5nLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBUaGlzIGZsYWcgZGlzYWJsZXMgdGhhdCBmb3JtYXR0aW5nLCBhZmZlY3RpbmcgYm90aCBpbXBvcnRlciBhbmQgZXhwb3J0ZXIuCi0gICAgICogSWYgdGhlIHVzZXIgaXMgYXdhcmUgb2Ygc29tZSBzaWRlIGVmZmVjdHMgZHVlIHRvIHRoZSBpbXBsaWNpdCBmb3JtYXR0aW5nLCB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcgPSAweDAyMDAwMDAwOwotCi0gICAgLy8vLyBUaGUgZm9sbG93aW5ncyBhcmUgVkNhcmQgdHlwZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZXIvZXhwb3J0ZXIuIC8vLy8KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIEdlbmVyaWMgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZDYXJkIDIuMS4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogV2hlbiBjb21wb3NpbmcgYSB2Q2FyZCBlbnRyeSwgdGhlIFVTIGNvbnZlbnNpb24gd2lsbCBiZSB1c2VkIHRvd2FyZCBmb3JtYXR0aW5nCi0gICAgICogc29tZSB2YWx1ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIGUuZy4gVGhlIG9yZGVyIG9mIHRoZSBkaXNwbGF5IG5hbWUgd291bGQgYmUgIlByZWZpeCBHaXZlbiBNaWRkbGUgRmFtaWx5IFN1ZmZpeCIsCi0gICAgICogd2hpbGUgaXQgc2hvdWxkIGJlICJQcmVmaXggRmFtaWx5IE1pZGRsZSBHaXZlbiBTdWZmaXgiIGluIEphcGFuIGZvciBleGFtcGxlLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MjFfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAuIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgZnVsbHkgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMzAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MzBfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgZm9yIHRoZSB2Q2FyZCAyLjEgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFV0Zi04LgotICAgICAqIEN1cnJlbnRseSwgb25seSBuYW1lIG9yZGVyIGlzIGNvbnNpZGVyZWQgKCJQcmVmaXggTWlkZGxlIEdpdmVuIEZhbWlseSBTdWZmaXgiKQotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIgPSAidjIxX2V1cm9wZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFVURi04LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSID0gInYzMF9ldXJvcGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4X1NUUiA9ICJ2MjFfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCAyLjEgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMuIFNoaWZ0X0ppcyBpcyB1c2VkIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVNfU1RSID0gInYyMV9qYXBhbmVzZV9zamlzIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgU2hpZnRfSmlzIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgICAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIgPSAidjMwX2phcGFuZXNlX3NqaXMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCAzLjAgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOF9TVFIgPSAidjMwX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBiYXNlZCBmb3JtYXQgd2hpY2ggKHBhcnRpYWxseSkgY29uc2lkZXJzIHRoZSBjb252ZW50aW9uIGluIEphcGFuZXNlCi0gICAgICogbW9iaWxlIHBob25lcywgd2hlcmUgcGhvbmV0aWMgbmFtZXMgYXJlIHRyYW5zbGF0ZWQgdG8gaGFsZi13aWR0aCBrYXRha2FuYSBpZgotICAgICAqIHBvc3NpYmxlLCBldGMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTIHwKLSAgICAgICAgICAgICAgICBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTIHwKLSAgICAgICAgICAgICAgICBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSID0gInYyMV9qYXBhbmVzZV9tb2JpbGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVkNhcmQgZm9ybWF0IHVzZWQgaW4gRG9Db01vLCB3aGljaCBpcyBvbmUgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lIGNhcmVlcnMuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIEJhc2UgdmVyc2lvbiBpcyB2Q2FyZCAyLjEsIGJ1dCB0aGUgZGF0YSBoYXMgc2V2ZXJhbCBEb0NvTW8tc3BlY2lmaWMgY29udmVuc2lvbnMuCi0gICAgICogTm8gQW5kcm9pZC1zcGVjaWZpYyBwcm9wZXJ0eSBub3IgZGVmYWN0IHByb3BlcnR5IGlzIGluY2x1ZGVkLiBUaGUgIlByaW1hcnkiIHByb3BlcnRpZXMKLSAgICAgKiBhcmUgTk9UIGVuY29kZWQgdG8gUXVvdGVkLVByaW50YWJsZS4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9ET0NPTU8gPQotICAgICAgICAoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFIHwgRkxBR19ET0NPTU8pOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfRE9DT01PX1NUUiA9ICJkb2NvbW8iOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVkNBUkRfVFlQRV9ERUZBVUxUID0gVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc1ZDYXJkVHlwZU1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gc0phcGFuZXNlTW9iaWxlVHlwZVNldDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBzVkNhcmRUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiwgVkNBUkRfVFlQRV9WMzBfRVVST1BFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIsIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4X1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfRE9DT01PX1NUUiwgVkNBUkRfVFlQRV9ET0NPTU8pOwotCi0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWQ2FyZFR5cGVGcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2Y2FyZFR5cGVTdHJpbmcpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyZWRLZXkgPSB2Y2FyZFR5cGVTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKHNWQ2FyZFR5cGVNYXAuY29udGFpbnNLZXkobG93ZXJlZEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzVkNhcmRUeXBlTWFwLmdldChsb3dlcmVkS2V5KTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZSh2Y2FyZFR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gdkNhcmQgdHlwZSBTdHJpbmc6IFwiIiArIHZjYXJkVHlwZVN0cmluZyArICJcIiIpOwotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YzMChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVjMwKSAhPSAwKTsgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VRdW90ZWRQcmludGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gIWlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNVdGY4KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1NoaWZ0SmlzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVPcmRlclR5cGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlICYgTkFNRV9PUkRFUl9NQVNLOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0RlZmFjdFByb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1BlcmZvcm1hbmNlTG9nKCkgewotICAgICAgICByZXR1cm4gKFZDYXJkQ29uZmlnLkxPR19MRVZFTCAmIFZDYXJkQ29uZmlnLkxPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgcmV0dXJuICghc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUykgIT0gMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmRUeXBlUGFyYW1OYW1lKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChpc1YzMCh2Y2FyZFR5cGUpIHx8ICgodmNhcmRUeXBlICYgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSkgIT0gMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIGFuZCBzb21lIEphcGFuZXNlIGNvbnZlbnNpb24gaXMKLSAgICAgKiBhcHBsaWVkIHRvIGNyZWF0aW5nICJmb3JtYXR0ZWQiIHNvbWV0aGluZyBsaWtlIEZPUk1BVFRFRF9BRERSRVNTLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcGFuZXNlRGV2aWNlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETzogU29tZSBtYXNrIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCB0aGlzIG1ldGhvZCB3cm9uZ2x5IGludGVycHJldAotICAgICAgICAvLyAgICAgICAgSmFwYW5lc2UiLWxpa2UiIHZDYXJkIHR5cGUuCi0gICAgICAgIC8vICAgICAgICBlLmcuIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNUwotICAgICAgICByZXR1cm4gc0phcGFuZXNlTW9iaWxlVHlwZVNldC5jb250YWlucyh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gcmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSA9PSBWQ0FSRF9UWVBFX0RPQ09NTzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb0NvTW8oZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0RPQ09NTykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbmZpZygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA3MTI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBib3RoIGV4cG9ydGVyIGFuZCBpbXBvcnRlciBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjIxID0gIjIuMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMzAgPSAiMy4wIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBuYW1lcyB2YWxpZCBib3RoIGluIHZDYXJkIDIuMSBhbmQgMy4wLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JFR0lOID0gIkJFR0lOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WRVJTSU9OID0gIlZFUlNJT04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX04gPSAiTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk4gPSAiRk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FEUiA9ICJBRFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VNQUlMID0gIkVNQUlMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OT1RFID0gIk5PVEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09SRyA9ICJPUkciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NPVU5EID0gIlNPVU5EIjsgIC8vIE5vdCBmdWxseSBzdXBwb3J0ZWQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEVMID0gIlRFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVElUTEUgPSAiVElUTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JPTEUgPSAiUk9MRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEhPVE8gPSAiUEhPVE8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0xPR08gPSAiTE9HTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVJMID0gIlVSTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkRBWSA9ICJCREFZIjsgIC8vIEJpcnRoZGF5Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU5EID0gIkVORCI7Ci0KLSAgICAvLyBWYWxpZCBwcm9wZXJ0eSBuYW1lcyBub3Qgc3VwcG9ydGVkIChub3QgYXBwcm9wcmlhdGVseSBoYW5kbGVkKSBieSBvdXIgdkNhcmQgaW1wb3J0ZXIgbm93LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFViA9ICJSRVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FHRU5UID0gIkFHRU5UIjsKLQotICAgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAzLjAuIFNob3VkIG5vdCB1c2Ugd2hlbiBjb21wb3NpbmcgdkNhcmQgMi4xIGZpbGUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUNLTkFNRSA9ICJOSUNLTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09SVF9TVFJJTkcgPSAiU09SVC1TVFJJTkciOwotICAgIAotICAgIC8vIERlLWZhY3QgcHJvcGVydHkgdmFsdWVzIGV4cHJlc3NpbmcgcGhvbmV0aWMgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FID0gIlgtUEhPTkVUSUMtRklSU1QtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSA9ICJYLVBIT05FVElDLU1JRERMRS1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSA9ICJYLVBIT05FVElDLUxBU1QtTkFNRSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGJvdGggQ29udGFjdHNTdHJ1Y3QgaW4gRWNsYWlyIGFuZCBkZS1mYWN0IHZDYXJkIGV4dGVuc2lvbnMKLSAgICAvLyBzaG93biBpbiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZDYXJkIHN1cHBvcnQgYXJlIGRlZmluZWQgaGVyZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0FJTSA9ICJYLUFJTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9NU04gPSAiWC1NU04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfWUFIT08gPSAiWC1ZQUhPTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9JQ1EgPSAiWC1JQ1EiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfSkFCQkVSID0gIlgtSkFCQkVSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0dPT0dMRV9UQUxLID0gIlgtR09PR0xFLVRBTEsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUgPSAiWC1TS1lQRS1VU0VSTkFNRSI7Ci0gICAgLy8gUHJvcGVydGllcyBvbmx5IENvbnRhY3RzU3RydWN0IGhhcy4gV2UgYWxzZSB1c2UgdGhpcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1FRID0gIlgtUVEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTkVUTUVFVElORyA9ICJYLU5FVE1FRVRJTkciOwotCi0gICAgLy8gUGhvbmUgbnVtYmVyIGZvciBTa3lwZSwgYXZhaWxhYmxlIGFzIHVzdWFsIHBob25lLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUiA9ICJYLVNLWVBFLVBTVE5OVU1CRVIiOwotCi0gICAgLy8gUHJvcGVydHkgZm9yIEFuZHJvaWQtc3BlY2lmaWMgZmllbGRzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00gPSAiWC1BTkRST0lELUNVU1RPTSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGZvciBEb0NvTW8gdkNhcmQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9DTEFTUyA9ICJYLUNMQVNTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1JFRFVDVElPTiA9ICJYLVJFRFVDVElPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9OTyA9ICJYLU5PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSA9ICJYLURDTS1ITU4tTU9ERSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFID0gIlRZUEUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9IT01FID0gIkhPTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfV09SSyA9ICJXT1JLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0ZBWCA9ICJGQVgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0VMTCA9ICJDRUxMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZPSUNFID0gIlZPSUNFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lOVEVSTkVUID0gIklOVEVSTkVUIjsKLQotICAgIC8vIEFiYnJldmlhdGlvbiBvZiAicHJlZmVyZWQiIGFjY29yZGluZyB0byB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBXZSBpbnRlcnByZXQgdGhpcyB2YWx1ZSBhcyAicHJpbWFyeSIgcHJvcGVydHkgZHVyaW5nIGltcG9ydC9leHBvcnQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBCb3RoIHZDYXJkIHNwZWNzIGRvZXMgbm90IG1lbnRpb24gYW55dGhpbmcgYWJvdXQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGlzIHBhcmFtZXRlciwKLSAgICAvLyAgICAgICBidXQgdGhlcmUgbWF5IGJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgd2hpY2ggd2lsbCBnZXQgY29uZnVzZWQgd2l0aCBtb3JlIHRoYW4KLSAgICAvLyAgICAgICBvbmUgIlBSRUYicyBpbiBvbmUgcHJvcGVydHkgbmFtZSwgd2hpbGUgQW5kcm9pZCBhY2NlcHRzIHRoZW0uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QUkVGID0gIlBSRUYiOwotCi0gICAgLy8gUGhvbmUgdHlwZSBwYXJhbWV0ZXJzIHZhbGlkIGluIHZDYXJkIGFuZCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LCBidXQgbm90IHNvIGNvbW1vbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0NBUiA9ICJDQVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSVNETiA9ICJJU0ROIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BBR0VSID0gIlBBR0VSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1RMWCA9ICJUTFgiOyAgLy8gVGVsZXgKLQotICAgIC8vIFBob25lIHR5cGVzIGV4aXN0aW5nIGluIHZDYXJkIDIuMSBidXQgbm90IGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NT0RFTSA9ICJNT0RFTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NU0cgPSAiTVNHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0JCUyA9ICJCQlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVklERU8gPSAiVklERU8iOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBQaG9uZXMsIHdoaWNoIGFyZSBub3QgZm9ybWFsbHkgdmFsaWQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgLy8gVGhlc2UgdHlwZXMgYXJlIGJhc2ljYWxseSBlbmNvZGVkIHRvICJYLSIgcGFyYW1ldGVycyB3aGVuIGNvbXBvc2luZyB2Q2FyZC4KLSAgICAvLyBQYXJzZXIgcGFzc2VzIHRoZXNlIHdoZW4gIlgtIiBpcyBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG9yIG5vdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLID0gIkNBTExCQUNLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPID0gIlJBRElPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQgPSAiVFRZLVRERCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQgPSAiQVNTSVNUQU5UIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiV09SSyIgKyAiUFJFRiIuIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4gPSAiQ09NUEFOWS1NQUlOIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiVk9JQ0UiIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiA9ICJPVEhFUiI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIHBvc3RhbCBhZGRyZXNzZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfUEFSQ0VMID0gIlBBUkNFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfRE9NID0gIkRPTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfSU5UTCA9ICJJTlRMIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBub3Qgb2ZmaWNpYWxseSB2YWxpZCBidXQgdXNlZCBpbiBzb21lIHZDYXJkIGV4cG9ydGVyLgotICAgIC8vIERvIG5vdCB1c2UgaW4gY29tcG9zZXIgc2lkZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkgPSAiQ09NUEFOWSI7Ci0KLSAgICAvLyBEb0NvTW8gc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIuIFVzZWQgd2l0aCAiU09VTkQiIHByb3BlcnR5LCB3aGljaCBpcyBhbHRlcm5hdGUgb2YgU09SVC1TVFJJTkcgaW4KLSAgICAvLyB2Q2FyZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9YX0lSTUNfTiA9ICJYLUlSTUMtTiI7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEltcG9ydE9ubHkgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05JQ0tOQU1FID0gIlgtTklDS05BTUUiOwotICAgICAgICAvLyBTb21lIGRldmljZSBlbWl0cyB0aGlzICJYLSIgcGFyYW1ldGVyIGZvciBleHByZXNzaW5nIEdvb2dsZSBUYWxrLAotICAgICAgICAvLyB3aGljaCBpcyBzcGVjaWZpY2FsbHkgaW52YWxpZCBidXQgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSBhY2NlcHRlZCwgYW5kIGVtaXR0ZWQKLSAgICAgICAgLy8gaW4gc29tZSBzcGVjaWFsIGNhc2UgKGZvciB0aGF0IGRldmljZS9hcHBsaWNhdGlvbikuCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSA9ICJYLUdPT0dMRSBUQUxLIjsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfQ09MVU1OID0gMTU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJBQ1RFUl9OVU1TX1FQID0gNzY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMCA9IDc1OwotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbnN0YW50cygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2U5YjguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5PcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuR3JvdXBzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYnJpZGdlcyBiZXR3ZWVuIGRhdGEgc3RydWN0dXJlIG9mIENvbnRhY3QgYXBwIGFuZCBWQ2FyZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFX0dPT0dMRSA9ICJjb20uZ29vZ2xlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQID0gIlN5c3RlbSBHcm91cDogTXkgQ29udGFjdHMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0ltTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSwgSW0uUFJPVE9DT0xfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTiwgSW0uUFJPVE9DT0xfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PLCBJbS5QUk9UT0NPTF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EsIEltLlBST1RPQ09MX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIsIEltLlBST1RPQ09MX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSwgSW0uUFJPVE9DT0xfU0tZUEUpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEssIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5JbXBvcnRPbmx5LlBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSwKLSAgICAgICAgICAgICAgICBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQaG9uZURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBQaG9uZURhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQaG9uZURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IChQaG9uZURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IHBob25lRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKHBob25lRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMocGhvbmVEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gcGhvbmVEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBFbWFpbERhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgLy8gVXNlZCBvbmx5IHdoZW4gVFlQRSBpcyBUWVBFX0NVU1RPTS4KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBFbWFpbERhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBFbWFpbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW1haWxEYXRhIGVtYWlsRGF0YSA9IChFbWFpbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGVtYWlsRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKGVtYWlsRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMoZW1haWxEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gZW1haWxEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQb3N0YWxEYXRhIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lZCBieSB2Q2FyZCBzcGVjLgotICAgICAgICAvLyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERSX01BWF9EQVRBX1NJWkUgPSA3OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRhdGFBcnJheTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb2JveDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBleHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3RyZWV0OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxvY2FsdHk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVnaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvc3RhbENvZGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY291bnRyeTsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBvc3RhbERhdGEoZmluYWwgaW50IHR5cGUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBkYXRhQXJyYXkgPSBuZXcgU3RyaW5nW0FERFJfTUFYX0RBVEFfU0laRV07Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gcHJvcFZhbHVlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIHNpemUgPSBBRERSX01BWF9EQVRBX1NJWkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkci12YWx1ZSA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVXNlIEl0ZXJhdG9yIGFzc3VtaW5nIExpc3QgbWF5IGJlIExpbmtlZExpc3QsIHRob3VnaCBhY3R1YWxseSBpdCBpcwotICAgICAgICAgICAgLy8gYWx3YXlzIEFycmF5TGlzdCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3NFbGVtZW50IDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpXSA9IGFkZHJlc3NFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpKytdID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5wb2JveCA9IGRhdGFBcnJheVswXTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRBZGRyZXNzID0gZGF0YUFycmF5WzFdOwotICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSBkYXRhQXJyYXlbMl07Ci0gICAgICAgICAgICB0aGlzLmxvY2FsdHkgPSBkYXRhQXJyYXlbM107Ci0gICAgICAgICAgICB0aGlzLnJlZ2lvbiA9IGRhdGFBcnJheVs0XTsKLSAgICAgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IGRhdGFBcnJheVs1XTsKLSAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IGRhdGFBcnJheVs2XTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQb3N0YWxEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFBvc3RhbERhdGEgcG9zdGFsRGF0YSA9IChQb3N0YWxEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAoQXJyYXlzLmVxdWFscyhkYXRhQXJyYXksIHBvc3RhbERhdGEuZGF0YUFycmF5KSAmJgotICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBwb3N0YWxEYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbCA9PSBwb3N0YWxEYXRhLmxhYmVsKSA6IHRydWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5ID09IHBvc3RhbERhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZEFkZHJlc3MoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIEluIEphcGFuLCB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IEFERFJfTUFYX0RBVEFfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFERFJfTUFYX0RBVEFfU0laRTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgT3JnYW5pemF0aW9uRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgLy8gbm9uLWZpbmFsIGlzIEludGVudGlvbmFsOiB3ZSBtYXkgY2hhbmdlIHRoZSB2YWx1ZXMgc2luY2UgdGhpcyBpbmZvIGlzIHNlcGFyYXRlZCBpbnRvCi0gICAgICAgIC8vIHR3byBwYXJ0cyBpbiB2Q2FyZDogIk9SRyIgKyAiVElUTEUiLgotICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRpdGxlTmFtZTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBPcmdhbml6YXRpb25EYXRhKGludCB0eXBlLAotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGl0bGVOYW1lID0gdGl0bGVOYW1lOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvbkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb24gPSAoT3JnYW5pemF0aW9uRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gb3JnYW5pemF0aW9uLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhjb21wYW55TmFtZSwgb3JnYW5pemF0aW9uLmNvbXBhbnlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGRlcGFydG1lbnROYW1lLCBvcmdhbml6YXRpb24uZGVwYXJ0bWVudE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHModGl0bGVOYW1lLCBvcmdhbml6YXRpb24udGl0bGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPT0gb3JnYW5pemF0aW9uLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnlOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0aXRsZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgInR5cGU6ICVkLCBjb21wYW55OiAlcywgZGVwYXJ0bWVudDogJXMsIHRpdGxlOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGN1c3RvbVByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBJbURhdGEoZmluYWwgaW50IHByb3RvY29sLCBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGZpbmFsIGludCB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICAgICAgdGhpcy5jdXN0b21Qcm90b2NvbCA9IGN1c3RvbVByb3RvY29sOwotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSW1EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltRGF0YSBpbURhdGEgPSAoSW1EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBpbURhdGEudHlwZSAmJiBwcm90b2NvbCA9PSBpbURhdGEucHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgJiYgKGN1c3RvbVByb3RvY29sICE9IG51bGwgPyBjdXN0b21Qcm90b2NvbC5lcXVhbHMoaW1EYXRhLmN1c3RvbVByb3RvY29sKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW1EYXRhLmN1c3RvbVByb3RvY29sID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiAoZGF0YSAhPSBudWxsID8gZGF0YS5lcXVhbHMoaW1EYXRhLmRhdGEpIDogKGltRGF0YS5kYXRhID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ByaW1hcnkgPT0gaW1EYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIHByb3RvY29sOiAlZCwgY3VzdG9tX3Byb3Rjb2w6ICVzLCBkYXRhOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIHByb3RvY29sLCBjdXN0b21Qcm90b2NvbCwgZGF0YSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGhvdG9EYXRhIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0ZMQVNIID0gIlNXRiI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXROYW1lOyAgLy8gdXNlZCB3aGVuIHR5cGUgaXMgbm90IGRlZmluZWQgaW4gQ29udGFjdHNDb250cmFjdC4KLSAgICAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBwaG90b0J5dGVzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBob3RvRGF0YShpbnQgdHlwZSwgU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZm9ybWF0TmFtZSA9IGZvcm1hdE5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBob3RvQnl0ZXMgPSBwaG90b0J5dGVzOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob3RvRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG90b0RhdGEgcGhvdG9EYXRhID0gKFBob3RvRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvdG9EYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKGZvcm1hdE5hbWUgPT0gbnVsbCA/IChwaG90b0RhdGEuZm9ybWF0TmFtZSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZS5lcXVhbHMocGhvdG9EYXRhLmZvcm1hdE5hbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoQXJyYXlzLmVxdWFscyhwaG90b0J5dGVzLCBwaG90b0RhdGEucGhvdG9CeXRlcykpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcGhvdG9EYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGZvcm1hdDogJXM6IHNpemU6ICVkLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZm9ybWF0TmFtZSwgcGhvdG9CeXRlcy5sZW5ndGgsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBtUGFyYW1ldGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PigpOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJvcGVydHlWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXM7Ci0gICAgICAgICAgICBpZiAoIW1QYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1QYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVG9Qcm9wZXJ0eVZhbHVlTGlzdChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmFkZChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5Qnl0ZXMoZmluYWwgYnl0ZVtdIHByb3BlcnR5Qnl0ZXMpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gcHJvcGVydHlCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVycyhTdHJpbmcgdHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eVZhbHVlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBudWxsOwotICAgICAgICAgICAgbVBhcmFtZXRlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlCeXRlcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NaWRkbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1ZmZpeDsKLQotICAgIC8vIFVzZWQgb25seSB3aGVuIG5vIGZhbWlseSBub3IgZ2l2ZW4gbmFtZSBpcyBmb3VuZC4KLSAgICBwcml2YXRlIFN0cmluZyBtRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNNaWRkbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTmlja05hbWVMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJpcnRoZGF5OwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5vdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG9uZURhdGE+IG1QaG9uZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEVtYWlsRGF0YT4gbUVtYWlsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UG9zdGFsRGF0YT4gbVBvc3RhbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IG1Pcmdhbml6YXRpb25MaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbURhdGE+IG1JbUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob3RvRGF0YT4gbVBob3RvTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtV2Vic2l0ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3Q7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvbmUoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvbmVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBob25lRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHJpbWVkID0gZGF0YS50cmltKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROdW1iZXI7Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gdHJpbWVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRyaW1lZC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdHJpbWVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IChpID09IDAgJiYgY2ggPT0gJysnKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgTkFOUCBpbiBkZWZhdWx0IHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbGUuCi0gICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0dGluZ1R5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYnVpbGRlci50b1N0cmluZygpLCBmb3JtYXR0aW5nVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IG5ldyBQaG9uZURhdGEodHlwZSwgZm9ybWF0dGVkTnVtYmVyLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob25lTGlzdC5hZGQocGhvbmVEYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTmlja05hbWUoZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7Ci0gICAgICAgIGlmIChtTmlja05hbWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1OaWNrTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBtTmlja05hbWVMaXN0LmFkZChuaWNrTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVtYWlsKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtRW1haWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbWFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PEVtYWlsRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtRW1haWxMaXN0LmFkZChuZXcgRW1haWxEYXRhKHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUG9zdGFsKGludCB0eXBlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtUG9zdGFsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUG9zdGFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9zdGFsRGF0YT4oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBvc3RhbExpc3QuYWRkKG5ldyBQb3N0YWxEYXRhKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHZpYSB7QGxpbmsgI2hhbmRsZU9yZ1ZhbHVlKGludCwgTGlzdCwgYm9vbGVhbil9IG9yCi0gICAgICoge0BsaW5rICNoYW5kbGVUaXRsZVZhbHVlKFN0cmluZyl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdPcmdhbml6YXRpb24oaW50IHR5cGUsIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtT3JnYW5pemF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T3JnYW5pemF0aW9uRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtT3JnYW5pemF0aW9uTGlzdC5hZGQobmV3IE9yZ2FuaXphdGlvbkRhdGEodHlwZSwgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUsIHRpdGxlTmFtZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHNFbXB0eUxpc3QgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkpOwotCi0gICAgLyoqCi0gICAgICogU2V0ICJPUkciIHJlbGF0ZWQgdmFsdWVzIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0cywgdGhpcyBpbnB1dCBkYXRhIGFyZSBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2gKLSAgICAgKiBkb2VzIG5vdCBoYXZlIHZhbGlkIHZhbHVlcyAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3QsIGEgbmV3IHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBpcyBjcmVhdGVkLAotICAgICAqIHdob3NlIHRpdGxlIGlzIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPcmdWYWx1ZShmaW5hbCBpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IG9yZ0xpc3QsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChvcmdMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG9yZ0xpc3QgPSBzRW1wdHlMaXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9yZ0xpc3Quc2l6ZSgpOwotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7ICAvLyBNb3JlIHRoYW4gMS4KLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHN0cmluZyBmb3IgZGVwYXJ0bWVudC4KLSAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIGFsbCB0aGUgZGF0YSwgY29uY2F0aW5hdGUgdGhlIHJlc3Qgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQob3JnTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIHRpdGxlIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZVRpdGxlVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgLy8gTm90IHVzZSBUZXh0VXRpbHMuaXNFbXB0eSgpIHNpbmNlIE9SRyB3YXMgc2V0IGJ1dCB0aGUgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHkuCi0gICAgICAgICAgICAvLyBlLmcuICJPUkc7UFJFRjo7IiAtPiBCb3RoIGNvbXBhbnlOYW1lIGFuZCBkZXBhcnRtZW50TmFtZSBiZWNvbWUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgIlRJVExFIiBwcm9wZXJ0eSBjb21lcyBiZWZvcmUgdGhlICJPUkciIHByb3BlcnR5IHZpYQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlTGluZSgpLgotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvRGF0YSBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgdGl0bGUsIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBpc1ByaW1hcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCAidGl0bGUiIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBPcmdhbml6YXRpb25EYXRhIG9iamVjdHMsIHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gdGhlIGxhc3Qgb25lIHdoaWNoIGRvZXMgbm90Ci0gICAgICogaGF2ZSB2YWxpZCB0aXRsZSB2YWx1ZSAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0LCBhIG5ldyBPcmdhbml6YXRpb25EYXRhIGlzIGNyZWF0ZWQsIHdob3NlIGNvbXBhbnkgbmFtZSBpcwotICAgICAqIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUaXRsZVZhbHVlKGZpbmFsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIG90aGVyIGluZm8sIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvbiBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVPcmdWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW0oaW50IHByb3RvY29sLCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGludCB0eXBlLAotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1JbUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUltTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW1EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1JbUxpc3QuYWRkKG5ldyBJbURhdGEocHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROb3RlKGZpbmFsIFN0cmluZyBub3RlKSB7Ci0gICAgICAgIGlmIChtTm90ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5vdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1Ob3RlTGlzdC5hZGQobm90ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob3RvQnl0ZXMoU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob3RvTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvdG9MaXN0ID0gbmV3IEFycmF5TGlzdDxQaG90b0RhdGE+KDEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFBob3RvRGF0YSBwaG90b0RhdGEgPSBuZXcgUGhvdG9EYXRhKDAsIG51bGwsIHBob3RvQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG90b0xpc3QuYWRkKHBob3RvRGF0YSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTlByb3BlcnR5KExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICAvLyBGYW1pbHksIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LiAoMSAtIDUpCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCAoc2l6ZSA9IGVsZW1zLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPiA1KSB7Ci0gICAgICAgICAgICBzaXplID0gNTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgNTogbVN1ZmZpeCA9IGVsZW1zLmdldCg0KTsKLSAgICAgICAgICAgIGNhc2UgNDogbVByZWZpeCA9IGVsZW1zLmdldCgzKTsKLSAgICAgICAgICAgIGNhc2UgMzogbU1pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1HaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtRmFtaWx5TmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGU6IFNvbWUgSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgdGhpcyBmaWVsZCBmb3IgcGhvbmV0aWMgbmFtZSwKLSAgICAgKiAgICAgICBzaW5jZSB2Q2FyZCAyLjEgZG9lcyBub3QgaGF2ZSAiU09SVC1TVFJJTkciIHR5cGUuCi0gICAgICogICAgICAgQWxzbywgaW4gc29tZSBjYXNlcywgdGhlIGZpZWxkIGhhcyBzb21lICc7J3MgaW4gaXQuCi0gICAgICogICAgICAgQXNzdW1lIHRoZSAnOycgbWVhbnMgdGhlIHNhbWUgbWVhbmluZyBpbiBOIHByb3BlcnR5Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiB3YXMgYWxyZWFkeSBmb3VuZC4KLSAgICAgICAgICAgIC8vIElnbm9yZSAiU09VTkQ7WC1JUk1DLU4iLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBvcmRlciBpcyAiRmFtaWx5LCBHaXZlbiwgTWlkZGxlIi4KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgZnJvbSBzcGVjaWZpY2F0aW9uIGJ1dCBtZXJlIGFzc3VtcHRpb24uIFNvbWUgSmFwYW5lc2UgcGhvbmVzIHVzZSB0aGlzIG9yZGVyLgotICAgICAgICBpZiAoc2l6ZSA+IDMpIHsKLSAgICAgICAgICAgIHNpemUgPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1zLmdldCgwKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbXMuZ2V0KGkpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob25seUZpcnN0RWxlbUlzTm9uRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc0FycmF5ID0gZWxlbXMuZ2V0KDApLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG5hbWVBcnJheUxlbmd0aCA9IG5hbWVzQXJyYXkubGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMykgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IE1pZGRsZSBHaXZlbiIuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNNaWRkbGVOYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgR2l2ZW4iIGJhc2VkIG9uIHRoZSBKYXBhbmVzZSBtb2JpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGhvbmVzJyBwcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSAzOiBtUGhvbmV0aWNNaWRkbGVOYW1lID0gZWxlbXMuZ2V0KDIpOwotICAgICAgICAgICAgY2FzZSAyOiBtUGhvbmV0aWNHaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtUGhvbmV0aWNGYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoZmluYWwgUHJvcGVydHkgcHJvcGVydHkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkubVByb3BlcnR5TmFtZTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCA9IHByb3BlcnR5Lm1QYXJhbWV0ZXJNYXA7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0ID0gcHJvcGVydHkubVByb3BlcnR5VmFsdWVMaXN0OwotICAgICAgICBieXRlW10gcHJvcEJ5dGVzID0gcHJvcGVydHkubVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gbGlzdFRvU3RyaW5nKHByb3BWYWx1ZUxpc3QpLnRyaW0oKTsKLQotICAgICAgICBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCB2ZXJzaW9uLiBJZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pKSB7Ci0gICAgICAgICAgICBtRnVsbE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05BTUUpICYmIG1GdWxsTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGluIHZDYXJkIDMuMC4gVXNlIHRoaXMgaWYgRk4sIHdoaWNoIG11c3QgZXhpc3QgaW4gdkNhcmQgMy4wIGJ1dCBtYXkgbm90Ci0gICAgICAgICAgICAvLyBhY3R1YWxseSBleGlzdCBpbiB0aGUgcmVhbCB2Q2FyZCBkYXRhLCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIG1GdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTikpIHsKLSAgICAgICAgICAgIGhhbmRsZU5Qcm9wZXJ0eShwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9OSUNLTkFNRSkpIHsKLSAgICAgICAgICAgIGFkZE5pY2tOYW1lKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTikpIHsKLSAgICAgICAgICAgICAgICAvLyBBcyBvZiAyMDA5LTEwLTA4LCBQYXJzZXIgc2lkZSBkb2VzIG5vdCBzcGxpdCBhIHByb3BlcnR5IHZhbHVlIGludG8gc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgLy8gdmFsdWVzIHVzaW5nICc7JyAoaW4gb3RoZXIgd29yZHMsIHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDEpLAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgaXQgdG8gYmUgc2VwYXJhdGVkLCBzbyBkbyB0aGUgc2VwYXJhdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZXRpY05hbWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVjMwKG1WQ2FyZFR5cGUpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQocGhvbmV0aWNOYW1lTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIGZpZWxkIHNpbmNlIEFuZHJvaWQgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKSkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZXNBcmVBbGxFbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc0FyZUFsbEVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZXNBcmVBbGxFbXB0eSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiQ09NUEFOWSIgc2VlbXMgZW1pdHRlZCBieSBXaW5kb3dzIE1vYmlsZSwgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2FsbHkgc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMS4gV2UgYXNzdW1lIHRoaXMgaXMgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgIldPUksiLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9QQVJDRUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfRE9NKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0lOVEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgYXBwcm9wcmlhdGUgd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLiBBbHNvIHNvbWUgdkNhcmQgMi4xIGV4cG9ydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBub24tc3RhbmRhcmQgdHlwZXMuIFdlIGRvIG5vdCBoYW5kbGUgdGhlaXIgdmFsdWVzIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2UgdXNlICJIT01FIiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBvc3RhbCh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwpKSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfTU9CSUxFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIElOVEVSTkVUIChzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ0hPT0wsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkRW1haWwodHlwZSwgcHJvcFZhbHVlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IG90aGVyIHR5cGVzLgotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBPcmdhbml6YXRpb24uVFlQRV9XT1JLOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlT3JnVmFsdWUodHlwZSwgcHJvcFZhbHVlTGlzdCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1JPTEUpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvbmZsaWN0cyB3aXRoIFRJVExFLiBJZ25vcmUgZm9yIG5vdy4uLgotICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVWYWx1ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTykgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTE9HTykpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbU1hcFZhbHVlID0gcGFyYW1NYXAuZ2V0KCJWQUxVRSIpOwotICAgICAgICAgICAgaWYgKHBhcmFtTWFwVmFsdWUgIT0gbnVsbCAmJiBwYXJhbU1hcFZhbHVlLmNvbnRhaW5zKCJVUkwiKSkgewotICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBleGFtcGxlIGZvciB0ZXN0aW5nIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KCJUWVBFIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVZhbHVlIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYuZXF1YWxzKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUgPSB0eXBlVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUGhvdG9CeXRlcyhmb3JtYXROYW1lLCBwcm9wQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCkpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0eXBlT2JqZWN0ID0KLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmdldFBob25lVHlwZUZyb21TdHJpbmdzKHR5cGVDb2xsZWN0aW9uLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgICAgICBpZiAodHlwZU9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKEludGVnZXIpdHlwZU9iamVjdDsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRQaG9uZSh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1BTVE5OVU1CRVIpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcGhvbmUgbnVtYmVyIGF2YWlsYWJsZSB2aWEgU2t5cGUuCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChzSW1NYXAuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdG9jb2wgPSBzSW1NYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRJbShwcm90b2NvbCwgbnVsbCwgdHlwZSwgcHJvcFZhbHVlLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFKSkgewotICAgICAgICAgICAgYWRkTm90ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwpKSB7Ci0gICAgICAgICAgICBpZiAobVdlYnNpdGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtV2Vic2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2Vic2l0ZUxpc3QuYWRkKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVkpKSB7Ci0gICAgICAgICAgICBtQmlydGhkYXkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSkpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5pc1YzMChtVkNhcmRUeXBlKSk7Ci0gICAgICAgICAgICBoYW5kbGVBbmRyb2lkQ3VzdG9tUHJvcGVydHkoY3VzdG9tUHJvcGVydHlMaXN0KTsKLSAgICAgICAgLyp9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUkVWIikpIHsKLSAgICAgICAgICAgIC8vIFJldmlzaW9uIG9mIHRoaXMgVkNhcmQgZW50cnkuIEkgdGhpbmsgd2UgY2FuIGlnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVUlEIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIktFWSIpKSB7Ci0gICAgICAgICAgICAvLyBUeXBlIGlzIFg1MDkgb3IgUEdQPyBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzLi4uCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJNQUlMRVIiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVFoiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiR0VPIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNMQVNTIikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDTEFTUzpDT05GSURFTlRJQUwKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIlBST0ZJTEUiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuIE11c3QgYmUgIlZDQVJEIi4gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJDQVRFR09SSUVTIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDQVRFR09SSUVTOklOVEVSTkVULElFVEYsSU5EVVNUUlksSU5GT1JNQVRJT04gVEVDSE5PTE9HWQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiU09VUkNFIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUFJPRElEIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gVG8gc3BlY2lmeSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb2R1Y3QgdGhhdCBjcmVhdGVkCi0gICAgICAgICAgICAvLyB0aGUgdkNhcmQgb2JqZWN0LiovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVbmtub3duIFgtIHdvcmRzIGFuZCBJQU5BIHRva2VuLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0LmFkZChjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgZGlzcGxheSBuYW1lLiBUaGUgY29uc3RydWN0ZWQgZGF0YSBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgLy8gRnVsbE5hbWUgKGNyZWF0ZWQgdmlhICJGTiIgb3IgIk5BTUUiIGZpZWxkKSBpcyBwcmVmZXJlZC4KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtRnVsbE5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbUZhbWlseU5hbWUsIG1NaWRkbGVOYW1lLCBtR2l2ZW5OYW1lLCBtUHJlZml4LCBtU3VmZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lLCBtUGhvbmV0aWNNaWRkbGVOYW1lLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCAmJiBtRW1haWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1FbWFpbExpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBob25lTGlzdCAhPSBudWxsICYmIG1QaG9uZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBob25lTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsICYmIG1Qb3N0YWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Qb3N0YWxMaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRBZGRyZXNzKG1WQ2FyZFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwgJiYgbU9yZ2FuaXphdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbU9yZ2FuaXphdGlvbkxpc3QuZ2V0KDApLmdldEZvcm1hdHRlZFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnNvbGlkYXRlIHNldmVyYWwgZmllbHNkcyAobGlrZSBtTmFtZSkgdXNpbmcgbmFtZSBjYW5kaWRhdGVzLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnNvbGlkYXRlRmllbGRzKCkgewotICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChtUGhvbmV0aWNGdWxsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IG1QaG9uZXRpY0Z1bGxOYW1lLnRyaW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVcmkgcHVzaEludG9Db250ZW50UmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+KCk7Ci0gICAgICAgIC8vIEFmdGVyIGFwcGx5aW5nIHRoZSBiYXRjaCB0aGUgZmlyc3QgcmVzdWx0J3MgVXJpIGlzIHJldHVybmVkIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgICAgIC8vIHRoZSBSYXdDb250YWN0IGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGxpc3QKLSAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgU3RyaW5nIG15R3JvdXBzSWQgPSBudWxsOwotICAgICAgICBpZiAobUFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBtQWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbUFjY291bnQudHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGNhbGxlciBzaWRlIGNyZWF0ZXMgdGhpcyBncm91cCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIGlmIChBQ0NPVU5UX1RZUEVfR09PR0xFLmVxdWFscyhtQWNjb3VudC50eXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSByZXNvbHZlci5xdWVyeShHcm91cHMuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuU09VUkNFX0lEIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuVElUTEUgKyAiPT8iLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXlHcm91cHNJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5wcm90b2NvbCA9PSBJbS5QUk9UT0NPTF9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uQ1VTVE9NX1BST1RPQ09MLCBpbURhdGEuY3VzdG9tUHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW1EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoKS5sZW5ndGgoKSA9PSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5LCBzaW5jZSB0aGV5IG1heSBjaGFuZ2UKLSAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIG9mIDIwMDktMTAtMDUsIG9uIHdoaWNoIEkgY2Fubm90IGJlIHN1cmUgdGhpcyBzdHJ1Y3R1cmUKLSAgICAvLyBpcyBjb21wbGV0ZWx5IGNvbnNvbGlkYXRlZC4KLSAgICAvLwotICAgIC8vIEFsc28gbm90ZSB0aGF0IHRoZXNlIGdldHRlciBtZXRob2RzIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIKLSAgICAvLyBhbGwgcHJvcGVydGllcyBiZWluZyBwdXNoZWQgaW50byB0aGlzIG9iamVjdC4gSWYgbm90LCBpbmNvcnJlY3QKLSAgICAvLyB2YWx1ZSB3aWxsICJiZSBzdG9yZWQgaW4gdGhlIGxvY2FsIGNhY2hlIGFuZCIgYmUgcmV0dXJuZWQgdG8geW91LgotCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gbVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWZmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRmFtaWx5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0dpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljTWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0Z1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRnVsbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROaWNrTmFtZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtTmlja05hbWVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmlydGhkYXkoKSB7Ci0gICAgICAgIHJldHVybiBtQmlydGhkYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROb3RlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Ob3RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG9uZURhdGE+IGdldFBob25lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8RW1haWxEYXRhPiBnZXRFbWFpbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRW1haWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBvc3RhbERhdGE+IGdldFBvc3RhbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUG9zdGFsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxPcmdhbml6YXRpb25EYXRhPiBnZXRPcmdhbml6YXRpb25MaXN0KCkgewotICAgICAgICByZXR1cm4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8SW1EYXRhPiBnZXRJbUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtSW1MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob3RvRGF0YT4gZ2V0UGhvdG9MaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob3RvTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFdlYnNpdGVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVdlYnNpdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChtRGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uc3RydWN0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc3BsYXlOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWEyYmFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggY29tbWl0cyB0aGUgZW50cnkgdG8gQ29udGVudFJlc29sdmVyLgotICogPC9QPgotICogPFA+Ci0gKiBOb3RlOjxCUiAvPgotICogRWFjaCB2Q2FyZCBtYXkgY29udGFpbiBiaWcgcGhvdG8gaW1hZ2VzIGVuY29kZWQgYnkgQkFTRTY0LAotICogSWYgd2Ugc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCBPdXRPZk1lbW9yeUVycm9yIG1heSBiZSB0aHJvd24uCi0gKiBUaHVzLCB0aGlzIGNsYXNzIHB1c2ggZWFjaCBWQ2FyZCBlbnRyeSBpbnRvIENvbnRlbnRSZXNvbHZlciBpbW1lZGlhdGVseS4KLSAqIDwvUD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb21taXR0ZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5Q29taXR0ZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb0NvbW1pdDsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxVcmk+IG1DcmVhdGVkVXJpcyA9IG5ldyBBcnJheUxpc3Q8VXJpPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb21taXR0ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsIFN0cmluZy5mb3JtYXQoInRpbWUgdG8gY29tbWl0IGVudHJpZXM6ICVkIG1zIiwgbVRpbWVUb0NvbW1pdCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBjb250YWN0U3RydWN0KSB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUNyZWF0ZWRVcmlzLmFkZChjb250YWN0U3RydWN0LnB1c2hJbnRvQ29udGVudFJlc29sdmVyKG1Db250ZW50UmVzb2x2ZXIpKTsKLSAgICAgICAgbVRpbWVUb0NvbW1pdCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY3JlYXRlZCBVcmlzLiBUaGlzIGxpc3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyIGFzIGl0IGlzCi0gICAgICogbm90IGEgY2xvbmUuCi0gICAgICovCi0gICBwdWJsaWMgQXJyYXlMaXN0PFVyaT4gZ2V0Q3JlYXRlZFVyaXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3JlYXRlZFVyaXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwY2EyYi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSdzIG5vIG90aGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB1c2VzIHRoaXMgY2hhcnNldCBmb3IgZW5jb2RpbmcKLSAgICAgKiBieXRlIGFycmF5cyB0byBTdHJpbmcuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0hBUlNFVF9GT1JfREVDT0RFRF9CWVRFUyA9ICJVVEYtOCI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50Q29udGFjdFN0cnVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0Q2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHdpdGggd2hpY2ggYnl0ZSBhcnJheSBpcyBlbmNvZGVkIHRvIFN0cmluZy4KLSAgICAgKi8KLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gbVN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgZmluYWwgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBmaW5hbCBwcml2YXRlIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLyoqIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuICovCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExpc3Q8VkNhcmRFbnRyeUhhbmRsZXI+IG1FbnRyeUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBTdHJpbmcgY2hhcnNldCwgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLAotICAgICAgICAgICAgZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIHRoaXMobnVsbCwgY2hhcnNldCwgc3RyaWN0TGluZUJyZWFrUGFyc2luZywgdmNhcmRUeXBlLCBhY2NvdW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIFN0cmluZyBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIGlmIChpbnB1dENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0Q2hhcnNldCA9IGlucHV0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dENoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBERUZBVUxUX0NIQVJTRVRfRk9SX0RFQ09ERURfQllURVM7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0cmljdExpbmVCcmVha1BhcnNpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNlIGZhaWxlZCBiZXR3ZWVuIHtAbGluayAjc3RhcnRFbnRyeSgpfSBhbmQge0BsaW5rICNlbmRFbnRyeSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzdW1lIHRoYXQgVkNhcmQgaXMgbm90IG5lc3RlZC4gSW4gb3RoZXIgd29yZHMsIHRoaXMgY29kZSBkb2VzIG5vdCBhY2NlcHQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50Q29udGFjdFN0cnVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50Q29udGFjdFN0cnVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50Q29udGFjdFN0cnVjdC5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVTdHJpbmcoU3RyaW5nIG9yaWdpbmFsU3RyaW5nLCBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcykgewotICAgICAgICBpZiAobUlucHV0Q2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1JbnB1dENoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZy5lcXVhbHMoIkJBU0U2NCIpIHx8IGVuY29kaW5nLmVxdWFscygiQiIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5zZXRQcm9wZXJ0eUJ5dGVzKEJhc2U2NC5kZWNvZGVCYXNlNjQodmFsdWUuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICAvLyAiPSAiIC0+ICIgIiwgIj1cdCIgLT4gIlx0Ii4KLSAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJyAnIHx8IG5leHRDaCA9PSAnXHQnKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0Q2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZWRQcmludGFibGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGluZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gcXVvdGVkUHJpbnRhYmxlLnNwbGl0KCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHF1b3RlZFByaW50YWJsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbmFsTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgbUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEZWNvZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBkZWNvZGUgcXVvdGVkLXByaW50YWJsZTogIiArIGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVbmtub3duIGVuY29kaW5nLiBGYWxsIGJhY2sgdG8gZGVmYXVsdC4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2RlU3RyaW5nKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNoYXJzZXRDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJDSEFSU0VUIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0KLSAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpOwotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZW5jb2RpbmdDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJFTkNPRElORyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPQotICAgICAgICAgICAgKChlbmNvZGluZ0NvbGxlY3Rpb24gIT0gbnVsbCkgPyBlbmNvZGluZ0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgOiBudWxsKTsKLQotICAgICAgICBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcyA9IENoYXJzZXRVdGlscy5uYW1lRm9yRGVmYXVsdFZlbmRvcihjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPT0gbnVsbCB8fCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBlbmNvZGluZykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E2N2ZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgY2FsbGVkIGJ5IHtAbGluayBWQ2FyZEVudHJ5Q29uc3RydWN0b3J9LiBVc2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0bwotICogaGFuZGxlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFzIHdoYXQge0BsaW5rIFZDYXJkUGFyc2VyfSBwcm92aWRlcyB2aWEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gb25lIFZDYXJkIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBlbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBlbmRlZC4KLSAgICAgKiBBYmxlIHRvIGJlIHVzZSB0aGlzIG1ldGhvZCBmb3Igc2hvd2luZyBwZXJmb3JtYW5jZSBsb2csIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjM3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIFRoZSBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzc2VzIHdoaWNoIGhhdmUgdG8gYW5hbHl6ZSBlYWNoCi0gKiB2Q2FyZCBlbnRyeSBtb3JlIG1pbnV0ZWx5IHRoYW4ge0BsaW5rIFZDYXJkRW50cnl9IGNsYXNzIGFuYWx5c2lzLgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmODFmNy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgCi0gICAgcHVibGljIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gaW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlckNvbGxlY3Rpb24gPSBpbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlOYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M1MmE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZDYXJkUGFyc2VyIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1QYXJzZVR5cGU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbmNlbGVkOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKGludCBwYXJzZVR5cGUpIHsKLSAgICAgICAgbVBhcnNlVHlwZSA9IHBhcnNlVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmVhbSBhbmQgc2VuZCB0aGUgVkNhcmQgZGF0YSBpbnRvIFZDYXJkQnVpbGRlckJhc2Ugb2JqZWN0LgotICAgICAqIDwvUC4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiBWQ2FyZCAyLjEsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4gVkNhcmQgMy4wLiBJbiBWQ2FyZCAyLjEsCi0gICAgICogSW4gc29tZSBleHJlbWUgY2FzZSwgc29tZSBWQ2FyZCBtYXkgaGF2ZSBkaWZmZXJlbnQgY2hhcnNldHMgaW4gb25lIFZDYXJkICh0aG91Z2gKLSAgICAgKiB3ZSBkbyBub3Qgc2VlIGFueSBkZXZpY2Ugd2hpY2ggZW1pdHMgc3VjaCBraW5kIG9mIG1hbGljaW91cyBkYXRhKQotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJbiBvcmRlciB0byBhdm9pZCAibWlzdW5kZXJzdGFuZGluZyIgY2hhcnNldCBhcyBtdWNoIGFzIHBvc3NpYmxlLCB0aGlzIG1ldGhvZAotICAgICAqIHVzZSAiSVNPLTg4NTktMSIgZm9yIHJlYWRpbmcgdGhlIHN0cmVhbS4gV2hlbiBjaGFyc2V0IGlzIHNwZWNpZmllZCBpbiBzb21lIHByb3BlcnR5Ci0gICAgICogKHdpdGggIkNIQVJTRVQ9Li4uIiBwYXJhbWV0ZXIpLCB0aGUgc3RyaW5nIGlzIGRlY29kZWQgdG8gcmF3IGJ5dGVzIGFuZCBlbmNvZGVkIHRvCi0gICAgICogdGhlIGNoYXJzZXQuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCAiSVNPLTg4NTktMSIgaGFzIDEgdG8gMSBtYXBwaW5nIGluIGFsbCA4Yml0Ci0gICAgICogY2hhcmFjdGVycywgd2hpY2ggaXMgbm90IGNvbXBsZXRlbHkgc3VyZS4gSW4gc29tZSBjYXNlcywgdGhpcyAiZGVjb2RpbmctZW5jb2RpbmciCi0gICAgICogc2NoZW1lIG1heSBmYWlsLiBUbyBhdm9pZCB0aGUgY2FzZSwKLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgcmVjb21tZW5kIHlvdSB0byB1c2Uge0BsaW5rIFZDYXJkU291cmNlRGV0ZWN0b3J9IGFuZCBkZXRlY3Qgd2hpY2gga2luZCBvZiBzb3VyY2UgdGhlCi0gICAgICogVkNhcmQgY29tZXMgZnJvbSBhbmQgZXhwbGljaXRseSBzcGVjaWZ5IGEgY2hhcnNldCB1c2luZyB0aGUgcmVzdWx0LgotICAgICAqIDwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyBUaGUgc291cmNlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBpbnRlcmVwcmV0ZXIgQSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gb2JqZWN0IHdoaWNoIHVzZWQgdG8gY29uc3RydWN0IGRhdGEuCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgbWV0aG9kIHZhcmlhbnRzIHdoaWNoIGFjY2VwdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBSRkMgMjQyNiAicmVjb21tZW5kcyIgKG5vdCBmb3JjZXMpIHRvIHVzZSBVVEYtOCwgc28gaXQgbWF5IGJlIE9LIHRvIHVzZQotICAgICAqIFVURi04IGFzIGFuIGVuY29kaW5nIHdoZW4gcGFyc2luZyB2Q2FyZCAzLjAuIEJ1dCBub3RlIHRoYXQgc29tZSBKYXBhbmVzZQotICAgICAqIHBob25lIHVzZXMgU2hpZnRfSklTIGFzIGEgY2hhcnNldCAoZS5nLiBXNjFTSCksIGFuZCBhbm90aGVyIHVzZXMKLSAgICAgKiAiQ0hBUlNFVD1TSElGVF9KSVMiLCB3aGljaCBpcyBleHBsaWNpdGx5IHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gKGUuZy4gVzUzSykuCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGlzIFRoZSBzb3VyY2UgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGNoYXJzZXQgQ2hhcnNldCB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBidWlsZGVyIFRoZSBWQ2FyZEJ1aWxkZXJCYXNlIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgdmFyaWFudHMgd2hpY2ggdGVsbHMgdGhpcyBvYmplY3QgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNhbmNlbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwKLSAgICAgICAgICAgIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciwgYm9vbGVhbiBjYW5jZWxlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWwgcGFyc2luZy4KLSAgICAgKiBBY3R1YWwgY2FuY2VsIGlzIGRvbmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBvbmUgdmNhcmQgZW50cnkgcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1DYW5jZWxlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThjZmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZE5lc3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSB2Q2FyZC4gUGxlYXNlIHJlZmVyIHRvIHZDYXJkIFNwZWNpZmljYXRpb24gMi4xIGZvciBtb3JlIGRldGFpbC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBleHRlbmRzIFZDYXJkUGFyc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMjEiOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi10eXBlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNLbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAiUFJFRiIsICJWT0lDRSIsICJGQVgiLCAiTVNHIiwgIkNFTEwiLCAiUEFHRVIiLCAiQkJTIiwKLSAgICAgICAgICAgICAgICAgICAgIk1PREVNIiwgIkNBUiIsICJJU0ROIiwgIlZJREVPIiwgIkFPTCIsICJBUFBMRUxJTksiLAotICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAiTUNJTUFJTCIsICJQT1dFUlNIQVJFIiwgIlBST0RJR1kiLCAiVExYIiwgIlg0MDAiLCAiR0lGIiwKLSAgICAgICAgICAgICAgICAgICAgIkNHTSIsICJXTUYiLCAiQk1QIiwgIk1FVCIsICJQTUIiLCAiRElCIiwgIlBJQ1QiLCAiVElGRiIsCi0gICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICJXQVZFIiwgIkFJRkYiLCAiUENNIiwgIlg1MDkiLCAiUEdQIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi12YWx1ZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzS25vd25WYWx1ZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJJTkxJTkUiLCAiVVJMIiwgIkNPTlRFTlQtSUQiLCAiQ0lEIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBwcm9wZXJ0eSBuYW1lcyBhdmFpbGFibGUgaW4gdkNhcmQgMi4xICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBdmFpbGFibGVQcm9wZXJ0eU5hbWVTZXRWMjEgPQotICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpOwotCi0gICAgLyoqCi0gICAgICogVGhvdWdoIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93ICJCIiBlbmNvZGluZywgc29tZSBkYXRhIG1heSBoYXZlIGl0LgotICAgICAqIFdlIGFsbG93IGl0IGZvciBzYWZldHkuLi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0F2YWlsYWJsZUVuY29kaW5nVjIxID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICI3QklUIiwgIjhCSVQiLCAiUVVPVEVELVBSSU5UQUJMRSIsICJCQVNFNjQiLCAiQiIpKTsKLSAgICAKLSAgICAvLyBVc2VkIG9ubHkgZm9yIHBhcnNpbmcgRU5EOlZDQVJELgotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0gICAgCi0gICAgLyoqIFRoZSBidWlsZGVyIHRvIGJ1aWxkIHBhcnNlZCBkYXRhICovCi0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUJ1aWxkZXIgPSBudWxsOwotCi0gICAgLyoqIAotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlLiAiRW5jb2RpbmciIGluIHZDYXJkIGlzIGRpZmZlcmVudCBmcm9tICJDaGFyc2V0Ii4KLSAgICAgKiBlLmcuIDdCSVQsIDhCSVQsIFFVT1RFRC1QUklOVEFCTEUuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUVuY29kaW5nID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHNEZWZhdWx0RW5jb2RpbmcgPSAiOEJJVCI7Ci0gICAgCi0gICAgLy8gU2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UgZ2V0TGluZSgpIGluc3RlYWQuCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIG1SZWFkZXI7Ci0gICAgCi0gICAgLy8gSW4gc29tZSBjYXNlcywgdkNhcmQgaXMgbmVzdGVkLiBDdXJyZW50bHksIHdlIG9ubHkgY29uc2lkZXIgdGhlIG1vc3QgaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgcHJpdmF0ZSBpbnQgbU5lc3RDb3VudDsKLSAgICAKLSAgICAvLyBJbiBvcmRlciB0byByZWR1Y2Ugd2FybmluZyBtZXNzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUsIHdlIGhvbGQgdGhlIHZhbHVlIHdoaWNoIG1hZGUgTG9nZ2VyCi0gICAgLy8gZW1pdCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbVVua25vd25UeXBlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBtVW5rbm93blZhbHVlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMjEoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShWQ2FyZFNvdXJjZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgIHRoaXMoZGV0ZWN0b3IgIT0gbnVsbCA/IGRldGVjdG9yLmdldEVzdGltYXRlZFR5cGUoKSA6IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShpbnQgcGFyc2VUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHBhcnNlVHlwZSk7Ci0gICAgICAgIGlmIChwYXJzZVR5cGUgPT0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BKSB7Ci0gICAgICAgICAgICBtTmVzdENvdW50ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiB2Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3RSZWFkaW5nID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcGFyc2VPbmVWQ2FyZChmaXJzdFJlYWRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdFJlYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLkZMQUdfVjIxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoIShzQXZhaWxhYmxlUHJvcGVydHlOYW1lU2V0VjIxLmNvbnRhaW5zKHByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMTogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGVuY29kaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0F2YWlsYWJsZUVuY29kaW5nVjIxLmNvbnRhaW5zKGVuY29kaW5nLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZy4gSXQgbWF5IGJlIG51bGwsIG9yIGl0cyBsZW5ndGggbWF5IGJlIDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcgd2l0aCBpdCdzIGxlbmd0aCA+IDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB3aGVuIHRoZSBzdHJlYW0gcmVhY2hlZCBlbmQgb2YgbGluZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYKLSAgICAgKiAgICAgICAgICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZU9uZVZDYXJkKGJvb2xlYW4gZmlyc3RSZWFkaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBhbGxvd0dhcmJhZ2UgPSBmYWxzZTsKLSAgICAgICAgaWYgKGZpcnN0UmVhZGluZykgewotICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dHYXJiYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHN0YXJ0OwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0RW50cnkoKTsKLSAgICAgICAgICAgIG1UaW1lUmVhZFN0YXJ0UmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcGFyc2VJdGVtcygpOwotICAgICAgICBtVGltZVBhcnNlSXRlbXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgcmVhZEVuZFZDYXJkKHRydWUsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICAgICAgbVRpbWVSZWFkRW5kUmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIEZhbHNlIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCBvZiBsaW5lICAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRCZWdpblZDYXJkKGJvb2xlYW4gYWxsb3dHYXJiYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBzdHJBcnJheS5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIFRob3VnaCB2Q2FyZCAyLjEvMy4wIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAvLyB2Q2FyZCBmaWxlIGVtaXR0ZWQgYnkgc29tZSBleHRlcm5hbCB2Q2FyZCBleHBvdGVyIGhhdmUgc3VjaCBpbnZhbGlkIFN0cmluZ3MuCi0gICAgICAgICAgICAvLyBTbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgIC8vIGUuZy4gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoYWxsb3dHYXJiYWdlKTsKLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgd2hlcmUgbXVzdCBub3QgYmUgcmVhY2hlZC4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXJndW1lbnRzIHVzZUNhY2hlIGFuZCBhbGxvd0dhcmJhc2UgYXJlIHVzdWFsbHkgdHJ1ZSBhbmQgZmFsc2UgYWNjb3JkaW5nbHkgd2hlbgotICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG91dHNpZGUgdGhpcyBmdW5jdGlvbiBpdHNlbGYuIAotICAgICAqCi0gICAgICogQHBhcmFtIHVzZUNhY2hlIFdoZW4gdHJ1ZSwgbGluZSBpcyBvYnRhaW5lZCBmcm9tIG1QcmV2aW91c2xpbmUuIE90aGVyd2lzZSwgZ2V0TGluZSgpCi0gICAgICogaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gYWxsb3dHYXJiYWdlIFdoZW4gdHJ1ZSwgaWdub3JlIG5vbiAiRU5EOlZDQVJEIiBsaW5lLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodXNlQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaG91Z2ggdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBsb3dlciBjYXNlcywKLSAgICAgICAgICAgICAgICAvLyBzb21lIGRhdGEgbWF5IGhhdmUgdGhlbSwgc28gd2UgYWxsb3cgaXQuCi0gICAgICAgICAgICAgICAgbGluZSA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRXhwZWN0ZWQgRU5EOlZDQVJEIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsaW5lLnNwbGl0KCI6IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMF0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzFdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFTkQ6VkNBUkQgIT0gXCIiICsgbVByZXZpb3VzTGluZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgfSB3aGlsZSAoYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbXMgPSAqQ1JMRiBpdGVtIAotICAgICAqICAgICAgIC8gaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlSXRlbXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBlbmRlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsICYmICFlbmRlZCkgewotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghZW5kZWQpIHsKLSAgICAgICAgICAgIC8vIGZvbGxvdyBWQ0FSRCAsaXQgd29udCByZWFjaCBlbmRQcm9wZXJ0eQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IHBhcnNlSXRlbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZhbGlkIGxpbmUgd2hpY2ggbG9va3MgbGlrZSBzb21lIGNvbW1lbnQgd2FzIGZvdW5kLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgIGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCAmJiAhZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBtVGltZUVuZFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lICAgIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiQURSIiAgIFtwYXJhbXNdICI6IiBhZGRyZXNzcGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk9SRyIgICBbcGFyYW1zXSAiOiIgb3JncGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk4iICAgICBbcGFyYW1zXSAiOiIgbmFtZXBhcnRzIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUVuY29kaW5nID0gc0RlZmF1bHRFbmNvZGluZzsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGdldE5vbkVtcHR5TGluZSgpOwotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChsaW5lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZUFuZFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZSBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlOYW1lQW5kVmFsdWVbMV07Ci0KLSAgICAgICAgbVRpbWVQYXJzZUxpbmVBbmRIYW5kbGVHcm91cCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBRFIiKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJPUkciKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5lcXVhbHMoIk4iKSkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZUFkck9yZ04gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBR0VOVCIpKSB7Ci0gICAgICAgICAgICBoYW5kbGVBZ2VudChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJCRUdJTiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbigiVGhpcyB2Q2FyZCBoYXMgbmVzdGVkIHZDYXJkIGRhdGEgaW4gaXQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIEJFR0lOIHR5cGU6ICIgKyBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIlZFUlNJT04iKSAmJgotICAgICAgICAgICAgICAgICAgICAhcHJvcGVydHlWYWx1ZS5lcXVhbHMoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oIkluY29tcGF0aWJsZSB2ZXJzaW9uOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiICsgZ2V0VmVyc2lvblN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IG5hbWU6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9HUk9VUF9PUl9QUk9QTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW0tdmFsdWUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIHNhZmV0eS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfUEFSQU1TX0lOX0RRVU9URSA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAoU3RyaW5nIGxpbmUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BOQU1FOwotICAgICAgICBpbnQgbmFtZUluZGV4ID0gMDsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAwICYmIGxpbmUuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gbGluZS5jaGFyQXQoaSk7IAotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUE5BTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVM6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJhbXMobGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZTogXCIiICsgbGluZSArICJcIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBhcmFtcyAgICAgPSAiOyIgW3dzXSBwYXJhbWxpc3QKLSAgICAgKiBwYXJhbWxpc3QgID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0KLSAgICAgKiAgICAgICAgICAgIC8gcGFyYW0KLSAgICAgKiBwYXJhbSAgICAgID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlZBTFVFIiBbd3NdICI9IiBbd3NdIHB2YWx1ZXZhbAotICAgICAqICAgICAgICAgICAgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsCi0gICAgICogICAgICAgICAgICAvICJDSEFSU0VUIiBbd3NdICI9IiBbd3NdIGNoYXJzZXR2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlgtIiB3b3JkIFt3c10gIj0iIFt3c10gd29yZAotICAgICAqICAgICAgICAgICAgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHBhcnNlciBtYXkgdGhyb3cgVkNhcmRFeGNlcHRpb24uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwdHlwZXZhbCA9IGtub3dudHlwZSAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoZmluYWwgU3RyaW5nIHB0eXBldmFsKSB7Ci0gICAgICAgIFN0cmluZyB1cHBlclR5cGVWYWx1ZSA9IHB0eXBldmFsOwotICAgICAgICBpZiAoIShzS25vd25UeXBlU2V0LmNvbnRhaW5zKHVwcGVyVHlwZVZhbHVlKSB8fCB1cHBlclR5cGVWYWx1ZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHB0eXBldmFsKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlTWFwLmFkZChwdHlwZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVFlQRSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwdHlwZXZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJUWVBFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodXBwZXJUeXBlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCFzS25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwudG9VcHBlckNhc2UoKSkgJiYKLSAgICAgICAgICAgICAgICBwdmFsdWV2YWwuc3RhcnRzV2l0aCgiWC0iKSAmJgotICAgICAgICAgICAgICAgICFtVW5rbm93blZhbHVlTWFwLmNvbnRhaW5zKHB2YWx1ZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVmFsdWVNYXAuYWRkKHB2YWx1ZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVkFMVUUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwZW5jb2Rpbmd2YWwgPSAiN0JJVCIgLyAiOEJJVCIgLyAiUVVPVEVELVBSSU5UQUJMRSIgLyAiQkFTRTY0IiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVuY29kaW5nKFN0cmluZyBwZW5jb2Rpbmd2YWwpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1ZhbGlkRW5jb2RpbmcocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJFTkNPRElORyIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwZW5jb2Rpbmd2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIG9ubHkgYWxsb3dzIHVzLWFzY2lpIGFuZCBpc28tODg1OS14eHggKFNlZSBSRkMgMTUyMSksCi0gICAgICogYnV0IHRvZGF5J3MgdkNhcmQgb2Z0ZW4gY29udGFpbnMgb3RoZXIgY2hhcnNldCwgc28gd2UgYWxsb3cgdGhlbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFyc2V0KFN0cmluZyBjaGFyc2V0dmFsKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiQ0hBUlNFVCIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKGNoYXJzZXR2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGFsc28gU2VjdGlvbiA3LjEgb2YgUkZDIDE1MjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMYW5ndWFnZShTdHJpbmcgbGFuZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsYW5ndmFsLnNwbGl0KCItIik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRtcCA9IHN0ckFycmF5WzBdOwotICAgICAgICBpbnQgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzTGV0dGVyKHRtcC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gc3RyQXJyYXlbMV07Ci0gICAgICAgIGxlbmd0aCA9IHRtcC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc0xldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiTEFOR1VBR0UiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShsYW5ndmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGdldFF1b3RlZFByaW50YWJsZShwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHYuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCQVNFNjQiKSB8fAotICAgICAgICAgICAgICAgIG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCIikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRCYXNlNjQocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk91dE9mTWVtb3J5RXJyb3IgaGFwcGVuZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGRhdGEhIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVCYXNlNjQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKG1FbmNvZGluZyA9PSBudWxsIHx8IG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI3QklUIikKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIjhCSVQiKQotICAgICAgICAgICAgICAgICAgICB8fCBtRW5jb2RpbmcudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJYLSIpKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUaGUgZW5jb2RpbmcgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgc3BlYzogXCIiICsgbUVuY29kaW5nICsgIlwiLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB2LmFkZChtYXliZVVuZXNjYXBlVGV4dChwcm9wZXJ0eVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vICAgICAgICAgICAgcXAtcGFydCB0cmFuc3BvcnQtcGFkZGluZwotICAgICAgICAvLyBxcC1zZWdtZW50IDo9IHFwLXNlY3Rpb24gKihTUEFDRSAvIFRBQikgIj0iCi0gICAgICAgIC8vICAgICAgICAgICAgIDsgTWF4aW11bSBsZW5ndGggb2YgNzYgY2hhcmFjdGVycwotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuIChmcm9tIFJGQyAyMDQ1KQotICAgICAgICAvLyBOb3cncyB0aGUgdGltZSA9Ci0gICAgICAgIC8vIGZvciBhbGwgZm9sayB0byBjb21lPQotICAgICAgICAvLyAgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUoZmlyc3RTdHJpbmcuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcuc3Vic3RyaW5nKDAsIHBvcyArIDEpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBxdW90ZWQtcHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUobGluZS5jaGFyQXQocG9zKSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgYmluYXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFpbmx5IGZvciAiQURSIiwgIk9SRyIsIGFuZCAiTiIKLSAgICAgKiBXZSBkbyBub3QgY2FyZSB0aGUgbnVtYmVyIG9mIHN0cm5vc2VtaSBoZXJlLgotICAgICAqIAotICAgICAqIGFkZHJlc3NwYXJ0cyA9IDAqNihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwKLSAgICAgKiAgICAgICAgICAgICAgICBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICogb3JncGFydHMgICAgID0gKihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBGaXJzdCBpcyBPcmdhbml6YXRpb24gTmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICByZW1haW5kZXIgYXJlIE9yZ2FuaXphdGlvbiBVbml0cy4KLSAgICAgKiBuYW1lcGFydHMgICAgPSAwKjQoc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgRmFtaWx5LCBHaXZlbiwgTWlkZGxlLCBQcmVmaXgsIFN1ZmZpeC4KLSAgICAgKiAgICAgICAgICAgICAgOyBFeGFtcGxlOlB1YmxpYztKb2huO1EuO1JldmVyZW5kIERyLjtJSUksIEVzcS4KLSAgICAgKiBzdHJub3NlbWkgICAgPSAqKCpub25zZW1pICgiXDsiIC8gIlwiIENSTEYpKSAqbm9uc2VtaQotICAgICAqICAgICAgICAgICAgICA7IFRvIGluY2x1ZGUgYSBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZAotICAgICAqICAgICAgICAgICAgICA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLgotICAgICAqICAgICAgICAgICAgICAKLSAgICAgKiBXZSBhcmUgbm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuCi0gICAgICogRm9yIG5vdywgd2UgZXhjbHVkZSB0aGVtLiAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLAotICAgICAgICAvLyBidXQgc29tZSBzb2Z0d2FyZXMvZGV2aWNlcyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMoVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLCAoZ2V0VmVyc2lvbigpID09IFZDYXJkQ29uZmlnLkZMQUdfVjMwKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBJdCBpcyBub3QgZW5jb2RlZCBhdCBhbGwuCi0gICAgICoKLSAgICAgKiBpdGVtICA9IC4uLgotICAgICAqICAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIKLSAgICAgKiAgICAgICAgIFtwYXJhbXNdICI6IiB2Y2FyZCBDUkxGCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9yIHZDYXJkIDMuMC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdW5lc2NhcGVkIFN0cmluZyBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSB1bmVzY2FwZWQuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKiBlLmcuIEluIHZDYXJkIDIuMSwgIlw7IiBzaG91bGQgYmUgdW5lc2NhcGVkIGludG8gIjsiIHdoaWxlICJceCIgc2hvdWxkIG5vdCBiZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgLy8gIlw6IiAtPiAiOiIsICJcLCIgLT4gIiwiLCBhbmQgIlxcIiAtPiAiXCIsIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICAvLyB0aGlzIGNsYXNzIGFsbG93ZWQgdGhlbSwgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgICAgaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJzsnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZShpcywgVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VULCBidWlsZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGNoYXJzZXQpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQ3VzdG9tQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbUJ1aWxkZXIgPSBidWlsZGVyOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lVG90YWwgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIsIGJvb2xlYW4gY2FuY2VsZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUNhbmNlbGVkID0gY2FuY2VsZWQ7Ci0gICAgICAgIHBhcnNlKGlzLCBjaGFyc2V0LCBidWlsZGVyKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgdm9pZCBzaG93UGVyZm9ybWFuY2VJbmZvKCkgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVG90YWwgcGFyc2luZyB0aW1lOiAgIiArIG1UaW1lVG90YWwgKyAiIG1zIik7Ci0gICAgICAgIGlmIChtUmVhZGVyIGluc3RhbmNlb2YgQ3VzdG9tQnVmZmVyZWRSZWFkZXIpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCByZWFkTGluZSB0aW1lOiAiICsKLSAgICAgICAgICAgICAgICAgICAgKChDdXN0b21CdWZmZXJlZFJlYWRlciltUmVhZGVyKS5nZXRUb3RhbG1pbGxpc2Vjb25kKCkgKyAiIG1zIik7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVSZWFkU3RhcnRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgbGluZSwgYW5kIGhhbmRsaW5nIGdyb3VwOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBBRFIsIE9SRywgYW5kIE4gZmllbGRzOiIgKyBtVGltZVBhcnNlQWRyT3JnTiArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgcHJvcGVydHkgdmFsdWVzOiAiICsgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgbm9ybWFsIHByb3BlcnR5IHZhbHVlczogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIFF1b3RlZC1QcmludGFibGU6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgQmFzZTY0OiAiICsgbVRpbWVIYW5kbGVCYXNlNjQgKyAiIG1zIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGV0dGVyKGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgIHByaXZhdGUgbG9uZyBtVGltZTsKLSAgICAKLSAgICBwdWJsaWMgQ3VzdG9tQnVmZmVyZWRSZWFkZXIoUmVhZGVyIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1UaW1lICs9IGVuZCAtIHN0YXJ0OwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICByZXR1cm4gbVRpbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmZTk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgdXNlZCB0byBwYXJzZSB2Q2FyZCAzLjAuCi0gKiBQbGVhc2UgcmVmZXIgdG8gdkNhcmQgU3BlY2lmaWNhdGlvbiAzLjAgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI0MjYpLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJfVjIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMzAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBY2NlcHRhYmxlUHJvcHNXaXRoUGFyYW0gPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLCAKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT04iLCAiVEVMIiwgIkVNQUlMIiwgIlRaIiwgIkdFTyIsICJOT1RFIiwgIlVSTCIsCi0gICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIiwgLy8gMi4xCi0gICAgICAgICAgICAgICAgICAgICJOQU1FIiwgIlBST0ZJTEUiLCAiU09VUkNFIiwgIk5JQ0tOQU1FIiwgIkNMQVNTIiwKLSAgICAgICAgICAgICAgICAgICAgIlNPUlQtU1RSSU5HIiwgIkNBVEVHT1JJRVMiLCAiUFJPRElEIikpOyAvLyAzLjAKLSAgICAKLSAgICAvLyBBbHRob3VnaCAiN2JpdCIgYW5kICJCQVNFNjQiIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgd2UgYWxsb3cgaXQgZm9yIHNhZmV0eS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCI3QklUIiwgIjhCSVQiLCAiQkFTRTY0IiwgIkIiKSk7Ci0gICAgCi0gICAgLy8gQWx0aG91Z2ggUkZDIDI0MjYgc3BlY2lmaWVzIHNvbWUgcHJvcGVydHkgbXVzdCBub3QgaGF2ZSBwYXJhbWV0ZXJzLCB3ZSBhbGxvdyBpdCwgCi0gICAgLy8gc2luY2UgdGhlcmUgbWF5IGJlIHNvbWUgY2FyZWVycyB3aGljaCB2aW9sYXRlcyB0aGUgUkZDLi4uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IGFjY2VwdGFibGVQcm9wc1dpdGhvdXRQYXJhbSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUVtaXR0ZWRBZ2VudFdhcm5pbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRydWUgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRoZSBwYXJzZXIgdG8gYmUgc3RyaWN0IGFib3V0IHRoZSBpbnB1dC4KLSAgICAgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3RyaWN0UGFyc2luZzsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmljdFBhcnNpbmcgd2hlbiB0cnVlLCB0aGlzIG9iamVjdCB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgdmNhcmQgaXMgbm90Ci0gICAgICogdmFsaWQgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiAoZGVmaW5lZCBpbiBSRkMgMjQyNikuIE5vdGUgdGhhdCB0aGlzIGNsYXNzCi0gICAgICogaXMgbm90IGZ1bGx5IHlldCBmb3IgYmVpbmcgdXNlZCB3aXRoIHRoaXMgZmxhZyBhbmQgbWF5IG5vdCBub3RpY2UgaW52YWxpZCBsaW5lKHMpLgotICAgICAqCi0gICAgICogQGhpZGUgY3VycmVudGx5IG9ubHkgZm9yIHRlc3RpbmchIAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoYm9vbGVhbiBzdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gc3RyaWN0UGFyc2luZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjMwKGludCBwYXJzZU1vZGUpIHsKLSAgICAgICAgc3VwZXIocGFyc2VNb2RlKTsKLSAgICAgICAgbVN0cmljdFBhcnNpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5GTEFHX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKCEoc0FjY2VwdGFibGVQcm9wc1dpdGhQYXJhbS5jb250YWlucyhwcm9wZXJ0eU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgYWNjZXB0YWJsZVByb3BzV2l0aG91dFBhcmFtLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgJiYKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDMuMDogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMC5jb250YWlucyhlbmNvZGluZy50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KDApID09ICcgJyB8fCBsaW5lLmNoYXJBdCgwKSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWUgU2VjdGlvbiA1LjguMSBvZiBSRkMgMjQyNSAoTUlNRS1ESVIgZG9jdW1lbnQpLgotICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgaXMgdGhlIGV4Y2VycHRzIGZyb20gaXQuICAKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgICAgICAgICAvLyBDYW4gYmUgcmVwcmVzZW50ZWQgYXM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aGF0IGV4aXN0cyBvbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYWxzbyBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcAotICAgICAgICAgICAgICAgICAgICAvLyAgdGlvbiB0aGF0IGV4aXN0cyBvCi0gICAgICAgICAgICAgICAgICAgIC8vICBuIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1QcmV2aW91c0xpbmUpOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiU3BhY2UgZXhpc3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtUHJldmlvdXNMaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLmhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlBhcmFtZXRlciB3aXRob3V0IG5hbWUgaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQgMy4wIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVQYXJhbVdpdGhvdXROYW1lKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICogIAotICAgICAqICBwYXJhbSAgICAgICAgID0gcGFyYW0tbmFtZSAiPSIgcGFyYW0tdmFsdWUgKigiLCIgcGFyYW0tdmFsdWUpCi0gICAgICogIHBhcmFtLW5hbWUgICAgPSBpYW5hLXRva2VuIC8geC1uYW1lCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoU3RyaW5nIHB0eXBldmFsdWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIHB0eXBlQXJyYXkgPSBwdHlwZXZhbHVlcy5zcGxpdCgiLCIpOwotICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHB0eXBlQXJyYXkpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMiAmJiB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmIHZhbHVlLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgZG9lcyBub3QgcmVxdWlyZSB0d28gQ1JMRiBhdCB0aGUgbGFzdCBvZiBCQVNFNjQgZGF0YS4KLSAgICAgKiBJdCBvbmx5IHJlcXVpcmVzIHRoYXQgZGF0YSBzaG91bGQgYmUgTUlNRS1lbmNvZGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbGluZS5zdGFydHNXaXRoKCIgIikgJiYgIWxpbmUuc3RhcnRzV2l0aCgiXHQiKSkgewotICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEVTQ0FQRUQtQ0hBUiA9ICJcXCIgLyAiXDsiIC8gIlwsIiAvICJcbiIgLyAiXE4iKQotICAgICAqICAgICAgICAgICAgICA7IFxcIGVuY29kZXMgXCwgXG4gb3IgXE4gZW5jb2RlcyBuZXdsaW5lCi0gICAgICogICAgICAgICAgICAgIDsgXDsgZW5jb2RlcyA7LCBcLCBlbmNvZGVzICwKLSAgICAgKiAgICAgICAgICAgICAgCi0gICAgICogTm90ZTogQXBwbGUgZXNjYXBlcyAnOicgaW50byAnXDonIHdoaWxlIGRvZXMgbm90IGVzY2FwZSAnXCcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZVRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dF9jaCA9IHRleHQuY2hhckF0KCsraSk7IAotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOyAgICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk3YzUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENsYXNzIHdoaWNoIHRyaWVzIHRvIGRldGVjdHMgdGhlIHNvdXJjZSBvZiB0aGUgdkNhcmQgZnJvbSBpdHMgcHJvcGVydGllcy4KLSAqIEN1cnJlbnRseSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgcHJlbWF0dXJlLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkU291cmNlRGV0ZWN0b3IgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBBUFBMRV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJYLVBIT05FVElDLUxBU1QtTkFNRSIsCi0gICAgICAgICAgICAiWC1BQkFEUiIsICJYLUFCVUlEIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEpBUEFORVNFX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLUdOTyIsICJYLUdOIiwgIlgtUkVEVUNUSU9OIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IFdJTkRPV1NfTU9CSUxFX1BIT05FX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtTUlDUk9TT0ZULUFTU1RfVEVMIiwgIlgtTUlDUk9TT0ZULUFTU0lTVEFOVCIsICJYLU1JQ1JPU09GVC1PRkZJQ0VMT0MiKSk7Ci0gICAgCi0gICAgLy8gTm90ZTogdGhlc2Ugc2lnbmVzIGFwcGVhcnMgYmVmb3JlIHRoZSBzaWducyBvZiB0aGUgb3RoZXIgdHlwZSAoZS5nLiAiWC1HTiIpLgotICAgIC8vIEluIG90aGVyIHdvcmRzLCBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMgYXJlIGRldGVjdGVkIGFzIEZPTUEsIG5vdCBKQVBBTkVTRV9NT0JJTEVfUEhPTkVTLgotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEZPTUFfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1TRC1WRVJOIiwgIlgtU0QtRk9STUFUX1ZFUiIsICJYLVNELUNBVEVHT1JJRVMiLCAiWC1TRC1DTEFTUyIsICJYLVNELURDUkVBVEVEIiwKLSAgICAgICAgICAgICJYLVNELURFU0NSSVBUSU9OIikpOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUWVBFX0ZPTUFfQ0hBUlNFVF9TSUdOID0gIlgtU0QtQ0hBUl9DT0RFIjsKLSAgICAKLSAgICBwcml2YXRlIGludCBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTjsKLSAgICAvLyBTb21lIG1vYmlsZSBwaG9uZXMgKGxpa2UgRk9NQSkgdGVsbHMgdXMgdGhlIGNoYXJzZXQgb2YgdGhlIGRhdGEuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOwotICAgICAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVHlwZSAhPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQTsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQVBQTEVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9BUFBMRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICByZXR1cm4gbVR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBjaGFyc2V0IFN0cmluZyBndWVzc2VkIGZyb20gdGhlIHNvdXJjZSdzIHByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcGFyc2luZyB0YXJnZXQgZmlsZShzKS4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAobVNwZWNpZmllZENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDoKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOgotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjExMmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIFZDYXJkIGhhbmRsaW5nIGNvZGVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlscyB7Ci0gICAgLy8gTm90ZSB0aGF0IG5vdCBhbGwgdHlwZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbWFwL3NldCwgc2luY2UsIGZvciBleGFtcGxlLCBUWVBFX0hPTUVfRkFYIGlzCi0gICAgLy8gY29udmVydGVkIHRvIHR3byBwYXJhbWV0ZXIgU3RyaW5ncy4gVGhlc2Ugb25seSBjb250YWluIHNvbWUgbWlub3IgZmllbGRzIHZhbGlkIGluIGJvdGgKLSAgICAvLyB2Q2FyZCBhbmQgY3VycmVudCAoYXMgb2YgMjAwOS0wOC0wNykgQ29udGFjdHMgc3RydWN0dXJlLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzS25vd25QaG9uZVR5cGVNYXBfU3RvSTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc01vYmlsZVBob25lTGFiZWxTZXQ7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9DQVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9QQUdFUiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX0lTRE4sIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4sIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSLCBQaG9uZS5UWVBFX09USEVSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9DQUxMQkFDSyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dCgKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9SQURJTywgUGhvbmUuVFlQRV9SQURJTyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQsCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9UVFlfVEREKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQVNTSVNUQU5UKTsKLQotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01PREVNKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0JCUyk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVklERU8pOwotCi0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0dPT0dMRV9UQUxLLAotICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEspOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0lDUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0pBQkJFUiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1FRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1FRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ORVRNRUVUSU5HLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05FVE1FRVRJTkcpOwotCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MSA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaS1EZW53YSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHU2NDNBXHU1RTJGID0gRnVsbC13aWR0aCBIaXJhZ2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQgPSBGdWxsLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiA9IEhhbGYtd2lkdGggS2F0YWthbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgc01vYmlsZVBob25lTGFiZWxTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIk1PQklMRSIsICJcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEiLCAiXHU2NDNBXHU1RTJGIiwgIlx1MzBCMVx1MzBBNFx1MzBCRlx1MzBBNCIsCi0gICAgICAgICAgICAgICAgIlx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQaG9uZVR5cGVTdHJpbmcoSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MuZ2V0KHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSW50ZXJnZXIgd2hlbiB0aGUgZ2l2ZW4gdHlwZXMgY2FuIGJlIHBhcnNlZCBhcyBrbm93biB0eXBlLiBSZXR1cm5zIFN0cmluZyBvYmplY3QKLSAgICAgKiB3aGVuIG5vdCwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBsYWJlbC4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVzLAotICAgICAgICAgICAgU3RyaW5nIG51bWJlcikgewotICAgICAgICBpZiAobnVtYmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG51bWJlciA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNGYXggPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBoYXNQcmVmID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNQcmVmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSkgewotICAgICAgICAgICAgICAgICAgICBpc0ZheCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdG1wID0gc0tub3duUGhvbmVUeXBlTWFwX1N0b0kuZ2V0KHR5cGVTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlQ2FuZGlkYXRlID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFlQRV9QQUdFUiBpcyBwcmVmZXJlZCB3aGVuIHRoZSBudW1iZXIgY29udGFpbnMgQCBzdXJyb25kZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcGFnZXIgbnVtYmVyIGFuZCBhIGRvbWFpbiBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbyAxMTExQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggMTExMUAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleE9mQXQgPSBudW1iZXIuaW5kZXhPZigiQCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlQ2FuZGlkYXRlID09IFBob25lLlRZUEVfUEFHRVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgMCA8IGluZGV4T2ZBdCAmJiBpbmRleE9mQXQgPCBudW1iZXIubGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgaWYgKGhhc1ByZWYpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9NQUlOOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFRZUEVfSE9NRQotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzRmF4KSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0hPTUUpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfSE9NRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1dPUkspIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfV09SSzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVJfRkFYOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFiZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9iaWxlUGhvbmVMYWJlbChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIERldGFpbDogVW50aWwgRG9udXQsIHRoZXJlIGlzbid0IFRZUEVfTU9CSUxFIGZvciBlbWFpbCB3aGlsZSB0aGVyZSBpcyBub3cuCi0gICAgICAgIC8vICAgICAgICAgVG8gc3VwcG9ydCBtb2JpbGUgdHlwZSBhdCB0aGF0IHRpbWUsIHRoaXMgY3VzdG9tIGxhYmVsIGhhZCBiZWVuIHVzZWQuCi0gICAgICAgIHJldHVybiAoYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5Db250YWN0TWV0aG9kc0NvbHVtbnMuTU9CSUxFX0VNQUlMX1RZUEVfTkFNRS5lcXVhbHMobGFiZWwpCi0gICAgICAgICAgICAgICAgfHwgc01vYmlsZVBob25lTGFiZWxTZXQuY29udGFpbnMobGFiZWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEluVjIxQnV0VW5rbm93blRvQ29udGFjdHNQaG90ZVR5cGUoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmNvbnRhaW5zKGxhYmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWVGb3JJbShmaW5hbCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgcmV0dXJuIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5nZXQocHJvdG9jb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc29ydE5hbWVFbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpc3QgPSBuZXcgU3RyaW5nWzNdOwotICAgICAgICBmaW5hbCBpbnQgbmFtZU9yZGVyVHlwZSA9IFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUodmNhcmRUeXBlKTsKLSAgICAgICAgc3dpdGNoIChuYW1lT3JkZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfSkFQQU5FU0U6IHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsyXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfRVVST1BFOiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsxXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBsaXN0WzBdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBob25lTnVtYmVyRm9ybWF0KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHBvc3RhbCBkYXRhIGludG8gdGhlIGJ1aWxkZXIgb2JqZWN0LgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdHNDb250cmFjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRlZmluZWQgaW4gdkNhcmQuCi0gICAgICogU28gc29tZSBjb252ZXJzaW9uIG1heSBiZSBwZXJmb3JtZWQgaW4gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoaXNWMzAgPyBWQ2FyZFBhcnNlcl9WMzAudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFBhcnNlcl9WMjEudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogU2VlIHRoZSBkZWZpbml0aW9uIG9mICI3Yml0IiBpbiB2Q2FyZCAyLjEgc3BlYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENoYXJhY3Rlcj4gc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8Q2hhcmFjdGVyPihBcnJheXMuYXNMaXN0KCdbJywgJ10nLCAnPScsICc6JywgJy4nLCAnLCcsICcgJykpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VmdWwgc2luY2UgdkNhcmQgMy4wIG9mdGVuIHJlcXVpcmVzIHRoZSAoIlgtIikgcHJvcGVydGllcyBhbmQgZ3JvdXBzCi0gICAgICogc2hvdWxkIGNvbnRhaW4gb25seSBhbHBoYWJldHMsIGRpZ2l0cywgYW5kIGh5cGhlbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBJdCBpcyBhbHJlYWR5IGtub3duIHNvbWUgZGV2aWNlcyAod3JvbmdseSkgb3V0cHV0cyBwcm9wZXJ0aWVzIHdpdGggY2hhcmFjdGVycwotICAgICAqICAgICAgIHdoaWNoIHNob3VsZCBub3QgYmUgaW4gdGhlIGZpZWxkLiBPbmUgZXhhbXBsZSBpcyAiWC1HT09HTEUgVEFMSyIuIFdlIGFjY2VwdAotICAgICAqICAgICAgIHN1Y2gga2luZCBvZiBpbnB1dCBidXQgbXVzdCBuZXZlciBvdXRwdXQgaXQgdW5sZXNzIHRoZSB0YXJnZXQgaXMgdmVyeSBzcGVjaWZpYwotICAgICAqICAgICAgIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMgYWJsZSB0byBwYXJzZSB0aGUgbWFsZm9ybWVkIGlucHV0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgdXBwZXJBbHBoYWJldEZpcnN0ID0gMHg0MTsgIC8vIEEKLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QgPSAweDViOyAgLy8gWwotICAgICAgICBmaW5hbCBpbnQgbG93ZXJBbHBoYWJldEZpcnN0ID0gMHg2MTsgIC8vIGEKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QgPSAweDdiOyAgLy8gewotICAgICAgICBmaW5hbCBpbnQgZGlnaXRGaXJzdCA9IDB4MzA7ICAvLyAwCi0gICAgICAgIGZpbmFsIGludCBkaWdpdEFmdGVyTGFzdCA9IDB4M0E7ICAvLyA6Ci0gICAgICAgIGZpbmFsIGludCBoeXBoZW4gPSAnLSc7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHN0ciA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHN0ci5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXBvaW50ID0gc3RyLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKChsb3dlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh1cHBlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkaWdpdEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBkaWdpdEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvZGVwb2ludCA9PSBoeXBoZW4pKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiBTdHJpbmcgaXMgY2F0ZWdvcml6ZWQgYXMgIndvcmQiIHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjIDIuMS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllczo8QlIgLz4KLSAgICAgKiB3b3JkID0gJmx0O2FueSBwcmludGFibGUgN2JpdCB1cy1hc2NpaSBleGNlcHQgW109Oi4sICZndDsKLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVjIxV29yZChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjID0gdmFsdWUuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNVbkFjY2VwdGFibGVBc2NpaUluVjIxV29yZFNldC5jb250YWlucygoY2hhciljKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hhbGZXaWR0aFN0cmluZyhmaW5hbCBTdHJpbmcgb3JnU3RyaW5nKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvcmdTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gb3JnU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IG9yZ1N0cmluZy5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIC8vIEFsbCBKYXBhbmVzZSBjaGFyYWN0ZXIgaXMgYWJsZSB0byBiZSBleHByZXNzZWQgYnkgY2hhci4KLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHVzZSBTdHJpbmcjY29kZXBQb2ludEF0KCkuCi0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gb3JnU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWxmV2lkdGhUZXh0ID0gSmFwYW5lc2VVdGlscy50cnlHZXRIYWxmV2lkdGhUZXh0KGNoKTsKLSAgICAgICAgICAgIGlmIChoYWxmV2lkdGhUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChoYWxmV2lkdGhUZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3Vlc3NlcyB0aGUgZm9ybWF0IG9mIGlucHV0IGltYWdlLiBDdXJyZW50bHkganVzdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkLgotICAgICAqIFRoZSB0eXBlICJHSUYiLCAiUE5HIiwgb3IgIkpQRUciIGlzIHJldHVybmVkIHdoZW4gcG9zc2libGUuIFJldHVybnMgbnVsbCB3aGVuCi0gICAgICogdGhlIGd1ZXNzIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gaW5wdXQgSW1hZ2UgYXMgYnl0ZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbWFnZSB0eXBlIG9yIG51bGwgd2hlbiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0ltYWdlVHlwZShmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMyAmJiBpbnB1dFswXSA9PSAnRycgJiYgaW5wdXRbMV0gPT0gJ0knICYmIGlucHV0WzJdID09ICdGJykgewotICAgICAgICAgICAgcmV0dXJuICJHSUYiOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSA0ICYmIGlucHV0WzBdID09IChieXRlKSAweDg5Ci0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gJ1AnICYmIGlucHV0WzJdID09ICdOJyAmJiBpbnB1dFszXSA9PSAnRycpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDIuMSBvZmZpY2lhbGx5IGRvZXMgbm90IHN1cHBvcnQgUE5HLCBidXQgd2UgbWF5IGhhdmUgaXQgYW5kCi0gICAgICAgICAgICAvLyAgICAgICB1c2luZyBYLSB3b3JkIGxpa2UgIlgtUE5HIiBtYXkgbm90IGxldCBpbXBvcnRlcnMga25vdyBpdCBpcyBQTkcuCi0gICAgICAgICAgICAvLyAgICAgICBTbyB3ZSB1c2UgdGhlIFN0cmluZyAiUE5HIiBhcyBpcy4uLgotICAgICAgICAgICAgcmV0dXJuICJQTkciOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSAyICYmIGlucHV0WzBdID09IChieXRlKSAweGZmCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gKGJ5dGUpIDB4ZDgpIHsKLSAgICAgICAgICAgIHJldHVybiAiSlBFRyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIGFsbCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBudWxsIG9yIGVtcHR5IFN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUFsbEVtcHR5KGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgVkNhcmRVdGlscygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzJjN2RmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU3MjE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFZDYXJkRXhjZXB0aW9uIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZGI2MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIHRoZSB2Q2FyZCBoYXMgc29tZSBsaW5lIHN0YXJ0aW5nIHdpdGggJyMnLiBJbiB0aGUgc3BlY2lmaWNhdGlvbiwKLSAqIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgc3VjaCBsaW5lLCBidXQgc29tZSBhY3R1YWwgZXhwb3J0ZXIgZW1pdAotICogc3VjaCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxNTNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIHRoZSB2Q2FyZCBoYXMgc29tZSBsaW5lIHN0YXJ0aW5nIHdpdGggJyMnLiBJbiB0aGUgc3BlY2lmaWNhdGlvbiwKLSAqIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgc3VjaCBsaW5lLCBidXQgc29tZSBhY3R1YWwgZXhwb3J0ZXIgZW1pdAotICogc3VjaCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNjMmZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROZXN0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWQ2FyZEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBWQ2FyZCBpcyBuZXN0ZWQgd2l0aG91dCBWQ2FyZFBhcnNlcidzIGJlaW5nIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROZXN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTmVzdGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZhYTc3NjMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhjZXB0aW9uIHdoaWNoIHRlbGxzIHRoYXQgdGhlIGlucHV0IFZDYXJkIGlzIHByb2JhYmx5IHZhbGlkIGZyb20gdGhlIHZpZXcgb2YKLSAqIHNwZWNpZmljYXRpb24gYnV0IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWV3b3JrIGZvciBub3cuCi0gKiAKLSAqIFRoaXMgaXMgYSBraW5kIG9mIGEgZ29vZCBuZXdzIGZyb20gdGhlIHZpZXcgb2YgZGV2ZWxvcG1lbnQuCi0gKiBJdCBtYXkgYmUgZ29vZCB0byBhc2sgdXNlcnMgdG8gc2VuZCBhIHJlcG9ydCB3aXRoIHRoZSBWQ2FyZCBleGFtcGxlCi0gKiBmb3IgdGhlIGZ1dHVyZSBkZXZlbG9wbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZFZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlOGI3Zi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHVzZWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIG9mIHRoZSB2Q2FyZCBpcyBkaWZmZXJlbnQuIAotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNTU1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZW50cmllcyBhcworICogYSBkaWFsb2cuCisgKiA8cD4KKyAqIFRoaXMgcHJlZmVyZW5jZSB3aWxsIHN0b3JlIGEgc2V0IG9mIHN0cmluZ3MgaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKiBUaGlzIHNldCB3aWxsIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzIGZyb20gdGhlCisgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0gYXJyYXkuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSBleHRlbmRzIERpYWxvZ1ByZWZlcmVuY2UgeworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJpZXM7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cnlWYWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU5ld1ZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZWZlcmVuY2VDaGFuZ2VkOworICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLCAwLCAwKTsKKyAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMpOworICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUKKyAgICAgKiBzaG93biBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGluZGV4IGluCisgICAgICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBlbnRyaWVzLgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoQ2hhclNlcXVlbmNlW10gZW50cmllcykgeworICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJpZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJpZXNSZXNJZCBUaGUgZW50cmllcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoaW50IGVudHJpZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyaWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cmllc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QgaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGxpc3QgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgKiBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgKiBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzIFRoZSBhcnJheSB0byBiZSB1c2VkIGFzIHZhbHVlcyB0byBzYXZlIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSBlbnRyeVZhbHVlcykgeworICAgICAgICBtRW50cnlWYWx1ZXMgPSBlbnRyeVZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXNSZXNJZCBUaGUgZW50cnkgdmFsdWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoaW50IGVudHJ5VmFsdWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cnlWYWx1ZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyeVZhbHVlc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcyB0byBiZSBzYXZlZCBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyeVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyeVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGtleS4gVGhpcyBzaG91bGQgY29udGFpbiBlbnRyaWVzIGluCisgICAgICoge0BsaW5rICNnZXRFbnRyeVZhbHVlcygpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gc2V0IGZvciB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHBlcnNpc3RTdHJpbmdTZXQodmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSAoaW4gdGhlIGVudHJ5IHZhbHVlcyBhcnJheSkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3aG9zZSBpbmRleCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtRW50cnlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbnRyeVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChtRW50cnlWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2dCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBzdXBlci5vblByZXBhcmVEaWFsb2dCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1FbnRyaWVzID09IG51bGwgfHwgbUVudHJ5VmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIHJlcXVpcmVzIGFuIGVudHJpZXMgYXJyYXkgYW5kICIgKworICAgICAgICAgICAgICAgICAgICAiYW4gZW50cnlWYWx1ZXMgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW5bXSBjaGVja2VkSXRlbXMgPSBnZXRTZWxlY3RlZEl0ZW1zKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TXVsdGlDaG9pY2VJdGVtcyhtRW50cmllcywgY2hlY2tlZEl0ZW1zLAorICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoLCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLmFkZChtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLnJlbW92ZShtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU5ld1ZhbHVlcy5jbGVhcigpOworICAgICAgICBtTmV3VmFsdWVzLmFkZEFsbChtVmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuW10gZ2V0U2VsZWN0ZWRJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZW50cmllcyA9IG1FbnRyaWVzOworICAgICAgICBmaW5hbCBpbnQgZW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bZW50cnlDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gdmFsdWVzLmNvbnRhaW5zKGVudHJpZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOworICAgICAgICAKKyAgICAgICAgaWYgKHBvc2l0aXZlUmVzdWx0ICYmIG1QcmVmZXJlbmNlQ2hhbmdlZCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbU5ld1ZhbHVlczsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIodmFsdWVzKSkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGRlZmF1bHRWYWx1ZXMgPSBhLmdldFRleHRBcnJheShpbmRleCk7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gZGVmYXVsdFZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGRlZmF1bHRWYWx1ZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobVZhbHVlcykgOiAoU2V0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTYXZlZFN0YXRlIG15U3RhdGUgPSBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlKTsKKyAgICAgICAgbXlTdGF0ZS52YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc291cmNlLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RyaW5nQ291bnQgPSBzdHJpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IDE5N2Q5NzYuLjExN2U1MDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjgsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzM0LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYmFzaWMgUHJlZmVyZW5jZSBVSSBidWlsZGluZwogICogYmxvY2sgZGlzcGxheWVkIGJ5IGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0gaW4gdGhlIGZvcm0gb2YgYQpAQCAtNTQsNiArNTYsNyBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV90aXRsZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9zdW1tYXJ5CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX29yZGVyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2ZyYWdtZW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2xheW91dAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV93aWRnZXRMYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfZW5hYmxlZApAQCAtODYsNiArODksNyBAQAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdW1tYXJ5OwogICAgIHByaXZhdGUgU3RyaW5nIG1LZXk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFN0cmluZyBtRnJhZ21lbnQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGFibGUgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWlyZXNLZXk7CkBAIC0yMDgsNiArMjEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1PcmRlciA9IGEuZ2V0SW50KGF0dHIsIG1PcmRlcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlX2ZyYWdtZW50OgorICAgICAgICAgICAgICAgICAgICBtRnJhZ21lbnQgPSBhLmdldFN0cmluZyhhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfbGF5b3V0OgogICAgICAgICAgICAgICAgICAgICBtTGF5b3V0UmVzSWQgPSBhLmdldFJlc291cmNlSWQoYXR0ciwgbUxheW91dFJlc0lkKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMTMsNiArMzIxLDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhIGZyYWdtZW50IHRvIGJlIHNob3duIHdoZW4gdGhpcyBQcmVmZXJlbmNlIGlzIGNsaWNrZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50KSB7CisgICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBsYXN0IHNldCB2aWEge0BsaW5rICNzZXRGcmFnbWVudH0gb3IgWE1MLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGF5b3V0IHJlc291cmNlIHRoYXQgaXMgaW5mbGF0ZWQgYXMgdGhlIHtAbGluayBWaWV3fSB0byBiZSBzaG93bgogICAgICAqIGZvciB0aGlzIFByZWZlcmVuY2UuIEluIG1vc3QgY2FzZXMsIHRoZSBkZWZhdWx0IGxheW91dCBpcyBzdWZmaWNpZW50IGZvcgogICAgICAqIGN1c3RvbSBQcmVmZXJlbmNlIG9iamVjdHMgYW5kIG9ubHkgdGhlIHdpZGdldCBsYXlvdXQgbmVlZHMgdG8gYmUgY2hhbmdlZC4KQEAgLTEyNTAsNiArMTI3Niw2MSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGEgc2V0IG9mIFN0cmluZ3MgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IGFuIGVkaXRvciBmcm9tCisgICAgICogdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIHB1dCBpbiB0aGUgc3RyaW5ncywgYW5kIGNoZWNrIGlmIHdlIHNob3VsZCBjb21taXQgKGFuZAorICAgICAqIGNvbW1pdCBpZiBzbykuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHBlcnNpc3QuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQuIChUaGlzIGlzIG5vdCB3aGV0aGVyIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgd2FzIHBlcnNpc3RlZCwgc2luY2Ugd2UgbWF5IG5vdCBuZWNlc3NhcmlseSBjb21taXQgaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIHdpbGwgYmUgYSBiYXRjaCBjb21taXQgbGF0ZXIuKQorICAgICAqIEBzZWUgI2dldFBlcnNpc3RlZFN0cmluZyhTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0U3RyaW5nU2V0KFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBpZiAoc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3Qgc3RvcmUgbnVsbAorICAgICAgICAgICAgaWYgKHZhbHVlcy5lcXVhbHMoZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG51bGwpKSkgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgYWxyZWFkeSB0aGVyZSwgc28gdGhlIHNhbWUgYXMgcGVyc2lzdGluZworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gbVByZWZlcmVuY2VNYW5hZ2VyLmdldEVkaXRvcigpOworICAgICAgICAgICAgZWRpdG9yLnB1dFN0cmluZ1NldChtS2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgdHJ5Q29tbWl0KGVkaXRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gZ2V0IGEgcGVyc2lzdGVkIHNldCBvZiBTdHJpbmdzIGZyb20gdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgdGhlIFNoYXJlZFByZWZlcmVuY2VzCisgICAgICogZnJvbSB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgYW5kIGdldCB0aGUgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIGRlZmF1bHRSZXR1cm5WYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgZWl0aGVyIHRoZQorICAgICAqICAgICAgICAgICAgUHJlZmVyZW5jZSBpcyBub3QgcGVyc2lzdGVudCBvciB0aGUgUHJlZmVyZW5jZSBpcyBub3QgaW4gdGhlCisgICAgICogICAgICAgICAgICBzaGFyZWQgcHJlZmVyZW5jZXMuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZnJvbSB0aGUgU2hhcmVkUHJlZmVyZW5jZXMgb3IgdGhlIGRlZmF1bHQgcmV0dXJuCisgICAgICogICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2VlICNwZXJzaXN0U3RyaW5nU2V0KFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQoU2V0PFN0cmluZz4gZGVmYXVsdFJldHVyblZhbHVlKSB7CisgICAgICAgIGlmICghc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFJldHVyblZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFNoYXJlZFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nU2V0KG1LZXksIGRlZmF1bHRSZXR1cm5WYWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYW4gaW50IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHBlcnNpc3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQppbmRleCA3MjY3OTNkLi5lMTNjM2U4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKQEAgLTE2LDgzICsxNiwxNTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogU2hvd3MgYSBoaWVyYXJjaHkgb2Yge0BsaW5rIFByZWZlcmVuY2V9IG9iamVjdHMgYXMKLSAqIGxpc3RzLCBwb3NzaWJseSBzcGFubmluZyBtdWx0aXBsZSBzY3JlZW5zLiBUaGVzZSBwcmVmZXJlbmNlcyB3aWxsCi0gKiBhdXRvbWF0aWNhbGx5IHNhdmUgdG8ge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSBhcyB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aAotICogdGhlbS4gVG8gcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSB0aGF0IHRoZQotICogcHJlZmVyZW5jZSBoaWVyYXJjaHkgaW4gdGhpcyBhY3Rpdml0eSB3aWxsIHVzZSwgY2FsbAotICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI2dldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCl9Ci0gKiB3aXRoIGEgY29udGV4dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoaXMgYWN0aXZpdHkuCi0gKiA8cD4KLSAqIEZ1cnRoZXJtb3JlLCB0aGUgcHJlZmVyZW5jZXMgc2hvd24gd2lsbCBmb2xsb3cgdGhlIHZpc3VhbCBzdHlsZSBvZiBzeXN0ZW0KLSAqIHByZWZlcmVuY2VzLiBJdCBpcyBlYXN5IHRvIGNyZWF0ZSBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcyAodGhhdCBjYW4gYmUKLSAqIHNob3duIG9uIG11bHRpcGxlIHNjcmVlbnMpIHZpYSBYTUwuIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyByZWNvbW1lbmRlZCB0bwotICogdXNlIHRoaXMgYWN0aXZpdHkgKGFzIGEgc3VwZXJjbGFzcykgdG8gZGVhbCB3aXRoIHByZWZlcmVuY2VzIGluIGFwcGxpY2F0aW9ucy4KLSAqIDxwPgotICogQSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2JqZWN0IHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBwcmVmZXJlbmNlCi0gKiBoaWVyYXJjaHkuIEZ1cnRoZXJtb3JlLCBzdWJzZXF1ZW50IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5Ci0gKiBkZW5vdGUgYSBzY3JlZW4gYnJlYWstLXRoYXQgaXMgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCB3aXRoaW4gc3Vic2VxdWVudAotICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHNob3VsZCBiZSBzaG93biBvbiBhbm90aGVyIHNjcmVlbi4gVGhlIHByZWZlcmVuY2UKLSAqIGZyYW1ld29yayBoYW5kbGVzIHNob3dpbmcgdGhlc2Ugb3RoZXIgc2NyZWVucyBmcm9tIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KLSAqIDxwPgotICogVGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGNhbiBiZSBmb3JtZWQgaW4gbXVsdGlwbGUgd2F5czoKLSAqIDxsaT4gRnJvbSBhbiBYTUwgZmlsZSBzcGVjaWZ5aW5nIHRoZSBoaWVyYXJjaHkKLSAqIDxsaT4gRnJvbSBkaWZmZXJlbnQge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaCBzcGVjaWZ5IGl0cyBvd24KLSAqIHByZWZlcmVuY2VzIGluIGFuIFhNTCBmaWxlIHZpYSB7QGxpbmsgQWN0aXZpdHl9IG1ldGEtZGF0YQotICogPGxpPiBGcm9tIGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59Ci0gKiA8cD4KLSAqIFRvIGluZmxhdGUgZnJvbSBYTUwsIHVzZSB0aGUge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQpfS4gVGhlCi0gKiByb290IGVsZW1lbnQgc2hvdWxkIGJlIGEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LiBTdWJzZXF1ZW50IGVsZW1lbnRzIGNhbiBwb2ludAotICogdG8gYWN0dWFsIHtAbGluayBQcmVmZXJlbmNlfSBzdWJjbGFzc2VzLiBBcyBtZW50aW9uZWQgYWJvdmUsIHN1YnNlcXVlbnQKLSAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5IHdpbGwgcmVzdWx0IGluIHRoZSBzY3JlZW4gYnJlYWsuCi0gKiA8cD4KLSAqIFRvIHNwZWNpZnkgYW4ge0BsaW5rIEludGVudH0gdG8gcXVlcnkge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaAotICogaGF2ZSBwcmVmZXJlbmNlcywgdXNlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50fS4gRWFjaAotICoge0BsaW5rIEFjdGl2aXR5fSBjYW4gc3BlY2lmeSBtZXRhLWRhdGEgaW4gdGhlIG1hbmlmZXN0ICh2aWEgdGhlIGtleQotICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI01FVEFEQVRBX0tFWV9QUkVGRVJFTkNFU30pIHRoYXQgcG9pbnRzIHRvIGFuIFhNTAotICogcmVzb3VyY2UuIFRoZXNlIFhNTCByZXNvdXJjZXMgd2lsbCBiZSBpbmZsYXRlZCBpbnRvIGEgc2luZ2xlIHByZWZlcmVuY2UKLSAqIGhpZXJhcmNoeSBhbmQgc2hvd24gYnkgdGhpcyBhY3Rpdml0eS4KLSAqIDxwPgotICogVG8gc3BlY2lmeSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSwgdXNlCi0gKiB7QGxpbmsgI3NldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbil9LgotICogPHA+Ci0gKiBBcyBhIGNvbnZlbmllbmNlLCB0aGlzIGFjdGl2aXR5IGltcGxlbWVudHMgYSBjbGljayBsaXN0ZW5lciBmb3IgYW55Ci0gKiBwcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGhpZXJhcmNoeSwgc2VlCi0gKiB7QGxpbmsgI29uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlKX0uCi0gKiAKLSAqIEBzZWUgUHJlZmVyZW5jZQotICogQHNlZSBQcmVmZXJlbmNlU2NyZWVuCisgKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbiBhY3Rpdml0eSB0byBzaG93IGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzCisgKiB0byB0aGUgdXNlci4gIFByaW9yIHRvIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICogdGhpcyBjbGFzcyBvbmx5IGFsbG93ZWQgdGhlIGRpc3BsYXkgb2YgYSBzaW5nbGUgc2V0IG9mIHByZWZlcmVuY2U7IHRoaXMKKyAqIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIG5vdyBiZSBmb3VuZCBpbiB0aGUgbmV3IHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9CisgKiBjbGFzcy4gIElmIHlvdSBhcmUgdXNpbmcgUHJlZmVyZW5jZUFjdGl2aXR5IGluIGl0cyBvbGQgbW9kZSwgdGhlIGRvY3VtZW50YXRpb24KKyAqIHRoZXJlIGFwcGxpZXMgdG8gdGhlIGRlcHJlY2F0ZWQgQVBJcyBoZXJlLgorICoKKyAqIDxwPlRoaXMgYWN0aXZpdHkgc2hvd3Mgb25lIG9yIG1vcmUgaGVhZGVycyBvZiBwcmVmZXJlbmNlcywgZWFjaCBvZiB3aXRoCisgKiBpcyBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSB0byBkaXNwbGF5IHRoZSBwcmVmZXJlbmNlcworICogb2YgdGhhdCBoZWFkZXIuICBUaGUgYWN0dWFsIGxheW91dCBhbmQgZGlzcGxheSBvZiB0aGVzZSBhc3NvY2lhdGlvbnMgY2FuCisgKiBob3dldmVyIHZhcnk7IGN1cnJlbnRseSB0aGVyZSBhcmUgdHdvIG1ham9yIGFwcHJvYWNoZXMgaXQgbWF5IHRha2U6CisgKgorICogPHVsPgorICogPGxpPk9uIGEgc21hbGwgc2NyZWVuIGl0IG1heSBkaXNwbGF5IG9ubHkgdGhlIGhlYWRlcnMgYXMgYSBzaW5nbGUgbGlzdAorICogd2hlbiBmaXJzdCBsYXVuY2hlZC4gIFNlbGVjdGluZyBvbmUgb2YgdGhlIGhlYWRlciBpdGVtcyB3aWxsIHJlLWxhdW5jaAorICogdGhlIGFjdGl2aXR5IHdpdGggaXQgb25seSBzaG93aW5nIHRoZSBQcmVmZXJlbmNlRnJhZ21lbnQgb2YgdGhhdCBoZWFkZXIuCisgKiA8bGk+T24gYSBsYXJnZSBzY3JlZW4gaW4gbWF5IGRpc3BsYXkgYm90aCB0aGUgaGVhZGVycyBhbmQgY3VycmVudAorICogUHJlZmVyZW5jZUZyYWdtZW50IHRvZ2V0aGVyIGFzIHBhbmVzLiAgU2VsZWN0aW5nIGEgaGVhZGVyIGl0ZW0gc3dpdGNoZXMKKyAqIHRvIHNob3dpbmcgdGhlIGNvcnJlY3QgUHJlZmVyZW5jZUZyYWdtZW50IGZvciB0aGF0IGl0ZW0uCisgKiA8L3VsPgorICoKKyAqIDxwPlN1YmNsYXNzZXMgb2YgUHJlZmVyZW5jZUFjdGl2aXR5IHNob3VsZCBpbXBsZW1lbnQKKyAqIHtAbGluayAjb25CdWlsZEhlYWRlcnN9IHRvIHBvcHVsYXRlIHRoZSBoZWFkZXIgbGlzdCB3aXRoIHRoZSBkZXNpcmVkCisgKiBpdGVtcy4gIERvaW5nIHRoaXMgaW1wbGljaXRseSBzd2l0Y2hlcyB0aGUgY2xhc3MgaW50byBpdHMgbmV3ICJoZWFkZXJzCisgKiArIGZyYWdtZW50cyIgbW9kZSByYXRoZXIgdGhhbiB0aGUgb2xkIHN0eWxlIG9mIGp1c3Qgc2hvd2luZyBhIHNpbmdsZQorICogcHJlZmVyZW5jZXMgbGlzdC4KKyAqCisgKiA8YSBuYW1lPSJTYW1wbGVDb2RlIj48L2E+CisgKiA8aDM+U2FtcGxlIENvZGU8L2gzPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2FtcGxlIGNvZGUgc2hvd3MgYSBzaW1wbGUgcHJlZmVyZW5jZSBhY3Rpdml0eSB0aGF0CisgKiBoYXMgdHdvIGRpZmZlcmVudCBzZXRzIG9mIHByZWZlcmVuY2VzLiAgVGhlIGltcGxlbWVudGF0aW9uLCBjb25zaXN0aW5nCisgKiBvZiB0aGUgYWN0aXZpdHkgaXRzZWxmIGFzIHdlbGwgYXMgaXRzIHR3byBwcmVmZXJlbmNlIGZyYWdtZW50cyBpczo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVdpdGhIZWFkZXJzLmphdmEKKyAqICAgICAgYWN0aXZpdHl9CisgKgorICogPHA+VGhlIHByZWZlcmVuY2VfaGVhZGVycyByZXNvdXJjZSBkZXNjcmliZXMgdGhlIGhlYWRlcnMgdG8gYmUgZGlzcGxheWVkCisgKiBhbmQgdGhlIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIEl0IGlzOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sIGhlYWRlcnN9CisgKgorICogPHA+VGhlIGZpcnN0IGhlYWRlciBpcyBzaG93biBieSBQcmVmczFGcmFnbWVudCwgd2hpY2ggcG9wdWxhdGVzIGl0c2VsZgorICogZnJvbSB0aGUgZm9sbG93aW5nIFhNTCByZXNvdXJjZTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sIHByZWZlcmVuY2VzfQorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGlzIFhNTCByZXNvdXJjZSBjb250YWlucyBhIHByZWZlcmVuY2Ugc2NyZWVuIGhvbGRpbmcgYW5vdGhlcgorICogZnJhZ21lbnQsIHRoZSBQcmVmczFGcmFnbWVudElubmVyIGltcGxlbWVudGVkIGhlcmUuICBUaGlzIGFsbG93cyB0aGUgdXNlcgorICogdG8gdHJhdmVyc2UgZG93biBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlczsgcHJlc3NpbmcgYmFjayB3aWxsIHBvcCBlYWNoCisgKiBmcmFnbWVudCBvZmYgdGhlIHN0YWNrIHRvIHJldHVybiB0byB0aGUgcHJldmlvdXMgcHJlZmVyZW5jZXMuCisgKgorICogPHA+U2VlIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IGZvciBpbmZvcm1hdGlvbiBvbiBpbXBsZW1lbnRpbmcgdGhlCisgKiBmcmFnbWVudHMgdGhlbXNlbHZlcy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSBpbXBsZW1lbnRzCi0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyIHsKLSAgICAKKyAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIsCisgICAgICAgIFByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlZmVyZW5jZUFjdGl2aXR5IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7Ci0gICAgCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0hPV19GUkFHTUVOVCA9ICI6YW5kcm9pZDpzaG93X2ZyYWdtZW50IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19OT19IRUFERVJTID0gIjphbmRyb2lkOm5vX2hlYWRlcnMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tfU1RBQ0tfUFJFRlMgPSAiOmFuZHJvaWQ6cHJlZnMiOworCisgICAgLy8gZXh0cmFzIHRoYXQgYWxsb3cgYW55IHByZWZlcmVuY2UgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgYXMgcGFydCBvZiBhIHdpemFyZAorCisgICAgLy8gc2hvdyBCYWNrIGFuZCBOZXh0IGJ1dHRvbnM/IHRha2VzIGJvb2xlYW4gcGFyYW1ldGVyCisgICAgLy8gQmFjayB3aWxsIHRoZW4gcmV0dXJuIFJFU1VMVF9DQU5DRUxFRCBhbmQgTmV4dCBSRVNVTFRfT0sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSID0gImV4dHJhX3ByZWZzX3Nob3dfYnV0dG9uX2JhciI7CisKKyAgICAvLyBzcGVjaWZ5IGN1c3RvbSB0ZXh0IGZvciB0aGUgQmFjayBvciBOZXh0IGJ1dHRvbnMsIG9yIGNhdXNlIGEgYnV0dG9uIHRvIG5vdCBhcHBlYXIKKyAgICAvLyBhdCBhbGwgYnkgc2V0dGluZyBpdCB0byBudWxsCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X25leHRfdGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X2JhY2tfdGV4dCI7CisKKyAgICAvLyAtLS0gU3RhdGUgZm9yIG5ldyBtb2RlIHdoZW4gc2hvd2luZyBhIGxpc3Qgb2YgaGVhZGVycyArIHByZWZzIGZyYWdtZW50CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxIZWFkZXI+IG1IZWFkZXJzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KCk7CisKKyAgICBwcml2YXRlIEhlYWRlckFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbVByZWZzQ29udGFpbmVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaW5nbGVQYW5lOworCisgICAgLy8gLS0tIFN0YXRlIGZvciBvbGQgbW9kZSB3aGVuIHNob3dpbmcgYSBzaW5nbGUgcHJlZmVyZW5jZSBsaXN0CisKICAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKLSAgICAKKwogICAgIHByaXZhdGUgQnVuZGxlIG1TYXZlZEluc3RhbmNlU3RhdGU7CiAKKyAgICAvLyAtLS0gQ29tbW9uIHN0YXRlCisKKyAgICBwcml2YXRlIEJ1dHRvbiBtTmV4dEJ1dHRvbjsKKwogICAgIC8qKgogICAgICAqIFRoZSBzdGFydGluZyByZXF1ZXN0IGNvZGUgZ2l2ZW4gb3V0IHRvIHByZWZlcmVuY2UgZnJhbWV3b3JrLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9SRVFVRVNUX0NPREUgPSAxMDA7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAwOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKICAgICAgICAgICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAwLDUxICsxNjgsMzMyIEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBjbGFzcyBIZWFkZXJWaWV3SG9sZGVyIHsKKyAgICAgICAgSW1hZ2VWaWV3IGljb247CisgICAgICAgIFRleHRWaWV3IHRpdGxlOworICAgICAgICBUZXh0VmlldyBzdW1tYXJ5OworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSGVhZGVyQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxIZWFkZXI+IHsKKyAgICAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXI7CisKKyAgICAgICAgcHVibGljIEhlYWRlckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PEhlYWRlcj4gb2JqZWN0cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgb2JqZWN0cyk7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBIZWFkZXJWaWV3SG9sZGVyIGhvbGRlcjsKKyAgICAgICAgICAgIFZpZXcgdmlldzsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbUluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSBuZXcgSGVhZGVyVmlld0hvbGRlcigpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldyl2aWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaWNvbik7CisgICAgICAgICAgICAgICAgaG9sZGVyLnRpdGxlID0gKFRleHRWaWV3KXZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50aXRsZSk7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnN1bW1hcnkpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0VGFnKGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpZXcgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSAoSGVhZGVyVmlld0hvbGRlcil2aWV3LmdldFRhZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoaGVhZGVyLmljb24gIT0gbnVsbCkgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShoZWFkZXIuaWNvbik7CisgICAgICAgICAgICBlbHNlIGlmIChoZWFkZXIuaWNvblJlcyAhPSAwKSBob2xkZXIuaWNvbi5zZXRJbWFnZVJlc291cmNlKGhlYWRlci5pY29uUmVzKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXIudGl0bGUgIT0gbnVsbCkgaG9sZGVyLnRpdGxlLnNldFRleHQoaGVhZGVyLnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXIuc3VtbWFyeSAhPSBudWxsKSBob2xkZXIuc3VtbWFyeS5zZXRUZXh0KGhlYWRlci5zdW1tYXJ5KTsKKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBIZWFkZXIgaXRlbSB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGl0bGUgb2YgdGhlIGhlYWRlciB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX3RpdGxlCisgICAgICAgICAqLworICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIHN1bW1hcnkgZGVzY3JpYmluZyB3aGF0IHRoaXMgaGVhZGVyIGNvbnRyb2xzLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX3N1bW1hcnkKKyAgICAgICAgICovCisgICAgICAgIENoYXJTZXF1ZW5jZSBzdW1tYXJ5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBpY29uIHJlc291cmNlIHRvIHNob3cgZm9yIHRoaXMgaGVhZGVyLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2ljb24KKyAgICAgICAgICovCisgICAgICAgIGludCBpY29uUmVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBpY29uIGRyYXdhYmxlIHRvIHNob3cgZm9yIHRoaXMgaGVhZGVyLiAgKElmIHRoaXMgaXMgbm9uLW51bGwsCisgICAgICAgICAqIHRoZSBpY29uUmVzIHdpbGwgYmUgaWdub3JlZC4pCisgICAgICAgICAqLworICAgICAgICBEcmF3YWJsZSBpY29uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGdWxsIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkgd2hlbiB0aGlzIGhlYWRlciBpcworICAgICAgICAgKiBzZWxlY3RlZC4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudAorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGZyYWdtZW50OworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAogICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBvbkNyZWF0ZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgbVByZWZzQ29udGFpbmVyID0gZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJlZnMpOworICAgICAgICBib29sZWFuIGhpZGluZ0hlYWRlcnMgPSBvbklzSGlkaW5nSGVhZGVycygpOworICAgICAgICBtU2luZ2xlUGFuZSA9IGhpZGluZ0hlYWRlcnMgfHwgIW9uSXNNdWx0aVBhbmUoKTsKKyAgICAgICAgU3RyaW5nIGluaXRpYWxGcmFnbWVudCA9IGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NIT1dfRlJBR01FTlQpOworCisgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgIT0gbnVsbCAmJiBtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGp1c3Qgc2hvd2luZyBhIGZyYWdtZW50LCB3ZSB3YW50IHRvIHJ1biBpbgorICAgICAgICAgICAgLy8gbmV3IGZyYWdtZW50IG1vZGUsIGJ1dCBkb24ndCBuZWVkIHRvIGNvbXB1dGUgYW5kIHNob3cKKyAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaW5pdGlhbEZyYWdtZW50KTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cnkgdG8gYnVpbGQgdGhlIGhlYWRlcnMuCisgICAgICAgICAgICBvbkJ1aWxkSGVhZGVycyhtSGVhZGVycyk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBoZWFkZXJzLCB0aGVuIGF0IHRoaXMgcG9pbnQgd2UgbmVlZCB0byBzaG93CisgICAgICAgICAgICAvLyB0aGVtIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4sIHdlIG1heSBhbHNvIHNob3cgaW4tbGluZQorICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAgICAgICAgaWYgKG1IZWFkZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQWRhcHRlciA9IG5ldyBIZWFkZXJBZGFwdGVyKHRoaXMsIG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgICAgICAgICAgaWYgKCFtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5pdGlhbEZyYWdtZW50IDogb25HZXRJbml0aWFsRnJhZ21lbnQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaGVhZGVycywgd2UgYXJlIGluIHRoZSBvbGQgImp1c3Qgc2hvdyBhIHNjcmVlbgorICAgICAgICAgICAgLy8gb2YgcHJlZmVyZW5jZXMiIG1vZGUuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICAvLyBzZWUgaWYgd2Ugc2hvdWxkIHNob3cgQmFjay9OZXh0IGJ1dHRvbnMKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19TSE9XX0JVVFRPTl9CQVIsIGZhbHNlKSkgeworCisgICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5idXR0b25fYmFyKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgIEJ1dHRvbiBiYWNrQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5iYWNrX2J1dHRvbik7CisgICAgICAgICAgICBiYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5uZXh0X2J1dHRvbik7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIHNldCBvdXIgdmFyaW91cyBidXR0b24gcGFyYW1ldGVycworICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYnV0dG9uVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgYWN0aXZpdHkgc2hvdWxkIHJ1biBpbiBtdWx0aS1wYW5lIG1vZGUuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBzY3JlZW4gaXMgbGFyZ2UKKyAgICAgKiBlbm91Z2guCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc011bHRpUGFuZSgpIHsKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmICgoY29uZmlnLnNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spCisgICAgICAgICAgICAgICAgPT0gQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UKKyAgICAgICAgICAgICAgICAmJiBjb25maWcub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGhlYWRlciBsaXN0IHNob3VsZCBiZSBoaWRkZW4uICBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhpZGVzIHRoZSBsaXN0IGlmIHRoZSBhY3Rpdml0eSBpcyBiZWluZyByZS1sYXVuY2hlZAorICAgICAqIHdoZW4gbm90IGluIG11bHRpLXBhbmUgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbklzSGlkaW5nSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19OT19IRUFERVJTLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBmcmFnbWVudCB0byBiZSBzaG93bi4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIGZyYWdtZW50IG9mIHRoZSBmaXJzdCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBvbkdldEluaXRpYWxGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXJzLmdldCgwKS5mcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgbmVlZHMgaXRzIGxpc3Qgb2YgaGVhZGVycyBidWlsZC4gIEJ5CisgICAgICogaW1wbGVtZW50aW5nIHRoaXMgYW5kIGFkZGluZyBhdCBsZWFzdCBvbmUgaXRlbSB0byB0aGUgbGlzdCwgeW91CisgICAgICogd2lsbCBjYXVzZSB0aGUgYWN0aXZpdHkgdG8gcnVuIGluIGl0cyBtb2Rlcm4gZnJhZ21lbnQgbW9kZS4gIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBhbHdheXMgYmUgY2FsbGVkOyBmb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogYWN0aXZpdHkgaGFzIGJlZW4gYXNrZWQgdG8gZGlzcGxheSBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgd2l0aG91dAorICAgICAqIHRoZSBoZWFkZXIgbGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWwgaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIHtAbGluayAjbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2V9CisgICAgICogdG8gZmlsbCBpbiB0aGUgbGlzdCBmcm9tIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsaXN0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUgYXMgYSBoZWFkZXIgZGVzY3JpcHRpb24sIGFkZGluZyBlYWNoCisgICAgICogcGFyc2VkIEhlYWRlciBpbnRvIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNpZCBUaGUgWE1MIHJlc291cmNlIHRvIGxvYWQgYW5kIHBhcnNlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdGhlIHBhcnNlZCBoZWFkZXJzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoaW50IHJlc2lkLCBMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwocmVzaWQpOworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7CisKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghIlByZWZlcmVuY2VIZWFkZXJzIi5lcXVhbHMobm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWE1MIGRvY3VtZW50IG11c3Qgc3RhcnQgd2l0aCA8UHJlZmVyZW5jZUhlYWRlcnM+IHRhZzsgZm91bmQiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGVOYW1lICsgIiBhdCAiICsgcGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBvdXRlckRlcHRoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJIZWFkZXIiLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IHNhID0gZ2V0UmVzb3VyY2VzKCkub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnN1bW1hcnkgPSBzYS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pY29uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ljb24sIDApOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnQgPSBzYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkKGhlYWRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGhlYWRlcnMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5U3RvcCgpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CiAgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlEZXN0cm95KCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOwogCi0gICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7Ci0gICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHLCBjb250YWluZXIpOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHN0YXRlKSB7Ci0gICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7Ci0gICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBtU2F2ZWRJbnN0YW5jZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTYsMTQgKzUwNSw5MyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkgewogICAgICAgICBzdXBlci5vbkNvbnRlbnRDaGFuZ2VkKCk7Ci0gICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBzdXBlci5vbkxpc3RJdGVtQ2xpY2sobCwgdiwgcG9zaXRpb24sIGlkKTsKKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgb25IZWFkZXJDbGljayhtSGVhZGVycy5nZXQocG9zaXRpb24pLCBwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gaW4gdGhlIGhlYWRlciBsaXN0LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGNhbGwgZWl0aGVyIHtAbGluayAjc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nKX0KKyAgICAgKiBvciB7QGxpbmsgI3N3aXRjaFRvSGVhZGVyKFN0cmluZyl9IGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaGVhZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IZWFkZXJDbGljayhIZWFkZXIgaGVhZGVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICBzdGFydFdpdGhGcmFnbWVudChoZWFkZXIuZnJhZ21lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaGVhZGVyLmZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgYWN0aXZpdHksIHNob3dpbmcgb25seSB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LiAgV2hlbiBsYXVuY2hlZCBpbiB0aGlzIG1vZGUsIHRoZSBoZWFkZXIgbGlzdAorICAgICAqIHdpbGwgYmUgaGlkZGVuIGFuZCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBmcmFnbWVudCB3aWxsIGJlIGluc3RhbnRpYXRlZAorICAgICAqIGFuZCBmaWxsIHRoZSBlbnRpcmUgYWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBkaXNwbGF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2l0aEZyYWdtZW50KFN0cmluZyBmcmFnbWVudE5hbWUpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfUFJFRlNfU0hPV19GUkFHTUVOVCwgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1BSRUZTX05PX0hFQURFUlMsIHRydWUpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBpbiB0d28tcGFuZSBtb2RlLCBzd2l0Y2ggdGhlIGZyYWdtZW50IHBhbmUgdG8gc2hvdyB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihTdHJpbmcgZnJhZ21lbnROYW1lKSB7CisgICAgICAgIHBvcEJhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTLCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworCisgICAgICAgIEZyYWdtZW50IGY7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWx1cmUgaW5zdGFudGlhdGluZyBmcmFnbWVudCAiICsgZnJhZ21lbnROYW1lLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpLnJlcGxhY2UoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmcywgZikuY29tbWl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudChQcmVmZXJlbmNlRnJhZ21lbnQgY2FsbGVyLCBQcmVmZXJlbmNlIHByZWYpIHsKKyAgICAgICAgRnJhZ21lbnQgZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBwcmVmLmdldEZyYWdtZW50KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbHVyZSBpbnN0YW50aWF0aW5nIGZyYWdtZW50ICIgKyBwcmVmLmdldEZyYWdtZW50KCksIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCkucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmKQorICAgICAgICAgICAgICAgIC5hZGRUb0JhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTKS5jb21taXQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzYsNyArNjA0LDcgQEAKICAgICAgICAgaWYgKG1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CSU5EX1BSRUZFUkVOQ0VTKSkgcmV0dXJuOwogICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19CSU5EX1BSRUZFUkVOQ0VTKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgYmluZFByZWZlcmVuY2VzKCkgewogICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CiAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKQEAgLTE4NywzOCArNjE1LDQxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyIHByZWZlcmVuY2VNYW5hZ2VyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKHRoaXMsIEZJUlNUX1JFUVVFU1RfQ09ERSk7Ci0gICAgICAgIHByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICByZXR1cm4gcHJlZmVyZW5jZU1hbmFnZXI7Ci0gICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMgYWN0aXZpdHkuCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpIHsKICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlcjsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCkgewogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc3VwZXIub25DcmVhdGUuIik7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc3VwZXIub25DcmVhdGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1vZGVybiB0d28tcGFuZSBQcmVmZXJlbmNlQWN0aXZpdHkgcmVxdWlyZXMgdXNlIG9mIGEgUHJlZmVyZW5jZUZyYWdtZW50Iik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlU2NyZWVuIFRoZSByb290IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbikgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKwogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyLnNldFByZWZlcmVuY2VzKHByZWZlcmVuY2VTY3JlZW4pICYmIHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOwogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmdldFRpdGxlKCk7CkBAIC0yMjgsNjEgKzY1OSw4NCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQogICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VTY3JlZW4gZ2V0UHJlZmVyZW5jZVNjcmVlbigpIHsKLSAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWRkcyBwcmVmZXJlbmNlcyBmcm9tIGFjdGl2aXRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIEludGVudH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSBhY3Rpdml0aWVzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tSW50ZW50KGludGVudCwgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5mbGF0ZXMgdGhlIGdpdmVuIFhNTCByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlc1Jlc0lkIFRoZSBYTUwgcmVzb3VyY2UgSUQgdG8gaW5mbGF0ZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbVJlc291cmNlKHRoaXMsIHByZWZlcmVuY2VzUmVzSWQsCiAgICAgICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGaW5kcyBhIHtAbGluayBQcmVmZXJlbmNlfSBiYXNlZCBvbiBpdHMga2V5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlfSB3aXRoIHRoZSBrZXksIG9yIG51bGwuCiAgICAgICogQHNlZSBQcmVmZXJlbmNlR3JvdXAjZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlKQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgewotICAgICAgICAKKwogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKICAgICB9CiAKQEAgLTI5Miw1ICs3NDYsMTQgQEAKICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaE5ld0ludGVudChpbnRlbnQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLy8gZ2l2ZSBzdWJjbGFzc2VzIGFjY2VzcyB0byB0aGUgTmV4dCBidXR0b24KKyAgICAvKiogQGhpZGUgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b24gIT0gbnVsbDsKKyAgICB9CisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIEJ1dHRvbiBnZXROZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b247CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzOTVlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKKy8qKgorICogU2hvd3MgYSBoaWVyYXJjaHkgb2Yge0BsaW5rIFByZWZlcmVuY2V9IG9iamVjdHMgYXMKKyAqIGxpc3RzLiBUaGVzZSBwcmVmZXJlbmNlcyB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IHNhdmUgdG8ge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSBhcyB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aAorICogdGhlbS4gVG8gcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSB0aGF0IHRoZQorICogcHJlZmVyZW5jZSBoaWVyYXJjaHkgaW4gdGhpcyBmcmFnbWVudCB3aWxsIHVzZSwgY2FsbAorICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI2dldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCl9CisgKiB3aXRoIGEgY29udGV4dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIEZ1cnRoZXJtb3JlLCB0aGUgcHJlZmVyZW5jZXMgc2hvd24gd2lsbCBmb2xsb3cgdGhlIHZpc3VhbCBzdHlsZSBvZiBzeXN0ZW0KKyAqIHByZWZlcmVuY2VzLiBJdCBpcyBlYXN5IHRvIGNyZWF0ZSBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcyAodGhhdCBjYW4gYmUKKyAqIHNob3duIG9uIG11bHRpcGxlIHNjcmVlbnMpIHZpYSBYTUwuIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyByZWNvbW1lbmRlZCB0bworICogdXNlIHRoaXMgZnJhZ21lbnQgKGFzIGEgc3VwZXJjbGFzcykgdG8gZGVhbCB3aXRoIHByZWZlcmVuY2VzIGluIGFwcGxpY2F0aW9ucy4KKyAqIDxwPgorICogQSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2JqZWN0IHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkuIEZ1cnRoZXJtb3JlLCBzdWJzZXF1ZW50IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5CisgKiBkZW5vdGUgYSBzY3JlZW4gYnJlYWstLXRoYXQgaXMgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCB3aXRoaW4gc3Vic2VxdWVudAorICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHNob3VsZCBiZSBzaG93biBvbiBhbm90aGVyIHNjcmVlbi4gVGhlIHByZWZlcmVuY2UKKyAqIGZyYW1ld29yayBoYW5kbGVzIHNob3dpbmcgdGhlc2Ugb3RoZXIgc2NyZWVucyBmcm9tIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAqIDxwPgorICogVGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGNhbiBiZSBmb3JtZWQgaW4gbXVsdGlwbGUgd2F5czoKKyAqIDxsaT4gRnJvbSBhbiBYTUwgZmlsZSBzcGVjaWZ5aW5nIHRoZSBoaWVyYXJjaHkKKyAqIDxsaT4gRnJvbSBkaWZmZXJlbnQge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaCBzcGVjaWZ5IGl0cyBvd24KKyAqIHByZWZlcmVuY2VzIGluIGFuIFhNTCBmaWxlIHZpYSB7QGxpbmsgQWN0aXZpdHl9IG1ldGEtZGF0YQorICogPGxpPiBGcm9tIGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59CisgKiA8cD4KKyAqIFRvIGluZmxhdGUgZnJvbSBYTUwsIHVzZSB0aGUge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQpfS4gVGhlCisgKiByb290IGVsZW1lbnQgc2hvdWxkIGJlIGEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LiBTdWJzZXF1ZW50IGVsZW1lbnRzIGNhbiBwb2ludAorICogdG8gYWN0dWFsIHtAbGluayBQcmVmZXJlbmNlfSBzdWJjbGFzc2VzLiBBcyBtZW50aW9uZWQgYWJvdmUsIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5IHdpbGwgcmVzdWx0IGluIHRoZSBzY3JlZW4gYnJlYWsuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4ge0BsaW5rIEludGVudH0gdG8gcXVlcnkge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaAorICogaGF2ZSBwcmVmZXJlbmNlcywgdXNlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50fS4gRWFjaAorICoge0BsaW5rIEFjdGl2aXR5fSBjYW4gc3BlY2lmeSBtZXRhLWRhdGEgaW4gdGhlIG1hbmlmZXN0ICh2aWEgdGhlIGtleQorICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI01FVEFEQVRBX0tFWV9QUkVGRVJFTkNFU30pIHRoYXQgcG9pbnRzIHRvIGFuIFhNTAorICogcmVzb3VyY2UuIFRoZXNlIFhNTCByZXNvdXJjZXMgd2lsbCBiZSBpbmZsYXRlZCBpbnRvIGEgc2luZ2xlIHByZWZlcmVuY2UKKyAqIGhpZXJhcmNoeSBhbmQgc2hvd24gYnkgdGhpcyBmcmFnbWVudC4KKyAqIDxwPgorICogVG8gc3BlY2lmeSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSwgdXNlCisgKiB7QGxpbmsgI3NldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbil9LgorICogPHA+CisgKiBBcyBhIGNvbnZlbmllbmNlLCB0aGlzIGZyYWdtZW50IGltcGxlbWVudHMgYSBjbGljayBsaXN0ZW5lciBmb3IgYW55CisgKiBwcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGhpZXJhcmNoeSwgc2VlCisgKiB7QGxpbmsgI29uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlKX0uCisgKgorICogPGEgbmFtZT0iU2FtcGxlQ29kZSI+PC9hPgorICogPGgzPlNhbXBsZSBDb2RlPC9oMz4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHNob3dzIGEgc2ltcGxlIHByZWZlcmVuY2UgZnJhZ21lbnQgdGhhdCBpcworICogcG9wdWxhdGVkIGZyb20gYSByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSBpdCBsb2FkcyBpczo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbCBwcmVmZXJlbmNlc30KKyAqCisgKiA8cD5UaGUgZnJhZ21lbnQgaW1wbGVtZW50YXRpb24gaXRzZWxmIHNpbXBseSBwb3B1bGF0ZXMgdGhlIHByZWZlcmVuY2VzCisgKiB3aGVuIGNyZWF0ZWQuICBOb3RlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGZyYW1ld29yayB0YWtlcyBjYXJlIG9mIGxvYWRpbmcKKyAqIHRoZSBjdXJyZW50IHZhbHVlcyBvdXQgb2YgdGhlIGFwcCBwcmVmZXJlbmNlcyBhbmQgd3JpdGluZyB0aGVtIHdoZW4gY2hhbmdlZDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRnJhZ21lbnRQcmVmZXJlbmNlcy5qYXZhCisgKiAgICAgIGZyYWdtZW50fQorICoKKyAqIEBzZWUgUHJlZmVyZW5jZQorICogQHNlZSBQcmVmZXJlbmNlU2NyZWVuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCBpbXBsZW1lbnRzCisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7CisKKyAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKKyAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZVByZWZzOworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdERvbmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CSU5EX1BSRUZFUkVOQ0VTID0gMDsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JJTkRfUFJFRkVSRU5DRVM6CisgICAgICAgICAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0aGF0IFByZWZlcmVuY2VGcmFnbWVudCdzIGNvbnRhaW5pbmcgYWN0aXZpdHkgc2hvdWxkCisgICAgICogaW1wbGVtZW50IHRvIGJlIGFibGUgdG8gcHJvY2VzcyBwcmVmZXJlbmNlIGl0ZW1zIHRoYXQgd2lzaCB0bworICAgICAqIHN3aXRjaCB0byBhIG5ldyBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgY2xpY2tlZCBvbiBhIFByZWZlcmVuY2UgdGhhdCBoYXMKKyAgICAgICAgICogYSBmcmFnbWVudCBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4gIFRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiB0byBzaG91bGQgaW5zdGFudGlhdGUgYW5kIHN3aXRjaCB0byBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4KKyAgICAgICAgICogZnJhZ21lbnQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQoUHJlZmVyZW5jZUZyYWdtZW50IGNhbGxlciwgUHJlZmVyZW5jZSBwcmVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcihnZXRBY3Rpdml0eSgpLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICBpZiAobUhhdmVQcmVmcykgeworICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKworICAgICAgICBtSW5pdERvbmUgPSB0cnVlOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGZyYWdtZW50LgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbikgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyLnNldFByZWZlcmVuY2VzKHByZWZlcmVuY2VTY3JlZW4pICYmIHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbUhhdmVQcmVmcyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluaXREb25lKSB7CisgICAgICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGZyYWdtZW50IGlzIHNob3dpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQorICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CisgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZShnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzUmVzSWQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLAorICAgICAgICAgICAgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CisgICAgICAgIGlmIChwcmVmZXJlbmNlLmdldEZyYWdtZW50KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkgaW5zdGFuY2VvZiBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAoKE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjaylnZXRBY3Rpdml0eSgpKS5vblByZWZlcmVuY2VTdGFydEZyYWdtZW50KAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwcmVmZXJlbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgorICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0QmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5iaW5kKGdldExpc3RWaWV3KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxpc3QoKSB7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlldyByb290ID0gZ2V0VmlldygpOworICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250ZW50IHZpZXcgbm90IHlldCBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgaWYgKCEocmF3TGlzdFZpZXcgaW5zdGFuY2VvZiBMaXN0VmlldykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgYSBMaXN0VmlldyBjbGFzcyIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVJlcXVlc3RGb2N1cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQppbmRleCA5NWU1NDMyNC4uZjM0ZjRhMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ2xpY2soKSB7Ci0gICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsIHx8IGdldFByZWZlcmVuY2VDb3VudCgpID09IDApIHsKKyAgICAgICAgaWYgKGdldEludGVudCgpICE9IG51bGwgfHwgZ2V0RnJhZ21lbnQoKSAhPSBudWxsIHx8IGdldFByZWZlcmVuY2VDb3VudCgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQppbmRleCAyZmJhMWQ3OS4uOTkxY2U5ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQpAQCAtMjIsMTcgKzIyLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZTsKIAotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCiBwdWJsaWMgY2xhc3MgQnJvd3NlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJicm93c2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBCT09LTUFSS1NfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9ib29rbWFya3MiKTsKKworICAgIC8qKgorICAgICAqIEEgdGFibGUgY29udGFpbmluZyBib3RoIGJvb2ttYXJrcyBhbmQgaGlzdG9yeSBpdGVtcy4gVGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGluCisgICAgICoge0BsaW5rIEJvb2ttYXJrQ29sdW1uc30uIFJlYWRpbmcgdGhpcyB0YWJsZSByZXF1aXJlcyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24gYW5kIHdyaXRpbmcgdG8gaXQKKyAgICAgKiByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBCT09LTUFSS1NfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9ib29rbWFya3MiKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIGV4dHJhIGRhdGEgd2hlbiBzdGFydGluZyBCcm93c2VyIHdpdGggQUNUSU9OX1ZJRVcgb3IKQEAgLTQ5LDEyICs1MywxMSBAQAogICAgICAqIGFwcGxpY2F0aW9uLgogICAgICAqIDxwPgogICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8KLSAgICAgKiBpbmRlbnRpZnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIFRoZSBCcm93c2VyIHdpbGwgYXR0ZW1wdCB0byByZXVzZSB0aGUKKyAgICAgKiBpZGVudGlmeSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gVGhlIEJyb3dzZXIgd2lsbCBhdHRlbXB0IHRvIHJldXNlIHRoZQogICAgICAqIHNhbWUgd2luZG93IGVhY2ggdGltZSB0aGUgYXBwbGljYXRpb24gbGF1bmNoZXMgdGhlIEJyb3dzZXIgd2l0aCB0aGUgc2FtZQogICAgICAqIGlkZW50aWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVBQTElDQVRJT05fSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuYnJvd3Nlci5hcHBsaWNhdGlvbl9pZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVBQTElDQVRJT05fSUQgPSAiY29tLmFuZHJvaWQuYnJvd3Nlci5hcHBsaWNhdGlvbl9pZCI7CiAKICAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0cmEgZGF0YSBpbiB0aGUgVklFVyBpbnRlbnQuIFRoZSBkYXRhIGFyZSBrZXkvdmFsdWUKQEAgLTY4LDEwICs3MSwxNyBAQAogICAgIC8qIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMKICAgICAgICBiZWxvdyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSElTVE9SWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgQm9va21hcmtDb2x1bW5zLlVSTCwgQm9va21hcmtDb2x1bW5zLlZJU0lUUywKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgQm9va21hcmtDb2x1bW5zLlRJVExFLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuRkFWSUNPTiwgQm9va21hcmtDb2x1bW5zLlRIVU1CTkFJTCwKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLlRPVUNIX0lDT04sIEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQgfTsKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5VUkwsIC8vIDEKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIC8vIDIKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCAvLyAzCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIC8vIDQKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5USVRMRSwgLy8gNQorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkZBVklDT04sIC8vIDYKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5USFVNQk5BSUwsIC8vIDcKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5UT1VDSF9JQ09OLCAvLyA4CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCAvLyA5CisgICAgfTsKIAogICAgIC8qIHRoZXNlIGluZGljZXMgZGVwZW5kZW50IG9uIEhJU1RPUllfUFJPSkVDVElPTiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCA9IDA7CkBAIC05MiwxOSArMTAyLDMzIEBACiAKICAgICAvKiBjb2x1bW5zIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byB0cnVuY2F0ZSBoaXN0b3J5ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCBCb29rbWFya0NvbHVtbnMuREFURSwgfTsKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwKKyAgICB9OworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYID0gMDsKIAogICAgIC8qIHRydW5jYXRlIHRoaXMgbWFueSBoaXN0b3J5IGl0ZW1zIGF0IGEgdGltZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVU5DQVRFX05fT0xERVNUID0gNTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFNFQVJDSEVTX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvc2VhcmNoZXMiKTsKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIGNvbnRhaW5pbmcgYSBsb2cgb2YgYnJvd3NlciBzZWFyY2hlcy4gVGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGluCisgICAgICoge0BsaW5rIFNlYXJjaENvbHVtbnN9LiBSZWFkaW5nIHRoaXMgdGFibGUgcmVxdWlyZXMgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uIGFuZCB3cml0aW5nIHRvIGl0CisgICAgICogcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU0VBUkNIRVNfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9zZWFyY2hlcyIpOwogCi0gICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwotICAgICAgIGJlbG93ICovCisgICAgLyoqCisgICAgICogQSBwcm9qZWN0aW9uIG9mIHtAbGluayAjU0VBUkNIRVNfVVJJfSB0aGF0IGNvbnRhaW5zIHtAbGluayBTZWFyY2hDb2x1bW5zI19JRH0sCisgICAgICoge0BsaW5rIFNlYXJjaENvbHVtbnMjU0VBUkNIfSwgYW5kIHtAbGluayBTZWFyY2hDb2x1bW5zI0RBVEV9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0VBUkNIRVNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIFNlYXJjaENvbHVtbnMuX0lELCBTZWFyY2hDb2x1bW5zLlNFQVJDSCwgU2VhcmNoQ29sdW1ucy5EQVRFIH07CisgICAgICAgICAgICAvLyBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzIGJlbG93CisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5TRUFSQ0gsIC8vIDEKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuREFURSwgLy8gMgorICAgIH07CiAKICAgICAvKiB0aGVzZSBpbmRpY2VzIGRlcGVuZGVudCBvbiBTRUFSQ0hFU19QUk9KRUNUSU9OICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIRVNfUFJPSkVDVElPTl9TRUFSQ0hfSU5ERVggPSAxOwpAQCAtMTIxLDkgKzE0NSwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSElTVE9SWV9DT1VOVCA9IDI1MDsKIAogICAgIC8qKgotICAgICAqICBPcGVuIHRoZSBBZGRCb29rbWFyayBhY3Rpdml0eSB0byBzYXZlIGEgYm9va21hcmsuICBMYXVuY2ggd2l0aAotICAgICAqICBhbmQvb3IgdXJsLCB3aGljaCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBzYXZpbmcuCi0gICAgICogIEBwYXJhbSBjICAgICAgICBDb250ZXh0IHVzZWQgdG8gbGF1bmNoIHRoZSBBZGRCb29rbWFyayBhY3Rpdml0eS4KKyAgICAgKiAgT3BlbiBhbiBhY3Rpdml0eSB0byBzYXZlIGEgYm9va21hcmsuIExhdW5jaCB3aXRoIGEgdGl0bGUKKyAgICAgKiAgYW5kL29yIGEgdXJsLCBib3RoIG9mIHdoaWNoIGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHNhdmluZy4KKyAgICAgKgorICAgICAqICBAcGFyYW0gYyAgICAgICAgQ29udGV4dCB1c2VkIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgdG8gYWRkIGEgYm9va21hcmsuCiAgICAgICogIEBwYXJhbSB0aXRsZSAgICBUaXRsZSBmb3IgdGhlIGJvb2ttYXJrLiBDYW4gYmUgbnVsbCBvciBlbXB0eSBzdHJpbmcuCiAgICAgICogIEBwYXJhbSB1cmwgICAgICBVcmwgZm9yIHRoZSBib29rbWFyay4gQ2FuIGJlIG51bGwgb3IgZW1wdHkgc3RyaW5nLgogICAgICAqLwpAQCAtMTUyLDggKzE3NywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVFJBX1NIQVJFX0ZBVklDT04gPSAic2hhcmVfZmF2aWNvbiI7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2VuZFN0cmluZyhDb250ZXh0IGMsIFN0cmluZyBzKSB7Ci0gICAgICAgIHNlbmRTdHJpbmcoYywgcywgYy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VuZFRleHQpKTsKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIGFuIEludGVudCB3aXRoIHtAbGluayBJbnRlbnQjQUNUSU9OX1NFTkR9IGFuZCBhIG1pbWUgdHlwZQorICAgICAqIG9mIHRleHQvcGxhaW4uIFRoZSBzdHJpbmcgaXMgcHV0IGludG8ge0BsaW5rIEludGVudCNFWFRSQV9URVhUfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHVzZWQgdG8gc3RhcnQgdGhlIGFjdGl2aXR5CisgICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIHNlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2VuZFN0cmluZyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgc2VuZFN0cmluZyhjb250ZXh0LCBzdHJpbmcsIGNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbmRUZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODEsMjAgKzIxMywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLgorICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLiBUaGUgY3Vyc29yIHdpbGwgaGF2ZSBhIHNpbmdsZQorICAgICAqICBjb2x1bW4sIHtAbGluayBCb29rbWFya0NvbHVtbnMjVVJMfS4KKyAgICAgKiAgPHA+CiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRBbGxCb29rbWFya3MoQ29udGVudFJlc29sdmVyIGNyKSB0aHJvd3MgCiAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya0NvbHVtbnMuVVJMIH0sIAotICAgICAgICAgICAgICAgICJib29rbWFyayA9IDEiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuQk9PS01BUksgKyAiID0gMSIsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB2aXNpdGVkIHNpdGUgdXJscy4KKyAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdmlzaXRlZCBzaXRlIHVybHMuIFRoZSBjdXJzb3Igd2lsbAorICAgICAqICBoYXZlIGEgc2luZ2xlIGNvbHVtbiwge0BsaW5rIEJvb2ttYXJrQ29sdW1ucyNVUkx9LgorICAgICAqICA8cD4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldEFsbFZpc2l0ZWRVcmxzKENvbnRlbnRSZXNvbHZlciBjcikgdGhyb3dzCkBAIC0yNjYsNyArMzA0LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdXBkYXRlVmlzaXRlZEhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsLCBib29sZWFuIHJlYWwpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYyA9IGdldFZpc2l0ZWRMaWtlKGNyLCB1cmwpOwpAQCAtNTM0LDcgKzU3Miw3IEBACiAgICAgICogQHBhcmFtIHNlYXJjaCAgICBUaGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgc2VhcmNoZXMgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFkZFNlYXJjaFVybChDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyBzZWFyY2gpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KApAQCAtNTU4LDYgKzU5Niw3IEBACiAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYWxsIHNlYXJjaGVzIGZyb20gdGhlIHNlYXJjaCBkYXRhYmFzZS4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KQEAgLTU5MCwzMSArNjI5LDkwIEBACiAgICAgICAgICAgICAgICAgLmJ1bGtSZXF1ZXN0SWNvbkZvclBhZ2VVcmwoY3IsIHdoZXJlLCBsaXN0ZW5lcik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgbWl4ZWQgYm9va21hcmsgYW5kIGhpc3RvcnkgaXRlbXMgYXZhaWxhYmxlCisgICAgICogYXQge0BsaW5rICNCT09LTUFSS1NfVVJJfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2ttYXJrQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVCAoVVJMKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWUgdGhlIGl0ZW0gaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIGl0ZW0gaXMgYSBib29rbWFyay4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyBhIGJvb2ttYXJrLCBhIHZhbHVlCisgICAgICAgICAqIG9mIDAgaW5kaWNhdGVzIGEgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLID0gImJvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsgb3IgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBURVhUPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEID0gImNyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmF2aWNvbiBvZiB0aGUgYm9va21hcmsuIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMID0gInRodW1ibmFpbCI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSF9JQ09OID0gInRvdWNoX2ljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgc2VhcmNoIGhpc3RvcnkgdGFibGUsIGF2YWlsYWJsZSBhdCB7QGxpbmsgI1NFQVJDSEVTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWFyY2hDb2x1bW5zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogTm90IHVzZWQuCisgICAgICAgICAqIEBkZXByZWNhdGVkCisgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKaW5kZXggOWEwOTgwNS4uYTYzOTRlNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCkBAIC03NiwxMSArNzYsMTA2IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEVSX0lTX1NZTkNBREFQVEVSID0gImNhbGxlcl9pc19zeW5jYWRhcHRlciI7CiAKKworICAgIC8qKgorICAgICAqIEdlbmVyaWMgY29sdW1ucyBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBjb2x1bW5zIGFyZSBwcml2YXRlIHRvIHRoZSBzeW5jIGFkYXB0ZXIuIE90aGVyIGNsaWVudHMgb2YgdGhlIEFQSQorICAgICAqIHNob3VsZCBub3QgYXR0ZW1wdCB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSB0aGlzIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEJhc2VTeW5jQ29sdW1ucyB7CisKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzEgPSAic3luYzEiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMiA9ICJzeW5jMiI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMzID0gInN5bmMzIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzQgPSAic3luYzQiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNSA9ICJzeW5jNSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmb3IgU3luYyBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKKyAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KKyAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEFjY291bnQgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBBY2NvdW50Q29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBDYWxlbmRhcnMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGNvbG9yIHZhbHVlKTwvUD4KQEAgLTEzNSw3NSArMjMwLDEwMyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1NUQVRFID0gInN5bmNfc3RhdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqIFdoZXRoZXIgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLiAgQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UID0gIl9zeW5jX2FjY291bnQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UX1RZUEUgPSAiX3N5bmNfYWNjb3VudF90eXBlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3csIGFzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19WRVJTSU9OID0gIl9zeW5jX3ZlcnNpb24iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3IgdXNlIGJ5IHN5bmMgYWRhcHRlciBhdCBpdHMgZGlzY3JldGlvbjsgbm90IG1vZGlmaWVkIGJ5IENhbGVuZGFyUHJvdmlkZXIKLSAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY29sdW1uIHdhcyBmb3JtZXJseSBuYW1lZCBfU1lOQ19MT0NBTF9JRC4gIFdlIGFyZSB1c2luZyBpdCB0byBhdm9pZCBhCi0gICAgICAgICAqIHNjaGVtYSBjaGFuZ2UuCi0gICAgICAgICAqIFRPRE8gUmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIG9ubHkgaW4gcGVyc2lzdGVudCBwcm92aWRlcnMsIGFuZCBvbmx5IGR1cmluZyBtZXJnaW5nLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX01BUksgPSAiX3N5bmNfbWFyayI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCwgdW5zeW5jZWQsIGNoYW5nZXMgYXJlIHByZXNlbnQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfRElSVFkgPSAiX3N5bmNfZGlydHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCi0gICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUQgPSAiZGVsZXRlZCI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgQ2FsZW5kYXIgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfZW50aXRpZXMiKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCByZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudGl0eUl0ZXJhdG9ySW1wbCBleHRlbmRzIEN1cnNvckVudGl0eUl0ZXJhdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Qcm92aWRlcjsKKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5QW5kSW5jcmVtZW50Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgY3Vyc29yIGlzIGFscmVhZHkgYXQgdGhlIHJvdyB3ZSBuZWVkIHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsZW5kYXJJZCA9IGN1cnNvci5nZXRMb25nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coX0lEKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbnRlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBjdi5wdXQoX0lELCBjYWxlbmRhcklkKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlRfVFlQRSk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19JRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVElNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfTUFSSyk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMzKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNSk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5ESVNQTEFZX05BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DT0xPUik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUNDRVNTX0xFVkVMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTRUxFQ1RFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19FVkVOVFMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5MT0NBVElPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVElNRVpPTkUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuT1dORVJfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PUkdBTklaRVJfQ0FOX1JFU1BPTkQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEVudGl0eSBmcm9tIHRoZSBDb250ZW50VmFsdWUKKyAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgY3Vyc29yIHRvIG5leHQgcm93CisgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCBFbnRpdHkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnRhaW5zIGEgbGlzdCBvZiBhdmFpbGFibGUgY2FsZW5kYXJzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBDYWxlbmRhcnNDb2x1bW5zCiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfREVMRVRFX0ZPUl9BQ0NPVU5UID0gQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlQgKyAiPT8iCiAgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlRfVFlQRSArICI9PyI7CkBAIC0yNTgsNiArMzgxLDI0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgaXRzZWxmCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxGX1VSTCA9ICJzZWxmVXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIHRvIGJlIGVkaXRlZAorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9VUkwgPSAiZWRpdFVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBldmVudHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UU19VUkwgPSAiZXZlbnRzVXJsIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwpAQCAtMjc2LDEyICs0MTcsNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3VsZCB0aGUgY2FsZW5kYXIgYmUgaGlkZGVuIGluIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24gcGFuZWw/Ci0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOID0gImhpZGRlbiI7Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBvd25lciBhY2NvdW50IGZvciB0aGlzIGNhbGVuZGFyLCBiYXNlZCBvbiB0aGUgY2FsZW5kYXIgZmVlZC4KICAgICAgICAgICogVGhpcyB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBfU1lOQ19BQ0NPVU5UIGZvciBkZWxlZ2F0ZWQgY2FsZW5kYXJzLgogICAgICAgICAgKiA8UD5UeXBlOiBTdHJpbmc8L1A+CkBAIC0yOTYsNiArNDMxLDkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHQU5JWkVSX0NBTl9SRVNQT05EID0gIm9yZ2FuaXplckNhblJlc3BvbmQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQXR0ZW5kZWVzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgQXR0ZW5kZWVzQ29sdW1ucyB7CiAKICAgICAgICAgLyoqCkBAIC0zNjEsOCArNDk5LDcgQEAKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50cyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjYWxlbmRhciB0aGUgZXZlbnQgYmVsb25ncyB0bwogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgQ2FsZW5kYXJzIHRhYmxlKTwvUD4KQEAgLTQzOCw2ICs1NzUsMTggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQgPSAiZHRlbmQiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgc3RhcnRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUMiA9ICJkdHN0YXJ0MiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBlbmRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORDIgPSAiZHRlbmQyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChkdXJhdGlvbiBpbiBSRkMyNDQ1IGZvcm1hdCk8L1A+CiAgICAgICAgICAqLwpAQCAtNDUwLDYgKzU5OSwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORSA9ICJldmVudFRpbWV6b25lIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWV6b25lIGZvciB0aGUgZXZlbnQsIGFsbERheSBldmVudHMgd2lsbCBoYXZlIGEgbG9jYWwgdHogaW5zdGVhZCBvZiBVVEMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUyID0gImV2ZW50VGltZXpvbmUyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgbGFzdHMgYWxsIGRheSBvciBub3QKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwpAQCAtNTk4LDcgKzc1Myw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwpAQCAtNzAzLDggKzg1OSw4IEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuVVJMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFdmVudHNDb2x1bW5zLkRFTEVURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CiAKICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CiAgICAgICAgICAgICAgICAgQ3Vyc29yIHN1YkN1cnNvcjsKQEAgLTc5NSw3ICs5NTEsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGRVRDSF9FTlRSWV9DT0xVTU5TID0KICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBFdmVudHMuX1NZTkNfQUNDT1VOVCwgRXZlbnRzLl9TWU5DX0lEIH07CkBAIC04NjAsNiArMTAxNywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBzZWFyY2hRdWVyeSB9LCBERUZBVUxUX1NPUlRfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkgewogICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOwogICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOwpAQCAtODczLDYgKzEwMzksMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgbG9uZyBiZWdpbiwKKyAgICAgICAgICAgICAgICBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5LCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgeworICAgICAgICAgICAgICAgIHdoZXJlID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwpAQCAtODgwLDYgKzEwNjEsMTAgQEAKICAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy93aGVuIik7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfQllfREFZX1VSSSA9CiAgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9pbnN0YW5jZXMvd2hlbmJ5ZGF5Iik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3NlYXJjaCIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9CWV9EQVlfVVJJID0KKyAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy9zZWFyY2hieWRheSIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlLgpAQCAtODk2LDcgKzEwODEsNiBAQAogICAgICAgICAgKiByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MsIGl0IGp1c3QgYWRkcyBhIG5pY2UgdG91Y2guCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUX0NBTEVOREFSX1ZJRVcgPSAiYmVnaW4gQVNDLCBlbmQgREVTQywgdGl0bGUgQVNDIjsKLQogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGJlZ2lubmluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcwogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgpAQCAtOTgxLDcgKzExNjUsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zLCBCYXNlQ29sdW1ucyB7CiAgICAgfQogCiAgICAgcHVibGljIGludGVyZmFjZSBFdmVudERheXNDb2x1bW5zIHsKQEAgLTEzNzksNCArMTU2Myw0MyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CiAgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ2FsZW5kYXIuQ09OVEVOVF9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50c1Jhd1RpbWVzIHRhYmxlCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaWQKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlRfMjQ0NSA9ICJkdHN0YXJ0MjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORF8yNDQ1ID0gImR0ZW5kMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRV8yNDQ1ID0gIm9yaWdpbmFsSW5zdGFuY2VUaW1lMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBsYXN0IGRhdGUgdGhpcyBldmVudCByZXBlYXRzIG9uLCBvciBOVUxMIGlmIGl0IG5ldmVyIGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURV8yNDQ1ID0gImxhc3REYXRlMjQ0NSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNSYXdUaW1lcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQppbmRleCBmMGVlODM4Li40OGQ1MzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCkBAIC0zMCw3ICszMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwpAQCAtMTMwLDYgKzEyOSwxNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkgPSAicmVxdWVzdGluZ19wYWNrYWdlIjsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtZXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gYWNjZXNzIGEgc3BlY2lmaWMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5fS4gVGhlIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgdGhlIF9JRCBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGRpcmVjdG9yeSwgZS5nLgorICAgICAqIHtAY29kZSBjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvZGF0YS9lbWFpbHMvZmlsdGVyL2FjbWU/ZGlyZWN0b3J5PTN9CisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWV9QQVJBTV9LRVkgPSAiZGlyZWN0b3J5IjsKKworCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByZWZlcmVuY2VzIHsKQEAgLTE4MSw2ICsxOTEsMzM2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBEaXJlY3RvcnkgcmVwcmVzZW50cyBhIGNvbnRhY3RzIGNvcnB1cywgZS5nLiBMb2NhbCBjb250YWN0cywKKyAgICAgKiBHb29nbGUgQXBwcyBHbG9iYWwgQWRkcmVzcyBMaXN0IG9yIENvcnBvcmF0ZSBHbG9iYWwgQWRkcmVzcyBMaXN0LgorICAgICAqIDxwPgorICAgICAqIEEgRGlyZWN0b3J5IGlzIGltcGxlbWVudGVkIGFzIGEgY29udGVudCBwcm92aWRlciB3aXRoIGl0cyB1bmlxdWUgYXV0aG9yaXR5IGFuZAorICAgICAqIHRoZSBzYW1lIEFQSSBhcyB0aGUgbWFpbiBDb250YWN0cyBQcm92aWRlci4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGV4cGVjdGF0aW9uIHRoYXQKKyAgICAgKiBldmVyeSBkaXJlY3RvcnkgcHJvdmlkZXIgd2lsbCBpbXBsZW1lbnQgdGhpcyBDb250cmFjdCBpbiBpdHMgZW50aXJldHkuICBJZiBhCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgcmVxdWVzdCwgaXQKKyAgICAgKiBzaG91bGQgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBtb3N0IGltcG9ydGFudCB1c2UgY2FzZSBmb3IgRGlyZWN0b3JpZXMgaXMgc2VhcmNoLiAgQSBEaXJlY3RvcnkgcHJvdmlkZXIgaXMKKyAgICAgKiBleHBlY3RlZCB0byBzdXBwb3J0IGF0IGxlYXN0IHtAbGluayBDb250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkkKKyAgICAgKiBDb250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkl9LiAgSWYgYSBEaXJlY3RvcnkgcHJvdmlkZXIgd2FudHMgdG8gcGFydGljaXBhdGUKKyAgICAgKiBpbiBlbWFpbCBhbmQgcGhvbmUgbG9va3VwIGZ1bmN0aW9uYWxpdGllcywgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50CisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfRklMVEVSX1VSSX0KKyAgICAgKiBhbmQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLlBob25lI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9GSUxURVJfVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgc2hvdWxkIHJldHVybiBOVUxMIGZvciBldmVyeSBwcm9qZWN0aW9uIGZpZWxkIGl0IGRvZXMgbm90CisgICAgICogcmVjb2duaXplLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBUaGlzIHdheSBpdCB3aWxsIG5vdCBiZSBicm9rZW4KKyAgICAgKiBpZiBDb250YWN0c0NvbnRyYWN0IGlzIGV4dGVuZGVkIHdpdGggbmV3IGZpZWxkcyBpbiB0aGUgZnV0dXJlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xpZW50IGludGVyYWN0cyB3aXRoIGEgZGlyZWN0b3J5IHZpYSBDb250YWN0cyBQcm92aWRlciBieSBzdXBwbHlpbmcgYW4KKyAgICAgKiBvcHRpb25hbCB7QGNvZGUgZGlyZWN0b3J5PX0gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCB0cmFuc2Zvcm1zIHRoZSBVUkkgYW5kIGZvcndhcmRzCisgICAgICogdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogVGhlIFVSSSBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgVVJJIGF1dGhvcml0eSBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjRElSRUNUT1JZX0FVVEhPUklUWX0uPC9saT4KKyAgICAgKiA8bGk+VGhlIHtAY29kZSBhY2NvdW50TmFtZT19IGFuZCB7QGNvZGUgYWNjb3VudFR5cGU9fSBwYXJhbWV0ZXJzIGFyZSBhZGRlZCBvcgorICAgICAqIHJlcGxhY2VkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjQUNDT1VOVF9UWVBFfSBhbmQge0BsaW5rICNBQ0NPVU5UX05BTUV9IHZhbHVlcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgVVJJIGlzIG1pc3NpbmcgYSB7QGxpbmsgQ29udGFjdHNDb250cmFjdCNSRVFVRVNUSU5HX1BBQ0tBR0VfUEFSQU1fS0VZfQorICAgICAqIHBhcmFtZXRlciwgdGhpcyBwYXJhbWV0ZXIgaXMgYWRkZWQuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDbGllbnRzIHNob3VsZCBzZW5kIGRpcmVjdG9yeSByZXF1ZXN0cyB0byBDb250YWN0cyBQcm92aWRlciBhbmQgbGV0IGl0CisgICAgICogZm9yd2FyZCB0aGVtIHRvIHRoZSByZXNwZWN0aXZlIHByb3ZpZGVycyByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcKKyAgICAgKiBkaXJlY3RvcnkgcHJvdmlkZXIgVVJJcyBieSB0aGVtc2VsdmVzLiBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cworICAgICAqIENvbnRhY3RzIFByb3ZpZGVyIHRvIGltcGxlbWVudCBhZGRpdGlvbmFsIHN5c3RlbS1sZXZlbCBmZWF0dXJlcyBhbmQKKyAgICAgKiBvcHRpbWl6YXRpb25zLiBBY2Nlc3MgdG8gQ29udGFjdHMgUHJvdmlkZXIgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICAgICAqIFJFQURfQ09OVEFDVFMgcGVybWlzc2lvbiwgYnV0IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGlzIG5vdC4KKyAgICAgKiBUaGVyZWZvcmUgZGlyZWN0b3J5IHByb3ZpZGVycyBtdXN0IHJlamVjdCByZXF1ZXN0cyBjb21pbmcgZnJvbSBjbGllbnRzCisgICAgICogb3RoZXIgdGhhbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgaXRzZWxmLiBBbiBlYXN5IHdheSB0byBwcmV2ZW50IHN1Y2gKKyAgICAgKiB1bmF1dGhvcml6ZWQgYWNjZXNzIGlzIHRvIGNoZWNrIHRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIHBhY2thZ2U6CisgICAgICogPHByZT4KKyAgICAgKiBwcml2YXRlIGJvb2xlYW4gaXNDYWxsZXJBbGxvd2VkKCkgeworICAgICAqICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgKiAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lOiBwbS5nZXRQYWNrYWdlc0ZvclVpZChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAqICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuY29udGFjdHMiKSkgeworICAgICAqICAgICAgIHJldHVybiB0cnVlOworICAgICAqICAgICB9CisgICAgICogICB9CisgICAgICogICByZXR1cm4gZmFsc2U7CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgRGlyZWN0b3J5IHRhYmxlIGlzIHJlYWQtb25seSBhbmQgaXMgbWFpbnRhaW5lZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5JdCBhbHdheXMgaGFzIGF0IGxlYXN0IHRoZXNlIHR3byByb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGRpcmVjdG9yeS4gSXQgaGFzIHtAbGluayBEaXJlY3RvcnkjX0lEIERpcmVjdG9yeS5fSUR9ID0KKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0RFRkFVTFQgRGlyZWN0b3J5LkRFRkFVTFR9LiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgbG9jYWxseQorICAgICAqIHN0b3JlZCBjb250YWN0cy4gVGhlIHNhbWUgY2FuIGJlIGFjaGlldmVkIGJ5IG9taXR0aW5nIHRoZSB7QGNvZGUgZGlyZWN0b3J5PX0KKyAgICAgKiBwYXJhbWV0ZXIgYWx0b2dldGhlci4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGUgbG9jYWwgaW52aXNpYmxlIGNvbnRhY3RzLiBUaGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgSUQgaXMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0xPQ0FMX0lOVklTSUJMRSBEaXJlY3RvcnkuTE9DQUxfSU5WSVNJQkxFfS4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPkN1c3RvbSBEaXJlY3RvcmllcyBhcmUgZGlzY292ZXJlZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgZm9sbG93aW5nIHRoaXMgcHJvY2VkdXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SXQgZmluZHMgYWxsIGluc3RhbGxlZCBjb250ZW50IHByb3ZpZGVycyB3aXRoIG1ldGEgZGF0YSBpZGVudGlmeWluZyB0aGVtCisgICAgICogYXMgZGlyZWN0b3J5IHByb3ZpZGVycyBpbiBBbmRyb2lkTWFuaWZlc3QueG1sOgorICAgICAqIDxjb2RlPgorICAgICAqICZsdDttZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29udGFjdERpcmVjdG9yeSIKKyAgICAgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9InRydWUiIC8mZ3Q7CisgICAgICogPC9jb2RlPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdGFnIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgcHJvdmlkZXIgZGVjbGFyYXRpb24uCisgICAgICogPC9wPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZW4gQ29udGFjdHMgUHJvdmlkZXIgc2VuZHMgYSB7QGxpbmsgRGlyZWN0b3J5I0NPTlRFTlRfVVJJIERpcmVjdG9yeS5DT05URU5UX1VSSX0KKyAgICAgKiBxdWVyeSB0byBlYWNoIG9mIHRoZSBkaXJlY3RvcnkgYXV0aG9yaXRpZXMuICBBIGRpcmVjdG9yeSBwcm92aWRlciBtdXN0IGltcGxlbWVudAorICAgICAqIHRoaXMgcXVlcnkgYW5kIHJldHVybiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBFYWNoIGRpcmVjdG9yeSByZXR1cm5lZCBieQorICAgICAqIHRoZSBwcm92aWRlciBtdXN0IGhhdmUgYSB1bmlxdWUgY29tYmluYXRpb24gZm9yIHRoZSB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gYW5kCisgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGNvbHVtbnMgKG51bGxzIGFyZSBhbGxvd2VkKS4gIFNpbmNlIGRpcmVjdG9yeSBJRHMgYXJlIGFzc2lnbmVkCisgICAgICogYXV0b21hdGljYWxseSwgdGhlIF9JRCBmaWVsZCB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBxdWVyeSBwcm9qZWN0aW9uLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPkNvbnRhY3RzIFByb3ZpZGVyIGNvbXBpbGVzIGRpcmVjdG9yeSBsaXN0cyByZWNlaXZlZCBmcm9tIGFsbCBkaXJlY3RvcnkKKyAgICAgKiBwcm92aWRlcnMgaW50byBvbmUsIGFzc2lnbnMgZWFjaCBpbmRpdmlkdWFsIGRpcmVjdG9yeSBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBhbmQKKyAgICAgKiBzdG9yZXMgYWxsIGRpcmVjdG9yeSByZWNvcmRzIGluIHRoZSBEaXJlY3RvcnkgdGFibGUuCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5Db250YWN0cyBQcm92aWRlciBhdXRvbWF0aWNhbGx5IGludGVycm9nYXRlcyBuZXdseSBpbnN0YWxsZWQgb3IgcmVwbGFjZWQgcGFja2FnZXMuCisgICAgICogVGh1cyBzaW1wbHkgaW5zdGFsbGluZyBhIHBhY2thZ2UgY29udGFpbmluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBpcyBzdWZmaWNpZW50CisgICAgICogdG8gaGF2ZSB0aGF0IHByb3ZpZGVyIHJlZ2lzdGVyZWQuICBBIHBhY2thZ2Ugc3VwcGx5aW5nIGEgZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSB0byBjb250YWluIGxhdW5jaGFibGUgYWN0aXZpdGllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRXZlcnkgcm93IGluIHRoZSBEaXJlY3RvcnkgdGFibGUgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZQorICAgICAqIChhcGspLiAgSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIGFsbCBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzCisgICAgICogYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWN0cyBQcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBoYW5kbGVkIGJ5IGEgZGlyZWN0b3J5IHByb3ZpZGVyIGNoYW5nZXMKKyAgICAgKiAoZm9yIGluc3RhbmNlIHdoZW4gdGhlIHVzZXIgYWRkcyBhIG5ldyBEaXJlY3RvcnkgYWNjb3VudCksIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIKKyAgICAgKiBzaG91bGQgY2FsbCB7QGxpbmsgI25vdGlmeURpcmVjdG9yeUNoYW5nZX0gdG8gbm90aWZ5IHRoZSBDb250YWN0cyBQcm92aWRlciBvZiB0aGUgY2hhbmdlLgorICAgICAqIEluIHJlc3BvbnNlLCB0aGUgQ29udGFjdHMgUHJvdmlkZXIgd2lsbCByZXF1ZXJ5IHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgdG8gb2J0YWluIHRoZQorICAgICAqIG5ldyBsaXN0IG9mIGRpcmVjdG9yaWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSByb3cgY2FuIGJlIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGFjY291bnQKKyAgICAgKiAoc2VlIHtAbGluayBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyfSkuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyIHJlbW92ZWQsCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHJvd3MgYXJlCisgICAgICogYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIENvbnRhY3RzIFByb3ZpZGVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXJlY3RvcnkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCBpbnN0YW50aWFibGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIERpcmVjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUuICBSZXF1ZXN0cyB0byB0aGlzIFVSSSBjYW4gYmUKKyAgICAgICAgICogcGVyZm9ybWVkIG9uIHRoZSBVSSB0aHJlYWQgYmVjYXVzZSB0aGV5IGFyZSBhbHdheXMgdW5ibG9ja2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiZGlyZWN0b3JpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUtdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YKKyAgICAgICAgICogY29udGFjdCBkaXJlY3Rvcmllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9CisgICAgICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvY29udGFjdF9kaXJlY3RvcmllcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGVmYXVsdCBkaXJlY3RvcnksIHdoaWNoIHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyBsb2NhbGx5IHN0b3JlZCBpbnZpc2libGUgY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9DQUxfSU5WSVNJQkxFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIHRoaXMgZGlyZWN0b3J5LiBDb250YWN0cyBQcm92aWRlcgorICAgICAgICAgKiBmaWxsIGl0IGluIHdpdGggdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyLgorICAgICAgICAgKiBJZiB0aGUgcGFja2FnZSBpcyBsYXRlciB1bmluc3RhbGxlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlCisgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IFRFWFQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBkaXJlY3RvcnkgY2FwdHVyZWQgYXMgYSByZXNvdXJjZSBJRCBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAgICAgICAgICogcGFja2FnZSB7QGxpbmsgI1BBQ0tBR0VfTkFNRX0sIGUuZy4gIkNvcnBvcmF0ZSBEaXJlY3RvcnkiCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IElOVEVHRVI8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1JFU09VUkNFX0lEID0gInR5cGVSZXNvdXJjZUlkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBVSSB0byByZXByZXNlbnQgdGhpcyBkaXJlY3RvcnksCisgICAgICAgICAqIGUuZy4gIkFjbWUgQ29ycCIKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5TmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYXV0aG9yaXR5IG9mIHRoZSBEaXJlY3RvcnkgUHJvdmlkZXIuIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwKKyAgICAgICAgICogdXNlIHRoaXMgYXV0aG9yaXR5IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgY2FuIGxlYXZlIHRoaXMgY29sdW1uIGVtcHR5IC0gQ29udGFjdHMgUHJvdmlkZXIgd2lsbCBmaWxsIGl0IGluLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBDbGllbnRzIG9mIHRoaXMgQVBJIHNob3VsZCBub3Qgc2VuZCByZXF1ZXN0cyBkaXJlY3RseSB0byB0aGlzIGF1dGhvcml0eS4KKyAgICAgICAgICogQWxsIGRpcmVjdG9yeSByZXF1ZXN0cyBtdXN0IGJlIHJvdXRlZCB0aHJvdWdoIENvbnRhY3RzIFByb3ZpZGVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfQVVUSE9SSVRZID0gImF1dGhvcml0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHR5cGUgd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50VHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHdpdGggd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4gSWYgdGhlIGFjY291bnQgaXMgbGF0ZXIKKyAgICAgICAgICogcmVtb3ZlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudE5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmUgb2Yge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVH0sCisgICAgICAgICAqIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFl9LiBUaGlzIGlzIHRoZSBleHBlY3RhdGlvbiB0aGUKKyAgICAgICAgICogZGlyZWN0b3J5IGhhcyBmb3IgZGF0YSBleHBvcnRlZCBmcm9tIGl0LiAgQ2xpZW50cyBtdXN0IG9iZXkgdGhpcyBzZXR0aW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1NVUFBPUlQgPSAiZXhwb3J0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGRvZXMgbm90IGFsbG93IGFueSBkYXRhIHRvIGJlIGNvcGllZCBvdXQgb2YgaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9OT05FID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNFWFBPUlRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgaXRzIGRhdGEgY29waWVkIG9ubHkgdG8gdGhlIGFjY291bnQgc3BlY2lmaWVkIGJ5CisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfS97QGxpbmsgI0FDQ09VTlRfTkFNRX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCB0byBhbnkgY29udGFjdHMgYWNjb3VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWX0sCisgICAgICAgICAqIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9GVUxMfSwgVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBoYXMgZm9yIHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgZWxlbWVudHMuIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUQ1VUX1NVUFBPUlQgPSAic2hvcnRjdXRTdXBwb3J0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgc2hvcnRjdXRzIGNyZWF0ZWQgZm9yIGl0cyBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBkYXRhIGl0ZW1zIGxpa2UgZW1haWwsIHBob25lIG9yIHBvc3RhbCBhZGRyZXNzLAorICAgICAgICAgKiBidXQgbm90IHRoZSBlbnRpcmUgY29udGFjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfREFUQV9JVEVNU19PTkxZID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBjcmVhdGlvbiBvZiBzaG9ydGN1dHMgZm9yIGNvbnRhY3QgYXMgd2VsbCBhcyB0aGVpciBjb25zdGl0dWVudCBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfRlVMTCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmaWVzIHRoZSBzeXN0ZW0gb2YgYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieQorICAgICAgICAgKiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHByb3ZpZGVyLiBUaGUgQ29udGFjdHMgcHJvdmlkZXIgd2lsbCB0dXJuIGFyb3VuZAorICAgICAgICAgKiBhbmQgc2VuZCBhIHF1ZXJ5IHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgZGlyZWN0b3JpZXMsCisgICAgICAgICAqIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub3RpZnlEaXJlY3RvcnlDaGFuZ2UoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gdHJpZ2dlciBhIHF1ZXJ5IGJ5IENvbnRhY3RzIFByb3ZpZGVyIGJhY2sgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICAgIC8vIE5vIGRhdGEgbmVlZHMgdG8gYmUgc2VudCBiYWNrLCBiZWNhdXNlIHRoZSBwcm92aWRlciBjYW4gaW5mZXIgdGhlIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIHBhY2thZ2UgZnJvbSBiaW5kZXIuCisgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgcmVzb2x2ZXIudXBkYXRlKERpcmVjdG9yeS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHVzZXJzIGFyZSB1cGRhdGVkIHRvIHJlZmVyIHRvIFN5bmNTdGF0ZQogICAgICAqIEBkZXByZWNhdGVkIHVzZSBTeW5jU3RhdGUgaW5zdGVhZAogICAgICAqLwpAQCAtMTA1Niw2ICsxMzk2LDU5IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c30gYXMgd2VsbCBhcworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogRW50aXR5IGhhcyB0aHJlZSBJRCBmaWVsZHM6IHtAbGluayAjQ09OVEFDVF9JRH0gZm9yIHRoZSBjb250YWN0LAorICAgICAgICAgKiB7QGxpbmsgI1JBV19DT05UQUNUX0lEfSBmb3IgdGhlIHJhdyBjb250YWN0IGFuZCB7QGxpbmsgI0RBVEFfSUR9IGZvcgorICAgICAgICAgKiB0aGUgZGF0YSByb3dzLiBFbnRpdHkgYWx3YXlzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgcGVyCisgICAgICAgICAqIGNvbnN0aXR1ZW50IHJhdyBjb250YWN0LCBldmVuIGlmIHRoZXJlIGFyZSBubyBhY3R1YWwgZGF0YSByb3dzLiBJbgorICAgICAgICAgKiB0aGlzIGNhc2UgdGhlIHtAbGluayAjREFUQV9JRH0gZmllbGQgd2lsbCBiZSBudWxsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsIGRhdGEgZm9yIHRoZSBlbnRpcmUgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvCisgICAgICAgICAqIGd1YXJhbnRlZSBjb25zaXN0ZW5jeS4gIFRoZXJlIGlzIHNpZ25pZmljYW50IGRhdGEgZHVwbGljYXRpb24KKyAgICAgICAgICogaW4gdGhlIEVudGl0eSAoZWFjaCByb3cgcmVwZWF0cyBhbGwgQ29udGFjdCBjb2x1bW5zIGFuZCBhbGwgUmF3Q29udGFjdAorICAgICAgICAgKiBjb2x1bW5zKSwgc28gdGhlIGJlbmVmaXRzIG9mIHRyYW5zYWN0aW9uYWwgY29uc2lzdGVuY3kgc2hvdWxkIGJlIHdlaWdoZWQKKyAgICAgICAgICogYWdhaW5zdCB0aGUgY29zdCBvZiB0cmFuc2ZlcnJpbmcgbGFyZ2UgYW1vdW50cyBvZiBkZW5vcm1hbGl6ZWQgZGF0YQorICAgICAgICAgKiBmcm9tIHRoZSBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zLAorICAgICAgICAgICAgICAgIENvbnRhY3ROYW1lQ29sdW1ucywgUmF3Q29udGFjdHNDb2x1bW5zLCBCYXNlU3luY0NvbHVtbnMsIFN5bmNDb2x1bW5zLCBEYXRhQ29sdW1ucywKKyAgICAgICAgICAgICAgICBTdGF0dXNDb2x1bW5zLCBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgRW50aXR5KCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBkaXJlY3RvcnkgdHdpZyBmb3IgdGhpcyBzdWItdGFibGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXRpZXMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcmF3IGNvbnRhY3Qgcm93LgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSUQgPSAicmF3X2NvbnRhY3RfaWQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSByb3cuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KKyAgICAgICAgICAgICAqIGRhdGEgcm93cy4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUQgPSAiZGF0YV9pZCI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CiAgICAgICAgICAqIEEgPGk+cmVhZC1vbmx5PC9pPiBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIGNvbnRhY3QgYWdncmVnYXRlIHRoYXQKICAgICAgICAgICogY29udGFpbnMgYWxsIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIChvdGhlciBjb250YWN0cykuIFRoZQogICAgICAgICAgKiBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9ucyBhcmUgY29tcHV0ZWQgYmFzZWQgb24gYXBwcm94aW1hdGUgZGF0YQpAQCAtMTI0NCw2ICsxNjM3LDE0IEBACiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1ZFUklGSUVEID0gIm5hbWVfdmVyaWZpZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgInJlYWQtb25seSIgZmxhZzogIjAiIGJ5IGRlZmF1bHQsICIxIiBpZiB0aGUgcm93IGNhbm5vdCBiZSBtb2RpZmllZCBvcgorICAgICAgICAgKiBkZWxldGVkIGV4Y2VwdCBieSBhIHN5bmMgYWRhcHRlci4gIFNlZSB7QGxpbmsgQ29udGFjdHNDb250cmFjdCNDQUxMRVJfSVNfU1lOQ0FEQVBURVJ9LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZID0gInJhd19jb250YWN0X2lzX3JlYWRfb25seSI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUxLDcgKzIxNTIsNyBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXR5IjsKIAogICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgY29sdW1uLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgcm93LiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCiAgICAgICAgICAgICAgKiBkYXRhIHJvd3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgogICAgICAgICAgICAgICovCkBAIC0xODM5LDI4ICsyMjQwLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5EQVRBX1ZFUlNJT04pOwogICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBEQVRBX0tFWVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgb3IgdW5oYW5kbGVkIGRhdGEgdHlwZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZ28gYmFjayB0byB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgd2hlbiBidWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTIzMDYzNzAgaXMgZml4ZWQuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzTG9uZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Zsb2F0KGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRGbG9hdChjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc1N0cmluZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzQmxvYihjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5hZGRTdWJWYWx1ZShDb250YWN0c0NvbnRyYWN0LkRhdGEuQ09OVEVOVF9VUkksIGN2KTsKICAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKQEAgLTIwMjMsNiArMjQxNywxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TVVBFUl9QUklNQVJZID0gImlzX3N1cGVyX3ByaW1hcnkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgInJlYWQtb25seSIgZmxhZzogIjAiIGJ5IGRlZmF1bHQsICIxIiBpZiB0aGUgcm93IGNhbm5vdCBiZSBtb2RpZmllZCBvcgorICAgICAgICAgKiBkZWxldGVkIGV4Y2VwdCBieSBhIHN5bmMgYWRhcHRlci4gIFNlZSB7QGxpbmsgQ29udGFjdHNDb250cmFjdCNDQUxMRVJfSVNfU1lOQ0FEQVBURVJ9LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfUkVBRF9PTkxZID0gImlzX3JlYWRfb25seSI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgZGF0YSByZWNvcmQuIFRoaXMgaXMgYSByZWFkLW9ubHkgdmFsdWUuIFRoZSBkYXRhIGNvbHVtbiBpcwogICAgICAgICAgKiBndWFyYW50ZWVkIHRvIG5vdCBjaGFuZ2Ugd2l0aG91dCB0aGUgdmVyc2lvbiBnb2luZyB1cC4gVGhpcyB2YWx1ZSBpcyBtb25vdG9uaWNhbGx5CiAgICAgICAgICAqIGluY3JlYXNpbmcuCkBAIC00OTUxLDYgKzUzNTMsMjMgQEAKICAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9TWU5DID0gInNob3VsZF9zeW5jIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW55IG5ld2x5IGNyZWF0ZWQgY29udGFjdHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGdyb3VwcyB0aGF0IGhhdmUgdGhpcworICAgICAgICAgKiBmbGFnIHNldCB0byB0cnVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fQUREID0gImF1dG9fYWRkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBhIGNvbnRhY3RzIGlzIG1hcmtlZCBhcyBhIGZhdm9yaXRlcyBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKyAgICAgICAgICogdG8gdGhlIGdyb3VwcyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldCwgYW5kIHdoZW4gaXQgaXMgcmVtb3ZlZCBmcm9tIGZhdm9yaXRlcworICAgICAgICAgKiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVzZSBncm91cHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWT1JJVEVTID0gImZhdm9yaXRlcyI7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MDkxLDYgKzU1MTAsOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgREVMRVRFRCk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIE5PVEVTKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgU0hPVUxEX1NZTkMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBGQVZPUklURVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBBVVRPX0FERCk7CiAgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eSh2YWx1ZXMpOwogICAgICAgICAgICAgfQpAQCAtNTYwNyw2ICs2MDI4LDI4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5TSE9XX09SX0NSRUFURV9DT05UQUNUIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnRzIGFuIEFjdGl2aXR5IHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgdGhlIG11bHRpcGxlIHBob25lcyBmcm9tIGEKKyAgICAgICAgICogbGlzdCBvZiBwaG9uZSBudW1iZXJzIHdoaWNoIGNvbWUgZnJvbSB0aGUgY29udGFjdHMgb3IKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIGJlaW5nIHBhc3NlZCBpbiB0aHJvdWdoIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30KKyAgICAgICAgICogY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QsIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgdXNlcidzIHNlbGVjdGlvbiB3aWxsIGJlIHJldHVybmVkIGZyb20KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQorICAgICAgICAgKiBpZiB0aGUgcmVzdWx0Q29kZSBpcworICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSwgdGhlIGFycmF5IG9mIHBpY2tlZCBwaG9uZQorICAgICAgICAgKiBudW1iZXJzIGFyZSBpbiB0aGUgSW50ZW50J3MKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfTsgb3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9DQU5DRUxFRH0gaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIKKyAgICAgICAgICogbGVmdCB0aGUgQWN0aXZpdHkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVMgPQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uR0VUX01VTFRJUExFX1BIT05FUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIGZvcmNlIGNyZWF0aW5nIGEgbmV3CiAgICAgICAgICAqIGNvbnRhY3QgaWYgbm8gbWF0Y2hpbmcgY29udGFjdCBmb3VuZC4gT3RoZXJ3aXNlLCBkZWZhdWx0IGJlaGF2aW9yIGlzCiAgICAgICAgICAqIHRvIHByb21wdCB1c2VyIHdpdGggZGlhbG9nIGJlZm9yZSBjcmVhdGluZy4KQEAgLTU2MjcsNiArNjA3MCwyMyBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5DUkVBVEVfREVTQ1JJUFRJT04iOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FU30gYXMgdGhlIGlucHV0IG9yIG91dHB1dCB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdhbnQgdG8gYmUgcGlja2VkIGJ5IGRlZmF1bHQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcworICAgICAgICAgKiBpbnB1dCB2YWx1ZS4gVGhlc2UgcGhvbmUgbnVtYmVycyBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIHdlcmUgcGlja2VkIGJ5IHRoZSB1c2VyIGFyZSByZXR1cm5lZCBhcyBvdXRwdXQKKyAgICAgICAgICogdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBhcnJheSBvZiBVUklzLCB0aGUgdGVsIFVSSSBpcyB1c2VkIGZvciB0aGUgcGhvbmUgbnVtYmVycyB3aGljaCBkb24ndAorICAgICAgICAgKiBiZWxvbmcgdG8gYW55IGNvbnRhY3QsIHRoZSBjb250ZW50IFVSSSBpcyB1c2VkIGZvciBwaG9uZSBpZCBpbiBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BIT05FX1VSSVMgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmV4dHJhLlBIT05FX1VSSVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBPcHRpb25hbCBleHRyYSB1c2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBzcGVjaWZ5IGEKICAgICAgICAgICogZGlhbG9nIGxvY2F0aW9uIHVzaW5nIHNjcmVlbiBjb29yZGluYXRlcy4gV2hlbiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICogZGlhbG9nIHdpbGwgYmUgY2VudGVyZWQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKaW5kZXggNDBlZDk4MC4uMjI3ZDk0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQpAQCAtMjM3LDkgKzIzNyw4MiBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWVfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByb3cgSUQgaW4gdGhlIE1UUCBvYmplY3QgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIGZpbGUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVFBfT0JKRUNUX0lEID0gIm9iamVjdF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNVFAgb2JqZWN0IGhhbmRsZSBvZiBhIG5ld2x5IHRyYW5zZmVyZWQgZmlsZS4KKyAgICAgICAgICogVXNlZCB0byBwYXNzIHRoZSBuZXcgZmlsZSdzIG9iamVjdCBoYW5kbGUgdGhyb3VnaCB0aGUgbWVkaWEgc2Nhbm5lcgorICAgICAgICAgKiBmcm9tIE1UUCB0byB0aGUgbWVkaWEgcHJvdmlkZXIKKyAgICAgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5IGJ5IE1UUCwgbWVkaWEgc2Nhbm5lciBhbmQgbWVkaWEgcHJvdmlkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQgPSAibWVkaWFfc2Nhbm5lcl9uZXdfb2JqZWN0X2lkIjsKICAgICAgfQogCiAgICAgLyoqCisgICAgICogTWVkaWEgcHJvdmlkZXIgaW50ZXJmYWNlIHVzZWQgYnkgTVRQIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNdHBPYmplY3RzIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIvb2JqZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgb2JqZWN0SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZWQgZm9yIE1UUCBHZXRPYmplY3RSZWZlcmVuY2VzIGFuZCBTZXRPYmplY3RSZWZlcmVuY2VzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldFJlZmVyZW5jZXNVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBvYmplY3RJZCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SWQgKyAiL3JlZmVyZW5jZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZHMgZm9yIG1hc3RlciB0YWJsZSBmb3IgYWxsIG1lZGlhIGZpbGVzLgorICAgICAgICAgKiBUYWJsZSBhbHNvIGNvbnRhaW5zIE1lZGlhQ29sdW1ucy5fSUQsIERBVEEsIFNJWkUgYW5kIERBVEVfTU9ESUZJRUQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9iamVjdENvbHVtbnMgZXh0ZW5kcyBNZWRpYUNvbHVtbnMgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgTVRQIGZvcm1hdCBjb2RlIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBtZWRpYSB0YWJsZSBjb250YWluaW5nIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgTWVkaWFQcm92aWRlcgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVEFCTEUgPSAibWVkaWFfdGFibGUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgb2JqZWN0IGluIGl0cyBtZWRpYSB0YWJsZS4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX0lEID0gIm1lZGlhX2lkIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEltYWdlcy5UaHVtYm5haWxzIGFuZCBWaWRlby5UaHVtYm5haWxzLCBpdCdzIG5vdCBpbnRlbmRlZAogICAgICAqIHRvIGJlIGFjY2Vzc2VkIGVsc2V3aGVyZS4KICAgICAgKi8KQEAgLTMxNywyMiArMzkwLDIzIEBACiAgICAgICAgICAgICAvLyBMb2cudihUQUcsICJnZXRUaHVtYm5haWw6IG9yaWdJZD0iK29yaWdJZCsiLCBraW5kPSIra2luZCsiLCBpc1ZpZGVvPSIraXNWaWRlbyk7CiAgICAgICAgICAgICAvLyBJZiB0aGUgbWFnaWMgaXMgbm9uLXplcm8sIHdlIHNpbXBseSByZXR1cm4gdGh1bWJuYWlsIGlmIGl0IGRvZXMgZXhpc3QuCiAgICAgICAgICAgICAvLyBxdWVyeWluZyBNZWRpYVByb3ZpZGVyIGFuZCBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbC4KLSAgICAgICAgICAgIE1pbmlUaHVtYkZpbGUgdGh1bWJGaWxlID0gTWluaVRodW1iRmlsZS5pbnN0YW5jZShiYXNlVXJpKTsKLSAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKLSAgICAgICAgICAgIGlmIChtYWdpYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTUlDUk9fS0lORCkgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW01pbmlUaHVtYkZpbGUuQllURVNfUEVSX01JTlRIVU1CXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRodW1iRmlsZS5nZXRNaW5pVGh1bWJGcm9tRmlsZShvcmlnSWQsIGRhdGEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNvdWxkbid0IGRlY29kZSBieXRlIGFycmF5LiIpOworICAgICAgICAgICAgTWluaVRodW1iRmlsZSB0aHVtYkZpbGUgPSBuZXcgTWluaVRodW1iRmlsZShpc1ZpZGVvID8gVmlkZW8uTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkKKyAgICAgICAgICAgICAgICAgICAgOiBJbWFnZXMuTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkpOworICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7CisgICAgICAgICAgICAgICAgaWYgKG1hZ2ljICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTUlDUk9fS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgZGF0YSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uID0gaXNWaWRlbyA/ICJ2aWRlb19pZD0iIDogImltYWdlX2lkPSI7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBNSU5JX0tJTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShiYXNlVXJpLCBQUk9KRUNUSU9OLCBjb2x1bW4gKyBvcmlnSWQsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBnZXRNaW5pVGh1bWJGcm9tRmlsZShjLCBiYXNlVXJpLCBjciwgb3B0aW9ucyk7CkBAIC0zNDAsMTcgKzQxNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBVcmkgYmxvY2tpbmdVcmkgPSBiYXNlVXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJibG9ja2luZyIsICIxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigib3JpZ19pZCIsIFN0cmluZy52YWx1ZU9mKG9yaWdJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImdyb3VwX2lkIiwgU3RyaW5nLnZhbHVlT2YoZ3JvdXBJZCkpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShibG9ja2luZ1VyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gb3JpZ2luYWwgaW1hZ2UvdmlkZW8gZG9lc24ndCBleGlzdC4KICAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSByZXR1cm4gbnVsbDsKQEAgLTM5Nyw2ICs0NjcsOSBAQAogICAgICAgICAgICAgICAgIExvZy53KFRBRywgZXgpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gYXBwbGljYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICB0aHVtYkZpbGUuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgIHRodW1iRmlsZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzY0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIFRoZSBNVFAgcHJvdmlkZXIgc3VwcG9ydHMgYWNjZXNzaW5nIGNvbnRlbnQgb24gTVRQIGFuZCBQVFAgZGV2aWNlcy4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHAKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIk10cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAibXRwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9TTEFTSCA9ICJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9kZXZpY2UvIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250YW50cyBmb3Ige0BsaW5rICNGT1JNQVR9IGFuZCB7QGxpbmsgI1RIVU1CX0ZPUk1BVH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORUQgPSAweDMwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1NDUklQVCA9IDB4MzAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYRUNVVEFCTEUgPSAweDMwMDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSFRNTCA9IDB4MzAwNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RQT0YgPSAweDMwMDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0FWID0gMHgzMDA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAzID0gMHgzMDA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVBFRyA9IDB4MzAwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTRiA9IDB4MzAwQzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWElGX0pQRUcgPSAweDM4MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0VQID0gMHgzODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9CTVAgPSAweDM4MDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DSUZGID0gMHgzODA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSkZJRiA9IDB4MzgwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NEID0gMHgzODA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1BORyA9IDB4MzgwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkYgPSAweDM4MEQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlAyID0gMHgzODBGOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlBYID0gMHgzODEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgPSAweEI4ODE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQVVESU8gPSAweEI5MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9PR0cgPSAweEI5MDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQUMgPSAweEI5MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBQyA9IDB4QjkwNjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9WSURFTyA9IDB4Qjk4MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QNF9DT05UQUlORVIgPSAweEI5ODI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDIgPSAweEI5ODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gPSAweEJBMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNID0gMHhCQTAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSA9IDB4QkEwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNID0gMHhCQTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQID0gMHhCQTA2OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgPSAweEJBMDc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUID0gMHhCQTA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgPSAweEJBMEE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XUExfUExBWUxJU1QgPSAweEJBMTA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NM1VfUExBWUxJU1QgPSAweEJBMTE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1hfUExBWUxJU1QgPSAweEJBMTM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QTFNfUExBWUxJU1QgPSAweEJBMTQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCA9IDB4QkE4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1hNTF9ET0NVTUVOVCA9IDB4QkE4MjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCA9IDB4QkE4NDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUID0gMHhCQTg1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfTUVTU0FHRSA9IDB4QkIwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFID0gMHhCQjAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUID0gMHhCQjgxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVkNBUkRfMiA9IDB4QkI4MjsKKworICAgICAgICAvLyBPYmplY3QgcHJvcGVydGllcyB3ZSBzdXBwb3J0CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NUT1JBR0VfSUQgPSAweERDMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GT1JNQVQgPSAweERDMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9TSVpFID0gMHhEQzA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FID0gMHhEQzA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQVJFTlRfT0JKRUNUID0gMHhEQzBCOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QgaXMgbm90IHByb3RlY3RlZC4gSXQgbWF5IGJlIG1vZGlmaWVkIGFuZCBkZWxldGVkLCBhbmQgaXRzIHByb3BlcnRpZXMKKyAgICAgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYnV0IGl0cyBwcm9wZXJ0aWVzIGFyZSBtb2RpZmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZX0RBVEEgPSAweDgwMDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICAgICAqIG1heSBiZSBtb3ZlZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBtYXkgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA9IDB4MDAwMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBlYmM4NWQzLi42ZDNjYTI3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC0xNiwxNCArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzgsMTkgKzM1LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCiAvKioKQEAgLTEwMDksNyArMTAwMSw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2VzKGludCBjaGFuZ2VzKSB7CiAgICAgICAgICAgICByZXR1cm4gKGNoYW5nZXMmQWN0aXZpdHlJbmZvLkNPTkZJR19GT05UX1NDQUxFKSAhPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93R1RhbGtTZXJ2aWNlU3RhdHVzKENvbnRlbnRSZXNvbHZlciBjcikgewogICAgICAgICAgICAgcmV0dXJuIGdldEludChjciwgU0hPV19HVEFMS19TRVJWSUNFX1NUQVRVUywgMCkgIT0gMDsKICAgICAgICAgfQpAQCAtMTIxNiw3ICsxMjA4LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19QQVRURVJOX1ZJU0lCTEUgPSAibG9ja19wYXR0ZXJuX3Zpc2libGVfcGF0dGVybiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSAKKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlCiAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNMT0NLX1BBVFRFUk5fVEFDVElMRV9GRUVEQkFDS19FTkFCTEVEfQogICAgICAgICAgKiBpbnN0ZWFkCiAgICAgICAgICAqLwpAQCAtMjI5MCw2ICsyMjgyLDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBrZXkgdGhhdCByZXRyaWV2ZXMgYSBibHVldG9vdGggSW5wdXQgRGV2aWNlJ3MgcHJpb3JpdHkuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgICAgICByZXR1cm4gKCJibHVldG9vdGhfaW5wdXRfZGV2aWNlX3ByaW9yaXR5XyIgKyBhZGRyZXNzLnRvVXBwZXJDYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IGRhdGEgcm9hbWluZyBpcyBlbmFibGVkLiAoMCA9IGZhbHNlLCAxID0gdHJ1ZSkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUk9BTUlORyA9ICJkYXRhX3JvYW1pbmciOwpAQCAtMjMyMSwxMSArMjMyMSwyNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9TWVNURU1fSU5QVVRfTUVUSE9EUyA9ICJkaXNhYmxlZF9zeXN0ZW1faW5wdXRfbWV0aG9kcyI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEhvc3QgbmFtZSBhbmQgcG9ydCBmb3IgYSB1c2VyLXNlbGVjdGVkIHByb3h5LgorICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGdsb2JhbCBwcm94eS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFkgPSAiaHR0cF9wcm94eSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEV4Y2x1c2lvbiBsaXN0IGZvciBnbG9iYWwgcHJveHkuIFRoaXMgc3RyaW5nIGNvbnRhaW5zIGEgbGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICAgICogZG9tYWlucyB3aGVyZSB0aGUgZ2xvYmFsIHByb3h5IGRvZXMgbm90IGFwcGx5LiBEb21haW5zIHNob3VsZCBiZSBsaXN0ZWQgaW4gYSBjb21tYS0KKyAgICAgICAgICogc2VwYXJhdGVkIGxpc3QuIEV4YW1wbGUgb2YgYWNjZXB0YWJsZSBmb3JtYXRzOiAiLmRvbWFpbjEuY29tLG15LmRvbWFpbjIuY29tIgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCA9ICJodHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRW5hYmxlcyB0aGUgVUkgc2V0dGluZyB0byBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBnbG9iYWwgSFRUUCBwcm94eQorICAgICAgICAgKiBhbmQgYXNzb2NpYXRlZCBleGNsdXNpb24gbGlzdC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9HTE9CQUxfSFRUUF9QUk9YWSA9ICJzZXRfZ2xvYmFsX2h0dHBfcHJveHkiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBwYWNrYWdlIGluc3RhbGxlciBzaG91bGQgYWxsb3cgaW5zdGFsbGF0aW9uIG9mIGFwcHMgZG93bmxvYWRlZCBmcm9tCiAgICAgICAgICAqIHNvdXJjZXMgb3RoZXIgdGhhbiB0aGUgQW5kcm9pZCBNYXJrZXQgKHZlbmRpbmcgbWFjaGluZSkuCiAgICAgICAgICAqCkBAIC0yNDE2LDYgKzI0MzEsMTQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwgPSAicGFyZW50YWxfY29udHJvbF9yZWRpcmVjdF91cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBBIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGUgZnJlcXVlbmN5IG9mIFNhbXBsaW5nUHJvZmlsZXIKKyAgICAgICAgICogdGFraW5nIHNuYXBzaG90cyBpbiBoZXJ0ei4gWmVybyB2YWx1ZSBtZWFucyBTYW1wbGluZ1Byb2ZpbGVyIGlzIGRpc2FibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUExJTkdfUFJPRklMRVJfSFogPSAic2FtcGxpbmdfcHJvZmlsZXJfaHoiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBTZXR0aW5ncyBjbGFzc25hbWUgdG8gbGF1bmNoIHdoZW4gU2V0dGluZ3MgaXMgY2xpY2tlZCBmcm9tIEFsbAogICAgICAgICAgKiBBcHBsaWNhdGlvbnMuICBOZWVkZWQgYmVjYXVzZSBvZiB1c2VyIHRlc3RpbmcgYmV0d2VlbiB0aGUgb2xkCiAgICAgICAgICAqIGFuZCBuZXcgU2V0dGluZ3MgYXBwcy4KQEAgLTM1ODEsMjAgKzM2MDQsOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQppbmRleCAzNWE1ODJkLi5lYjliNjJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtNDI3LDYgKzQyOCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvZygiIElucHV0IERldmljZSA6IE5hbWUgb2YgUHJvcGVydHkgaXM6IiArIHByb3BWYWx1ZXNbMF0pOworICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShhZGRyZXNzLCBzdGF0ZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tQYWlyaW5nUmVxdWVzdEFuZEdldEFkZHJlc3MoU3RyaW5nIG9iamVjdFBhdGgsIGludCBuYXRpdmVEYXRhKSB7CiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKG9iamVjdFBhdGgpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CkBAIC01NzMsNiArNTg4LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gb25BZ2VudEF1dGhvcml6ZShTdHJpbmcgb2JqZWN0UGF0aCwgU3RyaW5nIGRldmljZVV1aWQpIHsKKyAgICAgICAgaWYgKCFtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSkgcmV0dXJuIGZhbHNlOworCiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKG9iamVjdFBhdGgpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZ2V0IGRldmljZSBhZGRyZXNzIGluIG9uQXV0aEFnZW50QXV0aG9yaXplIik7CkBAIC01ODEsMTUgKzU5OCwxNSBAQAogCiAgICAgICAgIGJvb2xlYW4gYXV0aG9yaXplZCA9IGZhbHNlOwogICAgICAgICBQYXJjZWxVdWlkIHV1aWQgPSBQYXJjZWxVdWlkLmZyb21TdHJpbmcoZGV2aWNlVXVpZCk7Ci0gICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKIAogICAgICAgICAvLyBCbHVleiBzZW5kcyB0aGUgVVVJRCBvZiB0aGUgbG9jYWwgc2VydmljZSBiZWluZyBhY2Nlc3NlZCwgX25vdF8gdGhlCiAgICAgICAgIC8vIHJlbW90ZSBzZXJ2aWNlCi0gICAgICAgIGlmIChtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBCbHVldG9vdGhVdWlkLmlzQWR2QXVkaW9EaXN0KHV1aWQpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoYWRkcmVzcykpIHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGlmICgoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQorICAgICAgICAgICAgICB8fCBCbHVldG9vdGhVdWlkLmlzQWR2QXVkaW9EaXN0KHV1aWQpKSAmJgorICAgICAgICAgICAgICAhaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RpbmdTdGF0ZShhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOworCiAgICAgICAgICAgICBhdXRob3JpemVkID0gYTJkcC5nZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGOwogICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBbGxvd2luZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKQEAgLTU5Nyw2ICs2MTQsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVqZWN0aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aFV1aWQuaXNJbnB1dERldmljZSh1dWlkKSAmJiAhaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKGFkZHJlc3MpKSB7CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZSBpbnB1dERldmljZSA9IG5ldyBCbHVldG9vdGhJbnB1dERldmljZShtQ29udGV4dCk7CisgICAgICAgICAgICBhdXRob3JpemVkID0gaW5wdXREZXZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID4KKyAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkY7CisgICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsKKyAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWxsb3dpbmcgaW5jb21pbmcgSElEIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVqZWN0aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNjA0LDcgKzYzMCwxOSBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKLSAgICBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwogICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gYTJkcC5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpOwogICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwpAQCAtNjU1LDYgKzY5MywyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdC4gU3RhdGUgaXM6IiArIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoYWRkcmVzcywgY29ubmVjdGVkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBvblJlc3RhcnRSZXF1aXJlZCgpIHsKICAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICIqKiogQSBzZXJpb3VzIGVycm9yIG9jY3VyZWQgKGRpZCBibHVldG9vdGhkIGNyYXNoPykgLSAiICsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCmluZGV4IGYwMDM4OWIuLmFjZmMwZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQpAQCAtMjQsMTYgKzI0LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ2xhc3M7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhJbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTb2NrZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTcwLDggKzczLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBCbHVldG9vdGhTZXJ2aWNlIGV4dGVuZHMgSUJsdWV0b290aC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFNlcnZpY2UiOwpAQCAtMTI3LDggKzEzMiwxMSBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZT4gbURldmljZVByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtQTJkcFByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IaWRQcm9maWxlU3RhdGU7CiAKICAgICBwcml2YXRlIEJsdWV0b290aEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBtSW5wdXREZXZpY2VzOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1Eb2NrQWRkcmVzczsKICAgICBwcml2YXRlIFN0cmluZyBtRG9ja1BpbjsKIApAQCAtMTg5LDE1ICsxOTcsMTggQEAKICAgICAgICAgbURldmljZVByb2ZpbGVTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlPigpOwogICAgICAgICBtQTJkcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5BMkRQKTsKICAgICAgICAgbUhmcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5IRlApOworICAgICAgICBtSGlkUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhJRCk7CiAKICAgICAgICAgbUhmcFByb2ZpbGVTdGF0ZS5zdGFydCgpOwogICAgICAgICBtQTJkcFByb2ZpbGVTdGF0ZS5zdGFydCgpOworICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CiAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgcmVnaXN0ZXJGb3JBaXJwbGFuZU1vZGUoZmlsdGVyKTsKIAogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fRE9DS19FVkVOVCk7CiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICBtSW5wdXREZXZpY2VzID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPigpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyByZWFkRG9ja0JsdWV0b290aEFkZHJlc3MoKSB7CkBAIC02NjgsNiArNjc5LDEwIEBACiAgICAgICAgICAgICAgICAgcmVtb3ZlUHJvZmlsZVN0YXRlKGFkZHJlc3MpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBISUQgaXMgaGFuZGxlZCBieSBCbHVldG9vdGhTZXJ2aWNlLCBvdGhlciBwcm9maWxlcworICAgICAgICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgc2VydmljZXMuCisgICAgICAgICAgICBzZXRJbml0aWFsSW5wdXREZXZpY2VQcmlvcml0eShtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyksIHN0YXRlKTsKKwogICAgICAgICAgICAgaWYgKERCRykgbG9nKGFkZHJlc3MgKyAiIGJvbmQgc3RhdGUgIiArIG9sZFN0YXRlICsgIiAtPiAiICsgc3RhdGUgKyAiICgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gKyAiKSIpOwogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQpOwpAQCAtMTIyMCw2ICsxMjM1LDE2NyBAQAogICAgICAgICByZXR1cm4gc3AuY29udGFpbnMoU0hBUkVEX1BSRUZFUkVOQ0VfRE9DS19BRERSRVNTICsgYWRkcmVzcyk7CiAgICAgfQogCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkNPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmICghY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuRElTQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoCisgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRH0pOworICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qcGFja2FnZSovc3luY2hyb25pemVkIFNldDxCbHVldG9vdGhEZXZpY2U+IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBpbnB1dERldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1JbnB1dERldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBpbnB1dERldmljZVN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gaW5wdXREZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyB8fAorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbm5lY3RlZCBvciBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuCisgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5CisgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJJbnB1dERldmljZSBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CisKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIGFkZHJlc3MsIGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNvbm5lY3RlZCA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTIxMDMsNCArMjI3OSw2IEBACiAgICAgICAgICAgICBzaG9ydCBjaGFubmVsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRMaW5rVGltZW91dE5hdGl2ZShTdHJpbmcgcGF0aCwgaW50IG51bV9zbG90cyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQppbmRleCBlNGY5MzRlLi5lYWNkNDBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworCiAvKioKICAqIEFjY2VzcyB0aGUgSUNVIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKiBAaGlkZQpAQCAtNDQsNSArNDYsMTMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBydW4gZGlyZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUgd2l0aGluIGEgcGFyYWdyYXBoLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBiYXNlIGxpbmUgZGlyZWN0aW9uLCBlaXRoZXIgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUIG9yCisgICAgICogICAgIExheW91dC5ESVJfUklHSFRfVE9fTEVGVAorICAgICAqIEBwYXJhbSBsZXZlbHMgbGV2ZWxzIGFzIHJldHVybmVkIGZyb20ge0BsaW5rICNiaWRpfQorICAgICAqIEBwYXJhbSBsc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGxldmVscyBhcnJheQorICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5ICh1c2VkIHRvIGRldGVybWluZSB3aGl0ZXNwYWNlKQorICAgICAqIEBwYXJhbSBjc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBjaGFycyBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpcmVjdGlvbnMgZGlyZWN0aW9ucyhpbnQgZGlyLCBieXRlW10gbGV2ZWxzLCBpbnQgbHN0YXJ0LAorICAgICAgICAgICAgY2hhcltdIGNoYXJzLCBpbnQgY3N0YXJ0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaW50IGJhc2VMZXZlbCA9IGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgPyAwIDogMTsKKyAgICAgICAgaW50IGN1ckxldmVsID0gbGV2ZWxzW2xzdGFydF07CisgICAgICAgIGludCBtaW5MZXZlbCA9IGN1ckxldmVsOworICAgICAgICBpbnQgcnVuQ291bnQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0ICsgMSwgZSA9IGxzdGFydCArIGxlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGZpbmFsIHJ1biBmb3IgdHJhaWxpbmcgY291bnRlci1kaXJlY3Rpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgIGludCB2aXNMZW4gPSBsZW47CisgICAgICAgIGlmICgoY3VyTGV2ZWwgJiAxKSAhPSAoYmFzZUxldmVsICYgMSkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHZpc2libGUgZW5kCisgICAgICAgICAgICB3aGlsZSAoLS12aXNMZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tjc3RhcnQgKyB2aXNMZW5dOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgLS12aXNMZW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Zpc0xlbjsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5Db3VudCA9PSAxICYmIG1pbkxldmVsID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSwgb25seSBvbmUgcnVuIG9uIHRoaXMgbGluZQorICAgICAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBsZCA9IG5ldyBpbnRbcnVuQ291bnQgKiAyXTsKKyAgICAgICAgaW50IG1heExldmVsID0gbWluTGV2ZWw7CisgICAgICAgIGludCBsZXZlbEJpdHMgPSBtaW5MZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCBvZiBmaXJzdCBwYWlyIGlzIGFsd2F5cyAwLCB3ZSB3cml0ZQorICAgICAgICAgICAgLy8gbGVuZ3RoIHRoZW4gc3RhcnQgYXQgZWFjaCBuZXcgcnVuLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJ1biBsZW5ndGggYWZ0ZXIgd2UncmUgZG9uZS4KKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbHN0YXJ0OworICAgICAgICAgICAgY3VyTGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQsIGUgPSBsc3RhcnQgKyB2aXNMZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWluTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGlnbm9yZSBydW4gbGVuZ3RoIGxpbWl0IG9mIDJeUlVOX0xFVkVMX1NISUZUCisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSAoaSAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gaSAtIGxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCaXRzID0gY3VyTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGRbbl0gPSAobHN0YXJ0ICsgdmlzTGVuIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICBpZiAodmlzTGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IHZpc0xlbjsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gKGxlbiAtIHZpc0xlbikgfCAoYmFzZUxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc3dhcCBhbnkgcnVucy4KKyAgICAgICAgLy8gSWYgdGhlIG1pbiBsZXZlbCBydW4gZGlyZWN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGJhc2UKKyAgICAgICAgLy8gZGlyZWN0aW9uLCB3ZSBhbHdheXMgbmVlZCB0byBzd2FwIChhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBydW4pLgorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IG5lZWQgdG8gc3dhcCB0aGUgbG93ZXN0IGxldmVsLgorICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gbG9naWNhbGx5IGFkamFjZW50IHJ1bnMgYXQgdGhlIHNhbWUKKyAgICAgICAgLy8gbGV2ZWwsIGlmIHRoZSBtYXggbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIChuZXcpIG1pbgorICAgICAgICAvLyBsZXZlbCwgd2UgaGF2ZSBhIHNlcmllcyBvZiBhbHRlcm5hdGluZyBsZXZlbHMgdGhhdAorICAgICAgICAvLyBpcyBhbHJlYWR5IGluIG9yZGVyLCBzbyB0aGVyZSdzIG5vIG1vcmUgdG8gZG8uCisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gc3dhcDsKKyAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgbWluTGV2ZWwgKz0gMTsKKyAgICAgICAgICAgIHN3YXAgPSBtYXhMZXZlbCA+IG1pbkxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dhcCA9IHJ1bkNvdW50ID4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3dhcCkgeworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSBtYXhMZXZlbCAtIDE7IGxldmVsID49IG1pbkxldmVsOyAtLWxldmVsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzW2xkW2ldXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGUgPSBpICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlIDwgbGQubGVuZ3RoICYmIGxldmVsc1tsZFtlXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBpLCBoaSA9IGUgLSAyOyBsb3cgPCBoaTsgbG93ICs9IDIsIGhpIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGxkW2xvd107IGxkW2xvd10gPSBsZFtoaV07IGxkW2hpXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxkW2xvdysxXTsgbGRbbG93KzFdID0gbGRbaGkrMV07IGxkW2hpKzFdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMobGQpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgcnVuQmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgYm9vbGVhbiBoYXZlSW5mbyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKaW5kZXggOTQ0ZjczNS4uOTMwOWIwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCkBAIC0yMDgsMTEgKzIwOCwxMSBAQAogICAgICAgICAgICAgICogd2lkdGggYmVjYXVzZSB0aGUgd2lkdGggdGhhdCB3YXMgcGFzc2VkIGluIHdhcyBmb3IgdGhlCiAgICAgICAgICAgICAgKiBmdWxsIHRleHQsIG5vdCB0aGUgZWxsaXBzaXplZCBmb3JtLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgbU1heCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBtTWF4ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKG51bGwpKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5jbHVkZXBhZCkgewpAQCAtMjc2LDE0ICsyNzYsMTMgQEAKICAgICAgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm0gPSBuZXcgTWV0cmljcygpOwogICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW50IHdpZDsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIHdpZCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgZm0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbS53aWR0aCA9IHdpZDsKKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBmbS53aWR0aCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhmbSkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKKwogICAgICAgICAgICAgcmV0dXJuIGZtOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zODksNyArMzg4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljcyBleHRlbmRzIFBhaW50LkZvbnRNZXRyaWNzSW50IHsKICAgICAgICAgcHVibGljIGludCB3aWR0aDsKLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgd2lkdGg9IiArIHdpZHRoOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCmluZGV4IDUyMDM5YWYuLjBiMjM5Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0xNiw3MyArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogLyoqCi0gKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCi0gKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KLSAqCi0gKiA8cD4KLSAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAotICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgotICoKLSAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQGRlcHJlY2F0ZWQgT2xkIHRleHQtb25seSBpbnRlcmFjZSB0byB0aGUgY2xpcGJvYXJkLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXJ9IGZvciB0aGUgbW9kZXJuIEFQSS4KICAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7Ci0gICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOwotICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqIHtAaGlkZX0gKi8KLSAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCitARGVwcmVjYXRlZAorcHVibGljIGFic3RyYWN0IGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQogICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgogICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldENsaXBib2FyZFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2VydmljZSgpLnNldENsaXBib2FyZFRleHQodGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzQ2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1RleHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKaW5kZXggMTRlNTY1NS4uYjZhYTAzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKQEAgLTMxMCw3ICszMTAsNiBAQAogCiAgICAgICAgIERpcmVjdGlvbnNbXSBvYmplY3RzID0gbmV3IERpcmVjdGlvbnNbMV07CiAKLQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgaW50c1tTVEFSVF0gPSByZWZsb3dlZC5nZXRMaW5lU3RhcnQoaSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmbG93ZWQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpIDw8IERJUl9TSElGVCkgfApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKaW5kZXggYzNiZDBhZS4uZDQyNmQxMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQpAQCAtMzQsMTMgKzM0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcCk7CiAKICAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIENhbnZhcyNkcmF3VGV4dFJ1bn0uCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApOworCisgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I21lYXN1cmVUZXh0fS4KICAgICAgKi8KICAgICBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApOwogCi0KICAgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRXaWR0aHN9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkFkdmFuY2VzfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwgUGFpbnQgcGFpbnQpOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQ3Vyc29yfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgY3Vyc29yT3B0LCBQYWludCBwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWI1YzguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi0vKioKLSAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZwotICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQ2xpcGJvYXJkIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQuICBJdCB3aWxsIGV2ZW50dWFsbHkgYmUgcG9zc2libGUKLSAgICAgKiB0byBzdG9yZSB0eXBlcyBvdGhlciB0aGFuIHRleHQgdG9vLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHRleHQuCi0gICAgICovCi0gICAgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LgotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpcGJvYXJkVGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCmluZGV4IDM4YWM5YjcuLjA0NjZjNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQpAQCAtMTYsMjkgKzE2LDMzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCi1pbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuKjsKK2ltcG9ydCBhbmRyb2lkLmVtb2ppLkVtb2ppRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lQmFja2dyb3VuZFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCi0gKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbiAKLSAqIHRoZSBzY3JlZW4uIAotICogPHA+Rm9yIHRleHQgdGhhdCB3aWxsIGJlIGVkaXRlZCwgdXNlIGEge0BsaW5rIER5bmFtaWNMYXlvdXR9LCAKLSAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLiAgCisgKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbgorICogdGhlIHNjcmVlbi4KKyAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwKKyAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLgogICogRm9yIHRleHQgdGhhdCB3aWxsIG5vdCBjaGFuZ2UsIHVzZSBhIHtAbGluayBTdGF0aWNMYXlvdXR9LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF5b3V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyYWdyYXBoU3R5bGVbXSBOT19QQVJBX1NQQU5TID0KICAgICAgICAgQXJyYXlVdGlscy5lbXB0eUFycmF5KFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKIApAQCAtNTQsOSArNTgsNyBAQAogICAgICAgICAgICAgTUlOX0VNT0pJID0gLTE7CiAgICAgICAgICAgICBNQVhfRU1PSkkgPSAtMTsKICAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFJlY3RGIG1FbW9qaVJlY3Q7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGhvdyB3aWRlIGEgbGF5b3V0IG11c3QgYmUgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUKQEAgLTY2LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgcmV0dXJuIGdldERlc2lyZWRXaWR0aChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgcGFpbnQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCiAgICAgICogc3BlY2lmaWVkIHRleHQgc2xpY2Ugd2l0aCBvbmUgbGluZSBwZXIgcGFyYWdyYXBoLgpAQCAtODUsOCArODcsNyBAQAogICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7CiAKICAgICAgICAgICAgIC8vIG5vdGUsIG9taXRzIHRyYWlsaW5nIHBhcmFncmFwaCBjaGFyCi0gICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGksIG5leHQsIG51bGwsIHRydWUsIG51bGwpOworICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVQYXJhKHBhaW50LCB3b3JrUGFpbnQsIHNvdXJjZSwgaSwgbmV4dCk7CiAKICAgICAgICAgICAgIGlmICh3ID4gbmVlZCkKICAgICAgICAgICAgICAgICBuZWVkID0gdzsKQEAgLTExNiw2ICsxMTcsMTUgQEAKICAgICAgICAgaWYgKHdpZHRoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxheW91dDogIiArIHdpZHRoICsgIiA8IDAiKTsKIAorICAgICAgICAvLyBFbnN1cmUgcGFpbnQgZG9lc24ndCBoYXZlIGJhc2VsaW5lU2hpZnQgc2V0LgorICAgICAgICAvLyBXaGlsZSBub3JtYWxseSB3ZSBkb24ndCBtb2RpZnkgdGhlIHBhaW50IHRoZSB1c2VyIHBhc3NlZCBpbiwKKyAgICAgICAgLy8gd2Ugd2VyZSBhbHJlYWR5IGRvaW5nIHRoaXMgaW4gU3R5bGVkLmRyYXdVbmlmb3JtUnVuIHdpdGggYm90aAorICAgICAgICAvLyBiYXNlbGluZVNoaWZ0IGFuZCBiZ0NvbG9yLiAgV2UgcHJvYmFibHkgc2hvdWxkIHJlZXZhbHVhdGUgYmdDb2xvci4KKyAgICAgICAgaWYgKHBhaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOworICAgICAgICAgICAgcGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgIH0KKwogICAgICAgICBtVGV4dCA9IHRleHQ7CiAgICAgICAgIG1QYWludCA9IHBhaW50OwogICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOwpAQCAtMTc1LDcgKzE4NSw2IEBACiAgICAgICAgICAgICBkYm90dG9tID0gc1RlbXBSZWN0LmJvdHRvbTsKICAgICAgICAgfQogCi0KICAgICAgICAgaW50IHRvcCA9IDA7CiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGdldExpbmVDb3VudCgpKTsKIApAQCAtMTg1LDI2ICsxOTQsMjggQEAKICAgICAgICAgaWYgKGRib3R0b20gPCBib3R0b20pIHsKICAgICAgICAgICAgIGJvdHRvbSA9IGRib3R0b207CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBmaXJzdCA9IGdldExpbmVGb3JWZXJ0aWNhbCh0b3ApOyAKKworICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsKICAgICAgICAgaW50IGxhc3QgPSBnZXRMaW5lRm9yVmVydGljYWwoYm90dG9tKTsKLSAgICAgICAgCisKICAgICAgICAgaW50IHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICBpbnQgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKLSAgICAgICAgCisKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbVBhaW50OwogICAgICAgICBDaGFyU2VxdWVuY2UgYnVmID0gbVRleHQ7CiAgICAgICAgIGludCB3aWR0aCA9IG1XaWR0aDsKICAgICAgICAgYm9vbGVhbiBzcGFubmVkVGV4dCA9IG1TcGFubmVkVGV4dDsKIAogICAgICAgICBQYXJhZ3JhcGhTdHlsZVtdIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgaW50IHNwYW5lbmQgPSAwOworICAgICAgICBpbnQgc3BhbkVuZCA9IDA7CiAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gMDsKIAogICAgICAgICAvLyBGaXJzdCwgZHJhdyBMaW5lQmFja2dyb3VuZFNwYW5zLgotICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50IG9yIGRpcmVjdGlvbiBvZgotICAgICAgICAvLyB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PworICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50LCBtYXJnaW5zLCBvcgorICAgICAgICAvLyBkaXJlY3Rpb24gb2YgdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gVGhleSBhcmUgZXZhbHVhdGVkIGF0IGVhY2ggbGluZS4KICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKICAgICAgICAgICAgIHRleHRMZW5ndGggPSBidWYubGVuZ3RoKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcHJldmlvdXNMaW5lRW5kOwpAQCAtMjE2LDEyICsyMjcsMTQgQEAKICAgICAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOwotICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIHNwYW5lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBpbmZyZXF1ZW50LCBzbyB3ZSdsbCB1c2UgdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgYXMgb2Z0ZW4uCisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxsIExpbmVCYWNrZ3JvdW5kU3BhbnMgb24gYSBsaW5lIGNvbnRyaWJ1dGUgdG8gaXRzCisgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zLmxlbmd0aDsgbisrKSB7CkBAIC0yMzQsMTEgKzI0NywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlc2V0IHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICAgICAgc3BhbmVuZCA9IDA7CisgICAgICAgICAgICBzcGFuRW5kID0gMDsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICAgICAgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKICAgICAgICAgICAgIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgfSAKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhIGhpZ2hsaWdodCBldmVuIHdpdGhvdXQgc3BhbnMgaWYgd2UgYXJlIGRyYXdpbmcKICAgICAgICAgLy8gYSBub24tc3Bhbm5lZCB0cmFuc2Zvcm1hdGlvbiBvZiBhIHNwYW5uZWQgZWRpdGluZyBidWZmZXIuCkBAIC0yNTUsNyArMjY4LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBtQWxpZ25tZW50OwotICAgICAgICAKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBib29sZWFuIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisKICAgICAgICAgLy8gTmV4dCBkcmF3IHRoZSBsaW5lcywgb25lIGF0IGEgdGltZS4KICAgICAgICAgLy8gdGhlIGJhc2VsaW5lIGlzIHRoZSB0b3Agb2YgdGhlIGZvbGxvd2luZyBsaW5lIG1pbnVzIHRoZSBjdXJyZW50CiAgICAgICAgIC8vIGxpbmUncyBkZXNjZW50LgpAQCAtMjcwLDE5ICsyODcsMzAgQEAKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CiAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7IAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwIHx8IGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQYXJhTGluZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb21wdXRlIHRoZSBhbGlnbm1lbnQuCi0gICAgICAgICAgICAgICAgLy8gTGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CisKKyAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaXJzdFBhcmFMaW5lID0gKHN0YXJ0ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKTsKKworICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb2xsZWN0IGludG8gc3BhbnMgYXJyYXkuCisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYWxpZ25tZW50LCBsYXN0IGFsaWdubWVudCBzdHlsZSB3aW5zLgorICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRhYlN0b3BzLCB3ZSdsbCByZWJ1aWxkIGlmIHdlIGVuY291bnRlciBhIGxpbmUgd2l0aAorICAgICAgICAgICAgICAgIC8vIHRhYnMuCisgICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHBhcmFncmFwaCBzcGFucyB0byBiZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIHVzZQorICAgICAgICAgICAgICAgIC8vIHNwYW5FbmQgc28gdGhhdCB3ZSBjYW4gY2hlY2sgbGVzcyBmcmVxdWVudGx5LiAgU2luY2UKKyAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggc3R5bGVzIG91Z2h0IHRvIGFwcGx5IHRvIGVudGlyZSBwYXJhZ3JhcGhzLCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbGxlY3QgdGhlIG9uZXMgcHJlc2VudCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAvLyBJZiBzcGFuRW5kIGlzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGgsIHRoYXQncyBub3QKKyAgICAgICAgICAgICAgICAvLyBvdXIgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCAmJiAoaSA9PSBmaXJzdCB8fCBpc0ZpcnN0UGFyYUxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBzdGFydCwgc3BhbkVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOworCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gbUFsaWdubWVudDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IHNwYW5zLmxlbmd0aC0xOyBuID49IDA7IG4tLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zW25dIGluc3RhbmNlb2YgQWxpZ25tZW50U3BhbikgewpAQCAtMjkwLDQ1ICszMTgsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihpKTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKLSAgICAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKIAotICAgICAgICAgICAgLy8gRHJhdyBhbGwgbGVhZGluZyBtYXJnaW4gc3BhbnMuICBBZGp1c3QgbGVmdCBvciByaWdodCBhY2NvcmRpbmcKLSAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhlIGxpbmUuCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNwYW5zLmxlbmd0aDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBtYXJnaW4gPSAoTGVhZGluZ01hcmdpblNwYW4pIHNwYW5zW25dOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VGaXJzdExpbmVNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpIG1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwLmdldFNwYW5TdGFydChtYXJnaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBpIDwgc3RhcnRMaW5lICsgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIHJpZ2h0LCBkaXIsIGx0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiYXNlbGluZSwgbGJvdHRvbSwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBpc0ZpcnN0UGFyYUxpbmUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbihpc0ZpcnN0UGFyYUxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi5kcmF3TGVhZGluZ01hcmdpbihjLCBwYWludCwgbGVmdCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbWFyZ2luKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1hcmdpbiA9IGNvdW50ID4gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBwb2ludCBhdCB3aGljaCB0byBzdGFydCByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZQotICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CisgICAgICAgICAgICAvLyBDYW4ndCB0ZWxsIGlmIHdlIGhhdmUgdGFicyBmb3Igc3VyZSwgY3VycmVudGx5CisgICAgICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSAmJiAhdGFiU3RvcHNJc0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhYlN0b3BzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzLnJlc2V0KFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFiU3RvcHNJc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgewogICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKQEAgLTMzNyw0MSArMzY5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVNYXgoaSwgc3BhbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGksIHRhYlN0b3BzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCArIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gbWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgotICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYgPSAocmlnaHQgLSBsZWZ0IC0gbWF4KSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBoYWxmOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgICAgICB4ID0gKHJpZ2h0ICsgbGVmdCAtIG1heCkgPj4gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGkpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWIgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CiAgICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUICYmCi0gICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIXNwYW5uZWRUZXh0ICYmICFoYXNUYWJPckVtb2ppKSB7CiAgICAgICAgICAgICAgICAgLy8gWFhYOiBhc3N1bWVzIHRoZXJlJ3Mgbm90aGluZyBhZGRpdGlvbmFsIHRvIGJlIGRvbmUKICAgICAgICAgICAgICAgICBjLmRyYXdUZXh0KGJ1Ziwgc3RhcnQsIGVuZCwgeCwgbGJhc2VsaW5lLCBwYWludCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRyYXdUZXh0KGMsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sIHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICBoYXNUYWIsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB0bC5zZXQocGFpbnQsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgICAgICAgICAgdGwuZHJhdyhjLCB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZSwgZ2l2ZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcworICAgICAqIG9mIHRoZSBtYXJnaW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBib3VuZHMgKDAsIG9yIGxlYWRpbmcgbWFyZ2luIGlmIGx0ciBwYXJhKQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgYm91bmRzICh3aWR0aCwgbWludXMgbGVhZGluZyBtYXJnaW4gaWYgcnRsIHBhcmEpCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUgKHRvIHJpZ2h0IG9mIGxpbmUgaWYgcnRsIHBhcmEpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVN0YXJ0UG9zKGludCBsaW5lLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgIEFsaWdubWVudCBhbGlnbiA9IGdldFBhcmFncmFwaEFsaWdubWVudChsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IHJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCAmJiBnZXRMaW5lQ29udGFpbnNUYWIobGluZSkpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgbVRleHQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHNwYW5uZWQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJTcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHN0YXJ0LCBzcGFuRW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKHRhYlNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFiU3BhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVFeHRlbnQobGluZSwgdGFiU3RvcHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCAtIG1heDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7CisgICAgICAgICAgICAgICAgeCA9IChsZWZ0ICsgcmlnaHQgLSBtYXgpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MTcsNyArNDg4LDcgQEAKIAogICAgICAgICBtV2lkdGggPSB3aWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhpcyBsYXlvdXQuCiAgICAgICovCkBAIC00NTAsNyArNTIxLDcgQEAKICAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0ZXh0IGluIHRoaXMgbGF5b3V0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZUNvdW50KCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGJhc2VsaW5lIGZvciB0aGUgc3BlY2lmaWVkIGxpbmUgKDAmaGVsbGlwO2dldExpbmVDb3VudCgpIC0gMSkKICAgICAgKiBJZiBib3VuZHMgaXMgbm90IG51bGwsIHJldHVybiB0aGUgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIGV4dGVudHMKQEAgLTUyNCwxMyArNTk1LDk1IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRCb3R0b21QYWRkaW5nKCk7CiAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCBhbmQgdGhlIHByZWNlZGluZyBjaGFyYWN0ZXIKKyAgICAgKiBhcmUgYXQgZGlmZmVyZW50IHJ1biBsZXZlbHMgKGFuZCB0aHVzIHRoZXJlJ3MgYSBzcGxpdCBjYXJldCkuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0CisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGEgbGV2ZWwgYm91bmRhcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMZXZlbEJvdW5kYXJ5KGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpZiAoZGlycyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUIHx8IGRpcnMgPT0gRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gcnVucyA9IGRpcnMubURpcmVjdGlvbnM7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQgfHwgb2Zmc2V0ID09IGxpbmVFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXJhTGV2ZWwgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICAgICAgaW50IHJ1bkluZGV4ID0gb2Zmc2V0ID09IGxpbmVTdGFydCA/IDAgOiBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgICAgICByZXR1cm4gKChydW5zW3J1bkluZGV4ICsgMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSykgIT0gcGFyYUxldmVsOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0IC09IGxpbmVTdGFydDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHJ1bnNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMoaW50IG9mZnNldCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpbnRbXSBydW5zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSkubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IGxldmVsQXQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgaW50IGxpbWl0ID0gc3RhcnQgKyAocnVuc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBhdCBzYW1lIGxldmVsLCBzbyBkb24ndCB1c2UgdHJhaWxpbmcuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGV2ZWxBdCA9IChydW5zW2krMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWxBdCA9PSAtMSkgeworICAgICAgICAgICAgLy8gT2Zmc2V0IHdhcyBsaW1pdCBvZiBsaW5lLgorICAgICAgICAgICAgbGV2ZWxBdCA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PSAxID8gMCA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCBsZXZlbCBib3VuZGFyeSwgY2hlY2sgcHJldmlvdXMgbGV2ZWwuCisgICAgICAgIGludCBsZXZlbEJlZm9yZSA9IC0xOworICAgICAgICBpZiAob2Zmc2V0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0IC09IDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgaWYgKGxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhcnQgJiYgb2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsZXZlbEJlZm9yZSA8IGxldmVsQXQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBwcmltYXJ5IGhvcml6b250YWwgcG9zaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGV4dCBvZmZzZXQuCiAgICAgICogVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hlcmUgYSBuZXcgY2hhcmFjdGVyIHdvdWxkIGJlIGluc2VydGVkIGluCiAgICAgICogdGhlIHBhcmFncmFwaCdzIHByaW1hcnkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRQcmltYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgZmFsc2UsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzOSw2NiArNjkyLDQyIEBACiAgICAgICogdGhlIGRpcmVjdGlvbiBvdGhlciB0aGFuIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKG9mZnNldCk7CisgICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgIXRyYWlsaW5nKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQpIHsKKyAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZykgewogICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKIAotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBhbHQsIGxpbmUpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBsaW5lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGludCBsaW5lKSB7CiAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLSAgICAgICAgYm9vbGVhbiB0YWIgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKLSAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gbnVsbDsKLSAgICAgICAgaWYgKHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgd2lkID0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LCBtVGV4dCwgc3RhcnQsIG9mZnNldCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsIHRyYWlsaW5nLCBhbHQsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYk9yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkID0gdGwubWVhc3VyZShvZmZzZXQgLSBzdGFydCwgdHJhaWxpbmcsIG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKIAotICAgICAgICBpZiAob2Zmc2V0ID4gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHdpZCAtPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LCBlbmQsIG9mZnNldCwgbnVsbCwgdGFiLCB0YWJzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aWQgKz0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CiAgICAgICAgIGludCBsZWZ0ID0gZ2V0UGFyYWdyYXBoTGVmdChsaW5lKTsKICAgICAgICAgaW50IHJpZ2h0ID0gZ2V0UGFyYWdyYXBoUmlnaHQobGluZSk7CiAKLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgbWF4ID0gZ2V0TGluZU1heChsaW5lKTsKLQotICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgbWF4ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtIG1heCArIHdpZDsKLSAgICAgICAgfSBlbHNlIHsgLyogYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX0NFTlRFUiAqLwotICAgICAgICAgICAgaW50IGltYXggPSAoKGludCkgbWF4KSAmIH4xOwotCi0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtICgoKHJpZ2h0IC0gbGVmdCkgLSBpbWF4KSAvIDIpICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyICsgd2lkOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRMaW5lU3RhcnRQb3MobGluZSwgbGVmdCwgcmlnaHQpICsgd2lkOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDM4ICs3ODUsNzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQsIGJ1dCBleGNsdWRpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGZsb2F0IG1hcmdpbiA9IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CisgICAgICAgIGZsb2F0IHNpZ25lZEV4dGVudCA9IGdldExpbmVFeHRlbnQobGluZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCi0gICAgICogdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB1bnNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luIGluZGVudCBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZVdpZHRoKGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5lTWF4KGxpbmUsIG51bGwsIHRydWUpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIHRydWUpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSwgT2JqZWN0W10gdGFicywgYm9vbGVhbiBmdWxsKSB7CisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2dldExpbmVFeHRlbnQoaW50LFRhYlN0b3BzLGJvb2xlYW4pfSBidXQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiB0YWIgc3RvcHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lcyBwYXNzZWQgaW4uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZ1bGwgd2hldGhlciB0byBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnQgb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIGJvb2xlYW4gZnVsbCkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQ7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwogCi0gICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZVZpc2libGVFbmQobGluZSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOwotCi0gICAgICAgIGlmICh0YWJzID09IG51bGwgJiYgdGFiICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBpZiAoaGFzVGFic09yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIHJldHVybiBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgc3RhcnQsIGVuZCwgbnVsbCwgdGFiLCB0YWJzKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luLiAgSWYgZnVsbCBpcyBmYWxzZSwgZXhjbHVkZXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGFiU3RvcHMgdGhlIHRhYiBzdG9wcywgY2FuIGJlIG51bGwgaWYgd2Uga25vdyB0aGV5J3JlIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSB0ZXh0IG9uIHRoaXMgbGluZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZUV4dGVudChpbnQgbGluZSwgVGFiU3RvcHMgdGFiU3RvcHMsIGJvb2xlYW4gZnVsbCkgeworICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYnNPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICBmbG9hdCB3aWR0aCA9IHRsLm1ldHJpY3MobnVsbCk7CisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gd2lkdGg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzgsNyArOTA1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNmaWVkIGxpbmUgd2hvc2UgcG9zaXRpb24gaXMKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNpZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCiAgICAgICogY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkIGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGludCBsaW5lLCBmbG9hdCBob3JpeikgewpAQCAtNzUyLDE0ICs5MTksMTMgQEAKICAgICAgICAgaW50IGJlc3QgPSBtaW47CiAgICAgICAgIGZsb2F0IGJlc3RkaXN0ID0gTWF0aC5hYnMoZ2V0UHJpbWFyeUhvcml6b250YWwoYmVzdCkgLSBob3Jpeik7CiAKLSAgICAgICAgaW50IGhlcmUgPSBtaW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpbnQgc3dhcCA9ICgoaSAmIDEpID09IDApID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbWluICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGludCBzd2FwID0gKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9SVExfRkxBRykgIT0gMCA/IC0xIDogMTsKIAogICAgICAgICAgICAgaWYgKHRoZXJlID4gbWF4KQogICAgICAgICAgICAgICAgIHRoZXJlID0gbWF4OwotCiAgICAgICAgICAgICBpbnQgaGlnaCA9IHRoZXJlIC0gMSArIDEsIGxvdyA9IGhlcmUgKyAxIC0gMSwgZ3Vlc3M7CiAKICAgICAgICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewpAQCAtNzkyLDcgKzk1OCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IGJlc3RkaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsgICAKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTgwMiw4ICs5NjgsNiBAQAogICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKG1heCkgLSBob3Jpeik7CkBAIC04MjMsMTkgKzk4NywxNSBAQAogICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKICAgICB9CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCBhZnRlciB0aGUgbGFzdCB2aXNpYmxlIGNoYXJhY3RlciAoc28gd2hpdGVzcGFjZQogICAgICAqIGlzIG5vdCBjb3VudGVkKSBvbiB0aGUgc3BlY2lmaWVkIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSkgewogICAgICAgICByZXR1cm4gZ2V0TGluZVZpc2libGVFbmQobGluZSwgZ2V0TGluZVN0YXJ0KGxpbmUpLCBnZXRMaW5lU3RhcnQobGluZSsxKSk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShnZXRMaW5lU3RhcnQobGluZSkgPT0gc3RhcnQgJiYgZ2V0TGluZVN0YXJ0KGxpbmUrMSkgPT0gZW5kKTsKLSAgICAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1UZXh0OwogICAgICAgICBjaGFyIGNoOwogICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpIHsKQEAgLTg4MiwyMDcgKzEwNDIsNjIgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVUb3AobGluZSkgLSAoZ2V0TGluZVRvcChsaW5lKzEpIC0gZ2V0TGluZURlc2NlbnQobGluZSkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyBsZWZ0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9MZWZ0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7Ci0KLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07Ci0KLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotCi0gICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAxMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCB0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgcmlnaHQKLSAgICAgKiAocG9zc2libHkgb250byBhbm90aGVyIGxpbmUpIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRUb1JpZ2h0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQtLTsKKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKGludCBjYXJldCwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KGNhcmV0KTsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpbnQgbGluZURpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICBmbG9hdCBob3JpeiA9IGdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCk7Ci0KLSAgICAgICAgaW50IGJlc3QgPSBvZmZzZXQ7Ci0gICAgICAgIGZsb2F0IGJlc3RoID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBjYW5kaWRhdGU7Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQ7Ci0KLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChoZXJlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgaGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKKyAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IChsaW5lRGlyID09IERJUl9SSUdIVF9UT19MRUZUKTsKKyAgICAgICAgaWYgKGNhcmV0ID09IChhZHZhbmNlID8gbGluZUVuZCA6IGxpbmVTdGFydCkpIHsKKyAgICAgICAgICAgIC8vIHdhbGtpbmcgb2ZmIGxpbmUsIHNvIGxvb2sgYXQgdGhlIGxpbmUgd2UncmUgaGVhZGVkIHRvCisgICAgICAgICAgICBpZiAoY2FyZXQgPT0gbGluZVN0YXJ0KSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tbGluZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXQ7IC8vIGF0IHZlcnkgc3RhcnQsIGRvbid0IG1vdmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsaW5lIDwgZ2V0TGluZUNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGluZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXQ7IC8vIGF0IHZlcnkgZW5kLCBkb24ndCBtb3ZlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgICAgICBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgICAgIGludCBuZXdEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgICAgICBpZiAobmV3RGlyICE9IGxpbmVEaXIpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnVzdWFsIGNhc2UuICB3ZSB3YW50IHRvIHdhbGsgb250byB0aGUgbGluZSwgYnV0IGl0IHJ1bnMKKyAgICAgICAgICAgICAgICAvLyBpbiBhIGRpZmZlcmVudCBkaXJlY3Rpb24gdGhhbiB0aGlzIG9uZSwgc28gd2UgZmFrZSBtb3ZlbWVudAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgdG9MZWZ0ID0gIXRvTGVmdDsKKyAgICAgICAgICAgICAgICBsaW5lRGlyID0gbmV3RGlyOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7CiAgICAgICAgIH0KIAotICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKLSAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgIGJlc3QgPSBlbmQ7Ci0gICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVzdCAhPSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gYmVzdDsKLQotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCi0gICAgICAgIGlmIChkaXIgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIC0xMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCAtMTAwMDApOwotICAgICAgICB9CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIC8vIFhYWDogd2UgZG9uJ3QgY2FyZSBhYm91dCB0YWJzCisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBsaW5lU3RhcnQsIGxpbmVFbmQsIGxpbmVEaXIsIGRpcmVjdGlvbnMsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgY2FyZXQgPSBsaW5lU3RhcnQgKyB0bC5nZXRPZmZzZXRUb0xlZnRSaWdodE9mKGNhcmV0IC0gbGluZVN0YXJ0LCB0b0xlZnQpOworICAgICAgICB0bCA9IFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gY2FyZXQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0QXRTdGFydE9mKGludCBvZmZzZXQpIHsKKyAgICAgICAgLy8gWFhYIHRoaXMgcHJvYmFibHkgc2hvdWxkIHNraXAgbG9jYWwgcmVvcmRlcmluZ3MgYW5kCisgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVycywgbG9vayBhdCBjYWxsZXJzCiAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKICAgICAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMTE1LDcgKzExMzAsNyBAQAogICAgIC8qKgogICAgICAqIEZpbGxzIGluIHRoZSBzcGVjaWZpZWQgUGF0aCB3aXRoIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjdXJzb3IKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gIFRoaXMgd2lsbCBvZnRlbiBiZSBhIHZlcnRpY2FsIGxpbmUKLSAgICAgKiBidXQgY2FuIGJlIG11bHRpcGxlIGRpc2NvbnRpbm91cyBsaW5lcyBpbiB0ZXh0IHdpdGggbXVsdGlwbGUKKyAgICAgKiBidXQgY2FuIGJlIG11bHRpcGxlIGRpc2NvbnRpbnVvdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCiAgICAgICogZGlyZWN0aW9uYWxpdGllcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRDdXJzb3JQYXRoKGludCBwb2ludCwgUGF0aCBkZXN0LApAQCAtMTEyNyw3ICsxMTQyLDggQEAKICAgICAgICAgaW50IGJvdHRvbSA9IGdldExpbmVUb3AobGluZSsxKTsKIAogICAgICAgICBmbG9hdCBoMSA9IGdldFByaW1hcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWY7Ci0gICAgICAgIGZsb2F0IGgyID0gZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOworICAgICAgICBmbG9hdCBoMiA9IGlzTGV2ZWxCb3VuZGFyeShwb2ludCkgPworICAgICAgICAgICAgICAgICAgICBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWYgOiBoMTsKIAogICAgICAgICBpbnQgY2FwcyA9IFRleHRLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoZWRpdGluZ0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pIHwKQEAgLTEyMDQsOSArMTIyMCwxMCBAQAogICAgICAgICBpZiAobGluZWVuZCA+IGxpbmVzdGFydCAmJiBtVGV4dC5jaGFyQXQobGluZWVuZCAtIDEpID09ICdcbicpCiAgICAgICAgICAgICBsaW5lZW5kLS07CiAKLSAgICAgICAgaW50IGhlcmUgPSBsaW5lc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IGhlcmUgPSBsaW5lc3RhcnQgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworCiAgICAgICAgICAgICBpZiAodGhlcmUgPiBsaW5lZW5kKQogICAgICAgICAgICAgICAgIHRoZXJlID0gbGluZWVuZDsKIApAQCAtMTIxNSwxNCArMTIzMiwxMiBAQAogICAgICAgICAgICAgICAgIGludCBlbiA9IE1hdGgubWluKGVuZCwgdGhlcmUpOwogCiAgICAgICAgICAgICAgICAgaWYgKHN0ICE9IGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgxID0gZ2V0SG9yaXpvbnRhbChzdCwgZmFsc2UsIGZhbHNlLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBmYWxzZSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgxID0gZ2V0SG9yaXpvbnRhbChzdCwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMiA9IGdldEhvcml6b250YWwoZW4sIHRydWUsIGxpbmUpOwogCiAgICAgICAgICAgICAgICAgICAgIGRlc3QuYWRkUmVjdChoMSwgdG9wLCBoMiwgYm90dG9tLCBQYXRoLkRpcmVjdGlvbi5DVyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNTcsNyArMTI3Miw3IEBACiAKICAgICAgICAgICAgIGFkZFNlbGVjdGlvbihzdGFydGxpbmUsIHN0YXJ0LCBnZXRMaW5lRW5kKHN0YXJ0bGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCBnZXRMaW5lQm90dG9tKHN0YXJ0bGluZSksIGRlc3QpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oc3RhcnRsaW5lKSA9PSBESVJfUklHSFRfVE9fTEVGVCkKICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoZ2V0TGluZUxlZnQoc3RhcnRsaW5lKSwgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBQYXRoLkRpcmVjdGlvbi5DVyk7CkBAIC0xMjkzLDcgKzEzMDgsNyBAQAogCiAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICBBbGlnbm1lbnRTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCisgICAgICAgICAgICBBbGlnbm1lbnRTcGFuW10gc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgZ2V0TGluZVN0YXJ0KGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudFNwYW4uY2xhc3MpOwogCkBAIC0xMzEwLDQyMiArMTMyNSwxNzMgQEAKICAgICAgKiBHZXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFncmFwaCwgaW5zZXQgYnkgbGVmdCBtYXJnaW5zLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoTGVmdChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCBsZWZ0ID0gMDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0gICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXJnaW4gPSBwYXI7Ci0gICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IGNvdW50ID49IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4obWFyZ2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgfHwgIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQ7IC8vIGxlYWRpbmcgbWFyZ2luIGhhcyBubyBpbXBhY3QsIG9yIG5vIHN0eWxlcwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIHJldHVybiBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFncmFwaCwgaW5zZXQgYnkgcmlnaHQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaFJpZ2h0KGludCBsaW5lKSB7Ci0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOwotCi0gICAgICAgIGJvb2xlYW4gcGFyID0gZmFsc2U7Ci0gICAgICAgIGludCBvZmYgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGlmIChvZmYgPT0gMCB8fCBtVGV4dC5jaGFyQXQob2ZmIC0gMSkgPT0gJ1xuJykKLSAgICAgICAgICAgIHBhciA9IHRydWU7Ci0KLQotICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IHNwYW5zW2ldLmdldExlYWRpbmdNYXJnaW4ocGFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgfHwgIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByaWdodDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHJhd1RleHQoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHBhcnNwYW5zKSB7Ci0gICAgICAgIGNoYXJbXSBidWY7Ci0gICAgICAgIGlmICghaGFzVGFicykgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShESVJfTEVGVF9UT19SSUdIVCA9PSBkaXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZiA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IDA7Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBidWZbal0gPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCAoaSAmIDEpICE9IDAsIHggKyBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqICE9IGVuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCBwYXJzcGFucyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc1RhYnMgJiYgYnVmW2pdID49IDB4RDgwMCAmJiBidWZbal0gPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEVNT0pJX0ZBQ1RPUlkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoZW1vamkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCAoaSAmIDEpICE9IDAsIHggKyBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbW9qaVJlY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW1vamlSZWN0ID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiwgc3RhcnQgKyBqICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4dEhlaWdodCA9IC13b3JrUGFpbnQuYXNjZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB0ZXh0SGVpZ2h0IC8gYml0bWFwSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdC5zZXQoeCArIGgsIHkgLSB0ZXh0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBoICsgd2lkdGgsIHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoYm0sIG51bGwsIG1FbW9qaVJlY3QsIHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBvZmZzZXQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLQotICAgICAgICBpZiAoaGFzVGFicykgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGlmIChhbHQpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aW9ucy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGFsdCkKLSAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKLQotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcmVjdGlvbnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQgLSBzdGFydCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBoZXJlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhhc1RhYnMgPyBoZXJlIDogdGhlcmU7IGogPD0gdGhlcmU7IGorKykgewotICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFzVGFicyAmJiBqIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW2pdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgaiArIDEgPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBqKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChqID09IHRoZXJlIHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VndzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc3RhcnQgKyBqIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCAmJiAoaSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCAmJiAoaSAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC09IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3cgPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWlsaW5nICYmIG9mZnNldCA8PSBzdGFydCArIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC09IHNlZ3cgLSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICBoIC09IHNlZ3c7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBidWZbal0gPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBzdGFydCArIGopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHRhYnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiArIDIsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiBoOworICAgICAgICByZXR1cm4gcmlnaHQgLSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1lYXN1cmUgd2lkdGggb2YgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lIHRoYXQgaXMga25vd24gdG8gYWxsIGJlCi0gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoZSBwYXJhZ3JhcGggYmFzZSBkaXJlY3Rpb24uIFJldHVybnMgdGhlIHdpZHRoLAotICAgICAqIGFuZCB0aGUgbGluZSBtZXRyaWNzIGluIGZtIGlmIGZtIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCBmb3IgdGhlIHRleHQ7IHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBwYWludCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbgotICAgICAqIEBwYXJhbSB0ZXh0IHRleHQKLSAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUKLSAgICAgKiBAcGFyYW0gZW5kIGxpbWl0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGZtIG9iamVjdCB0byByZXR1cm4gaW50ZWdlciBtZXRyaWNzIGluLCBjYW4gYmUgbnVsbAotICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgaXQgaXMga25vd24gdGhhdCB0aGUgbGluZSBoYXMgdGFicwotICAgICAqIEBwYXJhbSB0YWJzIHRhYiBwb3NpdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGZyb20gc3RhcnQgdG8gZW5kCisgICAgICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIGxlYWRpbmcgbWFyZ2luICh1bnNpZ25lZCkgZm9yIHRoaXMgbGluZSwKKyAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IExlYWRpbmdNYXJnaW5TcGFuIGFuZCBMZWFkaW5nTWFyZ2luU3BhbjIuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBsZWFkaW5nIG1hcmdpbiBvZiB0aGlzIGxpbmUKICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotICAKLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihpbnQgbGluZSkgeworICAgICAgICBpZiAoIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworCisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihsaW5lU3RhcnQsIGxpbmVFbmQsCisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgbGluZVN0YXJ0LCBzcGFuRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBubyBsZWFkaW5nIG1hcmdpbiBzcGFuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgbWFyZ2luID0gMDsKIAotICAgICAgICBpbnQgbGFzdFBvcyA9IDA7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gMDsKLSAgICAgICAgaW50IGFzY2VudCA9IDAsIGRlc2NlbnQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGxpbmVTdGFydCA9PSAwIHx8CisgICAgICAgICAgICBzcGFubmVkLmNoYXJBdChsaW5lU3RhcnQgLSAxKSA9PSAnXG4nOwogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSAwOwotICAgICAgICAgICAgZm0uZGVzY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBwb3MgPSBoYXNUYWJzID8gMCA6IGxlbjsgcG9zIDw9IGxlbjsgcG9zKyspIHsKLSAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW3Bvc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3BTdGFydCA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW4pOworICAgICAgICAgICAgICAgIGludCBzcGFuTGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3BTdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgIHVzZUZpcnN0TGluZU1hcmdpbiA9IGxpbmUgPCBzcGFuTGluZSArIGNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFyZ2luICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1ZiwgcG9zKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbjsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgZmxvYXQgbWVhc3VyZVBhcmEoVGV4dFBhaW50IHBhaW50LCBUZXh0UGFpbnQgd29ya1BhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgRElSX1JFUVVFU1RfTFRSKTsKKyAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9uczsKKyAgICAgICAgICAgIGludCBkaXI7CisgICAgICAgICAgICBpZiAobXQubUVhc3kpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgICAgICBkaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSBBbmRyb2lkQmlkaS5kaXJlY3Rpb25zKG10Lm1EaXIsIG10Lm1MZXZlbHMsCisgICAgICAgICAgICAgICAgICAgIDAsIG10Lm1DaGFycywgMCwgbXQubUxlbik7CisgICAgICAgICAgICAgICAgZGlyID0gbXQubURpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIGludCBsZW4gPSBtdC5tTGVuOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVGFicyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGwuc2V0KHBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnMsIHRhYlN0b3BzKTsKKyAgICAgICAgICAgIHJldHVybiB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChwb3MgPT0gbGVuIHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBUYWJTdG9wcyB7CisgICAgICAgIHByaXZhdGUgaW50W10gbVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtTnVtU3RvcHM7CisgICAgICAgIHByaXZhdGUgaW50IG1JbmNyZW1lbnQ7CiAKLSAgICAgICAgICAgICAgICB3aWR0aCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGxhc3RQb3MsIHN0YXJ0ICsgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtKTsKKyAgICAgICAgVGFiU3RvcHMoaW50IGluY3JlbWVudCwgT2JqZWN0W10gc3BhbnMpIHsKKyAgICAgICAgICAgIHJlc2V0KGluY3JlbWVudCwgc3BhbnMpOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICB2b2lkIHJlc2V0KGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICB0aGlzLm1JbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisKKyAgICAgICAgICAgIGludCBucyA9IDA7CisgICAgICAgICAgICBpZiAoc3BhbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHNwYW5zKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFiU3RvcFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnMgPT0gc3RvcHMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gbnN0b3BzID0gbmV3IGludFtucyAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RvcHNbaV0gPSBzdG9wc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuc3RvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wc1tucysrXSA9ICgoVGFiU3RvcFNwYW4pIG8pLmdldFRhYlN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwb3MgIT0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBlbW9qaSwgbXVzdCBoYXZlIGhpdCBhIHRhYgotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRoLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2V0cyB1cCB3b3JrUGFpbnQgd2l0aCB0aGUgZm9udCBvbiB0aGUgZW1vamkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQsIHNvIHRoYXQgd2UgY2FuIGV4dHJhY3QgdGhlIGFzY2VudCBhbmQgc2NhbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlVGV4dCBiZWNhdXNlIHRoZSBlbW9qaSBtaWdodCBoYXZlIGl0cyBvd24gc3R5bGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGluaXRpYWxpemUgd29ya1BhaW50IGhlcmUgYmVjYXVzZSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgaXMgdW5zdHlsZWQgbWVhc3VyZVRleHQgbWlnaHQgbm90IHVzZSB3b3JrUGFpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGFsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBwb3MsIHN0YXJ0ICsgcG9zICsgMSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IChmbG9hdCkgYm0uZ2V0V2lkdGgoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd29ya1BhaW50LmFzY2VudCgpIC8gYm0uZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhZCBhbiBlbW9qaSwgd2UgYnVtcCBwYXN0IHRoZSBzZWNvbmQgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHN0b3BzLCAwLCBucyk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmFzY2VudCA8IGFzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW50ID0gZm0uYXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5kZXNjZW50ID4gZGVzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VudCA9IGZtLmRlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0udG9wIDwgdG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBmbS50b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gZm0uYm90dG9tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB0YWtlIGJpdG1hcCBoZWlnaHQgaW50byBhY2NvdW50IGhlcmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIHNjYWxlZCB0byBtYXRjaCB0aGUgdGV4dCBoZWlnaHQuCisgICAgICAgICAgICAgICAgaWYgKHN0b3BzICE9IHRoaXMubVN0b3BzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubVN0b3BzID0gc3RvcHM7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFBvcyA9IHBvcyArIDE7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1OdW1TdG9wcyA9IG5zOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZtLmFzY2VudCA9IGFzY2VudDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSBkZXNjZW50OwotICAgICAgICAgICAgZm0udG9wID0gdG9wOwotICAgICAgICAgICAgZm0uYm90dG9tID0gYm90dG9tOworICAgICAgICBmbG9hdCBuZXh0VGFiKGZsb2F0IGgpIHsKKyAgICAgICAgICAgIGludCBucyA9IHRoaXMubU51bVN0b3BzOworICAgICAgICAgICAgaWYgKG5zID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdG9wID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID4gaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV4dERlZmF1bHRTdG9wKGgsIG1JbmNyZW1lbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiB3aWR0aDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBuZXh0RGVmYXVsdFN0b3AoZmxvYXQgaCwgaW50IGluYykgeworICAgICAgICAgICAgcmV0dXJuICgoaW50KSAoKGggKyBpbmMpIC8gaW5jKSkgKiBpbmM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3NDcsNyArMTUxMyw3IEBACiAKICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CiAgICAgICAgICAgICBpZiAodGFicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgdGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgdGV4dCwgc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOwogICAgICAgICAgICAgICAgIGFsbHRhYnMgPSB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC0xNzc0LDYgKzE1NDAsMzggQEAKICAgICAgICAgcmV0dXJuIG1TcGFubmVkVGV4dDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1lIGFzIDxjb2RlPnRleHQuZ2V0U3BhbnMoKTwvY29kZT4sIGV4Y2VwdCB3aGVyZQorICAgICAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPiBhcmUgdGhlIHNhbWUgYW5kIGFyZSBub3QKKyAgICAgKiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHRleHQsIGluIHdoaWNoIGNhc2UgYW4gZW1wdHkgYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgY2FzZSB0aGF0IDxjb2RlPmdldFNwYW5zKCk8L2NvZGU+CisgICAgICogb24gYW4gZW1wdHkgcmFuZ2UgcmV0dXJucyB0aGUgc3BhbnMgYWRqYWNlbnQgdG8gdGhhdCByYW5nZSwgd2hpY2ggaXMKKyAgICAgKiBwcmltYXJpbHkgZm9yIHRoZSBzYWtlIG9mIDxjb2RlPlRleHRXYXRjaGVyczwvY29kZT4gc28gdGhleSB3aWxsIGdldAorICAgICAqIG5vdGlmaWNhdGlvbnMgd2hlbiB0ZXh0IGdvZXMgZnJvbSBlbXB0eSB0byBub24tZW1wdHkuICBCdXQgaXQgYWxzbworICAgICAqIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3QgdGhhdCBpZiB0aGUgdGV4dCBlbmRzIHdpdGggYW4gZW1wdHkKKyAgICAgKiBwYXJhZ3JhcGgsIHRoYXQgcGFyYWdyYXBoIGFjY2lkZW50YWxseSBwaWNrcyB1cCB0aGUgc3R5bGVzIG9mIHRoZQorICAgICAqIHByZWNlZGluZyBwYXJhZ3JhcGggKGV2ZW4gdGhvdWdoIHRob3NlIHN0eWxlcyB3aWxsIG5vdCBiZSBwaWNrZWQgdXAKKyAgICAgKiBieSBuZXcgdGV4dCB0aGF0IGlzIGluc2VydGVkIGludG8gdGhlIGVtcHR5IHBhcmFncmFwaCkuCisgICAgICogPHA+CisgICAgICogVGhlIHJlYXNvbiBpdCBqdXN0IGNoZWNrcyB3aGV0aGVyIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPgorICAgICAqIGlzIHRoZSBzYW1lIGlzIHRoYXQgdGhlIG9ubHkgdGltZSBhIGxpbmUgY2FuIGNvbnRhaW4gMCBjaGFyYWN0ZXJzCisgICAgICogaXMgaWYgaXQgaXMgdGhlIGZpbmFsIHBhcmFncmFwaCBvZiB0aGUgTGF5b3V0OyBvdGhlcndpc2UgYW55IGxpbmUgd2lsbAorICAgICAqIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHByaW50aW5nIG9yIG5ld2xpbmUgY2hhcmFjdGVyLiAgVGhlIHJlYXNvbiBmb3IgdGhlCisgICAgICogYWRkaXRpb25hbCBjaGVjayBpZiA8Y29kZT5zdGFydDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDAgaXMgdGhhdAorICAgICAqIGlmIHRoZSBlbXB0eSBwYXJhZ3JhcGggaXMgdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBidWZmZXIsIHBhcmFncmFwaAorICAgICAqIHN0eWxlcyB0aGF0IGFyZSBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGJ1ZmZlciB3aWxsIGFwcGx5IHRvIHRleHQgdGhhdAorICAgICAqIGlzIGluc2VydGVkIGludG8gaXQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgPFQ+IFRbXSBnZXRQYXJhZ3JhcGhTcGFucyhTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICBpZiAoc3RhcnQgPT0gZW5kICYmIHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIChUW10pIEFycmF5VXRpbHMuZW1wdHlBcnJheSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIHR5cGUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBlbGxpcHNpemUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdG9mZikgewogICAgICAgICBpbnQgZWxsaXBzaXNDb3VudCA9IGdldEVsbGlwc2lzQ291bnQobGluZSk7CkBAIC0xODA0LDIzICsxNjAyLDIyIEBACiAKICAgICAvKioKICAgICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYmlkaXJlY3Rpb25hbCAobGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KQotICAgICAqIHRleHQgd2l0aGluIHRoZSBsYXlvdXQgb2YgYSBsaW5lLiAgVE9ETzogVGhpcyB3b3JrIGlzIG5vdCBjb21wbGV0ZQotICAgICAqIG9yIGNvcnJlY3QgYW5kIHdpbGwgYmUgZmxlc2hlZCBvdXQgaW4gYSBsYXRlciByZXZpc2lvbi4KKyAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdGlvbnMgewotICAgICAgICBwcml2YXRlIHNob3J0W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8vIERpcmVjdGlvbnMgcmVwcmVzZW50cyBkaXJlY3Rpb25hbCBydW5zIHdpdGhpbiBhIGxpbmUgb2YgdGV4dC4KKyAgICAgICAgLy8gUnVucyBhcmUgcGFpcnMgb2YgaW50cyBsaXN0ZWQgaW4gdmlzdWFsIG9yZGVyLCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbi4gIFRoZSBmaXJzdCBpbnQgb2YgZWFjaCBwYWlyIGlzIHRoZSBvZmZzZXQgZnJvbQorICAgICAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgcnVuLiAgVGhlCisgICAgICAgIC8vIHNlY29uZCBpbnQgcmVwcmVzZW50cyBib3RoIHRoZSBsZW5ndGggYW5kIGxldmVsIG9mIHRoZSBydW4uCisgICAgICAgIC8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIGxvd2VyIGJpdHMsIGFjY2Vzc2VkIGJ5IG1hc2tpbmcgd2l0aAorICAgICAgICAvLyBESVJfTEVOR1RIX01BU0suICBUaGUgbGV2ZWwgaXMgaW4gdGhlIGhpZ2hlciBiaXRzLCBhY2Nlc3NlZAorICAgICAgICAvLyBieSBzaGlmdGluZyBieSBESVJfTEVWRUxfU0hJRlQgYW5kIG1hc2tpbmcgYnkgRElSX0xFVkVMX01BU0suCisgICAgICAgIC8vIFRvIHNpbXBseSB0ZXN0IGZvciBhbiBSVEwgZGlyZWN0aW9uLCB0ZXN0IHRoZSBiaXQgdXNpbmcKKyAgICAgICAgLy8gRElSX1JUTF9GTEFHLCBpZiBzZXQgdGhlbiB0aGUgZGlyZWN0aW9uIGlzIHJ0bC4KIAotICAgICAgICAvLyBUaGUgdmFsdWVzIGluIG1EaXJlY3Rpb25zIGFyZSB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgLy8gaW4gdGhlIGxpbmUgdG8gdGhlIG5leHQgZmxpcCBpbiBkaXJlY3Rpb24uICBSdW5zIGF0IGV2ZW4gaW5kaWNlcwotICAgICAgICAvLyBhcmUgbGVmdC10by1yaWdodCwgdGhlIG90aGVycyBhcmUgcmlnaHQtdG8tbGVmdC4gIFNvLCBmb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYSByaWdodC10by1sZWZ0IHJ1biBoYXMgMCBhdCBtRGlyZWN0aW9uc1swXSwKLSAgICAgICAgLy8gc2luY2UgdGhlICdmaXJzdCcgKGx0cikgcnVuIGlzIHplcm8gbGVuZ3RoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgY29kZSBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IGVhY2ggcnVuIGlzIGFkamFjZW50IHRvIHRoZSBwcmV2aW91cwotICAgICAgICAvLyBvbmUsIHByb2dyZXNzaW5nIGluIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uLiAgVGhpcyBpc24ndCBzdWZmaWNpZW50Ci0gICAgICAgIC8vIHRvIGhhbmRsZSBuZXN0ZWQgcnVucywgZm9yIGV4YW1wbGUgbnVtZXJpYyB0ZXh0IGluIGFuIHJ0bCBjb250ZXh0Ci0gICAgICAgIC8vIGluIGFuIGx0ciBwYXJhZ3JhcGguCi0gICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhzaG9ydFtdIGRpcnMpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyBpbnRbXSBtRGlyZWN0aW9uczsKKyAgICAgICAgLyogcGFja2FnZSAqLyBEaXJlY3Rpb25zKGludFtdIGRpcnMpIHsKICAgICAgICAgICAgIG1EaXJlY3Rpb25zID0gZGlyczsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MzEsNiArMTYyOCw3IEBACiAgICAgICogbGluZSBpcyBlbGxpcHNpemVkLCBub3QgZ2V0TGluZVN0YXJ0KCkuKQogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxsaXBzaXNTdGFydChpbnQgbGluZSk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlbGxpcHNpemVkIGF3YXksIG9yIDAgaWYKICAgICAgKiBubyBlbGxpcHNpcyBpcyB0byB0YWtlIHBsYWNlLgpAQCAtMTg3MCw3ICsxNjY4LDcgQEAKICAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVRleHQubGVuZ3RoKCk7CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICAgICAgY2hhcltdIHMgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CiAgICAgICAgICAgICBnZXRDaGFycyhzdGFydCwgZW5kLCBzLCAwKTsKQEAgLTE5MzYsMTIgKzE3MzQsMTcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9MRUZUX1RPX1JJR0hUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfUklHSFRfVE9fTEVGVCA9IC0xOwotICAgIAorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0xUUiA9IDE7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX1JUTCA9IC0xOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiA9IDI7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMID0gLTI7CiAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKICAgICBwdWJsaWMgZW51bSBBbGlnbm1lbnQgewogICAgICAgICBBTElHTl9OT1JNQUwsCiAgICAgICAgIEFMSUdOX09QUE9TSVRFLApAQCAtMTk1Myw5ICsxNzU2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOwogCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMzI3NjcgfSk7CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IHNob3J0W10geyAwLCAzMjc2NyB9KTsKLQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Njk5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBAaGlkZQorICovCitjbGFzcyBNZWFzdXJlZFRleHQgeworICAgIC8qIHBhY2thZ2UgKi8gQ2hhclNlcXVlbmNlIG1UZXh0OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZXh0U3RhcnQ7CisgICAgLyogcGFja2FnZSAqLyBmbG9hdFtdIG1XaWR0aHM7CisgICAgLyogcGFja2FnZSAqLyBjaGFyW10gbUNoYXJzOworICAgIC8qIHBhY2thZ2UgKi8gYnl0ZVtdIG1MZXZlbHM7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbURpcjsKKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gbUVhc3k7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtUG9zOworICAgIHByaXZhdGUgVGV4dFBhaW50IG1Xb3JrUGFpbnQ7CisKKyAgICBwcml2YXRlIE1lYXN1cmVkVGV4dCgpIHsKKyAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZWFzdXJlZFRleHRbXSBjYWNoZWQgPSBuZXcgTWVhc3VyZWRUZXh0WzNdOworCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgb2J0YWluKCkgeworICAgICAgICBNZWFzdXJlZFRleHQgbXQ7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG10ID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG10ID0gbmV3IE1lYXN1cmVkVGV4dCgpOworICAgICAgICBMb2cuZSgiTUVBUyIsICJuZXc6ICIgKyBtdCk7CisgICAgICAgIHJldHVybiBtdDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIE1lYXN1cmVkVGV4dCByZWN5Y2xlKE1lYXN1cmVkVGV4dCBtdCkgeworICAgICAgICBtdC5tVGV4dCA9IG51bGw7CisgICAgICAgIGlmIChtdC5tTGVuIDwgMTAwMCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmFseXplcyB0ZXh0IGZvciBiaWRpcmVjdGlvbmFsIHJ1bnMuICBBbGxvY2F0ZXMgd29ya2luZyBidWZmZXJzLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8KKyAgICB2b2lkIHNldFBhcmEoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpZGlSZXF1ZXN0KSB7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVRleHRTdGFydCA9IHN0YXJ0OworCisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgbUxlbiA9IGxlbjsKKyAgICAgICAgbVBvcyA9IDA7CisKKyAgICAgICAgaWYgKG1XaWR0aHMgPT0gbnVsbCB8fCBtV2lkdGhzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgbVdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsRmxvYXRBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaGFycyA9PSBudWxsIHx8IG1DaGFycy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBtQ2hhcnMsIDApOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW5bXSBzcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzdGFydEluUGFyYSA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGludCBlbmRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5FbmQoc3BhbnNbaV0pIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0SW5QYXJhOyBqIDwgZW5kSW5QYXJhOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoYXJzW2pdID0gJ1x1RkZGQyc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFRleHRVdGlscy5kb2VzTm90TmVlZEJpZGkobUNoYXJzLCAwLCBsZW4pKSB7CisgICAgICAgICAgICBtRGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgbUVhc3kgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1MZXZlbHMgPT0gbnVsbCB8fCBtTGV2ZWxzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgICAgIG1MZXZlbHMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaXIgPSBBbmRyb2lkQmlkaS5iaWRpKGJpZGlSZXF1ZXN0LCBtQ2hhcnMsIG1MZXZlbHMsIGxlbiwgZmFsc2UpOworICAgICAgICAgICAgbUVhc3kgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IGFkZFN0eWxlUnVuKFRleHRQYWludCBwYWludCwgaW50IGxlbiwgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0pIHsKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwID0gbVBvczsKKyAgICAgICAgbVBvcyA9IHAgKyBsZW47CisKKyAgICAgICAgaWYgKG1FYXN5KSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBtRGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAorICAgICAgICAgICAgICAgID8gQ2FudmFzLkRJUkVDVElPTl9MVFIgOiBDYW52YXMuRElSRUNUSU9OX1JUTDsKKyAgICAgICAgICAgIHJldHVybiBwYWludC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBwLCBsZW4sIHAsIGxlbiwgZmxhZ3MsIG1XaWR0aHMsIHApOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gMDsKKyAgICAgICAgaW50IGxldmVsID0gbUxldmVsc1twXTsKKyAgICAgICAgZm9yIChpbnQgcSA9IHAsIGkgPSBwICsgMSwgZSA9IHAgKyBsZW47OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IGUgfHwgbUxldmVsc1tpXSAhPSBsZXZlbCkgeworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IChsZXZlbCAmIDB4MSkgPT0gMCA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICAgICAgdG90YWxBZHZhbmNlICs9CisgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBxLCBpIC0gcSwgcSwgaSAtIHEsIGZsYWdzLCBtV2lkdGhzLCBxKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBlKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxID0gaTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IG1MZXZlbHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucywgaW50IGxlbiwKKyAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisKKyAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOworICAgICAgICAvLyBYWFggcGFpbnQgc2hvdWxkIG5vdCBoYXZlIGEgYmFzZWxpbmUgc2hpZnQsIGJ1dC4uLgorICAgICAgICB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisKKyAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgd2lkOworICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgd2lkID0gYWRkU3R5bGVSdW4od29ya1BhaW50LCBsZW4sIGZtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFVzZSBvcmlnaW5hbCB0ZXh0LiAgU2hvdWxkbid0IG1hdHRlci4KKyAgICAgICAgICAgIHdpZCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCBtVGV4dCwgbVRleHRTdGFydCArIG1Qb3MsCisgICAgICAgICAgICAgICAgICAgIG1UZXh0U3RhcnQgKyBtUG9zICsgbGVuLCBmbSk7CisgICAgICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICAgICAgd1ttUG9zXSA9IHdpZDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9zICsgMSwgZSA9IG1Qb3MgKyBsZW47IGkgPCBlOyBpKyspCisgICAgICAgICAgICAgICAgd1tpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgeworICAgICAgICAgICAgICAgIGZtLmFzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICBmbS50b3AgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdpZDsKKyAgICB9CisKKyAgICBpbnQgYnJlYWtUZXh0KGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIGZvcndhcmRzLCBmbG9hdCB3aWR0aCkgeworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBpZiAoZm9yd2FyZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaW1pdDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd1tpXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdCAtIGkgLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbWl0IC0gc3RhcnQ7CisgICAgfQorCisgICAgZmxvYXQgbWVhc3VyZShpbnQgc3RhcnQsIGludCBsaW1pdCkgeworICAgICAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgIHdpZHRoICs9IHdbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NlbGVjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TZWxlY3Rpb24uamF2YQppbmRleCBiYjk4YmNlLi4xM2NiNWU2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NlbGVjdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU2VsZWN0aW9uLmphdmEKQEAgLTQxNyw4ICs0MTcsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU1RBUlQgaW1wbGVtZW50cyBOb0NvcHlTcGFuIHsgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFTkQgaW1wbGVtZW50cyBOb0NvcHlTcGFuIHsgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTVEFSVCBpbXBsZW1lbnRzIE5vQ29weVNwYW4geyB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRU5EIGltcGxlbWVudHMgTm9Db3B5U3BhbiB7IH0KICAgICAKICAgICAvKgogICAgICAqIFB1YmxpYyBjb25zdGFudHMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKaW5kZXggY2FhYWZhMS4uZmMwMWVmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKQEAgLTMxMiwxMiArMzEzLDE1IEBACiAKICAgICAgICAgbW92ZUdhcFRvKGVuZCk7CiAKLSAgICAgICAgaWYgKHRiZW5kIC0gdGJzdGFydCA+PSBtR2FwTGVuZ3RoICsgKGVuZCAtIHN0YXJ0KSkKLSAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggLSBtR2FwTGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgLy8gQ2FuIGJlIG5lZ2F0aXZlCisgICAgICAgIGZpbmFsIGludCBuYk5ld0NoYXJzID0gKHRiZW5kIC0gdGJzdGFydCkgLSAoZW5kIC0gc3RhcnQpOwogCi0gICAgICAgIG1HYXBTdGFydCArPSB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpOwotICAgICAgICBtR2FwTGVuZ3RoIC09IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7CisgICAgICAgIGlmIChuYk5ld0NoYXJzID49IG1HYXBMZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggKyBuYk5ld0NoYXJzIC0gbUdhcExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBtR2FwU3RhcnQgKz0gbmJOZXdDaGFyczsKKyAgICAgICAgbUdhcExlbmd0aCAtPSBuYk5ld0NoYXJzOwogCiAgICAgICAgIGlmIChtR2FwTGVuZ3RoIDwgMSkKICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIm1HYXBMZW5ndGggPCAxIikucHJpbnRTdGFja1RyYWNlKCk7CkBAIC03MDcsNiArNzExLDcgQEAKICAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBidWZmZXIuICBUaGUga2luZCBtYXkgYmUgT2JqZWN0LmNsYXNzIHRvIGdldAogICAgICAqIGEgbGlzdCBvZiBhbGwgdGhlIHNwYW5zIHJlZ2FyZGxlc3Mgb2YgdHlwZS4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IFRbXSBnZXRTcGFucyhpbnQgcXVlcnlTdGFydCwgaW50IHF1ZXJ5RW5kLCBDbGFzczxUPiBraW5kKSB7CiAgICAgICAgIGludCBzcGFuQ291bnQgPSBtU3BhbkNvdW50OwogICAgICAgICBPYmplY3RbXSBzcGFucyA9IG1TcGFuczsKQEAgLTcxNyw4ICs3MjIsOCBAQAogICAgICAgICBpbnQgZ2FwbGVuID0gbUdhcExlbmd0aDsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBPYmplY3RbXSByZXQgPSBudWxsOwotICAgICAgICBPYmplY3QgcmV0MSA9IG51bGw7CisgICAgICAgIFRbXSByZXQgPSBudWxsOworICAgICAgICBUIHJldDEgPSBudWxsOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCBzcGFuU3RhcnQgPSBzdGFydHNbaV07CkBAIC03NTAsMTEgKzc1NSwxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldDEgPSBzcGFuc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICByZXQxID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgc3BhbkNvdW50IC0gaSArIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24sIGJ1dCByZXF1aXJlcyBhIHN1cHByZXNzV2FybmluZworICAgICAgICAgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgIHJldFswXSA9IHJldDE7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzEsMjkgKzc3OCwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXQsIGosIHJldCwgaiArIDEsIGNvdW50IC0gaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtqXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtjb3VudCsrXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKKyAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKICAgICAgICAgICAgIHJldFswXSA9IHJldDE7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gcmV0Lmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIHJldDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3RbXSBucmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CisgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgIFRbXSBucmV0ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgY291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgMCwgbnJldCwgMCwgY291bnQpOwotICAgICAgICByZXR1cm4gKFRbXSkgbnJldDsKKyAgICAgICAgcmV0dXJuIG5yZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjIsNiArODczLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNoYXJzIGluIHRoaXMgYnVmZmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGludCBsZW4gPSBsZW5ndGgoKTsKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CkBAIC05NTIsNiArOTY0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorLyoKICAgICBwcml2YXRlIGJvb2xlYW4gaXNwcmludChjaGFyIGMpIHsgLy8gWFhYCiAgICAgICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTU5LDcgKzk3Miw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0vKgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGFydEZsYWcoaW50IGZsYWcpIHsKICAgICAgICAgcmV0dXJuIChmbGFnID4+IDQpICYgMHgwRjsKICAgICB9CkBAIC0xMDU0LDcgKzEwNjYsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgQ2FudmFzIHRvIHVzZSBpbnRlcm5hbGx5LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgY2hlY2tSYW5nZSgiZHJhd1RleHRSdW4iLCBzdGFydCwgZW5kKTsKKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCiAgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCiAgICAgICoge0BoaWRlfQogICAgICAqLwpAQCAtMTEwMyw2ICsxMTQwLDU4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzUG9zLCBQYWludCBwKSB7CisKKyAgICAgICAgZmxvYXQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChlbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgc3RhcnQsIGxlbiwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCArIG1HYXBMZW5ndGgsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpIC0gbUdhcExlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCAtIGNvbnRleHRTdGFydCwgY3Vyc29yT3B0KSArIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIC8vIERvY3VtZW50YXRpb24gZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJzKElucHV0RmlsdGVyW10gZmlsdGVycykgewogICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCmluZGV4IDE1NDQ5N2QuLmQxNGZjYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKaW5kZXggZjAyYWQyYS4uY2M5NjljYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCkBAIC0xNiwxNCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUhlaWdodFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMjsKIAogLyoqCiAgKiBTdGF0aWNMYXlvdXQgaXMgYSBMYXlvdXQgZm9yIHRleHQgdGhhdCB3aWxsIG5vdCBiZSBlZGl0ZWQgYWZ0ZXIgaXQKQEAgLTMxLDggKzMyLDkgQEAKICAqIDxwPlRoaXMgaXMgdXNlZCBieSB3aWRnZXRzIHRvIGNvbnRyb2wgdGV4dCBsYXlvdXQuIFlvdSBzaG91bGQgbm90IG5lZWQKICAqIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5IHVubGVzcyB5b3UgYXJlIGltcGxlbWVudGluZyB5b3VyIG93biB3aWRnZXQKICAqIG9yIGN1c3RvbSBkaXNwbGF5IG9iamVjdCwgb3Igd291bGQgYmUgdGVtcHRlZCB0byBjYWxsCi0gKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLSAqICBDYW52YXMuZHJhd1RleHQoKX0gZGlyZWN0bHkuPC9wPgorICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LAorICogZmxvYXQsIGZsb2F0LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KQorICogQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KICAqLwogcHVibGljIGNsYXNzCiBTdGF0aWNMYXlvdXQKQEAgLTYyLDcgKzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgaW50IGVsbGlwc2l6ZWRXaWR0aCkgewogICAgICAgICBzdXBlcigoZWxsaXBzaXplID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBzb3VyY2UgCisgICAgICAgICAgICAgICAgPyBzb3VyY2UKICAgICAgICAgICAgICAgICA6IChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKQogICAgICAgICAgICAgICAgICAgICA/IG5ldyBTcGFubmVkRWxsaXBzaXplcihzb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgIDogbmV3IEVsbGlwc2l6ZXIoc291cmNlKSwKQEAgLTcyLDcgKzc0LDcgQEAKICAgICAgICAgICogVGhpcyBpcyBhbm5veWluZywgYnV0IHdlIGNhbid0IHJlZmVyIHRvIHRoZSBsYXlvdXQgdW50aWwKICAgICAgICAgICogc3VwZXJjbGFzcyBjb25zdHJ1Y3Rpb24gaXMgZmluaXNoZWQsIGFuZCB0aGUgc3VwZXJjbGFzcwogICAgICAgICAgKiBjb25zdHJ1Y3RvciB3YW50cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkaXNwbGF5IHRleHQuCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBUaGlzIHdpbGwgYnJlYWsgaWYgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgZXZlciBhY3R1YWxseQogICAgICAgICAgKiBjYXJlcyBhYm91dCB0aGUgY29udGVudCBpbnN0ZWFkIG9mIGp1c3QgaG9sZGluZyB0aGUgcmVmZXJlbmNlLgogICAgICAgICAgKi8KQEAgLTk0LDEzICs5NiwxMyBAQAogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKIAorICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisKICAgICAgICAgZ2VuZXJhdGUoc291cmNlLCBidWZzdGFydCwgYnVmZW5kLCBwYWludCwgb3V0ZXJ3aWR0aCwgYWxpZ24sCiAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBpbmNsdWRlcGFkLCBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICBlbGxpcHNpemUgIT0gbnVsbCwgZWxsaXBzaXplZFdpZHRoLCBlbGxpcHNpemUpOwogCi0gICAgICAgIG1DaGRpcnMgPSBudWxsOwotICAgICAgICBtQ2hzID0gbnVsbDsKLSAgICAgICAgbVdpZHRocyA9IG51bGw7CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG1NZWFzdXJlZCk7CiAgICAgICAgIG1Gb250TWV0cmljc0ludCA9IG51bGw7CiAgICAgfQogCkBAIC0xMTEsNiArMTEzLDcgQEAKICAgICAgICAgbUxpbmVzID0gbmV3IGludFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOwogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBnZW5lcmF0ZShDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgYnVmc3RhcnQsIGludCBidWZlbmQsCkBAIC0xMjgsNTkgKzEzMSw1MCBAQAogICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSA9IG1Gb250TWV0cmljc0ludDsKICAgICAgICAgaW50W10gY2hvb3NlaHR2ID0gbnVsbDsKIAotICAgICAgICBpbnQgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBidWZzdGFydCwgYnVmZW5kKTsKLSAgICAgICAgaW50IGJ1ZnNpeiA9IGVuZCA+PSAwID8gZW5kIC0gYnVmc3RhcnQgOiBidWZlbmQgLSBidWZzdGFydDsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtZWFzdXJlZCA9IG1NZWFzdXJlZDsKIAotICAgICAgICBpZiAobUNoZGlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hkaXJzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUoYnVmc2l6ICsgMSldOwotICAgICAgICAgICAgbUNocyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgoYnVmc2l6ICsgMSkgKiAyKV07Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gY2hkaXJzID0gbUNoZGlyczsKLSAgICAgICAgY2hhcltdIGNocyA9IG1DaHM7Ci0gICAgICAgIGZsb2F0W10gd2lkdGhzID0gbVdpZHRoczsKLQotICAgICAgICBBbHRlcmVkQ2hhclNlcXVlbmNlIGFsdGVyID0gbnVsbDsKICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gbnVsbDsKLQogICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgIHNwYW5uZWQgPSAoU3Bhbm5lZCkgc291cmNlOwogCiAgICAgICAgIGludCBERUZBVUxUX0RJUiA9IERJUl9MRUZUX1RPX1JJR0hUOyAvLyBYWFgKIAotICAgICAgICBmb3IgKGludCBzdGFydCA9IGJ1ZnN0YXJ0OyBzdGFydCA8PSBidWZlbmQ7IHN0YXJ0ID0gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW50IHBhcmFFbmQ7CisgICAgICAgIGZvciAoaW50IHBhcmFTdGFydCA9IGJ1ZnN0YXJ0OyBwYXJhU3RhcnQgPD0gYnVmZW5kOyBwYXJhU3RhcnQgPSBwYXJhRW5kKSB7CisgICAgICAgICAgICBwYXJhRW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBwYXJhU3RhcnQsIGJ1ZmVuZCk7CisgICAgICAgICAgICBpZiAocGFyYUVuZCA8IDApCisgICAgICAgICAgICAgICAgcGFyYUVuZCA9IGJ1ZmVuZDsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIHN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgICAgIHBhcmFFbmQrKzsKKyAgICAgICAgICAgIGludCBwYXJhTGVuID0gcGFyYUVuZCAtIHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgICAgICAgICAgZW5kID0gYnVmZW5kOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVuZCsrOwotCi0gICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVDb3VudCA9IDE7CisgICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVMaW1pdCA9IG1MaW5lQ291bnQgKyAxOwogICAgICAgICAgICAgaW50IGZpcnN0d2lkdGggPSBvdXRlcndpZHRoOwogICAgICAgICAgICAgaW50IHJlc3R3aWR0aCA9IG91dGVyd2lkdGg7CiAKICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQgPSBudWxsOwogCiAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcDsKLQotICAgICAgICAgICAgICAgIHNwID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLCBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIGxtcyA9IHNwW2ldOwogICAgICAgICAgICAgICAgICAgICBmaXJzdHdpZHRoIC09IHNwW2ldLmdldExlYWRpbmdNYXJnaW4odHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxtcyBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVDb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKWxtcykuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gTGVhZGluZ01hcmdpblNwYW4yIGlzIG9kZC4gIFRoZSBjb3VudCBhZmZlY3RzIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbiBzcGFucywgbm90IGp1c3QgdGhpcyBwYXJ0aWN1bGFyIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IGZyb20gdGhlIHRvcCBvZiB0aGUgc3Bhbiwgbm90IHRoZSB0b3Agb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxtcyBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4yIGxtczIgPSAoTGVhZGluZ01hcmdpblNwYW4yKSBsbXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG1zRmlyc3RMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcGFubmVkLmdldFNwYW5TdGFydChsbXMyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdpZHRoTGluZUxpbWl0ID0gbG1zRmlyc3RMaW5lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1zMi5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjaG9vc2VodCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGNob29zZWh0ID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LCBwYXJhRW5kLCBMaW5lSGVpZ2h0U3Bhbi5jbGFzcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2hvb3NlaHQubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0diA9PSBudWxsIHx8CkBAIC0xOTIsMTEgKzE4NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob29zZWh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KGNob29zZWh0W2ldKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBwYXJhU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgaW4gdGhpcyBsYXlvdXQsIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBhcmFncmFwaAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgcGFyYWdyYXBoCiAKQEAgLTIwNiwxNjIgKzIwMCw4NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gY2hkaXJzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGVuZCAtIHN0YXJ0KV07Ci0gICAgICAgICAgICAgICAgbUNoZGlycyA9IGNoZGlyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNocy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaHMgPSBjaHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAqIDIgPiB3aWR0aHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGVuZCAtIHN0YXJ0KSAqIDIpXTsKLSAgICAgICAgICAgICAgICBtV2lkdGhzID0gd2lkdGhzOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVhc3VyZWQuc2V0UGFyYShzb3VyY2UsIHBhcmFTdGFydCwgcGFyYUVuZCwgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOworICAgICAgICAgICAgY2hhcltdIGNocyA9IG1lYXN1cmVkLm1DaGFyczsKKyAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzID0gbWVhc3VyZWQubVdpZHRoczsKKyAgICAgICAgICAgIGJ5dGVbXSBjaGRpcnMgPSBtZWFzdXJlZC5tTGV2ZWxzOworICAgICAgICAgICAgaW50IGRpciA9IG1lYXN1cmVkLm1EaXI7CisgICAgICAgICAgICBib29sZWFuIGVhc3kgPSBtZWFzdXJlZC5tRWFzeTsKIAotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHNvdXJjZSwgc3RhcnQsIGVuZCwgY2hzLCAwKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZWFzeSA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGFsdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBkaXIgPSBERUZBVUxUX0RJUjsgLy8gWFhYCi0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoc1tpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVhc3kgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBub25lIG9mIHRoZSB1bmRlcmx5aW5nIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQKLSAgICAgICAgICAgIC8vIGFzIHZpYWJsZSBicmVha3BvaW50cywgYW5kIHRoYXQgdGhlIGVudGlyZSBydW4gZ2V0cyB0aGUKLSAgICAgICAgICAgIC8vIHNhbWUgYmlkaSBkaXJlY3Rpb24uCi0KLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgZW5kLCBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzcGFucy5sZW5ndGg7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IHNwLmdldFNwYW5TdGFydChzcGFuc1t5XSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gc3AuZ2V0U3BhbkVuZChzcGFuc1t5XSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IGE7IHggPCBiOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoc1t4IC0gc3RhcnRdID0gJ1x1RkZGQyc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZWFzeSkgewotICAgICAgICAgICAgICAgIC8vIFhYWCBwdXQgb3ZlcnJpZGUgZmxhZ3MsIGV0Yy4gaW50byBjaGRpcnMKLSAgICAgICAgICAgICAgICBkaXIgPSBiaWRpKGRpciwgY2hzLCBjaGRpcnMsIG4sIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIERvIG1pcnJvcmluZyBmb3IgcmlnaHQtdG8tbGVmdCBzZWdtZW50cwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tpXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2pdICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRDaGFyYWN0ZXIubWlycm9yKGNocywgaSwgaiAtIGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWI7Ci0KLSAgICAgICAgICAgIGlmIChhbHRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsdGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyID0gQWx0ZXJlZENoYXJTZXF1ZW5jZS5tYWtlKHNvdXJjZSwgY2hzLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyLnVwZGF0ZShjaHMsIHN0YXJ0LCBlbmQpOwotCi0gICAgICAgICAgICAgICAgc3ViID0gYWx0ZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1YiA9IHNvdXJjZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWIgPSBzb3VyY2U7CiAKICAgICAgICAgICAgIGludCB3aWR0aCA9IGZpcnN0d2lkdGg7CiAKICAgICAgICAgICAgIGZsb2F0IHcgPSAwOwotICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBoZXJlID0gcGFyYVN0YXJ0OwogCi0gICAgICAgICAgICBpbnQgb2sgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBvayA9IHBhcmFTdGFydDsKICAgICAgICAgICAgIGZsb2F0IG9rd2lkdGggPSB3OwogICAgICAgICAgICAgaW50IG9rYXNjZW50ID0gMCwgb2tkZXNjZW50ID0gMCwgb2t0b3AgPSAwLCBva2JvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGludCBmaXQgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBmaXQgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBmaXR3aWR0aCA9IHc7CiAgICAgICAgICAgICBpbnQgZml0YXNjZW50ID0gMCwgZml0ZGVzY2VudCA9IDAsIGZpdHRvcCA9IDAsIGZpdGJvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGJvb2xlYW4gdGFiID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CiAKLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzKTsKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IHBhcmFTdGFydCwgc3BhbkVuZCA9IHNwYW5TdGFydCwgbmV4dFNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0IDwgcGFyYUVuZDsgc3BhblN0YXJ0ID0gbmV4dFNwYW5TdGFydCkgewogCi0gICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRUZXh0V2lkdGhzKHN1YiwgaSwgbmV4dCwgd2lkdGhzKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICAgICAgICAgIGlmIChzcGFuU3RhcnQgPT0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHBhcmFFbmQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzcGFuU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwogCi0gICAgICAgICAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmVkLCBpLCBuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIGZtKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmFzY2VudCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkxlbiA9IHNwYW5FbmQgLSBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkLmFkZFN0eWxlUnVuKHBhaW50LCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQuZ2V0U3BhbnMoc3BhblN0YXJ0LCBzcGFuRW5kLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkLmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkxlbiwgZm0pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgbmV4dFNwYW5TdGFydCA9IHNwYW5FbmQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5QYXJhID0gc3BhblN0YXJ0IC0gcGFyYVN0YXJ0OworICAgICAgICAgICAgICAgIGludCBlbmRJblBhcmEgPSBzcGFuRW5kIC0gcGFyYVN0YXJ0OworCiAgICAgICAgICAgICAgICAgaW50IGZtdG9wID0gZm0udG9wOwogICAgICAgICAgICAgICAgIGludCBmbWJvdHRvbSA9IGZtLmJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgZm1hc2NlbnQgPSBmbS5hc2NlbnQ7CiAgICAgICAgICAgICAgICAgaW50IGZtZGVzY2VudCA9IGZtLmRlc2NlbnQ7CiAKLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQod2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoInRleHQiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IG5leHQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjaHNbaiAtIHN0YXJ0XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3BhblN0YXJ0OyBqIDwgc3BhbkVuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmVmb3JlID0gdzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gTGF5b3V0Lm5leHRUYWIoc3ViLCBzdGFydCwgZW5kLCB3LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1RhYiA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiT3JFbW9qaSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCB0YWIgdGhpcyBwYXJhLCBjaGVjayBmb3IgdGFic3RvcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhRW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiU3RvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB0YWJTdG9wcy5uZXh0VGFiKHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gVGFiU3RvcHMubmV4dERlZmF1bHRTdG9wKHcsIFRBQl9JTkNSRU1FTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGICYmIGogKyAxIDwgc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNocywgaiAtIHBhcmFTdGFydCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gRU1PSklfRkFDVE9SWS4KQEAgLTM3NiwyMSArMjk1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhaW50ID0gbVdvcmtQYWludDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IChmbG9hdCkgYm0uZ2V0V2lkdGgoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2hpY2hQYWludC5hc2NlbnQoKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtLmdldEhlaWdodCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIndhcyAiICsgYmVmb3JlICsgIiBub3cgIiArIHcgKyAiIGFmdGVyICIgKyBjICsgIiB3aXRoaW4gIiArIHdpZHRoKTsKQEAgLTQxMSw3ICszMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZyb20gdGhlIFVuaWNvZGUgTGluZSBCcmVha2luZyBBbGdvcml0aG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoYXQgbGVhc3QgYXBwcm94aW1hdGVseSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAuLDo7IGFyZSBjbGFzcyBJUzogYnJlYWtwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgZXhjZXB0IHdoZW4gYWRqYWNlbnQgdG8gZGlnaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAvICAgIGlzIGNsYXNzIFNZOiBhIGJyZWFrcG9pbnQKQEAgLTQyNiwxMiArMzQ1LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyB8fCBjID09ICdcdCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJy4nICB8fCBjID09ICcsJyB8fCBjID09ICc6JyB8fCBjID09ICc7JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogLSAxIDwgaGVyZSB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogLSAxIC0gc3RhcnRdKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IG5leHQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHN0YXJ0XSkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBwYXJhU3RhcnRdKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJy8nIHx8IGMgPT0gJy0nKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBzcGFuRW5kIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBwYXJhU3RhcnRdKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gRklSU1RfQ0pLICYmIGlzSWRlb2dyYXBoaWMoYywgdHJ1ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBuZXh0ICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gc3RhcnRdLCBmYWxzZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKyAxIDwgc3BhbkVuZCAmJiBpc0lkZW9ncmFwaGljKGNoc1tqICsgMSAtIHBhcmFTdGFydF0sIGZhbHNlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva3dpZHRoID0gdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGogKyAxOwogCkBAIC00NDgsNyArMzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00NTcsMTAgKzM3NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNDg0LDcgKzQwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2sgIT0gaGVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCBvayAiICsgaGVyZSArICIgdG8gIiArb2spOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgbmV4dCAmJiBjaHNbb2sgLSBzdGFydF0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgc3BhbkVuZCAmJiBjaHNbb2sgLSBwYXJhU3RhcnRdID09ICcgJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDkzLDEwICs0MTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXNjZW50LCBva2Rlc2NlbnQsIG9rdG9wLCBva2JvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIG9rd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CiAKQEAgLTUwOSwxOSArNDI4LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXR0b3AsIGZpdGJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBmaXR3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBmaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCBvbmUgIiArIGhlcmUgKyAiIHRvICIgKyhoZXJlICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVUZXh0KHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaGVyZSwgaGVyZSArIDEsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIG5vdCBzdXJlIHdoeSB0aGUgZXhpc3RpbmcgZm0gd2Fzbid0IG9rLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVUZXh0KHBhaW50LCBtV29ya1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHNvdXJjZSwgaGVyZSwgaGVyZSArIDEsIGZtLCB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbnVsbCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGhlcmUrMSwKQEAgLTUyOSwxOSArNDQ5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AsIGZtLmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlICsgMSA9PSBidWZlbmQsIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBzdGFydF0sIHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoc1toZXJlIC0gcGFyYVN0YXJ0XSwgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGhlcmUgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZSA8IGkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dCA9IGhlcmU7IC8vIG11c3QgcmVtZWFzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZSA8IHNwYW5TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBvdXRwdXQgYWxsIHRoZSB0ZXh0IGZvciB0aGlzIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBtZWFzdXJlZCB0aGUgcmF3IHdpZHRocywgdGhvdWdoLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVzZXQgdGhlIHN0YXJ0IHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG5leHRTcGFuU3RhcnQgPSBoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gaGVyZSAtIDE7ICAgIC8vIGNvbnRpbnVlIGxvb3BpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1MSwxNCArNDc0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaXRhc2NlbnQgPSBmaXRkZXNjZW50ID0gZml0dG9wID0gZml0Ym90dG9tID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXNjZW50ID0gb2tkZXNjZW50ID0gb2t0b3AgPSBva2JvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWZpcnN0V2lkdGhMaW5lQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVMaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSByZXN0d2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgIT0gaGVyZSkgeworICAgICAgICAgICAgaWYgKHBhcmFFbmQgIT0gaGVyZSkgewogICAgICAgICAgICAgICAgIGlmICgoZml0dG9wIHwgZml0Ym90dG9tIHwgZml0ZGVzY2VudCB8IGZpdGFzY2VudCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CiAKQEAgLTU3MSwyMCArNDk0LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IHJlc3QgIiArIGhlcmUgKyAiIHRvICIgKyBlbmQpOwogCiAgICAgICAgICAgICAgICAgdiA9IG91dChzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBlbmQsIGZpdGFzY2VudCwgZml0ZGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIHBhcmFFbmQsIGZpdGFzY2VudCwgZml0ZGVzY2VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAotICAgICAgICAgICAgICAgICAgICAgICAgZW5kID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhRW5kID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIHcsIHBhaW50KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3RhcnQgPSBlbmQ7CisgICAgICAgICAgICBwYXJhU3RhcnQgPSBwYXJhRW5kOwogCi0gICAgICAgICAgICBpZiAoZW5kID09IGJ1ZmVuZCkKKyAgICAgICAgICAgIGlmIChwYXJhRW5kID09IGJ1ZmVuZCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC01OTksMjQ2ICs1MjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIGZtLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIGNoZGlycywgREVGQVVMVF9ESVIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgYnVmZW5kLCBudWxsLCBERUZBVUxUX0RJUiwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRocywgYnVmc3RhcnQsIDAsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGJ1ZnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCAwLCBwYWludCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSB1bmljb2RlIGJpZGkgYWxnb3JpdGhtIG9uIHRoZSBmaXJzdCBuIGNoYXJzIGluIGNocywgcmV0dXJuaW5nCi0gICAgICogdGhlIGNoYXIgZGlycyBpbiBjaEluZm8gYW5kIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uIG9mIHRoZSBmaXJzdAotICAgICAqIHBhcmFncmFwaC4KLSAgICAgKiAKLSAgICAgKiBYWFggY2hhbmdlIHJlc3VsdCBmcm9tIGRpcnMgdG8gbGV2ZWxzCi0gICAgICogIAotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdGlvbiBmbGFnLCBlaXRoZXIgRElSX1JFUVVFU1RfTFRSLAotICAgICAqIERJUl9SRVFVRVNUX1JUTCwgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIsIG9yIERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMLgotICAgICAqIEBwYXJhbSBjaHMgdGhlIHRleHQgdG8gZXhhbWluZQotICAgICAqIEBwYXJhbSBjaEluZm8gb24gaW5wdXQsIGlmIGhhc0luZm8gaXMgdHJ1ZSwgb3ZlcnJpZGUgYW5kIG90aGVyIGZsYWdzIAotICAgICAqIHJlcHJlc2VudGluZyBvdXQtb2YtYmFuZCBlbWJlZGRpbmcgaW5mb3JtYXRpb24uIE9uIG91dHB1dCwgdGhlIGdlbmVyYXRlZCAKLSAgICAgKiBkaXJzIG9mIHRoZSB0ZXh0LgotICAgICAqIEBwYXJhbSBuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQvaW5mb3JtYXRpb24gaW4gY2hzIGFuZCBjaEluZm8KLSAgICAgKiBAcGFyYW0gaGFzSW5mbyB0cnVlIGlmIGNoSW5mbyBoYXMgaW5wdXQgaW5mb3JtYXRpb24sIG90aGVyd2lzZSB0aGUKLSAgICAgKiBpbnB1dCBkYXRhIGluIGNoSW5mbyBpcyBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGRpcmVjdGlvbiBsZXZlbCBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLCBlaXRoZXIKLSAgICAgKiBESVJfTEVGVF9UT19SSUdIVCBvciBESVJfUklHSFRfVE9fTEVGVC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgYmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgCi0gICAgICAgICAgICBib29sZWFuIGhhc0luZm8pIHsKLSAgICAgICAgCi0gICAgICAgIEFuZHJvaWRDaGFyYWN0ZXIuZ2V0RGlyZWN0aW9uYWxpdGllcyhjaHMsIGNoSW5mbywgbik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGV0ZXJtaW5lIHByaW1hcnkgcGFyYWdyYXBoIGRpcmVjdGlvbiBpZiBub3Qgc3BlY2lmaWVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZGlyICE9IERJUl9SRVFVRVNUX0xUUiAmJiBkaXIgIT0gRElSX1JFUVVFU1RfUlRMKSB7Ci0gICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdAotICAgICAgICAgICAgZGlyID0gZGlyID49IDAgPyBESVJfTEVGVF9UT19SSUdIVCA6IERJUl9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IERJUl9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJ5dGUgU09SID0gZGlyID09IERJUl9MRUZUX1RPX1JJR0hUID8KLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogWFhYIEV4cGxpY2l0IG92ZXJyaWRlcyBzaG91bGQgZ28gaGVyZQotICAgICAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBXZWFrIHR5cGUgcmVzb2x1dGlvbgotICAgICAgICAgKi8KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgImluaXRpYWwiKTsKLQotICAgICAgICAvLyBXMSBub24gc3BhY2luZyBtYXJrcwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuTk9OX1NQQUNJTkdfTUFSSykgewotICAgICAgICAgICAgICAgIGlmIChqID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IGNoSW5mb1tqIC0gMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlcxIik7Ci0KLSAgICAgICAgLy8gVzIgZXVyb3BlYW4gbnVtYmVycwotICAgICAgICBieXRlIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikgewotICAgICAgICAgICAgICAgICBpZiAoY3VyID09Ci0gICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlcyIik7Ci0KLSAgICAgICAgLy8gVzMgYXJhYmljIGxldHRlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChjaEluZm9bal0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXMyIpOwotCi0gICAgICAgIC8vIFc0IHNpbmdsZSBzZXBhcmF0b3IgYmV0d2VlbiBudW1iZXJzCi0gICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgbiAtIDE7IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotICAgICAgICAgICAgYnl0ZSBwcmV2ID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIGJ5dGUgbmV4dCA9IGNoSW5mb1tqICsgMV07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0NPTU1PTl9OVU1CRVJfU0VQQVJBVE9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIgJiYKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc0Iik7Ci0KLSAgICAgICAgLy8gVzUgZXVyb3BlYW4gbnVtYmVyIHRlcm1pbmF0b3JzCi0gICAgICAgIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUiAmJiBhZGphY2VudCkKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2R1bXAoY2hkaXJzLCBuLCAiVzUiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMgcGFydCAyLAotICAgICAgICAvLyBXNiBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycwotICAgICAgICBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gbiAtIDE7IGogPj0gMDsgai0tKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRqYWNlbnQpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUEFSQUdSQVBIX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9TRUdNRU5UX1NFUEFSQVRPUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX09USEVSX05FVVRSQUxTOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXNiIpOwotCi0gICAgICAgIC8vIFc3IHN0cm9uZyBkaXJlY3Rpb24gb2YgZXVyb3BlYW4gbnVtYmVycwotICAgICAgICBjdXIgPSBTT1I7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IFNPUiB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIGN1ciA9IGQ7Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY3VyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXNyIpOwotCi0gICAgICAgIC8vIE4xLCBOMiBuZXV0cmFscwotICAgICAgICBjdXIgPSBTT1I7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgIGN1ciA9IGQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ5dGUgZGQgPSBTT1I7Ci0gICAgICAgICAgICAgICAgaW50IGs7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGsgPSBqICsgMTsgayA8IG47IGsrKykgewotICAgICAgICAgICAgICAgICAgICBkZCA9IGNoSW5mb1trXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSBqOyB5IDwgazsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBjdXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaEluZm9beV0gPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IFNPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqID0gayAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgImZpbmFsIik7Ci0KLSAgICAgICAgLy8gZXh0cmE6IGVuZm9yY2UgdGhhdCBhbGwgdGFicyBhbmQgc3Vycm9nYXRlIGNoYXJhY3RlcnMgZ28gdGhlCi0gICAgICAgIC8vIHByaW1hcnkgZGlyZWN0aW9uCi0gICAgICAgIC8vIFRPRE86IGFjdHVhbGx5IGRvIGRpcmVjdGlvbnMgcmlnaHQgZm9yIHN1cnJvZ2F0ZXMKLQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgY2hhciBjID0gY2hzW2pdOwotCi0gICAgICAgICAgICBpZiAoYyA9PSAnXHQnIHx8IChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikpIHsKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBTT1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkaXI7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9DSksgPSAnXHUyRTgwJzsKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgb25lIG9mIHRob3NlIHNwZWNpZmllZApAQCAtOTQ0LDM3ICs2MzQsMTUgQEAKICAgICB9CiAqLwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEZpdChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQpIHsKLSAgICAgICAgaW50IGhpZ2ggPSBlbmQgKyAxLCBsb3cgPSBzdGFydCAtIDEsIGd1ZXNzOwotCi0gICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewotICAgICAgICAgICAgZ3Vlc3MgPSAoaGlnaCArIGxvdykgLyAyOwotCi0gICAgICAgICAgICBpZiAobWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCBzdGFydCwgZ3Vlc3MsIG51bGwsIHRydWUsIG51bGwpID4gd2lkKQotICAgICAgICAgICAgICAgIGhpZ2ggPSBndWVzczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsb3cgPSBndWVzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb3cgPCBzdGFydCkKLSAgICAgICAgICAgIHJldHVybiBzdGFydDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGxvdzsKLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBvdXQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJvdmUsIGludCBiZWxvdywgaW50IHRvcCwgaW50IGJvdHRvbSwgaW50IHYsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BhY2luZ211bHQsIGZsb2F0IHNwYWNpbmdhZGQsCiAgICAgICAgICAgICAgICAgICAgICAgTGluZUhlaWdodFNwYW5bXSBjaG9vc2VodCwgaW50W10gY2hvb3NlaHR2LAotICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLCBib29sZWFuIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiBoYXNUYWJPckVtb2ppLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZE11bHRpcGx5LCBpbnQgcHN0YXJ0LCBieXRlW10gY2hkaXJzLAogICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gZWFzeSwgYm9vbGVhbiBsYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwgYm9vbGVhbiB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBjaHMsIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLlRydW5jYXRlQXQgZWxsaXBzaXplLCBmbG9hdCBlbGxpcHNpc3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHR3aWR0aCwgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIGludCBqID0gbUxpbmVDb3VudDsKQEAgLTk4Miw4ICs2NTAsNiBAQAogICAgICAgICBpbnQgd2FudCA9IG9mZiArIG1Db2x1bW5zICsgVE9QOwogICAgICAgICBpbnRbXSBsaW5lcyA9IG1MaW5lczsKIAotICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJsaW5lICIgKyBzdGFydCArICIgdG8gIiArIGVuZCArIChsYXN0ID8gIj09PSIgOiAiIikpOwotCiAgICAgICAgIGlmICh3YW50ID49IGxpbmVzLmxlbmd0aCkgewogICAgICAgICAgICAgaW50IG5sZW4gPSBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKHdhbnQgKyAxKTsKICAgICAgICAgICAgIGludFtdIGdyb3cgPSBuZXcgaW50W25sZW5dOwpAQCAtMTA1OSw1OSArNzI1LDIzIEBACiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgU1RBUlRdID0gZW5kOwogICAgICAgICBsaW5lc1tvZmYgKyBtQ29sdW1ucyArIFRPUF0gPSB2OwogCi0gICAgICAgIGlmICh0YWIpCisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppKQogICAgICAgICAgICAgbGluZXNbb2ZmICsgVEFCXSB8PSBUQUJfTUFTSzsKIAotICAgICAgICB7Ci0gICAgICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7Ci0KLSAgICAgICAgICAgIGludCBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGlmICghZWFzeSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXJlY3Rpb25zIGxpbmVkaXJzOwotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRbXSBsZCA9IG5ldyBzaG9ydFtjb3VudCArIDFdOwotCi0gICAgICAgICAgICAgICAgY3VyID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2sgLSBwc3RhcnRdICE9IGN1cikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG92ZXJmbG93IHNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZFtjb3VudCsrXSA9IChzaG9ydCkgKGsgLSBoZXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGNoZGlyc1trIC0gcHN0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGRbY291bnRdID0gKHNob3J0KSAoZW5kIC0gaGVyZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMSAmJiBsZFswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gRElSU19BTExfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5lZGlycyA9IG5ldyBEaXJlY3Rpb25zKGxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgbGluZXNbb2ZmICsgRElSXSB8PSBkaXIgPDwgRElSX1NISUZUOworICAgICAgICBEaXJlY3Rpb25zIGxpbmVkaXJzID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgLy8gZWFzeSBtZWFucyBhbGwgY2hhcnMgPCB0aGUgZmlyc3QgUlRMLCBzbyBubyBlbW9qaSwgbm8gbm90aGluZworICAgICAgICAvLyBYWFggYSBydW4gd2l0aCBubyB0ZXh0IG9yIGFsbCBzcGFjZXMgaXMgZWFzeSBidXQgbWlnaHQgYmUgYW4gZW1wdHkKKyAgICAgICAgLy8gUlRMIHBhcmFncmFwaC4gIE1ha2Ugc3VyZSBlYXN5IGlzIGZhbHNlIGlmIHRoaXMgaXMgdGhlIGNhc2UuCisgICAgICAgIGlmIChlYXN5KSB7CiAgICAgICAgICAgICBtTGluZURpcmVjdGlvbnNbal0gPSBsaW5lZGlyczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IEFuZHJvaWRCaWRpLmRpcmVjdGlvbnMoZGlyLCBjaGRpcnMsIHdpZHN0YXJ0LCBjaHMsCisgICAgICAgICAgICAgICAgICAgIHdpZHN0YXJ0LCBlbmQgLSBzdGFydCk7CiAKICAgICAgICAgICAgIC8vIElmIGVsbGlwc2l6ZSBpcyBpbiBtYXJxdWVlIG1vZGUsIGRvIG5vdCBhcHBseSBlbGxpcHNpcyBvbiB0aGUgZmlyc3QgbGluZQogICAgICAgICAgICAgaWYgKGVsbGlwc2l6ZSAhPSBudWxsICYmIChlbGxpcHNpemUgIT0gVGV4dFV0aWxzLlRydW5jYXRlQXQuTUFSUVVFRSB8fCBqICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwgd2lkb2ZmLAorICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUVsbGlwc2lzKHN0YXJ0LCBlbmQsIHdpZHRocywgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXN3aWR0aCwgZWxsaXBzaXplLCBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR3aWR0aCwgcGFpbnQpOwogICAgICAgICAgICAgfQpAQCAtMTEyMiw3ICs3NTIsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVFbGxpcHNpcyhpbnQgbGluZXN0YXJ0LCBpbnQgbGluZWVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXZhaWwsIFRleHRVdGlscy5UcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgZmxvYXQgdGV4dHdpZHRoLCBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgaW50IGxlbiA9IGxpbmVlbmQgLSBsaW5lc3RhcnQ7CkBAIC0xMTQyLDcgKzc3Miw3IEBACiAgICAgICAgICAgICBpbnQgaTsKIAogICAgICAgICAgICAgZm9yIChpID0gbGVuOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNTgsNyArNzg4LDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3NSw3ICs4MDUsNyBAQAogCiAgICAgICAgICAgICBmbG9hdCByYXZhaWwgPSAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyOwogICAgICAgICAgICAgZm9yIChyaWdodCA9IGxlbjsgcmlnaHQgPj0gMDsgcmlnaHQtLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbcmlnaHQgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbcmlnaHQgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE4Niw3ICs4MTYsNyBAQAogCiAgICAgICAgICAgICBmbG9hdCBsYXZhaWwgPSBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gcnN1bTsKICAgICAgICAgICAgIGZvciAobGVmdCA9IDA7IGxlZnQgPCByaWdodDsgbGVmdCsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbbGVmdCArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgbHN1bSA+IGxhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyMDMsNyArODMzLDcgQEAKICAgICAgICAgbUxpbmVzW21Db2x1bW5zICogbGluZSArIEVMTElQU0lTX0NPVU5UXSA9IGVsbGlwc2lzQ291bnQ7CiAgICAgfQogCi0gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2VjbGFzcyBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIG91ciBtZW1iZXJzLAorICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCiAgICAgLy8gcmF0aGVyIHRoYW4gcmVseWluZyBvbiBtZW1iZXIgZnVuY3Rpb25zLgogICAgIC8vIFRoZSBsb2dpYyBtaXJyb3JzIHRoYXQgb2YgTGF5b3V0LmdldExpbmVGb3JWZXJ0aWNhbAogICAgIC8vIEZJWE1FOiBJdCBtYXkgYmUgZmFzdGVyIHRvIGRvIGEgbGluZWFyIHNlYXJjaCBmb3IgbGF5b3V0cyB3aXRob3V0IG1hbnkgbGluZXMuCkBAIC0xMjMyLDExICs4NjIsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldExpbmVUb3AoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBUT1BdOyAgICAKKyAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBUT1BdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZURlc2NlbnQoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBERVNDRU5UXTsgICAKKyAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBERVNDRU5UXTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldExpbmVTdGFydChpbnQgbGluZSkgewpAQCAtMTMwOSwxMyArOTM5LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJUl9TSElGVCAgPSAzMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX01BU0sgICA9IDB4MjAwMDAwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX1JJR0hUX1RPX0xFRlQgPSAnXHUwNTkwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOyAvLyBzYW1lIGFzIExheW91dCwgYnV0IHRoYXQncyBwcml2YXRlCiAKICAgICAvKgotICAgICAqIFRoZXNlIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIGdlbmVyYXRlKCkKKyAgICAgKiBUaGlzIGlzIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQogICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1DaGRpcnM7Ci0gICAgcHJpdmF0ZSBjaGFyW10gbUNoczsKLSAgICBwcml2YXRlIGZsb2F0W10gbVdpZHRoczsKKyAgICBwcml2YXRlIE1lYXN1cmVkVGV4dCBtTWVhc3VyZWQ7CiAgICAgcHJpdmF0ZSBQYWludC5Gb250TWV0cmljc0ludCBtRm9udE1ldHJpY3NJbnQgPSBuZXcgUGFpbnQuRm9udE1ldHJpY3NJbnQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNiMmNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQudGV4dDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgZHJhd2luZyBhbmQgbWVhc3VyaW5nIHN0eWxlZCB0ZXh0LAotICogbGlrZSB7QGxpbmsgYW5kcm9pZC50ZXh0LlNwYW5uZWR9IG9iamVjdCB3aXRoCi0gKiB7QGxpbmsgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3Bhbn0uCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlZAotewotICAgIC8qKgotICAgICAqIERyYXdzIGFuZC9vciBtZWFzdXJlcyBhIHVuaWZvcm0gcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZS4gTm8gc3BhbiBvZgotICAgICAqIGludGVyZXN0IHNob3VsZCBzdGFydCBvciBlbmQgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHJ1biAoaWYgbm90Ci0gICAgICogZHJhd2luZywgY2hhcmFjdGVyIHNwYW5zIHRoYXQgZG9uJ3QgYWZmZWN0IG1ldHJpY3MgY2FuIGJlIGlnbm9yZWQpLgotICAgICAqIE5laXRoZXIgc2hvdWxkIHRoZSBydW4gZGlyZWN0aW9uIGNoYW5nZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgeCBwb3NpdGlvbiBpcyB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0ZXh0LiBJbiBhIHJpZ2h0LXRvLWxlZnQKLSAgICAgKiBwYXJhZ3JhcGgsIHRoaXMgd2lsbCBiZSB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQgdG8gYmUgZHJhd24uIFBhaW50Ci0gICAgICogc2hvdWxkIG5vdCBoYXZlIGFuIEFsaWduIHZhbHVlIG90aGVyIHRoYW4gTEVGVCBvciBwb3NpdGlvbmluZyB3aWxsIGdldAotICAgICAqIGNvbmZ1c2VkLgotICAgICAqCi0gICAgICogPHA+T24gcmV0dXJuLCB3b3JrUGFpbnQgd2lsbCByZWZsZWN0IHRoZSBvcmlnaW5hbCBwYWludCBwbHVzIGFueQotICAgICAqIG1vZGlmaWNhdGlvbnMgbWFkZSBieSBjaGFyYWN0ZXIgc3R5bGVzIG9uIHRoZSBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgcmV0dXJuZWQgd2lkdGggaXMgc2lnbmVkIGFuZCB3aWxsIGJlIDwgMCBpZiB0aGUgcGFyYWdyYXBoCi0gICAgICogZGlyZWN0aW9uIGlzIHJpZ2h0LXRvLWxlZnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZHJhd1VuaWZvcm1SdW4oQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXZlV2lkdGggPSBmYWxzZTsKLSAgICAgICAgZmxvYXQgcmV0ID0gMDsKLSAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpOwotCi0gICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8gWFhYOiBUaGlzIHNob3VsZG4ndCBiZSBtb2RpZnlpbmcgcGFpbnQsIG9ubHkgd29ya1BhaW50LgotICAgICAgICAvLyBIb3dldmVyLCB0aGUgbWVtYmVycyBiZWxvbmdpbmcgdG8gVGV4dFBhaW50IHNob3VsZCBoYXZlIGRlZmF1bHQKLSAgICAgICAgLy8gdmFsdWVzIGFueXdheS4gIEJldHRlciB0byBlbnN1cmUgdGhpcyBpbiB0aGUgTGF5b3V0IGNvbnN0cnVjdG9yLgotICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKLSAgICAgICAgcGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7Ci0gICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotCi0JCWlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2ldOwotCi0JCQkJaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3b3JrUGFpbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wOwotICAgICAgICAgICAgaW50IHRtcHN0YXJ0LCB0bXBlbmQ7Ci0KLSAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgewotICAgICAgICAgICAgICAgIHRtcCA9IFRleHRVdGlscy5nZXRSZXZlcnNlKHRleHQsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgICAgIHRtcHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAvLyBYWFg6IGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgdG1wZW5kID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRtcCA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdvcmtQYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAod29ya1BhaW50LmJnQ29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IHdvcmtQYWludC5nZXRDb2xvcigpOwotICAgICAgICAgICAgICAgICAgICBQYWludC5TdHlsZSBzID0gd29ya1BhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRDb2xvcih3b3JrUGFpbnQuYmdDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoeCAtIHJldCwgdG9wLCB4LCBib3R0b20sIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4LCB0b3AsIHggKyByZXQsIGJvdHRvbSwgd29ya1BhaW50KTsKLQotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0U3R5bGUocyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRDb2xvcihjKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSByZXQsIHkgKyB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRXaWR0aCAmJiAhaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBmbWkpOwotCi0gICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgdG9wLCB5LCBib3R0b20sIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgcmV0dXJuIC1yZXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZSB3aWR0aHMgZm9yIGEgdW5pZm9ybSBsZWZ0LXRvLXJpZ2h0IHJ1biBvZiB0ZXh0IHdpdGgKLSAgICAgKiBubyBzdHlsZSBjaGFuZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4gSWYgYW55IHN0eWxlIGlzIHJlcGxhY2VtZW50Ci0gICAgICogdGV4dCwgdGhlIGZpcnN0IGNoYXJhY3RlciB3aWxsIGdldCB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGFuZCB0aGUKLSAgICAgKiByZW1haW5pbmcgY2hhcmFjdGVycyB3aWxsIGdldCBhIHdpZHRoIG9mIDAuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCwgd2lsbCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gd29ya1BhaW50IGEgcGFpbnQgdG8gbW9kaWZ5OyBvbiByZXR1cm4gd2lsbCByZWZsZWN0IHRoZSBvcmlnaW5hbAotICAgICAqICAgICAgICBwYWludCBwbHVzIHRoZSBlZmZlY3Qgb2YgYWxsIHNwYW5zIG9uIHRoZSBydW4KLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGxpbWl0IG9mIHRoZSBydW4KLSAgICAgKiBAcGFyYW0gd2lkdGhzIGFycmF5IHRvIHJlY2VpdmUgdGhlIGFkdmFuY2Ugd2lkdGhzIG9mIHRoZSBjaGFyYWN0ZXJzLiBNdXN0Ci0gICAgICogICAgICAgIGJlIGF0IGxlYXN0IGEgbGFyZ2UgYXMgKGVuZCAtIHN0YXJ0KS4KLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2Ygd2lkdGhzIHJldHVybmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dFdpZHRocyhUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pKSB7Ci0gICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9Ci0gICAgICAgICAgICB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0JCVJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7Ci0gICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotCQkJTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0JCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCXJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKLQkJCX0KLQkJfQotCQotICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0VGV4dFdpZHRocyh0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHdpZCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBmbWkpOwotCi0gICAgICAgICAgICBpZiAoZW5kID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aHNbMF0gPSB3aWQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaSAtIHN0YXJ0XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZCAtIHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcnMgYW5kL29yIG1lYXN1cmVzIGEgZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZS4KLSAgICAgKiBVbmxpa2Uge0BsaW5rICNkcmF3VW5pZm9ybVJ1bn0sIHRoaXMgY2FuIHJlbmRlciBydW5zIHRoYXQgY3Jvc3Mgc3R5bGUKLSAgICAgKiBib3VuZGFyaWVzLiAgUmV0dXJucyB0aGUgc2lnbmVkIGFkdmFuY2Ugd2lkdGgsIGlmIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIG9wdGltaXplcyBmb3IgdW5zdHlsZWQgdGV4dCBhbmQgc28gd29ya1BhaW50IG1pZ2h0IG5vdCBiZQotICAgICAqIG1vZGlmaWVkIGJ5IHRoaXMgY2FsbC4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCBhZHZhbmNlIHdpZHRoIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3RGlyZWN0aW9uYWxSdW4oQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICAvLyBYWFg6IEl0IGxvb2tzIGxpa2UgYWxsIGNhbGxzIHRvIHRoaXMgQVBJIG1hdGNoIGRpciBhbmQgcnVuSXNSdGwsIHNvCi0gICAgICAgIC8vIGhhdmluZyBib3RoIHBhcmFtZXRlcnMgaXMgcmVkdW5kYW50IGFuZCBjb25mdXNpbmcuCi0KLSAgICAgICAgLy8gZmFzdCBwYXRoIGZvciB1bnN0eWxlZCB0ZXh0Ci0gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSkgewotICAgICAgICAgICAgZmxvYXQgcmV0ID0gMDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRtcCA9IFRleHRVdGlscy5nZXRSZXZlcnNlKHRleHQsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgICAgIC8vIFhYWDogdGhpcyBhc3N1bWVzIGdldFJldmVyc2UgZG9lc24ndCB0d2VhayB0aGUgbGVuZ3RoIG9mCi0gICAgICAgICAgICAgICAgLy8gdGhlIHRleHQKLSAgICAgICAgICAgICAgICBpbnQgdG1wZW5kID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwgfHwgbmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0bXAsIDAsIHRtcGVuZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIDAsIHRtcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSByZXQsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRXaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gcGFpbnQubWVhc3VyZVRleHQodGV4dCwgc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXQgKiBkaXI7ICAgLy8gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUID09IC0xCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZsb2F0IG94ID0geDsKLSAgICAgICAgaW50IG1pbkFzY2VudCA9IDAsIG1heERlc2NlbnQgPSAwLCBtaW5Ub3AgPSAwLCBtYXhCb3R0b20gPSAwOwotCi0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgQ2xhc3M8Pz4gZGl2aXNpb247Ci0KLSAgICAgICAgaWYgKGNhbnZhcyA9PSBudWxsKQotICAgICAgICAgICAgZGl2aXNpb24gPSBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXZpc2lvbiA9IENoYXJhY3RlclN0eWxlLmNsYXNzOwotCi0gICAgICAgIGludCBuZXh0OwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwgZGl2aXNpb24pOwotCi0gICAgICAgICAgICAvLyBYWFg6IGlmIGRpciBhbmQgcnVuSXNSdGwgd2VyZSBub3QgdGhlIHNhbWUsIHRoaXMgd291bGQgZHJhdwotICAgICAgICAgICAgLy8gc3BhbnMgaW4gdGhlIHdyb25nIG9yZGVyLCBidXQgbm8gb25lIGFwcGVhcnMgdG8gY2FsbCBpdCB0aGlzCi0gICAgICAgICAgICAvLyB3YXkuCi0gICAgICAgICAgICB4ICs9IGRyYXdVbmlmb3JtUnVuKGNhbnZhcywgc3AsIGksIG5leHQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoIHx8IG5leHQgIT0gZW5kKTsKLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5hc2NlbnQgPCBtaW5Bc2NlbnQpCi0gICAgICAgICAgICAgICAgICAgIG1pbkFzY2VudCA9IGZtaS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5kZXNjZW50ID4gbWF4RGVzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWF4RGVzY2VudCA9IGZtaS5kZXNjZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKGZtaS50b3AgPCBtaW5Ub3ApCi0gICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IGZtaS50b3A7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5ib3R0b20gPiBtYXhCb3R0b20pCi0gICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IGZtaS5ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbWkuYXNjZW50ID0gbWluQXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS5kZXNjZW50ID0gbWF4RGVzY2VudDsKLSAgICAgICAgICAgICAgICBmbWkudG9wID0gbWluVG9wOwotICAgICAgICAgICAgICAgIGZtaS5ib3R0b20gPSBtYXhCb3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4geCAtIG94OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgYW5kIG9wdGlvbmFsbHkKLSAgICAgKiByZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZS4gIFVubGlrZSBkcmF3RGlyZWN0aW9uYWxSdW4sIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gYW5kIHJ1biBkaXJlY3Rpb24gY2FuIGJlIGRpZmZlcmVudC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBYWFggdGhpcyBsb2dpYyBpcyAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSA9PSBydW5Jc1J0bAotICAgICAgICBpZiAoKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgJiYgIXJ1bklzUnRsKSB8fAotICAgICAgICAgICAgKHJ1bklzUnRsICYmIGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRoZSByZWFsIGRpcmVjdGlvbgotICAgICAgICAgICAgZmxvYXQgY2ggPSBkcmF3RGlyZWN0aW9uYWxSdW4obnVsbCwgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULCBmYWxzZSwgMCwgMCwgMCwgMCwgbnVsbCwgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGNoICo9IGRpcjsgIC8vIERJUl9SSUdIVF9UT19MRUZUID09IC0xCi0gICAgICAgICAgICBkcmF3RGlyZWN0aW9uYWxSdW4oY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCAtZGlyLAotICAgICAgICAgICAgICAgICAgICBydW5Jc1J0bCwgeCArIGNoLCB0b3AsIHksIGJvdHRvbSwgbnVsbCwgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkcmF3RGlyZWN0aW9uYWxSdW4oY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgbnVsbCwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCB3aXRoIGl0cwotICAgICAqIG9yaWdpbiBhdCAoeCx5KSwgaW4gdGhlIHNwZWNpZmllZCBQYWludC4gVGhlIG9yaWdpbiBpcyBpbnRlcnByZXRlZCBiYXNlZAotICAgICAqIG9uIHRoZSBBbGlnbiBzZXR0aW5nIGluIHRoZSBQYWludC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGNvbnNpZGVycyBzdHlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGV4dCAoZS5nLiBldmVuIHdoZW4gdGV4dAotICAgICAqIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0sIHRoaXMgbWV0aG9kIGNvcnJlY3RseQotICAgICAqIGRyYXdzIHRoZSB0ZXh0KS4gU2VlIGFsc28KLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgZmxvYXQsCi0gICAgICogZmxvYXQsIFBhaW50KX0gYW5kCi0gICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdSZWN0KGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LAotICAgICAqIFBhaW50KX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhbnZhcyBUaGUgdGFyZ2V0IGNhbnZhcwotICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGRyYXduCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRleHQgdG8gZHJhdwotICAgICAqIEBwYXJhbSBlbmQgKGVuZCAtIDEpIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0ZXh0LiBUaGlzIG11c3QgYmUKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX0xFRlRfVE9fUklHSFR9IG9yCi0gICAgICogICAgICAgIHtAbGluayBhbmRyb2lkLnRleHQuTGF5b3V0I0RJUl9SSUdIVF9UT19MRUZUfS4KLSAgICAgKiBAcGFyYW0geCBUaGUgeC1jb29yZGluYXRlIG9mIG9yaWdpbiBmb3Igd2hlcmUgdG8gZHJhdyB0aGUgdGV4dAotICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBzaWRlIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0geSBUaGUgeS1jb29yZGluYXRlIG9mIG9yaWdpbiBmb3Igd2hlcmUgdG8gZHJhdyB0aGUgdGV4dAotICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBzaWRlIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0LgotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgVGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCB1c2VkIGZvciB0ZW1wb3JhbAotICAgICAqICAgICAgICB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIG5lZWRXaWR0aCBJZiB0cnVlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB3aWR0aCBvZiBkcmF3biB0ZXh0Ci0gICAgICogQHJldHVybiBXaWR0aCBvZiB0aGUgZHJhd24gdGV4dCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZHJhd1RleHQoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLSAgICAgICAgLy8gRm9yIHNhZmV0eS4KLSAgICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uID49IDAgPyBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKLSAgICAgICAgICAgICAgICA6IExheW91dC5ESVJfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvLyBIaWRlIHJ1bklzUnRsIHBhcmFtZXRlciBzaW5jZSBpdCBpcyBtZWFuaW5nbGVzcyBmb3IgZXh0ZXJuYWwKLSAgICAgICAgLy8gZGV2ZWxvcGVycy4KLSAgICAgICAgLy8gWFhYOiB0aGUgcnVuSXNSdGwgcHJvYmFibHkgb3VnaHQgdG8gYmUgdGhlIHNhbWUgYXMgZGlyZWN0aW9uLCB0aGVuCi0gICAgICAgIC8vIHRoaXMgY291bGQgZHJhdyBydGwgdGV4dC4KLSAgICAgICAgcmV0dXJuIGRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LCBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiBhIHJ1biBvZiBsZWZ0LXRvLXJpZ2h0IHRleHQgb24gYSBzaW5nbGUgbGluZSwKLSAgICAgKiBjb25zaWRlcmluZyBzdHlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGV4dCAoZS5nLiBldmVuIHdoZW4gdGV4dCBpcyBhbgotICAgICAqIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0sIHRoaXMgbWV0aG9kIGNvcnJlY3RseSBtZWFzdXJlcwotICAgICAqIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBtYWluIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdDsgd2lsbCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gd29ya1BhaW50IHRoZSB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb247Ci0gICAgICogICAgICAgIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHVzZWQKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBtZWFzdXJlCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHN0YXJ0IG1lYXN1cmluZwotICAgICAqIEBwYXJhbSBlbmQgMSBiZXlvbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciB0byBtZWFzdXJlCi0gICAgICogQHBhcmFtIGZtaSBGb250TWV0cmljcyBpbmZvcm1hdGlvbjsgY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgdGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsIHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM1MjJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuRm9udE1ldHJpY3NJbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5UYWJTdG9wczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsaW5lIG9mIHN0eWxlZCB0ZXh0LCBmb3IgbWVhc3VyaW5nIGluIHZpc3VhbCBvcmRlciBhbmQKKyAqIGZvciByZW5kZXJpbmcuCisgKgorICogPHA+R2V0IGEgbmV3IGluc3RhbmNlIHVzaW5nIG9idGFpbigpLCBhbmQgd2hlbiBmaW5pc2hlZCB3aXRoIGl0LCByZXR1cm4gaXQKKyAqIHRvIHRoZSBwb29sIHVzaW5nIHJlY3ljbGUoKS4KKyAqCisgKiA8cD5DYWxsIHNldCB0byBwcmVwYXJlIHRoZSBpbnN0YW5jZSBmb3IgdXNlLCB0aGVuIGVpdGhlciBkcmF3LCBtZWFzdXJlLAorICogbWV0cmljcywgb3IgY2FyZXRUb0xlZnRSaWdodE9mLgorICoKKyAqIEBoaWRlCisgKi8KK2NsYXNzIFRleHRMaW5lIHsKKyAgICBwcml2YXRlIFRleHRQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXJ0OworICAgIHByaXZhdGUgaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbURpcjsKKyAgICBwcml2YXRlIERpcmVjdGlvbnMgbURpcmVjdGlvbnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNUYWJzOworICAgIHByaXZhdGUgVGFiU3RvcHMgbVRhYnM7CisgICAgcHJpdmF0ZSBjaGFyW10gbUNoYXJzOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2hhcnNWYWxpZDsKKyAgICBwcml2YXRlIFNwYW5uZWQgbVNwYW5uZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0UGFpbnQgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFRleHRMaW5lW10gY2FjaGVkID0gbmV3IFRleHRMaW5lWzNdOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBUZXh0TGluZSBmcm9tIHRoZSBzaGFyZWQgcG9vbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gdW5pbml0aWFsaXplZCBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSBvYnRhaW4oKSB7CisgICAgICAgIFRleHRMaW5lIHRsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0bCA9IG5ldyBUZXh0TGluZSgpOworICAgICAgICBMb2cuZSgiVExJTkUiLCAibmV3OiAiICsgdGwpOworICAgICAgICByZXR1cm4gdGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhIFRleHRMaW5lIGJhY2sgaW50byB0aGUgc2hhcmVkIHBvb2wuIERvIG5vdCB1c2UgdGhpcyBUZXh0TGluZSBvbmNlCisgICAgICogaXQgaGFzIGJlZW4gcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHRsIHRoZSB0ZXh0TGluZQorICAgICAqIEByZXR1cm4gbnVsbCwgYXMgYSBjb252ZW5pZW5jZSBmcm9tIGNsZWFyaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkCisgICAgICogVGV4dExpbmUKKyAgICAgKi8KKyAgICBzdGF0aWMgVGV4dExpbmUgcmVjeWNsZShUZXh0TGluZSB0bCkgeworICAgICAgICB0bC5tVGV4dCA9IG51bGw7CisgICAgICAgIHRsLm1QYWludCA9IG51bGw7CisgICAgICAgIHRsLm1EaXJlY3Rpb25zID0gbnVsbDsKKyAgICAgICAgaWYgKHRsLm1MZW4gPCAyNTApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IHRsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBUZXh0TGluZSBhbmQgcHJlcGFyZXMgaXQgZm9yIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgYmFzZSBwYWludCBmb3IgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCwgY2FuIGJlIFN0eWxlZAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBsaW5lIHJlbGF0aXZlIHRvIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGlzIGxpbmUKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9ucyB0aGUgZGlyZWN0aW9ucyBpbmZvcm1hdGlvbiBvZiB0aGlzIGxpbmUKKyAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIHRoZSBsaW5lIG1pZ2h0IGNvbnRhaW4gdGFicyBvciBlbW9qaQorICAgICAqIEBwYXJhbSB0YWJTdG9wcyB0aGUgdGFiU3RvcHMuIENhbiBiZSBudWxsLgorICAgICAqLworICAgIHZvaWQgc2V0KFRleHRQYWludCBwYWludCwgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgZGlyLAorICAgICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLCBib29sZWFuIGhhc1RhYnMsIFRhYlN0b3BzIHRhYlN0b3BzKSB7CisgICAgICAgIG1QYWludCA9IHBhaW50OworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1TdGFydCA9IHN0YXJ0OworICAgICAgICBtTGVuID0gbGltaXQgLSBzdGFydDsKKyAgICAgICAgbURpciA9IGRpcjsKKyAgICAgICAgbURpcmVjdGlvbnMgPSBkaXJlY3Rpb25zOworICAgICAgICBtSGFzVGFicyA9IGhhc1RhYnM7CisgICAgICAgIG1TcGFubmVkID0gbnVsbDsKKworICAgICAgICBib29sZWFuIGhhc1JlcGxhY2VtZW50ID0gZmFsc2U7CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgbVNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgIGhhc1JlcGxhY2VtZW50ID0gbVNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpLmxlbmd0aCA+IDA7CisgICAgICAgIH0KKworICAgICAgICBtQ2hhcnNWYWxpZCA9IGhhc1JlcGxhY2VtZW50IHx8IGhhc1RhYnMgfHwKKyAgICAgICAgICAgIGRpcmVjdGlvbnMgIT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICBpZiAobUNoYXJzID09IG51bGwgfHwgbUNoYXJzLmxlbmd0aCA8IG1MZW4pIHsKKyAgICAgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShtTGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGxpbWl0LCBtQ2hhcnMsIDApOworICAgICAgICAgICAgaWYgKGhhc1JlcGxhY2VtZW50KSB7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZXNlIGFsbCBhdCBvbmNlIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgYXMgd2UgZ28uCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggcmVwbGFjZW1lbnQgcnVuIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gb2JqZWN0LXJlcGxhY2VtZW50IGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmRlciB3aXRoIHplcm8gd2lkdGgKKyAgICAgICAgICAgICAgICAvLyBub24tYnJlYWsgc3BhY2UgYWthIEJPTS4gIEN1cnNvciBtb3ZlbWVudCBjb2RlIHNraXBzIHRoZXNlCisgICAgICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG1DaGFyczsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGluZXh0OyBpIDwgbGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgICAgICAgICBpbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAobVNwYW5uZWQuZ2V0U3BhbnMoaSwgaW5leHQsIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoID4gMCkgeyAvLyB0cmFuc2l0aW9uIGludG8gYSBzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tpIC0gc3RhcnRdID0gJ1x1ZmZmYyc7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSAtIHN0YXJ0ICsgMSwgZSA9IGluZXh0IC0gc3RhcnQ7IGogPCBlOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tqXSA9ICdcdWZlZmYnOyAvLyB1c2VkIGFzIFpXTkJTLCBtYXJrcyBwb3NpdGlvbnMgdG8gc2tpcAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UYWJzID0gdGFiU3RvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVycyB0aGUgVGV4dExpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIHJlbmRlciBvbgorICAgICAqIEBwYXJhbSB4IHRoZSBsZWFkaW5nIG1hcmdpbiBwb3NpdGlvbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqLworICAgIHZvaWQgZHJhdyhDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20pIHsKKyAgICAgICAgaWYgKCFtSGFzVGFicykgeworICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgZHJhd1J1bihjLCAwLCAwLCBtTGVuLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIHRydWUsIHgsIHRvcCwgeSwgYm90dG9tLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgaCA9IDA7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgUmVjdEYgZW1vamlSZWN0ID0gbnVsbDsKKworICAgICAgICBpbnQgbGFzdFJ1bkluZGV4ID0gcnVucy5sZW5ndGggLSAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBydW5TdGFydCA9IHJ1bnNbaV07CisgICAgICAgICAgICBpbnQgcnVuTGltaXQgPSBydW5TdGFydCArIChydW5zW2krMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChydW5MaW1pdCA+IG1MZW4pIHsKKyAgICAgICAgICAgICAgICBydW5MaW1pdCA9IG1MZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsID0gKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fUlRMX0ZMQUcpICE9IDA7CisKKyAgICAgICAgICAgIGludCBzZWdzdGFydCA9IHJ1blN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1IYXNUYWJzID8gcnVuU3RhcnQgOiBydW5MaW1pdDsgaiA8PSBydW5MaW1pdDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7CisgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChtSGFzVGFicyAmJiBqIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gbUNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KG1DaGFycywgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IExheW91dC5NSU5fRU1PSkkgJiYgY29kZXB0IDw9IExheW91dC5NQVhfRU1PSkkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IExheW91dC5FTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwdCA+IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqID09IHJ1bkxpbWl0IHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBkcmF3UnVuKGMsIGksIHNlZ3N0YXJ0LCBqLCBydW5Jc1J0bCwgeCtoLCB0b3AsIHksIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9IGxhc3RSdW5JbmRleCB8fCBqICE9IG1MZW4pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG1EaXIgKiBuZXh0VGFiKGggKiBtRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAtYm1Bc2NlbnQgLyBiaXRtYXBIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppUmVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlSZWN0ID0gbmV3IFJlY3RGKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3Quc2V0KHggKyBoLCB5ICsgYm1Bc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBoICsgd2lkdGgsIHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5kcmF3Qml0bWFwKGJtLCBudWxsLCBlbW9qaVJlY3QsIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBtZXRyaWNzIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXJlIGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIGZvbnQgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBmbG9hdCBtZXRyaWNzKEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gbWVhc3VyZShtTGVuLCBmYWxzZSwgZm1pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcG9zaXRpb24gb24gdGhlIGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBsaW5lLXJlbGF0aXZlIGNoYXJhY3RlciBvZmZzZXQsIGJldHdlZW4gMCBhbmQgdGhlCisgICAgICogbGluZSBsZW5ndGgsIGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSB0cmFpbGluZyB0cnVlIHRvIG1lYXN1cmUgdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlcgorICAgICAqIGJlZm9yZSBvZmZzZXQsIGZhbHNlIHRvIG1lYXN1cmUgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYXQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdGVkCisgICAgICogY2hhcmFjdGVyLCBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luIHRvIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIgZWRnZS4KKyAgICAgKi8KKyAgICBmbG9hdCBtZWFzdXJlKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICBpbnQgdGFyZ2V0ID0gdHJhaWxpbmcgPyBvZmZzZXQgLSAxIDogb2Zmc2V0OworICAgICAgICBpZiAodGFyZ2V0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIGZhbHNlLCBmbWkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVSdW4oMCwgMCwgb2Zmc2V0LCBtTGVuLCB0cnVlLCBmbWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweGQ4MDAgJiYgY29kZXB0IDwgMHhkYzAwICYmIGogKyAxIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaGFycywgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IExheW91dC5NSU5fRU1PSkkgJiYgY29kZXB0IDw9IExheW91dC5NQVhfRU1PSkkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IExheW91dC5FTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwdCA+IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqID09IHJ1bkxpbWl0IHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblNlZ21lbnQgPSB0YXJnZXQgPj0gc2Vnc3RhcnQgJiYgdGFyZ2V0IDwgajsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSAobURpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpID09IHJ1bklzUnRsOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TZWdtZW50ICYmIGFkdmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIGZtaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgaiwgaiwgcnVuSXNSdGwsIGZtaSk7CisgICAgICAgICAgICAgICAgICAgIGggKz0gYWR2YW5jZSA/IHcgOiAtdzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TZWdtZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCArPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBvZmZzZXQsIGosIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm1Bc2NlbnQgPSBhc2NlbnQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSBibS5nZXRXaWR0aCgpICogLWJtQXNjZW50IC8gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoICs9IG1EaXIgKiB3aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgKGJ1dCBwb3NzaWJseSBtdWx0aS1zdHlsZWQpIHJ1biBvZiB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcyB0byBkcmF3IG9uCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGRpcmVjdGlvbmFsIHJ1bgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGluZS1yZWxhdGl2ZSBsaW1pdAorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSB4IHRoZSBwb3NpdGlvbiBvZiB0aGUgcnVuIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIHZhbHVlIGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuLCBiYXNlZCBvbiB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiBPbmx5IHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZHJhd1J1bihDYW52YXMgYywgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBpZiAoKG1EaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUKSA9PSBydW5Jc1J0bCkgeworICAgICAgICAgICAgZmxvYXQgdyA9IC1tZWFzdXJlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgbnVsbCk7CisgICAgICAgICAgICBoYW5kbGVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBjLCB4ICsgdywgdG9wLAorICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwKKyAgICAgICAgICAgICAgICB5LCBib3R0b20sIG51bGwsIG5lZWRXaWR0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVhc3VyZXMgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIG1lYXN1cmUgdG8sIGJldHdlZW4gc3RhcnQgYW5kIGxpbWl0IGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGluZS1yZWxhdGl2ZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBydW4sIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcnVuIHRvIHRoZSBsZWFkaW5nIGVkZ2UKKyAgICAgKiBvZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCwgYmFzZWQgb24gdGhlIHJ1biAobm90IHBhcmFncmFwaCkgZGlyZWN0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtZWFzdXJlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBGb250TWV0cmljc0ludCBmbWkpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIG9mZnNldCwgbGltaXQsIHJ1bklzUnRsLCBudWxsLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FsayB0aGUgY3Vyc29yIHRocm91Z2ggdGhpcyBsaW5lLCBza2lwcGluZyBjb25qdW5jdHMgYW5kCisgICAgICogemVyby13aWR0aCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogPHA+VGhpcyBmdW5jdGlvbiBjYW5ub3QgcHJvcGVybHkgd2FsayB0aGUgY3Vyc29yIG9mZiB0aGUgZW5kcyBvZiB0aGUgbGluZQorICAgICAqIHNpbmNlIGl0IGRvZXMgbm90IGtub3cgYWJvdXQgYW55IHNoYXBpbmcgb24gdGhlIHByZXZpb3VzL2ZvbGxvd2luZyBsaW5lCisgICAgICogdGhhdCBtaWdodCBhZmZlY3QgdGhlIGN1cnNvciBwb3NpdGlvbi4gQ2FsbGVycyBtdXN0IGVpdGhlciBhdm9pZCB0aGVzZQorICAgICAqIHNpdHVhdGlvbnMgb3IgaGFuZGxlIHRoZSByZXN1bHQgc3BlY2lhbGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnNvciwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsZW5ndGggb2YgdGhlIGxpbmUsIGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSB0b0xlZnQgdHJ1ZSBpZiB0aGUgY2FyZXQgaXMgbW92aW5nIHRvIHRoZSBsZWZ0LgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQuICBJZiBpdCBpcyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aAorICAgICAqIG9mIHRoZSBsaW5lLCB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGV4YW1pbmVkIHRvIGdldCB0aGUKKyAgICAgKiBhY3R1YWwgb2Zmc2V0LgorICAgICAqLworICAgIGludCBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKGludCBjdXJzb3IsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIC8vIDEpIFRoZSBjYXJldCBtYXJrcyB0aGUgbGVhZGluZyBlZGdlIG9mIGEgY2hhcmFjdGVyLiBUaGUgY2hhcmFjdGVyCisgICAgICAgIC8vIGxvZ2ljYWxseSBiZWZvcmUgaXQgbWlnaHQgYmUgb24gYSBkaWZmZXJlbnQgbGV2ZWwsIGFuZCB0aGUgYWN0aXZlIGNhcmV0CisgICAgICAgIC8vIHBvc2l0aW9uIGlzIG9uIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxvd2VyIGxldmVsLiBJZiB0aGF0IGNoYXJhY3RlcgorICAgICAgICAvLyB3YXMgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgdGhlIGNhcmV0IGlzIG9uIGl0cyB0cmFpbGluZyBlZGdlLgorICAgICAgICAvLyAyKSBUYWtlIHRoaXMgY2hhcmFjdGVyL2VkZ2UgYW5kIG1vdmUgaXQgaW4gdGhlIGluZGljYXRlZCBkaXJlY3Rpb24uCisgICAgICAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgbmV3IGNoYXJhY3RlciBhbmQgYSBuZXcgZWRnZS4KKyAgICAgICAgLy8gMykgVGhpcyBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB2aXN1YWxseSBhZGphY2VudCBjaGFyYWN0ZXJzLiAgT25lIG9mCisgICAgICAgIC8vIHRoZXNlIG1pZ2h0IGJlIGF0IGEgbG93ZXIgbGV2ZWwuICBUaGUgYWN0aXZlIHBvc2l0aW9uIGlzIG9uIHRoZQorICAgICAgICAvLyBjaGFyYWN0ZXIgYXQgdGhlIGxvd2VyIGxldmVsLgorICAgICAgICAvLyA0KSBJZiB0aGUgYWN0aXZlIHBvc2l0aW9uIGlzIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIsCisgICAgICAgIC8vIHRoZSBuZXcgY2FyZXQgcG9zaXRpb24gaXMgdGhlIGZvbGxvd2luZyBsb2dpY2FsIGNoYXJhY3RlciwgZWxzZSBpdAorICAgICAgICAvLyBpcyB0aGUgY2hhcmFjdGVyLgorCisgICAgICAgIGludCBsaW5lU3RhcnQgPSAwOworICAgICAgICBpbnQgbGluZUVuZCA9IG1MZW47CisgICAgICAgIGJvb2xlYW4gcGFyYUlzUnRsID0gbURpciA9PSAtMTsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBydW5JbmRleCwgcnVuTGV2ZWwgPSAwLCBydW5TdGFydCA9IGxpbmVTdGFydCwgcnVuTGltaXQgPSBsaW5lRW5kLCBuZXdDYXJldCA9IC0xOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGN1cnNvciA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIHJ1bkluZGV4ID0gLTI7CisgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yID09IGxpbmVFbmQpIHsKKyAgICAgICAgICAgIHJ1bkluZGV4ID0gcnVucy5sZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRmlyc3QsIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVuIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciB3aXRoCisgICAgICAgICAgLy8gdGhlIGFjdGl2ZSBjYXJldC4KKyAgICAgICAgICBmb3IgKHJ1bkluZGV4ID0gMDsgcnVuSW5kZXggPCBydW5zLmxlbmd0aDsgcnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgcnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3J1bkluZGV4XTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgPj0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgcnVuTGltaXQgPSBydW5TdGFydCArIChydW5zW3J1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgIGlmIChydW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoY3Vyc29yIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICBydW5MZXZlbCA9IChydW5zW3J1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSAmCisgICAgICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IHJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FyZXQgaXMgb24gYSBydW4gYm91bmRhcnksIHNlZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgcG9zaXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIGNoYXJhY3RlciBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgaW50IHByZXZSdW5JbmRleCwgcHJldlJ1bkxldmVsLCBwcmV2UnVuU3RhcnQsIHByZXZSdW5MaW1pdDsKKyAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBjdXJzb3IgLSAxOworICAgICAgICAgICAgICAgICAgZm9yIChwcmV2UnVuSW5kZXggPSAwOyBwcmV2UnVuSW5kZXggPCBydW5zLmxlbmd0aDsgcHJldlJ1bkluZGV4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldlJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1twcmV2UnVuSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IHByZXZSdW5TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MaW1pdCA9IHByZXZSdW5TdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChydW5zW3ByZXZSdW5JbmRleCsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UnVuTGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBwcmV2UnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MZXZlbCA9IChydW5zW3ByZXZSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UnVuTGV2ZWwgPCBydW5MZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmcm9tIGxvZ2ljYWxseSBwcmV2aW91cyBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gcHJldlJ1bkluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MZXZlbCA9IHByZXZSdW5MZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnQgPSBwcmV2UnVuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGNhcmV0IG1pZ2h0IGJlID09IGxpbmVFbmQuICBUaGlzIGlzIGdlbmVyYWxseSBhIHNwYWNlIG9yIHBhcmFncmFwaAorICAgICAgICAgIC8vIHNlcGFyYXRvciBhbmQgaGFzIGFuIGFzc29jaWF0ZWQgcnVuLCBidXQgbWlnaHQgYmUgdGhlIGVuZCBvZgorICAgICAgICAgIC8vIHRleHQsIGluIHdoaWNoIGNhc2UgaXQgZG9lc24ndC4gIElmIHRoYXQgaGFwcGVucywgd2UgcmFuIG9mZiB0aGUKKyAgICAgICAgICAvLyBlbmQgb2YgdGhlIHJ1biBsaXN0LCBhbmQgcnVuSW5kZXggPT0gcnVucy5sZW5ndGguICBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgLy8gd2UgYXJlIGF0IGEgcnVuIGJvdW5kYXJ5IHNvIHdlIHNraXAgdGhlIGJlbG93IHRlc3QuCisgICAgICAgICAgaWYgKHJ1bkluZGV4ICE9IHJ1bnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuTGV2ZWwgJiAweDEpICE9IDA7CisgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSBydW5Jc1J0bDsKKyAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSAoYWR2YW5jZSA/IHJ1bkxpbWl0IDogcnVuU3RhcnQpIHx8IGFkdmFuY2UgIT0gdHJhaWxpbmcpIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyB3aXRoaW4gb3IgaW50byB0aGUgcnVuLCBzbyB3ZSBjYW4gbW92ZSBsb2dpY2FsbHkuCisgICAgICAgICAgICAgICAgICBuZXdDYXJldCA9IGdldE9mZnNldEJlZm9yZUFmdGVyKHJ1bkluZGV4LCBydW5TdGFydCwgcnVuTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCBjdXJzb3IsIGFkdmFuY2UpOworICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgcnVuLCB3ZSdyZSBhdCB0aGUgc3Ryb25nCisgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbHJlYWR5IHNvIHdlJ3JlIGZpbmlzaGVkLgorICAgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2FyZXQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBuZXdDYXJldCBpcyAtMSwgd2UncmUgc3RhcnRpbmcgYXQgYSBydW4gYm91bmRhcnkgYW5kIGNyb3NzaW5nCisgICAgICAgIC8vIGludG8gYW5vdGhlciBydW4uIE90aGVyd2lzZSB3ZSd2ZSBhcnJpdmVkIGF0IGEgcnVuIGJvdW5kYXJ5LCBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGNoYXJhY3RlciB0byBhdHRhY2ggdG8uICBOb3RlIHdlIG1pZ2h0CisgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoaXMgdHdpY2UsIGlmIHdlIGNyb3NzIGEgcnVuIGJvdW5kYXJ5IGFuZCBlbmQgdXAgYXQKKyAgICAgICAgLy8gYW5vdGhlciBydW4gYm91bmRhcnkuCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHBhcmFJc1J0bDsKKyAgICAgICAgICBpbnQgb3RoZXJSdW5JbmRleCA9IHJ1bkluZGV4ICsgKGFkdmFuY2UgPyAyIDogLTIpOworICAgICAgICAgIGlmIChvdGhlclJ1bkluZGV4ID49IDAgJiYgb3RoZXJSdW5JbmRleCA8IHJ1bnMubGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbb3RoZXJSdW5JbmRleF07CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5MaW1pdCA9IG90aGVyUnVuU3RhcnQgKworICAgICAgICAgICAgKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKG90aGVyUnVuTGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5MZXZlbCA9IChydW5zW290aGVyUnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICBMYXlvdXQuUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICBib29sZWFuIG90aGVyUnVuSXNSdGwgPSAob3RoZXJSdW5MZXZlbCAmIDEpICE9IDA7CisKKyAgICAgICAgICAgIGFkdmFuY2UgPSB0b0xlZnQgPT0gb3RoZXJSdW5Jc1J0bDsKKyAgICAgICAgICAgIGlmIChuZXdDYXJldCA9PSAtMSkgeworICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIob3RoZXJSdW5JbmRleCwgb3RoZXJSdW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUnVuTGltaXQsIG90aGVyUnVuSXNSdGwsCisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQsIGFkdmFuY2UpOworICAgICAgICAgICAgICAgIGlmIChuZXdDYXJldCA9PSAoYWR2YW5jZSA/IG90aGVyUnVuTGltaXQgOiBvdGhlclJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcm9zc2VkIGFuZCBlbmRlZCB1cCBhdCBhIG5ldyBib3VuZGFyeSwKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwZWF0IGEgc2Vjb25kIGFuZCBmaW5hbCB0aW1lLgorICAgICAgICAgICAgICAgICAgICBydW5JbmRleCA9IG90aGVyUnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gb3RoZXJSdW5MZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgbmV3IGNhcmV0IGlzIGF0IGEgYm91bmRhcnkuCisgICAgICAgICAgICBpZiAob3RoZXJSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgIC8vIFRoZSBzdHJvbmcgY2hhcmFjdGVyIGlzIGluIHRoZSBvdGhlciBydW4uCisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IG90aGVyUnVuU3RhcnQgOiBvdGhlclJ1bkxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgIC8vIFdlJ3JlIHdhbGtpbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGUgcGFyYWdyYXBoCisgICAgICAgICAgICAgIC8vIGxldmVsIGlzIGFsd2F5cyBlcXVhbCB0byBvciBsb3dlciB0aGFuIGFueSBpbnRlcm5hbCBsZXZlbCwgc28KKyAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kYXJpZXMgZ2V0IHRoZSBzdHJvbmcgY2FyZXQuCisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IG1MZW4gKyAxIDogLTE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEVsc2Ugd2UndmUgYXJyaXZlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhhdCdzIGEgc3Ryb25nIHBvc2l0aW9uLgorICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYXJyaXZlZCBoZXJlIGJ5IGNyb3NzaW5nIG92ZXIgYSBydW4gd2l0aCBubyBpbnRlcm5hbAorICAgICAgICAgIC8vIGJyZWFrcyBhbmQgZHJvcHBpbmcgb3V0IG9mIHRoZSBhYm92ZSBsb29wIGJlZm9yZSBhZHZhbmNpbmcgb25lIGZpbmFsCisgICAgICAgICAgLy8gdGltZSwgc28gcmVzZXQgdGhlIGNhcmV0LgorICAgICAgICAgIC8vIE5vdGUsIHdlIHVzZSAnPD0nIGJlbG93IHRvIGhhbmRsZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgb25seSBydW4KKyAgICAgICAgICAvLyBvbiB0aGUgbGluZSBpcyBhIGNvdW50ZXItZGlyZWN0aW9uYWwgcnVuLiAgSWYgd2UncmUgbm90IGFkdmFuY2luZywKKyAgICAgICAgICAvLyB3ZSBjYW4gZW5kIHVwIGF0IHRoZSAnbGluZUVuZCcgcG9zaXRpb24gYnV0IHRoZSBjYXJldCB3ZSB3YW50IGlzIGF0CisgICAgICAgICAgLy8gdGhlIGxpbmVTdGFydC4KKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPD0gbGluZUVuZCkgeworICAgICAgICAgICAgICBuZXdDYXJldCA9IGFkdmFuY2UgPyBsaW5lRW5kIDogbGluZVN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHZhbGlkIG9mZnNldCB3aXRoaW4gdGhpcyBkaXJlY3Rpb25hbCBydW4sIHNraXBwaW5nCisgICAgICogY29uanVuY3RzIGFuZCB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIHRvIHdhbGsKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZSwgc2luY2UgdGhlIHJldHVybmVkIHZhbHVlcyBtaWdodCBub3QgYmUgdmFsaWQKKyAgICAgKiBvbiBuZWlnaGJvcmluZyBsaW5lcy4gIElmIHRoZSByZXR1cm5lZCBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8gb3IKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhlIGxpbmUgbGVuZ3RoLCB0aGUgb2Zmc2V0IHNob3VsZCBiZSByZWNvbXB1dGVkIG9uIHRoZQorICAgICAqIHByZWNlZGluZyBvciBmb2xsb3dpbmcgbGluZSwgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gcnVuU3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuTGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gYWZ0ZXIgdHJ1ZSBpZiB0aGUgbmV3IG9mZnNldCBzaG91bGQgbG9naWNhbGx5IGZvbGxvdyB0aGUgcHJvdmlkZWQKKyAgICAgKiBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2Zmc2V0CisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIoaW50IHJ1bkluZGV4LCBpbnQgcnVuU3RhcnQsIGludCBydW5MaW1pdCwKKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwsIGludCBvZmZzZXQsIGJvb2xlYW4gYWZ0ZXIpIHsKKworICAgICAgICBpZiAocnVuSW5kZXggPCAwIHx8IG9mZnNldCA9PSAoYWZ0ZXIgPyBtTGVuIDogMCkpIHsKKyAgICAgICAgICAgIC8vIFdhbGtpbmcgb2ZmIGVuZCBvZiBsaW5lLiAgU2luY2Ugd2UgZG9uJ3Qga25vdworICAgICAgICAgICAgLy8gd2hhdCBjdXJzb3IgcG9zaXRpb25zIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgbGluZXMsIHdlIGNhbid0CisgICAgICAgICAgICAvLyByZXR1cm4gYWNjdXJhdGUgdmFsdWVzLiAgVGhlc2UgYXJlIGEgZ3Vlc3MuCisgICAgICAgICAgICBpZiAoYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQgKyBtU3RhcnQpIC0gbVN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICB3cC5zZXQobVBhaW50KTsKKworICAgICAgICBpbnQgc3BhblN0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgIGludCBzcGFuTGltaXQ7CisgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzcGFuTGltaXQgPSBydW5MaW1pdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0YXJnZXQgPSBhZnRlciA/IG9mZnNldCArIDEgOiBvZmZzZXQ7CisgICAgICAgICAgICBpbnQgbGltaXQgPSBtU3RhcnQgKyBydW5MaW1pdDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgc3BhbkxpbWl0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIHNwYW5TdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKyAgICAgICAgICAgICAgICBpZiAoc3BhbkxpbWl0ID49IHRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3BhblN0YXJ0ID0gc3BhbkxpbWl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIHNwYW5MaW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVwbGFjZW1lbnQgc3Bhbiwgd2UncmUgbW92aW5nIGVpdGhlciB0bworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoaXMgc3Bhbi4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyID8gc3BhbkxpbWl0IDogc3BhblN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gUGFpbnQuRElSRUNUSU9OX1JUTCA6IFBhaW50LkRJUkVDVElPTl9MVFI7CisgICAgICAgIGludCBjdXJzb3JPcHQgPSBhZnRlciA/IFBhaW50LkNVUlNPUl9BRlRFUiA6IFBhaW50LkNVUlNPUl9CRUZPUkU7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBzcGFuU3RhcnQsIHNwYW5MaW1pdCAtIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB3cC5nZXRUZXh0UnVuQ3Vyc29yKG1UZXh0LCBtU3RhcnQgKyBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIHNwYW5MaW1pdCwgZmxhZ3MsIG1TdGFydCArIG9mZnNldCwgY3Vyc29yT3B0KSAtIG1TdGFydDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIHRleHQuICBUaGUgdGV4dCBtdXN0CisgICAgICogbm90IGluY2x1ZGUgYSB0YWIgb3IgZW1vamkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHdvcmtpbmcgcGFpbnQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwgaWYgcmVuZGVyaW5nIGlzIG5vdCBuZWVkZWQKKyAgICAgKiBAcGFyYW0geCB0aGUgZWRnZSBvZiB0aGUgcnVuIGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJ1biBpcyBuZWVkZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVUZXh0KFRleHRQYWludCB3cCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGJvb2xlYW4gcnVuSXNSdGwsCisgICAgICAgICAgICBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgZmxvYXQgcmV0ID0gMDsKKworICAgICAgICBpbnQgcnVuTGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKG5lZWRXaWR0aCB8fCAoYyAhPSBudWxsICYmICh3cC5iZ0NvbG9yICE9IDAgfHwgcnVuSXNSdGwpKSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgICAgIHJldCA9IHdwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0LCBydW5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIGZsYWdzLCBudWxsLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgICAgIHJldCA9IHdwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgZGVsdGEgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgZW5kLCBkZWx0YSArIGNvbnRleHRTdGFydCwgZGVsdGEgKyBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cC5nZXRGb250TWV0cmljc0ludChmbWkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7CisgICAgICAgICAgICAgICAgeCAtPSByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3cC5iZ0NvbG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSB3cC5nZXRDb2xvcigpOworICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3cC5nZXRTdHlsZSgpOworICAgICAgICAgICAgICAgIHdwLnNldENvbG9yKHdwLmJnQ29sb3IpOworICAgICAgICAgICAgICAgIHdwLnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICAgICAgYy5kcmF3UmVjdCh4LCB0b3AsIHggKyByZXQsIGJvdHRvbSwgd3ApOworCisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUocyk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3IoY29sb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcmF3VGV4dFJ1bihjLCB3cCwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBydW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgeCwgeSArIHdwLmJhc2VsaW5lU2hpZnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bklzUnRsID8gLXJldCA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBtZWFzdXJpbmcgYW5kIHJlbmRlcmluZyBhIHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2VtZW50IHRoZSByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSB3cCB0aGUgd29yayBwYWludAorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwgaWYgbm90IHJlbmRlcmluZworICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSByZXBsYWNlbWVudCBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIG9mIHRoZSByZXBsYWNlbWVudCBpcyBuZWVkZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVSZXBsYWNlbWVudChSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQsIFRleHRQYWludCB3cCwKKyAgICAgICAgICAgIGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIENhbnZhcyBjLAorICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sIEZvbnRNZXRyaWNzSW50IGZtaSwKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgZmxvYXQgcmV0ID0gMDsKKworICAgICAgICBpbnQgdGV4dFN0YXJ0ID0gbVN0YXJ0ICsgc3RhcnQ7CisgICAgICAgIGludCB0ZXh0TGltaXQgPSBtU3RhcnQgKyBsaW1pdDsKKworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgcnVuSXNSdGwpKSB7CisgICAgICAgICAgICByZXQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdwLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsIGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoYywgbVRleHQsIHRleHRTdGFydCwgdGV4dExpbWl0LAorICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgd3ApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bklzUnRsID8gLXJldCA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBoYW5kbGluZyBhIHVuaWRpcmVjdGlvbmFsIHJ1bi4gIFRoZSBydW4gbXVzdCBub3QKKyAgICAgKiBjb250YWluIHRhYnMgb3IgZW1vamkgYnV0IGNhbiBjb250YWluIHN0eWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbWVhc3VyZUxpbWl0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0geCB0aGUgZW5kIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBpcyByZXF1aXJlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJ1bihpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IG1lYXN1cmVMaW1pdCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LAorICAgICAgICAgICAgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLCBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIC8vIFNoYXBpbmcgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgY29udGV4dCB1cCB0byBtZXRyaWMgYm91bmRhcmllcywKKyAgICAgICAgLy8gYnV0IHJlbmRlcmluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjaGFyYWN0ZXIgc3R5bGUgYm91bmRhcmllcy4KKyAgICAgICAgLy8gU28gd2UgaXRlcmF0ZSB0aHJvdWdoIG1ldHJpYyBydW5zIHRvIGdldCBtZXRyaWMgYm91bmRzLAorICAgICAgICAvLyB0aGVuIHdpdGhpbiBlYWNoIG1ldHJpYyBydW4gaXRlcmF0ZSB0aHJvdWdoIGNoYXJhY3RlciBzdHlsZSBydW5zCisgICAgICAgIC8vIGZvciB0aGUgcnVuIGJvdW5kcy4KKyAgICAgICAgZmxvYXQgb3ggPSB4OworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGluZXh0OyBpIDwgbWVhc3VyZUxpbWl0OyBpID0gaW5leHQpIHsKKyAgICAgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKworICAgICAgICAgICAgaW50IG1saW1pdDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICBtbGltaXQgPSBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGksIG1TdGFydCArIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICBtbGltaXQgPSBpbmV4dCA8IG1lYXN1cmVMaW1pdCA/IGluZXh0IDogbWVhc3VyZUxpbWl0OworICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBtbGltaXQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworCisgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBoYXZlIGEgcmVwbGFjZW1lbnQgdGhhdCB1c2VzIHRoZSBkcmF3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUsIG90aGVyd2lzZSBtZWFzdXJlIHN0YXRlIHdvdWxkIHN1ZmZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQsIHdwLCBydW5JbmRleCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLCB5LCBib3R0b20sIGZtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwgfHwgYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBpLCBtbGltaXQsIGksIGluZXh0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBtbGltaXQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSwgam5leHQ7IGogPCBtbGltaXQ7IGogPSBqbmV4dCkgeworICAgICAgICAgICAgICAgICAgICBqbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpIC0gbVN0YXJ0OworCisgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlclN0eWxlW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIGpuZXh0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc3BhbnMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlclN0eWxlIHNwYW4gPSBzcGFuc1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlRHJhd1N0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlVGV4dCh3cCwgaiwgam5leHQsIGksIGluZXh0LCBydW5Jc1J0bCwgYywgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgZm1pLCBuZWVkV2lkdGggfHwgam5leHQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB4IC0gb3g7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgdGV4dCBydW4gd2l0aCB0aGUgc2V0LXVwIHBhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcworICAgICAqIEBwYXJhbSB3cCB0aGUgcGFpbnQgdXNlZCB0byByZW5kZXIgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lIG9mIHRoZSBydW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIFRleHRQYWludCB3cCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGJvb2xlYW4gcnVuSXNSdGwsIGZsb2F0IHgsIGludCB5KSB7CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBDYW52YXMuRElSRUNUSU9OX1JUTCA6IENhbnZhcy5ESVJFQ1RJT05fTFRSOworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1DaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgeCwgeSwgZmxhZ3MsIHdwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IG1TdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIGRlbHRhICsgc3RhcnQsIGRlbHRhICsgZW5kLAorICAgICAgICAgICAgICAgICAgICBkZWx0YSArIGNvbnRleHRTdGFydCwgZGVsdGEgKyBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXNjZW50IG9mIHRoZSB0ZXh0IGF0IHN0YXJ0LiAgVGhpcyBpcyB1c2VkIGZvciBzY2FsaW5nCisgICAgICogZW1vamkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBsaW5lLXJlbGF0aXZlIHBvc2l0aW9uCisgICAgICogQHJldHVybiB0aGUgYXNjZW50IG9mIHRoZSB0ZXh0IGF0IHN0YXJ0CisgICAgICovCisgICAgZmxvYXQgYXNjZW50KGludCBwb3MpIHsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFpbnQuYXNjZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwb3MgKz0gbVN0YXJ0OworICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhwb3MsIHBvcyArIDEsCisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgIGlmIChzcGFucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworICAgICAgICBmb3IgKE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA6IHNwYW5zKSB7CisgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3cCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdwLmFzY2VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdGFiIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGggdGhlICh1bnNpZ25lZCkgb2Zmc2V0IGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHJldHVybiB0aGUgKHVuc2lnbmVkKSB0YWIgcG9zaXRpb24gYWZ0ZXIgdGhpcyBvZmZzZXQKKyAgICAgKi8KKyAgICBmbG9hdCBuZXh0VGFiKGZsb2F0IGgpIHsKKyAgICAgICAgaWYgKG1UYWJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFicy5uZXh0VGFiKGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AoaCwgVEFCX0lOQ1JFTUVOVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCmluZGV4IDk1ODliZjMuLjJkNmM3YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQpAQCAtMTcsMTIgKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQmFja2dyb3VuZENvbG9yU3BhbjsKQEAgLTQ1LDEwICs0NCw4IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVuZGVybGluZVNwYW47CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIHB1YmxpYyBjbGFzcyBUZXh0VXRpbHMgewogICAgIHByaXZhdGUgVGV4dFV0aWxzKCkgeyAvKiBjYW5ub3QgYmUgaW5zdGFudGlhdGVkICovIH0KQEAgLTk4Myw3ICs5ODAsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHRleHQgaWYgaXQgZml0cyBpbiB0aGUgc3BlY2lmaWVkIHdpZHRoCiAgICAgICogZ2l2ZW4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBQYWludCwKLSAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQgCisgICAgICogb3IsIGlmIGl0IGRvZXMgbm90IGZpdCwgYSBjb3B5IHdpdGggZWxsaXBzaXMgY2hhcmFjdGVyIGFkZGVkCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBlZGdlIG9yIGNlbnRlci4KICAgICAgKiBJZiA8Y29kZT5wcmVzZXJ2ZUxlbmd0aDwvY29kZT4gaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuZWQgY29weQogICAgICAqIHdpbGwgYmUgcGFkZGVkIHdpdGggemVyby13aWR0aCBzcGFjZXMgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsCkBAIC05OTIsNyArOTg5LDcgQEAKICAgICAgKiByZXBvcnQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGVsbGlwc2l6ZWQgcmFuZ2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZWxsaXBzaXplKENoYXJTZXF1ZW5jZSB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVHJ1bmNhdGVBdCB3aGVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXplQ2FsbGJhY2sgY2FsbGJhY2spIHsKQEAgLTEwMDMsMTMgKzEwMDAsMTIgQEAKIAogICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKIAotICAgICAgICAvLyBVc2UgUGFpbnQuYnJlYWtUZXh0KCkgZm9yIHRoZSBub24tU3Bhbm5lZCBjYXNlIHRvIGF2b2lkIGhhdmluZwotICAgICAgICAvLyB0byBhbGxvY2F0ZSBtZW1vcnkgYW5kIGFjY3VtdWxhdGUgdGhlIGNoYXJhY3RlciB3aWR0aHMgb3Vyc2VsdmVzLgorICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IHNldFBhcmEobXQsIHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOwogCi0gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSkgewotICAgICAgICAgICAgZmxvYXQgd2lkID0gcC5tZWFzdXJlVGV4dCh0ZXh0LCAwLCBsZW4pOwotCi0gICAgICAgICAgICBpZiAod2lkIDw9IGF2YWlsKSB7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMTcsMjUwICsxMDEzLDY5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgLy8gWFhYIGFzc3VtZXMgZWxsaXBzaXMgc3RyaW5nIGRvZXMgbm90IHJlcXVpcmUgc2hhcGluZyBhbmQKKyAgICAgICAgICAgIC8vIGlzIHVuYWZmZWN0ZWQgYnkgc3R5bGUKKyAgICAgICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcGFpbnQubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIGF2YWlsIC09IGVsbGlwc2lzd2lkOwogCi0gICAgICAgICAgICBpZiAoZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgICAgIGludCBmaXQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIDAsIGxlbiAtIGZpdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNFbGxpcHNpcyArIHRleHQudG9TdHJpbmcoKS5zdWJzdHJpbmcobGVuIC0gZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKKyAgICAgICAgICAgIGludCByaWdodCA9IGxlbjsKKyAgICAgICAgICAgIGlmIChhdmFpbCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpdCBhbGwgZ29lcworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7CisgICAgICAgICAgICAgICAgcmlnaHQgPSBsZW4gLSBtdC5icmVha1RleHQoMCwgbGVuLCBmYWxzZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LkVORCkgewotICAgICAgICAgICAgICAgIGludCBmaXQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgZml0KSArIHNFbGxpcHNpczsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSBlbHNlIC8qIHdoZXJlID09IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDIsIG51bGwpOwotICAgICAgICAgICAgICAgIGZsb2F0IHVzZWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIGxlbiAtIHJpZ2h0LCBsZW4pOwotICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuIC0gcmlnaHQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gdXNlZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGxlZnQsIGxlbiAtIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGxlZnQsIGxlbiAtIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIGxlZnQpICsgc0VsbGlwc2lzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGxlbiAtIHJpZ2h0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJ1dCBkbyB0aGUgU3Bhbm5lZCBjYXNlcyBieSBoYW5kLCBiZWNhdXNlIGl0J3Mgc3VjaCBhIHBhaW4KLSAgICAgICAgLy8gdG8gaXRlcmF0ZSB0aGUgc3BhbiB0cmFuc2l0aW9ucyBiYWNrd2FyZHMgYW5kIGdldFRleHRXaWR0aHMoKQotICAgICAgICAvLyB3aWxsIGdpdmUgdXMgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQuCi0KLSAgICAgICAgLy8gZ2V0VGV4dFdpZHRocygpIGFsd2F5cyB3cml0ZXMgaW50byB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LAotICAgICAgICAvLyBzbyBtZWFzdXJlIGVhY2ggc3BhbiBpbnRvIHRoZSBmaXJzdCBoYWxmIGFuZCB0aGVuIGNvcHkgdGhlCi0gICAgICAgIC8vIHJlc3VsdHMgaW50byB0aGUgc2Vjb25kIGhhbGYgdG8gdXNlIGxhdGVyLgotCi0gICAgICAgIGZsb2F0W10gd2lkID0gbmV3IGZsb2F0W2xlbiAqIDJdOwotICAgICAgICBUZXh0UGFpbnQgdGVtcHBhaW50ID0gbmV3IFRleHRQYWludCgpOwotICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHRleHQ7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpID0gbmV4dCkgewotICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwLCB0ZW1wcGFpbnQsIHNwLCBpLCBuZXh0LCB3aWQsIG51bGwpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIDAsIHdpZCwgbGVuICsgaSwgbmV4dCAtIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgc3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgc3VtICs9IHdpZFtsZW4gKyBpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdW0gPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHAubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKLQotICAgICAgICBpZiAoZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pKTsKLSAgICAgICAgICAgICAgICByZWN5Y2xlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7CisgICAgICAgICAgICAgICAgbGVmdCA9IG10LmJyZWFrVGV4dCgwLCBsZW4sIHRydWUsIGF2YWlsKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gbGVuOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaSAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgMCwgaSkpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgxLCB0ZXh0LCBpLCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LkVORCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGldOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoaSwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCBpLCBsZW4pKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgaSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgLyogd2hlcmUgPSBUcnVuY2F0ZUF0Lk1JRERMRSAqLyB7Ci0gICAgICAgICAgICBmbG9hdCBsc3VtID0gMCwgcnN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDAsIHJpZ2h0ID0gbGVuOwotCi0gICAgICAgICAgICBmbG9hdCByYXZhaWwgPSAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyOwotICAgICAgICAgICAgZm9yIChyaWdodCA9IGxlbjsgcmlnaHQgPj0gMDsgcmlnaHQtLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgcmlnaHQgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgcnN1bSA+IHJhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwotICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGxlZnRdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxzdW0gKz0gdzsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCAvIDIpOworICAgICAgICAgICAgICAgIGF2YWlsIC09IG10Lm1lYXN1cmUocmlnaHQsIGxlbik7CisgICAgICAgICAgICAgICAgbGVmdCA9IG10LmJyZWFrVGV4dCgwLCByaWdodCwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgcmlnaHQpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworCisgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gbGVuIC0gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsgLy8gZWxzZSBlbGltaW5hdGUgdGhlIGVsbGlwc2lzIHRvbworICAgICAgICAgICAgICAgICAgICBidWZbbGVmdCsrXSA9ICdcdTIwMjYnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbGVmdDsgaSA8IHJpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcocyk7CiAgICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIGxlZnQpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQob3V0Lmxlbmd0aCgpLCB0ZXh0LCByaWdodCwgbGVuKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmxhbmsoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGludCBsZW4gPSBzb3VyY2UubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLQotICAgICAgICBpZiAoc3RhcnQgIT0gMCkgewotICAgICAgICAgICAgZ2V0Q2hhcnMoc291cmNlLCAwLCBzdGFydCwgYnVmLCAwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kICE9IGxlbikgewotICAgICAgICAgICAgZ2V0Q2hhcnMoc291cmNlLCBlbmQsIGxlbiwgYnVmLCBlbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXJ0ICE9IGVuZCkgewotICAgICAgICAgICAgYnVmW3N0YXJ0XSA9ICdcdTIwMjYnOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBTdHJpbmcgcmV0ID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7Ci0gICAgICAgIHJlY3ljbGUoYnVmKTsKIAotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocmVtYWluaW5nICsgc0VsbGlwc2lzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYnVmLCAwLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYnVmLCByaWdodCwgbGVuIC0gcmlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIDAsIGxlZnQpOworICAgICAgICAgICAgc3NiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgc3NiLmFwcGVuZCh0ZXh0LCByaWdodCwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBzc2I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEyNzgsODAgKzEwOTMsMTIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHAsIGZsb2F0IGF2YWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbmVNb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb3JlKSB7Ci0gICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKLSAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIDAsIGxlbiwgYnVmLCAwKTsKIAotICAgICAgICBpbnQgY29tbWFDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY29tbWFDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXRbXSB3aWQ7Ci0KLSAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHRleHQ7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGVtcHBhaW50ID0gbmV3IFRleHRQYWludCgpOwotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbiAqIDJdOwotCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIDAsIHdpZCwgbGVuICsgaSwgbmV4dCAtIGkpOworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcCwgdGV4dCwgMCwgbGVuLCBMYXlvdXQuRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOworICAgICAgICAgICAgaWYgKHdpZHRoIDw9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCBsZW4sIHdpZCwgMCwgbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpZCA9IG5ldyBmbG9hdFtsZW5dOwotICAgICAgICAgICAgcC5nZXRUZXh0V2lkdGhzKHRleHQsIDAsIGxlbiwgd2lkKTsKLSAgICAgICAgfQorICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG10Lm1DaGFyczsKIAotICAgICAgICBpbnQgb2sgPSAwOwotICAgICAgICBpbnQgb2tSZW1haW5pbmcgPSBjb21tYUNvdW50ICsgMTsKLSAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7Ci0KLSAgICAgICAgaW50IHcgPSAwOwotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIHcgKz0gd2lkW2ldOwotCi0gICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gY29tbWFDb3VudCAtIGNvdW50ICsgMTsKLSAgICAgICAgICAgICAgICBmbG9hdCBtb3JlV2lkOwotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgb25lTW9yZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbW9yZVdpZCA9IHAubWVhc3VyZVRleHQoZm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBvayA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICBpbnQgY29tbWFDb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFDb3VudCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfQogCi0gICAgICAgIGlmICh3IDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50ICsgMTsKKworICAgICAgICAgICAgaW50IG9rID0gMDsKKyAgICAgICAgICAgIGludCBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKKyAgICAgICAgICAgIFN0cmluZyBva0Zvcm1hdCA9ICIiOworCisgICAgICAgICAgICBpbnQgdyA9IDA7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMgPSBtdC5tV2lkdGhzOworCisgICAgICAgICAgICBpbnQgcmVxdWVzdCA9IG10Lm1EaXIgPT0gMSA/IExheW91dC5ESVJfUkVRVUVTVF9MVFIgOgorICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9SVEw7CisKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dCB0ZW1wTXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgbm90IGluc2VydCBzcGFjZXMsIHNob3VsZCBiZSBwYXJ0IG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIHVzZSBwbHVyYWwgcnVsZXMgYW5kIG5vdCBhc3N1bWUgRW5nbGlzaCBwbHVyYWxzCisgICAgICAgICAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgU3RyaW5nLmZvcm1hdChtb3JlLCByZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHRoaXMgaXMgcHJvYmFibHkgb2ssIGJ1dCBuZWVkIHRvIGxvb2sgYXQgaXQgbW9yZQorICAgICAgICAgICAgICAgICAgICB0ZW1wTXQuc2V0UGFyYShmb3JtYXQsIDAsIGZvcm1hdC5sZW5ndGgoKSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQgPSBtdC5hZGRTdHlsZVJ1bihwLCBtdC5tTGVuLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodyArIG1vcmVXaWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUodGVtcE10KTsKKwogICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihva0Zvcm1hdCk7CiAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIG9rKTsKICAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzZXRQYXJhKE1lYXN1cmVkVGV4dCBtdCwgVGV4dFBhaW50IHBhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpZGlSZXF1ZXN0KSB7CisKKyAgICAgICAgbXQuc2V0UGFyYSh0ZXh0LCBzdGFydCwgZW5kLCBiaWRpUmVxdWVzdCk7CisKKyAgICAgICAgZmxvYXQgd2lkdGg7CisgICAgICAgIFNwYW5uZWQgc3AgPSB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCA/IChTcGFubmVkKSB0ZXh0IDogbnVsbDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgd2lkdGggPSBtdC5hZGRTdHlsZVJ1bihwYWludCwgbGVuLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgIGludCBzcGFuRW5kOworICAgICAgICAgICAgZm9yIChpbnQgc3BhblN0YXJ0ID0gMDsgc3BhblN0YXJ0IDwgbGVuOyBzcGFuU3RhcnQgPSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzcGFuU3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0LCBzcGFuRW5kLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB3aWR0aCArPSBtdC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbnMsIHNwYW5FbmQgLSBzcGFuU3RhcnQsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBib29sZWFuIGRvZXNOb3ROZWVkQmlkaShDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKGNoYXJbXSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbjsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgaWYgKHRleHRbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjaGFyW10gb2J0YWluKGludCBsZW4pIHsKICAgICAgICAgY2hhcltdIGJ1ZjsKIApAQCAtMTUyOSw3ICsxMzg1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9DSEFSQUNURVJTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfQ0hBUkFDVEVSUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENhcGl0YWxpemF0aW9uIG1vZGUgZm9yIHtAbGluayAjZ2V0Q2Fwc01vZGV9OiBjYXBpdGFsaXplIHRoZSBmaXJzdAogICAgICAqIGNoYXJhY3RlciBvZiBhbGwgd29yZHMuICBUaGlzIHZhbHVlIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcwpAQCAtMTUzNyw3ICsxMzkzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9XT1JEUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX1dPUkRTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGVhY2ggc2VudGVuY2UuICBUaGlzIHZhbHVlIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcwpAQCAtMTU0NSwxMyArMTQwMSwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1NFTlRFTkNFUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX1NFTlRFTkNFUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGF0IGNhcHMgbW9kZSBzaG91bGQgYmUgaW4gZWZmZWN0IGF0IHRoZSBjdXJyZW50IG9mZnNldCBpbgogICAgICAqIHRoZSB0ZXh0LiAgT25seSB0aGUgbW9kZSBiaXRzIHNldCBpbiA8dmFyPnJlcU1vZGVzPC92YXI+IHdpbGwgYmUKICAgICAgKiBjaGVja2VkLiAgTm90ZSB0aGF0IHRoZSBjYXBzIG1vZGUgZmxhZ3MgaGVyZSBhcmUgZXhwbGljaXRseSBkZWZpbmVkCiAgICAgICogdG8gbWF0Y2ggdGhvc2UgaW4ge0BsaW5rIElucHV0VHlwZX0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY3MgVGhlIHRleHQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgY2FwcyBtb2Rlcy4KICAgICAgKiBAcGFyYW0gb2ZmIExvY2F0aW9uIGluIHRoZSB0ZXh0IGF0IHdoaWNoIHRvIGNoZWNrLgogICAgICAqIEBwYXJhbSByZXFNb2RlcyBUaGUgbW9kZXMgdG8gYmUgY2hlY2tlZDogbWF5IGJlIGFueSBjb21iaW5hdGlvbiBvZgpAQCAtMTY1MSw3ICsxNTA3LDcgQEAKIAogICAgICAgICByZXR1cm4gbW9kZTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHNUZW1wID0gbnVsbDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL0Fycm93S2V5TW92ZW1lbnRNZXRob2QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL0Fycm93S2V5TW92ZW1lbnRNZXRob2QuamF2YQppbmRleCA5YWY0MmNjLi43OWEwYzM3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9BcnJvd0tleU1vdmVtZW50TWV0aG9kLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvQXJyb3dLZXlNb3ZlbWVudE1ldGhvZC5qYXZhCkBAIC0xNiwzMCArMTYsMzggQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQubWV0aG9kOwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OworaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC4qOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQ3Vyc29yQ29udHJvbGxlcjsKIAogLy8gWFhYIHRoaXMgZG9lc24ndCBleHRlbmQgTWV0YUtleUtleUxpc3RlbmVyIGJlY2F1c2UgdGhlIHNpZ25hdHVyZXMKIC8vIGRvbid0IG1hdGNoLiAgTmVlZCB0byBmaWd1cmUgdGhhdCBvdXQuICBNZWFud2hpbGUgdGhlIG1ldGEga2V5cwogLy8gd29uJ3Qgd29yayBpbiBmaWVsZHMgdGhhdCBkb24ndCB0YWtlIGlucHV0LgogCi1wdWJsaWMgY2xhc3MKLUFycm93S2V5TW92ZW1lbnRNZXRob2QKLWltcGxlbWVudHMgTW92ZW1lbnRNZXRob2QKLXsKK3B1YmxpYyBjbGFzcyBBcnJvd0tleU1vdmVtZW50TWV0aG9kIGltcGxlbWVudHMgTW92ZW1lbnRNZXRob2QgeworICAgIC8qKgorICAgICAqIEFuIG9wdGlvbmFsIGNvbnRyb2xsZXIgZm9yIHRoZSBjdXJzb3IuCisgICAgICogVXNlIHtAbGluayAjc2V0Q3Vyc29yQ29udHJvbGxlcihDdXJzb3JDb250cm9sbGVyKX0gdG8gc2V0IHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEN1cnNvckNvbnRyb2xsZXIgbUN1cnNvckNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDYXAoU3Bhbm5hYmxlIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gKChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgPT0gMSkgfHwKKyAgICAgICAgICAgICAgICAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FsdChTcGFubmFibGUgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwgS2V5RXZlbnQuTUVUQV9BTFRfT04pID09IDE7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIHVwKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLSAgICAgICAgYm9vbGVhbiBhbHQgPSBNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfQUxUX09OKSA9PSAxOworICAgICAgICBib29sZWFuIGNhcCA9IGlzQ2FwKGJ1ZmZlcik7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gaXNBbHQoYnVmZmVyKTsKICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKIAogICAgICAgICBpZiAoY2FwKSB7CkBAIC02MCwxMiArNjgsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBkb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLSAgICAgICAgYm9vbGVhbiBhbHQgPSBNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfQUxUX09OKSA9PSAxOworICAgICAgICBib29sZWFuIGNhcCA9IGlzQ2FwKGJ1ZmZlcik7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gaXNBbHQoYnVmZmVyKTsKICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKIAogICAgICAgICBpZiAoY2FwKSB7CkBAIC04NiwxMiArOTAsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBsZWZ0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLSAgICAgICAgYm9vbGVhbiBhbHQgPSBNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfQUxUX09OKSA9PSAxOworICAgICAgICBib29sZWFuIGNhcCA9IGlzQ2FwKGJ1ZmZlcik7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gaXNBbHQoYnVmZmVyKTsKICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKIAogICAgICAgICBpZiAoY2FwKSB7CkBAIC0xMTAsMTIgKzExMCw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHJpZ2h0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLSAgICAgICAgYm9vbGVhbiBhbHQgPSBNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfQUxUX09OKSA9PSAxOworICAgICAgICBib29sZWFuIGNhcCA9IGlzQ2FwKGJ1ZmZlcik7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gaXNBbHQoYnVmZmVyKTsKICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKIAogICAgICAgICBpZiAoY2FwKSB7CkBAIC0xMzMsMzUgKzEyOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5LCBUZXh0VmlldyB3aWRnZXQpewotICAgICAgLy8gQ29udmVydHMgdGhlIGFic29sdXRlIFgsWSBjb29yZGluYXRlcyB0byB0aGUgY2hhcmFjdGVyIG9mZnNldCBmb3IgdGhlCi0gICAgICAvLyBjaGFyYWN0ZXIgd2hvc2UgcG9zaXRpb24gaXMgY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkCi0gICAgICAvLyBob3Jpem9udGFsIHBvc2l0aW9uLgotICAgICAgeCAtPSB3aWRnZXQuZ2V0VG90YWxQYWRkaW5nTGVmdCgpOwotICAgICAgeSAtPSB3aWRnZXQuZ2V0VG90YWxQYWRkaW5nVG9wKCk7Ci0KLSAgICAgIC8vIENsYW1wIHRoZSBwb3NpdGlvbiB0byBpbnNpZGUgb2YgdGhlIHZpZXcuCi0gICAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgICB4ID0gMDsKLSAgICAgIH0gZWxzZSBpZiAoeCA+PSAod2lkZ2V0LmdldFdpZHRoKCktd2lkZ2V0LmdldFRvdGFsUGFkZGluZ1JpZ2h0KCkpKSB7Ci0gICAgICAgICAgeCA9IHdpZGdldC5nZXRXaWR0aCgpLXdpZGdldC5nZXRUb3RhbFBhZGRpbmdSaWdodCgpIC0gMTsKLSAgICAgIH0KLSAgICAgIGlmICh5IDwgMCkgewotICAgICAgICAgIHkgPSAwOwotICAgICAgfSBlbHNlIGlmICh5ID49ICh3aWRnZXQuZ2V0SGVpZ2h0KCktd2lkZ2V0LmdldFRvdGFsUGFkZGluZ0JvdHRvbSgpKSkgewotICAgICAgICAgIHkgPSB3aWRnZXQuZ2V0SGVpZ2h0KCktd2lkZ2V0LmdldFRvdGFsUGFkZGluZ0JvdHRvbSgpIC0gMTsKLSAgICAgIH0KLQotICAgICAgeCArPSB3aWRnZXQuZ2V0U2Nyb2xsWCgpOwotICAgICAgeSArPSB3aWRnZXQuZ2V0U2Nyb2xsWSgpOwotCi0gICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsKHkpOwotCi0gICAgICBpbnQgb2Zmc2V0ID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgeCk7Ci0gICAgICByZXR1cm4gb2Zmc2V0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsIGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewogICAgICAgICBpZiAoZXhlY3V0ZURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUpKSB7CiAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuYWRqdXN0TWV0YUFmdGVyS2V5cHJlc3MoYnVmZmVyKTsKQEAgLTE5MywxMCArMTYwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgIGlmIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZGdldC5zaG93Q29udGV4dE1lbnUoKSkgeworICAgICAgICAgICAgaWYgKChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICh3aWRnZXQuc2hvd0NvbnRleHRNZW51KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTQsOCArMTgwLDcgQEAKIAogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5T3RoZXIoVGV4dFZpZXcgdmlldywgU3Bhbm5hYmxlIHRleHQsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGludCBjb2RlID0gZXZlbnQuZ2V0S2V5Q29kZSgpOwotICAgICAgICBpZiAoY29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04KLSAgICAgICAgICAgICAgICAmJiBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fTVVMVElQTEUpIHsKKyAgICAgICAgaWYgKGNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOICYmIGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9NVUxUSVBMRSkgewogICAgICAgICAgICAgaW50IHJlcGVhdCA9IGV2ZW50LmdldFJlcGVhdENvdW50KCk7CiAgICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHdoaWxlICgoLS1yZXBlYXQpID4gMCkgewpAQCAtMjI2LDEzICsxOTEsMjIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgdGV4dCwKLSAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSB0ZXh0LCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAobUN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnNvckNvbnRyb2xsZXIuaGlkZSgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudCkgeworICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb25Ub3VjaEV2ZW50Q3Vyc29yKHdpZGdldCwgYnVmZmVyLCBldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb25Ub3VjaEV2ZW50U3RhbmRhcmQod2lkZ2V0LCBidWZmZXIsIGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBvblRvdWNoRXZlbnRTdGFuZGFyZChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGludCBpbml0aWFsU2Nyb2xsWCA9IC0xLCBpbml0aWFsU2Nyb2xsWSA9IC0xOwogICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CiAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsWCA9IFRvdWNoLmdldEluaXRpYWxTY3JvbGxYKHdpZGdldCwgYnVmZmVyKTsKQEAgLTI0Myw1MyArMjE3LDIwIEBACiAKICAgICAgICAgaWYgKHdpZGdldC5pc0ZvY3VzZWQoKSAmJiAhd2lkZ2V0LmRpZFRvdWNoRm9jdXNTZWxlY3QoKSkgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICAgIGJvb2xlYW4gY2FwID0gKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgPT0gMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuTUVUQV9TRUxFQ1RJTkcpICE9IDApOwotICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKLSAgICAgICAgICAgICAgaW50IHkgPSAoaW50KSBldmVudC5nZXRZKCk7Ci0gICAgICAgICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXQoeCwgeSwgd2lkZ2V0KTsKLQorICAgICAgICAgICAgICBib29sZWFuIGNhcCA9IGlzQ2FwKGJ1ZmZlcik7CiAgICAgICAgICAgICAgIGlmIChjYXApIHsKLSAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRTcGFuKExBU1RfVEFQX0RPV04sIG9mZnNldCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fUE9JTlRfUE9JTlQpOworICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpZGdldC5nZXRPZmZzZXQoKGludCkgZXZlbnQuZ2V0WCgpLCAoaW50KSBldmVudC5nZXRZKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBidWZmZXIuc2V0U3BhbihMQVNUX1RBUF9ET1dOLCBvZmZzZXQsIG9mZnNldCwgU3Bhbm5hYmxlLlNQQU5fUE9JTlRfUE9JTlQpOwogCiAgICAgICAgICAgICAgICAgICAvLyBEaXNhbGxvdyBpbnRlcmNlcHRpbmcgb2YgdGhlIHRvdWNoIGV2ZW50cywgc28gdGhhdAogICAgICAgICAgICAgICAgICAgLy8gdXNlcnMgY2FuIHNjcm9sbCBhbmQgc2VsZWN0IGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIHVzZXJzIHdvdWxkIGdldCBib290ZWQgb3V0IG9mIHNlbGVjdAogICAgICAgICAgICAgICAgICAgLy8gbW9kZSBvbmNlIHRoZSB2aWV3IGRldGVjdGVkIGl0IG5lZWRlZCB0byBzY3JvbGwuCiAgICAgICAgICAgICAgICAgICB3aWRnZXQuZ2V0UGFyZW50KCkucmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIE9uZVBvaW50Rml2ZVRhcFN0YXRlW10gdGFwID0gYnVmZmVyLmdldFNwYW5zKDAsIGJ1ZmZlci5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICBPbmVQb2ludEZpdmVUYXBTdGF0ZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmICh0YXAubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFRpbWUoKSAtIHRhcFswXS5tV2hlbiA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXREb3VibGVUYXBUaW1lb3V0KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVdvcmQoYnVmZmVyLCBvZmZzZXQsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVmZmVyKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBbMF0uYWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0YXJ0U2VsZWN0aW5nKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmdldFBhcmVudCgpLnJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRTcGFuKExBU1RfVEFQX0RPV04sIG9mZnNldCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fUE9JTlRfUE9JTlQpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgIHRhcFswXS5tV2hlbiA9IGV2ZW50LmdldEV2ZW50VGltZSgpOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBPbmVQb2ludEZpdmVUYXBTdGF0ZSBuZXd0YXAgPSBuZXcgT25lUG9pbnRGaXZlVGFwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICBuZXd0YXAubVdoZW4gPSBldmVudC5nZXRFdmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICBuZXd0YXAuYWN0aXZlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNldFNwYW4obmV3dGFwLCAwLCBidWZmZXIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjYXAgPSAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNhcCAmJiBoYW5kbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBzZWxlY3RpbmcsIG1ha2Ugc3VyZSB3ZSd2ZSBtb3ZlZCBvdXQgb2YgdGhlICJzbG9wIi4KQEAgLTI5Nyw0NSArMjM4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIE9VVCBvZiB0aGUgc2xvcAogCiAgICAgICAgICAgICAgICAgICAgIC8vIFR1cm4gbG9uZyBwcmVzcyBvZmYgd2hpbGUgd2UncmUgc2VsZWN0aW5nLiBVc2VyIG5lZWRzIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlLXRhcCBvbiB0aGUgc2VsZWN0aW9uIHRvIGVuYWJsZSBsb25ncHJlc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gcmUtdGFwIG9uIHRoZSBzZWxlY3Rpb24gdG8gZW5hYmxlIGxvbmcgcHJlc3MKICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmNhbmNlbExvbmdQcmVzcygpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gYXMgd2UncmUgbW92aW5nIHRoZSBzZWxlY3Rpb24gYXJlYS4KIAogICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdG91Y2ggcG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KHgsIHksIHdpZGdldCk7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSB3aWRnZXQuZ2V0T2Zmc2V0KChpbnQpIGV2ZW50LmdldFgoKSwgKGludCkgZXZlbnQuZ2V0WSgpKTsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBPbmVQb2ludEZpdmVUYXBTdGF0ZVtdIHRhcCA9IGJ1ZmZlci5nZXRTcGFucygwLCBidWZmZXIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lUG9pbnRGaXZlVGFwU3RhdGUuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YXAubGVuZ3RoID4gMCAmJiB0YXBbMF0uYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3QgZG93biB0b3VjaCBwb3NpdGlvbiAodGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBzdGFydGVkIHRoZSBzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdERvd25PZmZzZXQgPSBidWZmZXIuZ2V0U3BhblN0YXJ0KExBU1RfVEFQX0RPV04pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3Rpb24gYm91bmRhcmllcwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBsYXN0RG93bk9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGFuZCBmcm9tIHdvcmQgc3RhcnQgb2YgdGhlIG9yaWdpbmFsIHRhcCB0byBuZXcgd29yZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCwgc2luY2Ugd2UgYXJlIHNlbGVjdGluZyAiZm9yd2FyZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbnN0YXJ0ID0gZmluZFdvcmRTdGFydChidWZmZXIsIGxhc3REb3duT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gZmluZFdvcmRFbmQoYnVmZmVyLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBhbmQgdG8gZnJvbSBuZXcgd29yZCBzdGFydCB0byB3b3JkIGVuZCBvZiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXAgc2luY2Ugd2UgYXJlIHNlbGVjdGluZyAiYmFja3dhcmRzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BhbmVuZCB3aWxsIGFsd2F5cyBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG91Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCBwb3NpdGlvbiwgc28gdGhhdCByZWZpbmluZyB0aGUgc2VsZWN0aW9uIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tiYWxsIHdpbGwgd29yayBhcyBleHBlY3RlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuc3RhcnQgPSBmaW5kV29yZEVuZChidWZmZXIsIGxhc3REb3duT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gZmluZFdvcmRTdGFydChidWZmZXIsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1ZmZlciwgc3BhbnN0YXJ0LCBzcGFuZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5leHRlbmRTZWxlY3Rpb24oYnVmZmVyLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5leHRlbmRTZWxlY3Rpb24oYnVmZmVyLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewpAQCAtMzQ0LDcwICsyNTUsMTcgQEAKICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBzY3JvbGwgb2Zmc2V0IHRvIGF2b2lkIHRoZSBzY3JvbGwganVtcGluZyBsYXRlcgogICAgICAgICAgICAgICAgIC8vIHRvIHNob3cgaXQuCiAgICAgICAgICAgICAgICAgaWYgKChpbml0aWFsU2Nyb2xsWSA+PSAwICYmIGluaXRpYWxTY3JvbGxZICE9IHdpZGdldC5nZXRTY3JvbGxZKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbFNjcm9sbFggPj0gMCAmJiBpbml0aWFsU2Nyb2xsWCAhPSB3aWRnZXQuZ2V0U2Nyb2xsWCgpKSkgeworICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbFNjcm9sbFggPj0gMCAmJiBpbml0aWFsU2Nyb2xsWCAhPSB3aWRnZXQuZ2V0U2Nyb2xsWCgpKSkgewogICAgICAgICAgICAgICAgICAgICB3aWRnZXQubW92ZUN1cnNvclRvVmlzaWJsZU9mZnNldCgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKLSAgICAgICAgICAgICAgICBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKLSAgICAgICAgICAgICAgICBpbnQgb2ZmID0gZ2V0T2Zmc2V0KHgsIHksIHdpZGdldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIGRvIHRoZSBzYW1lIGFkanVzdCBmb3IgeCBhcyB3ZSBkbyBmb3IgdGhlIGxpbmUuCi0KLSAgICAgICAgICAgICAgICBPbmVQb2ludEZpdmVUYXBTdGF0ZVtdIG9uZXBvaW50Zml2ZXRhcCA9IGJ1ZmZlci5nZXRTcGFucygwLCBidWZmZXIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgIE9uZVBvaW50Rml2ZVRhcFN0YXRlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAob25lcG9pbnRmaXZldGFwLmxlbmd0aCA+IDAgJiYgb25lcG9pbnRmaXZldGFwWzBdLmFjdGl2ZSAmJgotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVmZmVyKSA9PSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgc2V0IHNlbGVjdCBtb2RlLCBiZWNhdXNlIHRoZXJlIHdhcyBhIG9uZXBvaW50Zml2ZXRhcCwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZXJlIHdhcyBubyBlbnN1aW5nIHN3aXBlIGdlc3R1cmUsIHVuZG8gdGhlIHNlbGVjdCBtb2RlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9uZXBvaW50Zml2ZXRhcC4KLSAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3Rpbmcod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBvbmVwb2ludGZpdmV0YXAubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZW1vdmVTcGFuKG9uZXBvaW50Zml2ZXRhcFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gd2lkZ2V0LmdldE9mZnNldCgoaW50KSBldmVudC5nZXRYKCksIChpbnQpIGV2ZW50LmdldFkoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FwKGJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnJlbW92ZVNwYW4oTEFTVF9UQVBfRE9XTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FwID0gKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuTUVUQV9TRUxFQ1RJTkcpICE9IDApOwotCi0gICAgICAgICAgICAgICAgRG91YmxlVGFwU3RhdGVbXSB0YXAgPSBidWZmZXIuZ2V0U3BhbnMoMCwgYnVmZmVyLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZVRhcFN0YXRlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvdWJsZXRhcCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKHRhcC5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFRpbWUoKSAtIHRhcFswXS5tV2hlbiA8PQotICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1lV29yZChidWZmZXIsIG9mZiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWZmZXIpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGV0YXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGFwWzBdLm1XaGVuID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5leHRlbmRTZWxlY3Rpb24oYnVmZmVyLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERvdWJsZVRhcFN0YXRlIG5ld3RhcCA9IG5ldyBEb3VibGVUYXBTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBuZXd0YXAubVdoZW4gPSBldmVudC5nZXRFdmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNldFNwYW4obmV3dGFwLCAwLCBidWZmZXIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjYXApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnJlbW92ZVNwYW4oTEFTVF9UQVBfRE9XTik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbmVwb2ludGZpdmV0YXAubGVuZ3RoID4gMCAmJiBvbmVwb2ludGZpdmV0YXBbMF0uYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzZWxlY3Rpbmcgc29tZXRoaW5nIHdpdGggdGhlIG9uZXBvaW50Zml2ZXRhcC1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXBlIGdlc3R1cmUsIHN0b3AgaXQgb24gZmluZ2VyIHVwLgotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3Rpbmcod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLmV4dGVuZFNlbGVjdGlvbihidWZmZXIsIG9mZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZXRhcCkgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kV29yZFN0YXJ0KGJ1ZmZlciwgb2ZmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kV29yZEVuZChidWZmZXIsIG9mZikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oYnVmZmVyLCBvZmYpOworICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuYWRqdXN0TWV0YUFmdGVyS2V5cHJlc3MoYnVmZmVyKTsKQEAgLTQyMCw3MyArMjc4LDM2IEBACiAgICAgICAgIHJldHVybiBoYW5kbGVkOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERvdWJsZVRhcFN0YXRlIGltcGxlbWVudHMgTm9Db3B5U3BhbiB7Ci0gICAgICAgIGxvbmcgbVdoZW47Ci0gICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBvblRvdWNoRXZlbnRDdXJzb3IoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAod2lkZ2V0LmlzRm9jdXNlZCgpICYmICF3aWRnZXQuZGlkVG91Y2hGb2N1c1NlbGVjdCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbk1hc2tlZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmNhbmNlbExvbmdQcmVzcygpOwogCi0gICAgLyogV2UgY2hlY2sgZm9yIGEgb25lcG9pbnRmaXZlIHRhcC4gVGhpcyBpcyBzaW1pbGFyIHRvCi0gICAgKiAgZG91YmxldGFwIGdlc3R1cmUgKHdoZXJlIGEgZmluZ2VyIGdvZXMgZG93biwgdXAsIGRvd24sIHVwLCBpbiBhIHNob3J0Ci0gICAgKiAgdGltZSBwZXJpb2QpLCBleGNlcHQgaW4gdGhlIG9uZXBvaW50Zml2ZSB0YXAsIGEgdXNlcnMgZmluZ2VyIG9ubHkgbmVlZHMKLSAgICAqICB0byBnbyBkb3duLCB1cCwgZG93biBpbiBhIHNob3J0IHRpbWUgcGVyaW9kLiBXZSBkZXRlY3QgdGhpcyB0eXBlIG9mIHRhcAotICAgICogIHRvIGltcGxlbWVudCB0aGUgb25lcG9pbnRmaXZldGFwLWFuZC1zd2lwZSBzZWxlY3Rpb24gZ2VzdHVyZS4KLSAgICAqICBUaGlzIGdlc3R1cmUgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIHNlZ21lbnQgb2YgdGV4dCB3aXRob3V0IGdvaW5nCi0gICAgKiAgdGhyb3VnaCB0aGUgInNlbGVjdCB0ZXh0IiBvcHRpb24gaW4gdGhlIGNvbnRleHQgbWVudS4KLSAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9uZVBvaW50Rml2ZVRhcFN0YXRlIGltcGxlbWVudHMgTm9Db3B5U3BhbiB7Ci0gICAgICAgIGxvbmcgbVdoZW47Ci0gICAgICAgIGJvb2xlYW4gYWN0aXZlOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IHRoZSBjdXJyZW50IHRvdWNoIHBvc2l0aW9uIChmcm9tIGNvbnRyb2xsZXIgdG8gY3Vyc29yKQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpICsgbUN1cnNvckNvbnRyb2xsZXIuZ2V0T2Zmc2V0WCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpICsgbUN1cnNvckNvbnRyb2xsZXIuZ2V0T2Zmc2V0WSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gd2lkZ2V0LmdldE9mZnNldCgoaW50KSB4LCAoaW50KSB5KTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnNvckNvbnRyb2xsZXIudXBkYXRlUG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhbWVXb3JkKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgb25lLCBpbnQgdHdvKSB7Ci0gICAgICAgIGludCBzdGFydCA9IGZpbmRXb3JkU3RhcnQodGV4dCwgb25lKTsKLSAgICAgICAgaW50IGVuZCA9IGZpbmRXb3JkRW5kKHRleHQsIG9uZSk7Ci0KLSAgICAgICAgaWYgKGVuZCA9PSBzdGFydCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGZpbmRXb3JkU3RhcnQodGV4dCwgdHdvKSAmJgotICAgICAgICAgICAgICAgZW5kID09IGZpbmRXb3JkRW5kKHRleHQsIHR3byk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogVW5pZnkgd2l0aCBUZXh0Vmlldy5nZXRXb3JkRm9yRGljdGlvbmFyeSgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRXb3JkU3RhcnQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCkgewotICAgICAgICBmb3IgKDsgc3RhcnQgPiAwOyBzdGFydC0tKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSB0ZXh0LmNoYXJBdChzdGFydCAtIDEpOwotICAgICAgICAgICAgaW50IHR5cGUgPSBDaGFyYWN0ZXIuZ2V0VHlwZShjKTsKLQotICAgICAgICAgICAgaWYgKGMgIT0gJ1wnJyAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLlVQUEVSQ0FTRV9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSICYmCi0gICAgICAgICAgICAgICAgdHlwZSAhPSBDaGFyYWN0ZXIuVElUTEVDQVNFX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLk1PRElGSUVSX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLkRFQ0lNQUxfRElHSVRfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgorICAgICAgICAgICAgICAgICAgICBtQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gVE9ETzogVW5pZnkgd2l0aCBUZXh0Vmlldy5nZXRXb3JkRm9yRGljdGlvbmFyeSgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRXb3JkRW5kKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCi0gICAgICAgIGZvciAoOyBlbmQgPCBsZW47IGVuZCsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSB0ZXh0LmNoYXJBdChlbmQpOwotICAgICAgICAgICAgaW50IHR5cGUgPSBDaGFyYWN0ZXIuZ2V0VHlwZShjKTsKLQotICAgICAgICAgICAgaWYgKGMgIT0gJ1wnJyAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLlVQUEVSQ0FTRV9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSICYmCi0gICAgICAgICAgICAgICAgdHlwZSAhPSBDaGFyYWN0ZXIuVElUTEVDQVNFX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLk1PRElGSUVSX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLkRFQ0lNQUxfRElHSVRfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW5kOworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGN1cnNvciBjb250cm9sbGVyLgorICAgICAqCisgICAgICogV2hlbiBzZXQsIHRoaXMgb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGhhbmRsZSBldmVudHMsIHRoYXQgY2FuIGJlIHRyYW5zbGF0ZWQgaW4gY3Vyc29yIHVwZGF0ZXMuCisgICAgICogQHBhcmFtIGN1cnNvckNvbnRyb2xsZXIgQSBjdXJzb3IgY29udHJvbGxlciBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvckNvbnRyb2xsZXIoQ3Vyc29yQ29udHJvbGxlciBjdXJzb3JDb250cm9sbGVyKSB7CisgICAgICAgIG1DdXJzb3JDb250cm9sbGVyID0gY3Vyc29yQ29udHJvbGxlcjsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5TZWxlY3RBcmJpdHJhcmlseSgpIHsKQEAgLTUyNSw4ICszNDYsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTW92ZW1lbnRNZXRob2QgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkKKyAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCgpOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCA0MmFkMTBlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTE3LDE0ICsxNywxMyBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQubWV0aG9kOwogCiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuTm9Db3B5U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTm9Db3B5U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCiBwdWJsaWMgY2xhc3MgVG91Y2ggewogICAgIHByaXZhdGUgVG91Y2goKSB7IH0KQEAgLTQ1LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01Miw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OSwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTksNyArMTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIERyYWdTdGF0ZVtdIGRzOwogCi0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSkgewogICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgogICAgICAgICAgICAgZHMgPSBidWZmZXIuZ2V0U3BhbnMoMCwgYnVmZmVyLmxlbmd0aCgpLCBEcmFnU3RhdGUuY2xhc3MpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQppbmRleCA5ZDkxYWNhLi5hNzYzYTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKQEAgLTE3LDM2ICsxNyw1OCBAQAogcGFja2FnZSBhbmRyb2lkLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCisgKiA8cD4KICAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBjaGFyYWN0ZXIgc2V0cy4gVGhpcwogICogY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdpc2hlcyB0byBiZSB2ZW5kb3ItYXdhcmUKLSAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBlbmNvZGluZyBuYW1lcy4KLSAqIAotICogPHA+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/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkpIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCmluZGV4IDFjOGIzMzAuLjdmYzQzYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKQEAgLTkwLDYgKzkwLDE2IEBACiAgICAgICAgIGRlbGV0ZShrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXNbaW5kZXhdICE9IERFTEVURUQpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gREVMRVRFRDsKKyAgICAgICAgICAgIG1HYXJiYWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBwcml2YXRlIHZvaWQgZ2MoKSB7CiAgICAgICAgIC8vIExvZy5lKCJTcGFyc2VBcnJheSIsICJnYyBzdGFydCB3aXRoICIgKyBtU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQWJzU2F2ZWRTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BYnNTYXZlZFN0YXRlLmphdmEKaW5kZXggODQwZDdjMS4uNmFkMzNkZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BYnNTYXZlZFN0YXRlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BYnNTYXZlZFN0YXRlLmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQWJzU2F2ZWRTdGF0ZShQYXJjZWwgc291cmNlKSB7CiAgICAgICAgIC8vIEZJWE1FIG5lZWQgY2xhc3MgbG9hZGVyCi0gICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IChQYXJjZWxhYmxlKSBzb3VyY2UucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHNvdXJjZS5yZWFkUGFyY2VsYWJsZShudWxsKTsKICAgICAgICAgIAogICAgICAgICBtU3VwZXJTdGF0ZSA9IHN1cGVyU3RhdGUgIT0gbnVsbCA/IHN1cGVyU3RhdGUgOiBFTVBUWV9TVEFURTsKICAgICB9CkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxBYnNTYXZlZFN0YXRlPigpIHsKICAgICAgICAgCiAgICAgICAgIHB1YmxpYyBBYnNTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSAoUGFyY2VsYWJsZSkgaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKICAgICAgICAgICAgIGlmIChzdXBlclN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdXBlclN0YXRlIG11c3QgYmUgbnVsbCIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFmYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb250ZXh0dWFsIG1vZGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBBY3Rpb24gbW9kZXMgY2FuIGJlIHVzZWQgZm9yCisgKiBtb2RhbCBpbnRlcmFjdGlvbnMgd2l0aCBjb250ZW50IGFuZCByZXBsYWNlIHBhcnRzIG9mIHRoZSBub3JtYWwgVUkgdW50aWwgZmluaXNoZWQuCisgKiBFeGFtcGxlcyBvZiBnb29kIGFjdGlvbiBtb2RlcyBpbmNsdWRlIHNlbGVjdGlvbiBtb2Rlcywgc2VhcmNoLCBjb250ZW50IGVkaXRpbmcsIGV0Yy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbk1vZGUgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShpbnQpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgYSBzdHJpbmcgdG8gc2V0IGFzIHRoZSB0aXRsZQorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFN1YnRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3VidGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHN1YnRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGN1c3RvbSB2aWV3IHdpbGwgdGFrZSB0aGUgcGxhY2Ugb2YKKyAgICAgKiB0aGUgdGl0bGUgYW5kIHN1YnRpdGxlLiBVc2VmdWwgZm9yIHRoaW5ncyBsaWtlIHNlYXJjaCBib3hlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSB2aWV3IHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgdGl0bGUvc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGUgdGhlIGFjdGlvbiBtb2RlIGFuZCByZWZyZXNoIG1lbnUgY29udGVudC4gVGhlIG1vZGUncworICAgICAqIHtAbGluayBBY3Rpb25Nb2RlLkNhbGxiYWNrfSB3aWxsIGhhdmUgaXRzCisgICAgICoge0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG1ldGhvZCBjYWxsZWQuCisgICAgICogSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBtZW51IHdpbGwgYmUgc2Nhbm5lZCBmb3IgdXBkYXRlZCBjb250ZW50IGFuZCBhbnkgcmVsZXZhbnQgY2hhbmdlcworICAgICAqIHdpbGwgYmUgcmVmbGVjdGVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGUoKTsKKworICAgIC8qKgorICAgICAqIEZpbmlzaCBhbmQgY2xvc2UgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGFjdGlvbiBtb2RlJ3Mge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwKKyAgICAgKiBoYXZlIGl0cyB7QGxpbmsgQ2FsbGJhY2sjb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlKX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaW5pc2goKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lbnUgb2YgYWN0aW9ucyB0aGF0IHRoaXMgYWN0aW9uIG1vZGUgcHJlc2VudHMuCisgICAgICogQHJldHVybiBUaGUgYWN0aW9uIG1vZGUncyBtZW51LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51IGdldE1lbnUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1YnRpdGxlIG9mIHRoaXMgYWN0aW9uIG1vZGUuCisgICAgICogQHJldHVybiBTdWJ0aXRsZSB0ZXh0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSB2aWV3CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tVmlldygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBNZW51SW5mbGF0ZXJ9IHdpdGggdGhlIEFjdGlvbk1vZGUncyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGFjdGlvbiBtb2Rlcy4gU3VwcGxpZWQgdG8KKyAgICAgKiB7QGxpbmsgVmlldyNzdGFydEFjdGlvbk1vZGUoQ2FsbGJhY2spfSwgYSBDYWxsYmFjaworICAgICAqIGNvbmZpZ3VyZXMgYW5kIGhhbmRsZXMgZXZlbnRzIHJhaXNlZCBieSBhIHVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogPHA+QW4gYWN0aW9uIG1vZGUncyBsaWZlY3ljbGUgaXMgYXMgZm9sbG93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG9uY2Ugb24gaW5pdGlhbAorICAgICAqIGNyZWF0aW9uPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IGFmdGVyIGNyZWF0aW9uCisgICAgICogYW5kIGFueSB0aW1lIHRoZSB7QGxpbmsgQWN0aW9uTW9kZX0gaXMgaW52YWxpZGF0ZWQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlLCBNZW51SXRlbSl9IGFueSB0aW1lIGEKKyAgICAgKiBjb250ZXh0dWFsIGFjdGlvbiBidXR0b24gaXMgY2xpY2tlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSB3aGVuIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIGlzIGNsb3NlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFjdGlvbiBtb2RlIGlzIGZpcnN0IGNyZWF0ZWQuIFRoZSBtZW51IHN1cHBsaWVkIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgKiBnZW5lcmF0ZSBhY3Rpb24gYnV0dG9ucyBmb3IgdGhlIGFjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIGNyZWF0ZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIG1vZGUgc2hvdWxkIGJlIGNyZWF0ZWQsIGZhbHNlIGlmIGVudGVyaW5nIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIG1vZGUgc2hvdWxkIGJlIGFib3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVmcmVzaCBhbiBhY3Rpb24gbW9kZSdzIGFjdGlvbiBtZW51IHdoZW5ldmVyIGl0IGlzIGludmFsaWRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIHByZXBhcmVkCisgICAgICAgICAqIEBwYXJhbSBtZW51IE1lbnUgdXNlZCB0byBwb3B1bGF0ZSBhY3Rpb24gYnV0dG9ucworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lbnUgb3IgYWN0aW9uIG1vZGUgd2FzIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVwb3J0IGEgdXNlciBjbGljayBvbiBhbiBhY3Rpb24gYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgY3VycmVudCBBY3Rpb25Nb2RlCisgICAgICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbGJhY2sgaGFuZGxlZCB0aGUgZXZlbnQsIGZhbHNlIGlmIHRoZSBzdGFuZGFyZCBNZW51SXRlbQorICAgICAgICAgKiAgICAgICAgICBpbnZvY2F0aW9uIHNob3VsZCBjb250aW51ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYWJvdXQgdG8gYmUgZXhpdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGJlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCkBAIC0wLDAgKzEsNzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgQ2FudmFzIG9uIHRvcCBvZiBPcGVuR0wgRVMgMi4wLgorICovCitjbGFzcyBHTEVTMjBDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBHTCBtR2w7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1PcGFxdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlbmRlcmVyOworICAgIAorICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtUG9pbnQgPSBuZXcgZmxvYXRbMl07CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1MaW5lID0gbmV3IGZsb2F0WzRdOworICAgIAorICAgIHByaXZhdGUgZmluYWwgUmVjdCBtQ2xpcEJvdW5kcyA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbUZpbHRlcjsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKTkkKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5Jc0F2YWlsYWJsZSgpOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0lzQXZhaWxhYmxlID0gbklzQXZhaWxhYmxlKCk7CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHNJc0F2YWlsYWJsZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAKKyAgICBHTEVTMjBDYW52YXMoR0wgZ2wsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgbUdsID0gZ2w7CisgICAgICAgIG1PcGFxdWUgPSAhdHJhbnNsdWNlbnQ7CisKKyAgICAgICAgbVJlbmRlcmVyID0gbkNyZWF0ZVJlbmRlcmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5DcmVhdGVSZW5kZXJlcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBuRGVzdHJveVJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EZXN0cm95UmVuZGVyZXIoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENhbnZhcyBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCaXRtYXAoQml0bWFwIGJpdG1hcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGFxdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2V0dXAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBuU2V0Vmlld3BvcnQobVJlbmRlcmVyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIG5QcmVwYXJlKG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblByZXBhcmUoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENsaXBwaW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoUGF0aCBwYXRoLCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuQ2xpcFJlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgb3ApOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgb3AubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20sIGludCBvcCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0IHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsgICAgICAgIAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgb3AubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0KSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdEYgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgb3AubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlZ2lvbihSZWdpb24gcmVnaW9uLCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpcEJvdW5kcyhSZWN0IGJvdW5kcykgeworICAgICAgICByZXR1cm4gbkdldENsaXBCb3VuZHMobVJlbmRlcmVyLCBib3VuZHMpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkdldENsaXBCb3VuZHMoaW50IHJlbmRlcmVyLCBSZWN0IGJvdW5kcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5RdWlja1JlamVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdHlwZS5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5RdWlja1JlamVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBlZGdlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFBhdGggcGF0aCwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlja1JlamVjdChSZWN0RiByZWN0LCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBxdWlja1JlamVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgdHlwZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVHJhbnNmb3JtYXRpb25zCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgICAgIG5UcmFuc2xhdGUobVJlbmRlcmVyLCBkeCwgZHkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5UcmFuc2xhdGUoaW50IHJlbmRlcmVyLCBmbG9hdCBkeCwgZmxvYXQgZHkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tldyhmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICAgICAgblJvdGF0ZShtUmVuZGVyZXIsIGRlZ3JlZXMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Sb3RhdGUoaW50IHJlbmRlcmVyLCBmbG9hdCBkZWdyZWVzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICBuU2NhbGUobVJlbmRlcmVyLCBzeCwgc3kpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TY2FsZShpbnQgcmVuZGVyZXIsIGZsb2F0IHN4LCBmbG9hdCBzeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuU2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2V0TWF0cml4KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkdldE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5HZXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmNhdChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5Db25jYXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuQ29uY2F0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisgICAgCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU3RhdGUgbWFuYWdlbWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlKCkgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCAwKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlKGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmUoaW50IHJlbmRlcmVyLCBpbnQgZmxhZ3MpOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKFJlY3RGIGJvdW5kcywgUGFpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFBhaW50IHBhaW50LAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXIobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG5hdGl2ZVBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZUxheWVyKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50LCBpbnQgc2F2ZUZsYWdzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoUmVjdEYgYm91bmRzLCBpbnQgYWxwaGEsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllckFscGhhKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sCisgICAgICAgICAgICAgICAgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwKKyAgICAgICAgICAgIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXJBbHBoYShtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXJBbHBoYShpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgaW50IHNhdmVGbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKKyAgICAgICAgblJlc3RvcmUobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZShpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgICAgICBuUmVzdG9yZVRvQ291bnQobVJlbmRlcmVyLCBzYXZlQ291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc3RvcmVUb0NvdW50KGludCByZW5kZXJlciwgaW50IHNhdmVDb3VudCk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTYXZlQ291bnQoKSB7CisgICAgICAgIHJldHVybiBuR2V0U2F2ZUNvdW50KG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuR2V0U2F2ZUNvdW50KGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBGaWx0ZXJpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERyYXdGaWx0ZXIoRHJhd0ZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgbUZpbHRlciA9IGZpbHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd0ZpbHRlciBnZXREcmF3RmlsdGVyKCkgeworICAgICAgICByZXR1cm4gbUZpbHRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEcmF3aW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QXJjKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsIGJvb2xlYW4gdXNlQ2VudGVyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0FSR0IoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICAgICAgZHJhd0NvbG9yKChhICYgMHhGRikgPDwgMjQgfCAociAmIDB4RkYpIDw8IDE2IHwgKGcgJiAweEZGKSA8PCA4IHwgKGIgJiAweEZGKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgcGF0Y2hlcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3UGF0Y2gobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgY2h1bmtzLCBkc3QubGVmdCwgZHN0LnRvcCwKKyAgICAgICAgICAgICAgICBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0Y2goaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBieXRlW10gY2h1bmtzLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBsZWZ0LCB0b3AsIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBNYXRyaXggbWF0cml4LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBpbnQgbWF0cml4LCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdCBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworCisgICAgICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGVmdCA9IHRvcCA9IDA7CisgICAgICAgICAgICByaWdodCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgYm90dG9tID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdCA9IHNyYy5sZWZ0OworICAgICAgICAgICAgcmlnaHQgPSBzcmMucmlnaHQ7CisgICAgICAgICAgICB0b3AgPSBzcmMudG9wOworICAgICAgICAgICAgYm90dG9tID0gc3JjLmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgc3JjLmxlZnQsIHNyYy50b3AsIHNyYy5yaWdodCwgc3JjLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsCisgICAgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKGludFtdIGNvbG9ycywgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgQml0bWFwLkNvbmZpZyBjb25maWcgPSBoYXNBbHBoYSA/IEJpdG1hcC5Db25maWcuQVJHQl84ODg4IDogQml0bWFwLkNvbmZpZy5SR0JfNTY1OworICAgICAgICBmaW5hbCBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoY29sb3JzLCBvZmZzZXQsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgY29uZmlnKTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYi5tTmF0aXZlQml0bWFwLCB4LCB5LCBuYXRpdmVQYWludCk7CisgICAgICAgIGIucmVjeWNsZSgpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gaGFzQWxwaGEsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgZHJhd0JpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCAoZmxvYXQpIHgsIChmbG9hdCkgeSwgd2lkdGgsIGhlaWdodCwgaGFzQWxwaGEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwTWVzaChCaXRtYXAgYml0bWFwLCBpbnQgbWVzaFdpZHRoLCBpbnQgbWVzaEhlaWdodCwgZmxvYXRbXSB2ZXJ0cywKKyAgICAgICAgICAgIGludCB2ZXJ0T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NpcmNsZShmbG9hdCBjeCwgZmxvYXQgY3ksIGZsb2F0IHJhZGl1cywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvcikgeworICAgICAgICBkcmF3Q29sb3IoY29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgbkRyYXdDb2xvcihtUmVuZGVyZXIsIGNvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdDb2xvcihpbnQgcmVuZGVyZXIsIGludCBjb2xvciwgaW50IG1vZGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmUoZmxvYXQgc3RhcnRYLCBmbG9hdCBzdGFydFksIGZsb2F0IHN0b3BYLCBmbG9hdCBzdG9wWSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbUxpbmVbMF0gPSBzdGFydFg7CisgICAgICAgIG1MaW5lWzFdID0gc3RhcnRZOworICAgICAgICBtTGluZVsyXSA9IHN0b3BYOworICAgICAgICBtTGluZVszXSA9IHN0b3BZOworICAgICAgICBkcmF3TGluZXMobUxpbmUsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIGludCBvZmZzZXQsIGludCBjb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmVzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3TGluZXMocHRzLCAwLCBwdHMubGVuZ3RoIC8gNCwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdPdmFsKFJlY3RGIG92YWwsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYWludChQYWludCBwYWludCkgeworICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQ2xpcEJvdW5kczsKKyAgICAgICAgbkdldENsaXBCb3VuZHMobVJlbmRlcmVyLCByKTsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0aChQYXRoIHBhdGgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIGlmIChwYXRoLmlzU2ltcGxlUGF0aCkgeworICAgICAgICAgICAgaWYgKHBhdGgucmVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5EcmF3UmVjdHMobVJlbmRlcmVyLCBwYXRoLnJlY3RzLm1OYXRpdmVSZWdpb24sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuRHJhd1BhdGgobVJlbmRlcmVyLCBwYXRoLm1OYXRpdmVQYXRoLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1BhdGgoaW50IHJlbmRlcmVyLCBpbnQgcGF0aCwgaW50IHBhaW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UmVjdHMoaW50IHJlbmRlcmVyLCBpbnQgcmVnaW9uLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQaWN0dXJlKFBpY3R1cmUgcGljdHVyZSwgUmVjdCBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0RiBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIG1Qb2ludFswXSA9IHg7CisgICAgICAgIG1Qb2ludFsxXSA9IHk7CisgICAgICAgIGRyYXdQb2ludHMobVBvaW50LCAwLCAxLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50cyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UG9pbnRzKHB0cywgMCwgcHRzLmxlbmd0aCAvIDIsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gcG9zLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChTdHJpbmcgdGV4dCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgbkRyYXdSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3QgciwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UmVjdChSZWN0RiByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSR0IoaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoMHhGRjAwMDAwMCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Um91bmRSZWN0KFJlY3RGIHJlY3QsIGZsb2F0IHJ4LCBmbG9hdCByeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCAoaW5kZXggKyBjb3VudCkgfCAodGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0KHRoaXMsIHN0YXJ0LCBlbmQsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0KGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRPblBhdGgoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChTdHJpbmcgdGV4dCwgUGF0aCBwYXRoLCBmbG9hdCBoT2Zmc2V0LCBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCB0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyICE9IERJUkVDVElPTl9MVFIgJiYgZGlyICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZGlyZWN0aW9uOiAiICsgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LCBpbmRleCwgY291bnQsIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCB4LCB5LCBkaXIsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBpbnQgbmF0aXZlUGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gZGlyID09IDAgPyAwIDogMTsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0UnVuKHRoaXMsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCBidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sIDAsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0UnVuKGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VmVydGljZXMoVmVydGV4TW9kZSBtb2RlLCBpbnQgdmVydGV4Q291bnQsIGZsb2F0W10gdmVydHMsIGludCB2ZXJ0T2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSB0ZXhzLCBpbnQgdGV4T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgc2hvcnRbXSBpbmRpY2VzLAorICAgICAgICAgICAgaW50IGluZGV4T2Zmc2V0LCBpbnQgaW5kZXhDb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwTW9kaWZpZXJzKFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBmYWxzZTsKKworICAgICAgICBmaW5hbCBTaGFkZXIgc2hhZGVyID0gcGFpbnQuZ2V0U2hhZGVyKCk7CisgICAgICAgIGlmIChzaGFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwU2hhZGVyKG1SZW5kZXJlciwgc2hhZGVyLm5hdGl2ZV9zaGFkZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzTW9kaWZpZXI7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBzZXR1cENvbG9yRmlsdGVyKFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIENvbG9yRmlsdGVyIGZpbHRlciA9IHBhaW50LmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwQ29sb3JGaWx0ZXIobVJlbmRlcmVyLCBmaWx0ZXIubmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldHVwU2hhZGVyKGludCByZW5kZXJlciwgaW50IHNoYWRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBDb2xvckZpbHRlcihpbnQgcmVuZGVyZXIsIGludCBjb2xvckZpbHRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzZXRNb2RpZmllcnMoaW50IHJlbmRlcmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YjgyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBhIFZpZXdSb290IHVzaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlcXVlc3RlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSGFyZHdhcmVSZW5kZXJlciI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgYXZhaWxhYmxlIHVuZGVyIGFueSBmb3JtIGZvcgorICAgICAqIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHZpZXcgaGllcmFyY2h5IGNhbiBwb3RlbnRpYWxseSBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIEdMRVMyMENhbnZhcy5pc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBoYXJkd2FyZSByZW5kZXJpbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBob2xkZXIgVGhlIGhvbGRlciBmb3IgdGhlIHN1cmZhY2UgdG8gaGFyZHdhcmUgYWNjZWxlcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKTsKKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgZHJhd2luZy4gVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5CisgICAgICogZnJhbWUgdG8gZHJhdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIFRoZSBBdHRhY2hJbmZvIHVzZWQgdG8gcmVuZGVyIHRoZSBWaWV3Um9vdC4gCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBkcmF3LgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIEF0dGFjaEluZm8gdGllZCB0byB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sIGludCB5T2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlIGFuZCBzZXR1cCB0aGUKKyAgICAgKiByZW5kZXJlciBmb3IgZHJhd2luZywgaWYgbmVlZGVkLiBUaGlzIGlzIGludm9rZWQgd2hlbiB0aGUgVmlld1Jvb3QgaGFzCisgICAgICogcG90ZW50aWFsbHkgbG9zdCB0aGUgaGFyZHdhcmUgcmVuZGVyZXIuIFRoZSBoYXJkd2FyZSByZW5kZXJlciBzaG91bGQgYmUKKyAgICAgKiByZWluaXRpYWxpemVkIGFuZCBzZXR1cCB3aGVuIHRoZSByZW5kZXIge0BsaW5rICNpc1JlcXVlc3RlZCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2lzRW5hYmxlZCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gVGhlIAorICAgICAqIEBwYXJhbSBob2xkZXIKKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemVJZk5lZWRlZChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKworICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgLy8gV2UgbG9zdCB0aGUgZ2wgY29udGV4dCwgc28gcmVjcmVhdGUgaXQuCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemUoaG9sZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cCh3aWR0aCwgaGVpZ2h0LCBhdHRhY2hJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wuCisgICAgICogCisgICAgICogQHBhcmFtIGdsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBPcGVuR0wgdG8gdXNlICgxIGZvciBPcGVuR0wgMSwgMTEgZm9yIE9wZW5HTCAxLjEsIGV0Yy4pCisgICAgICogQHBhcmFtIHRyYW5zbHVjZW50IFRydWUgaWYgdGhlIHN1cmZhY2UgaXMgdHJhbnNsdWNlbnQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEByZXR1cm4gQSBoYXJkd2FyZSByZW5kZXJlciBiYWNrZWQgYnkgT3BlbkdMLgorICAgICAqLworICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZUdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBzd2l0Y2ggKGdsVmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBHbDIwUmVuZGVyZXIuY3JlYXRlKHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEdMIHZlcnNpb246ICIgKyBnbFZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIHJlcXVlc3QgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0ZWQoYm9vbGVhbiByZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVJlcXVlc3RlZCA9IHJlcXVlc3RlZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdsUmVuZGVyZXIgZXh0ZW5kcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworCisgICAgICAgIEVHTDEwIG1FZ2w7CisgICAgICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7CisgICAgICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7CisgICAgICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7CisgICAgICAgIEVHTENvbmZpZyBtRWdsQ29uZmlnOworCisgICAgICAgIEdMIG1HbDsKKyAgICAgICAgQ2FudmFzIG1DYW52YXM7CisKKyAgICAgICAgZmluYWwgaW50IG1HbFZlcnNpb247CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVRyYW5zbHVjZW50OworCisgICAgICAgIEdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgIG1UcmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBmb3IgT3BlbkdMIGVycm9ycy4gSWYgYW4gZXJyb3IgaGFzIG9jY3VyZWQsIHtAbGluayAjZGVzdHJveSgpfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0Vycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEVHTDExLkVHTF9DT05URVhUX0xPU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJPcGVuR0wgZXJyb3I6ICIgKyBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSAmJiAhaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplRWdsKCk7CisgICAgICAgICAgICAgICAgbUdsID0gY3JlYXRlRWdsU3VyZmFjZShob2xkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKG1HbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzID0gY3JlYXRlQ2FudmFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkhhcmR3YXJlIGFjY2VsZXJhdGVkIENhbnZhcyBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBDYW52YXMgY3JlYXRlQ2FudmFzKCk7CisKKyAgICAgICAgdm9pZCBpbml0aWFsaXplRWdsKCkgeworICAgICAgICAgICAgbUVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG1FZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG1FZ2xEaXNwbGF5ID09IEVHTDEwLkVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEdldERpc3BsYXkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQorICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBpZiAoIW1FZ2wuZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgdmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsSW5pdGlhbGl6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FZ2xDb25maWcgPSBnZXRDb25maWdDaG9vc2VyKG1HbFZlcnNpb24pLmNob29zZUNvbmZpZyhtRWdsLCBtRWdsRGlzcGxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgY29udGV4dC4gV2Ugd2FudCB0byBkbyB0aGlzIGFzIHJhcmVseSBhcyB3ZSBjYW4sIGJlY2F1c2UgYW4KKyAgICAgICAgICAgICogRUdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KG1FZ2wsIG1FZ2xEaXNwbGF5LCBtRWdsQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMIGNyZWF0ZUVnbFN1cmZhY2UoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICAgICAgICBpZiAobUVnbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRWdsRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbERpc3BsYXkgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbENvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1FZ2xDb25maWcgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgVGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgICogIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsICYmIG1FZ2xTdXJmYWNlICE9IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFVuYmluZCBhbmQgZGVzdHJveSB0aGUgb2xkIEVHTCBzdXJmYWNlLCBpZgorICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgorICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBtRWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xDb25maWcsIGhvbGRlciwgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSA9PSBudWxsIHx8IG1FZ2xTdXJmYWNlID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gbUVnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFR0wxMC5FR0xfQkFEX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVnbEhlbHBlciIsICJjcmVhdGVXaW5kb3dTdXJmYWNlIHJldHVybmVkIEVHTF9CQURfTkFUSVZFX1dJTkRPVy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIG1FZ2xDb250ZXh0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1FZ2xDb250ZXh0LmdldEdMKCk7CisgICAgICAgIH0KKworICAgICAgICBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgbUdsVmVyc2lvbiwgRUdMMTAuRUdMX05PTkUgfTsKKworICAgICAgICAgICAgcmV0dXJuIGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gIT0gMCA/IGF0dHJpYl9saXN0IDogbnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworCisgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZUlmTmVlZGVkKHdpZHRoLCBoZWlnaHQsIGF0dGFjaEluZm8sIGhvbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSByZXR1cm47CisKKyAgICAgICAgICAgIG1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOworICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOworCisgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7CisgICAgICAgICAgICBtRWdsID0gbnVsbDsKKyAgICAgICAgICAgIG1HbCA9IG51bGw7CisgICAgICAgICAgICBtQ2FudmFzID0gbnVsbDsKKworICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgc2V0dXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbykgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBhdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAod2lkdGggKiBzY2FsZSArIDAuNWYpLCAoaW50KSAoaGVpZ2h0ICogc2NhbGUgKyAwLjVmKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gY2FuRHJhdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2wgIT0gbnVsbCAmJiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lcyB0aGUgRUdMIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcmVuZGVyZXIuIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaXMgUkdCWCwgbm8gZGVwdGgsIG5vIHN0ZW5jaWwuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlci5HbFJlbmRlcmVyLkVnbENvbmZpZ0Nob29zZXJ9LgorICAgICAgICAgKiBAcGFyYW0gZ2xWZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBFZ2xDb25maWdDaG9vc2VyIGdldENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTaXplQ2hvb3NlcihnbFZlcnNpb24sIDgsIDgsIDgsIG1UcmFuc2x1Y2VudCA/IDggOiAwLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlPZmZzZXQpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgbUVnbC5lZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBtQ29uZmlnU3BlYzsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1HbFZlcnNpb247CisKKyAgICAgICAgICAgIEVnbENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbiwgaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gPSBnbFZlcnNpb247CisgICAgICAgICAgICAgICAgbUNvbmZpZ1NwZWMgPSBmaWx0ZXJDb25maWdTcGVjKGNvbmZpZ1NwZWMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgbnVsbCwgMCwgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGluZGV4WzBdOworICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICAgICAgaWYgKCFlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIG1Db25maWdTcGVjLCBjb25maWdzLCBudW1Db25maWdzLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcgPSBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlnIGNob3NlbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFic3RyYWN0IEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpOworCisgICAgICAgICAgICBwcml2YXRlIGludFtdIGZpbHRlckNvbmZpZ1NwZWMoaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIGlmIChtR2xWZXJzaW9uICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1NwZWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgbm9uZSBvZiB0aGUgc3ViY2xhc3NlcyBkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRS4KKyAgICAgICAgICAgICAgICAgKiBBbmQgd2Uga25vdyB0aGUgY29uZmlnU3BlYyBpcyB3ZWxsIGZvcm1lZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gY29uZmlnU3BlYy5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50W10gbmV3Q29uZmlnU3BlYyA9IG5ldyBpbnRbbGVuICsgMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25maWdTcGVjLCAwLCBuZXdDb25maWdTcGVjLCAwLCBsZW4gLSAxKTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiAtIDFdID0gRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbl0gPSA0OyAvKiBFR0xfT1BFTkdMX0VTMl9CSVQgKi8KKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiArIDFdID0gRUdMMTAuRUdMX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbmZpZ1NwZWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hvb3NlIGEgY29uZmlndXJhdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNwZWNpZmllZCByLGcsYixhIHNpemVzLAorICAgICAgICAgKiBhbmQgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBkZXB0aCBhbmQgc3RlbmNpbCBzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb21wb25lbnRTaXplQ2hvb3NlciBleHRlbmRzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1SZWRTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1BbHBoYVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtRGVwdGhTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVN0ZW5jaWxTaXplOworCisgICAgICAgICAgICBDb21wb25lbnRTaXplQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnQgcmVkU2l6ZSwgaW50IGdyZWVuU2l6ZSwgaW50IGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFTaXplLCBpbnQgZGVwdGhTaXplLCBpbnQgc3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihnbFZlcnNpb24sIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIHJlZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgZ3JlZW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgYWxwaGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIGRlcHRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIHN0ZW5jaWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUgfSk7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBtUmVkU2l6ZSA9IHJlZFNpemU7CisgICAgICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGdyZWVuU2l6ZTsKKyAgICAgICAgICAgICAgICBtQmx1ZVNpemUgPSBibHVlU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWxwaGFTaXplID0gYWxwaGFTaXplOworICAgICAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aFNpemU7CisgICAgICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbFNpemU7CisgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgZm9yIChFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzID49IG1TdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBtUmVkU2l6ZSAmJiBnID09IG1HcmVlblNpemUgJiYgYiA9PSBtQmx1ZVNpemUgJiYgYSA+PSBtQWxwaGFTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wgRVMgMi4wLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBHbDIwUmVuZGVyZXIgZXh0ZW5kcyBHbFJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBHTEVTMjBDYW52YXMgbUdsQ2FudmFzOworCisgICAgICAgIEdsMjBSZW5kZXJlcihib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBzdXBlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQ2FudmFzIGNyZWF0ZUNhbnZhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2xDYW52YXMgPSBuZXcgR0xFUzIwQ2FudmFzKG1HbCwgbVRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgICAgIG1HbENhbnZhcy5vblByZURyYXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZShib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBpZiAoR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdsMjBSZW5kZXJlcih0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQppbmRleCBlNTk4NWMxLi40NzllNzU3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNzEsMTEgKzcxLDExIEBACiAKICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIG1Db25zdHJ1Y3RvckFyZ3MgPSBuZXcgT2JqZWN0WzJdOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBtQ29uc3RydWN0b3JTaWduYXR1cmUgPSBuZXcgQ2xhc3NbXSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBtQ29uc3RydWN0b3JTaWduYXR1cmUgPSBuZXcgQ2xhc3NbXSB7CiAgICAgICAgICAgICBDb250ZXh0LmNsYXNzLCBBdHRyaWJ1dGVTZXQuY2xhc3N9OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPiBzQ29uc3RydWN0b3JNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+PiBzQ29uc3RydWN0b3JNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+KCk7CiAgICAgCiAgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4gbUZpbHRlck1hcDsKIApAQCAtOTcsNiArOTcsNyBAQAogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgY2xhc3MgaXMgYWxsb3dlZCB0byBiZSBpbmZsYXRlZCwgb3IgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgYm9vbGVhbiBvbkxvYWRDbGFzcyhDbGFzcyBjbGF6eik7CiAgICAgfQogICAgIApAQCAtMzc5LDcgKzM4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlZpZXdHcm91cCByb290IGFuZCBhdHRhY2hUb1Jvb3Q9dHJ1ZSIpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0cnMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUZW1wIGlzIHRoZSByb290IHZpZXcgdGhhdCB3YXMgZm91bmQgaW4gdGhlIHhtbAogICAgICAgICAgICAgICAgICAgICBWaWV3IHRlbXAgPSBjcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CkBAIC00MDQsNyArNDA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0+IHN0YXJ0IGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuIHVuZGVyIHRlbXAKLSAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB0ZW1wLCBhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0+IGRvbmUgaW5mbGF0aW5nIGNoaWxkcmVuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQ1MywxOCArNDU0LDE4IEBACiAgICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgaW5zdGFudGlhdGVkLgogICAgICAqIEBwYXJhbSBhdHRycyBUaGUgWE1MIGF0dHJpYnV0ZXMgc3VwcGxpZWQgZm9yIHRoaXMgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiBWaWV3IFRoZSBuZXdseSBpbnN0YW50aWVkIHZpZXcsIG9yIG51bGwuCisgICAgICogQHJldHVybiBWaWV3IFRoZSBuZXdseSBpbnN0YW50aWF0ZWQgdmlldywgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgVmlldyBjcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4LCBBdHRyaWJ1dGVTZXQgYXR0cnMpCiAgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5mbGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4gY29uc3RydWN0b3IgPSBzQ29uc3RydWN0b3JNYXAuZ2V0KG5hbWUpOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmlldz4gY2xhenogPSBudWxsOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIENsYXNzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHNlZSBpZiBpdCdzIHJlYWwsIGFuZCB0cnkgdG8gYWRkIGl0CiAgICAgICAgICAgICAgICAgY2xhenogPSBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpLmFzU3ViY2xhc3MoVmlldy5jbGFzcyk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCAmJiBjbGF6eiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IG1GaWx0ZXIub25Mb2FkQ2xhc3MoY2xhenopOwpAQCAtNDgyLDcgKzQ4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkU3RhdGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGNsYXNzIC0tIHJlbWVtYmVyIHdoZXRoZXIgaXQgaXMgYWxsb3dlZAogICAgICAgICAgICAgICAgICAgICAgICAgY2xhenogPSBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBjbGF6eiAhPSBudWxsICYmIG1GaWx0ZXIub25Mb2FkQ2xhc3MoY2xhenopOwogICAgICAgICAgICAgICAgICAgICAgICAgbUZpbHRlck1hcC5wdXQobmFtZSwgYWxsb3dlZCk7CkBAIC00OTcsNyArNDk4LDcgQEAKIAogICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG1Db25zdHJ1Y3RvckFyZ3M7CiAgICAgICAgICAgICBhcmdzWzFdID0gYXR0cnM7Ci0gICAgICAgICAgICByZXR1cm4gKFZpZXcpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwogCiAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCkBAIC01MDYsNiArNTA3LDEzIEBACiAgICAgICAgICAgICBpZS5pbml0Q2F1c2UoZSk7CiAgICAgICAgICAgICB0aHJvdyBpZTsKIAorICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgbG9hZGVkIGNsYXNzIGlzIG5vdCBhIFZpZXcgc3ViY2xhc3MKKyAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBDbGFzcyBpcyBub3QgYSBWaWV3ICIKKyAgICAgICAgICAgICAgICAgICAgKyAocHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKSk7CisgICAgICAgICAgICBpZS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB0aHJvdyBpZTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBJZiBsb2FkQ2xhc3MgZmFpbHMsIHdlIHNob3VsZCBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbi4KICAgICAgICAgICAgIHRocm93IGU7CkBAIC01MTksNyArNTI3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaHJvdyBhbiBleGNwZXRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgorICAgICAqIFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGZhaWxOb3RBbGxvd2VkKFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTkwLDggKzU5OCw4IEBACiAgICAgICogUmVjdXJzaXZlIG1ldGhvZCB1c2VkIHRvIGRlc2NlbmQgZG93biB0aGUgeG1sIGhpZXJhcmNoeSBhbmQgaW5zdGFudGlhdGUKICAgICAgKiB2aWV3cywgaW5zdGFudGlhdGUgdGhlaXIgY2hpbGRyZW4sIGFuZCB0aGVuIGNhbGwgb25GaW5pc2hJbmZsYXRlKCkuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzKQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgckluZmxhdGUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50LCBmaW5hbCBBdHRyaWJ1dGVTZXQgYXR0cnMsCisgICAgICAgICAgICBib29sZWFuIGZpbmlzaEluZmxhdGUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgZmluYWwgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CiAgICAgICAgIGludCB0eXBlOwpAQCAtNjE4LDEyICs2MjYsMTIgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZpZXdHcm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHZpZXdHcm91cC5nZW5lcmF0ZUxheW91dFBhcmFtcyhhdHRycyk7Ci0gICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycyk7CisgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgdmlld0dyb3VwLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgaWYgKGZpbmlzaEluZmxhdGUpIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcGFyc2VSZXF1ZXN0Rm9jdXMoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50KQpAQCAtNjc0LDcgKzY4Miw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19NRVJHRS5lcXVhbHMoY2hpbGROYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKGNoaWxkTmFtZSwgY2hpbGRBdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CkBAIC02OTksNyArNzA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgdmlldywgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgdmlldywgY2hpbGRBdHRycywgdHJ1ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gb3ZlcnJpZGUgdGhlIGluY2x1ZGVkIGxheW91dCdzIGFuZHJvaWQ6aWQgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBzZXQgb24gdGhlIDxpbmNsdWRlIC8+IHRhZyBpdHNlbGYuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQppbmRleCA0NmM4MDVjLi5hOTU5ZTBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKQEAgLTE2LDkgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CkBAIC0zMCw2ICsyOSw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgbWVudSBYTUwgZmlsZXMgaW50byBNZW51IG9iamVjdHMuCiAgKiA8cD4KQEAgLTE2Niw2ICsxNjcsNDEgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQQVJBTV9UWVBFUyA9IG5ldyBDbGFzc1tdIHsgTWVudUl0ZW0uY2xhc3MgfTsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbU1ldGhvZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIENsYXNzIGMgPSBjb250ZXh0LmdldENsYXNzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NZXRob2QgPSBjLmdldE1ldGhvZChtZXRob2ROYW1lLCBQQVJBTV9UWVBFUyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gZXggPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZXNvbHZlIG1lbnUgaXRlbSBvbkNsaWNrIGhhbmRsZXIgIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBjbGFzcyAiICsgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IEJvb2xlYW4uVFlQRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU3RhdGUgZm9yIHRoZSBjdXJyZW50IG1lbnUuCiAgICAgICogPHA+CkBAIC0yMDUsNiArMjQxLDE2IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtVmlzaWJsZTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1FbmFibGVkOwogICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bmMgdG8gYXR0cnMueG1sIGVudW0sIHZhbHVlcyBpbiBNZW51SXRlbToKKyAgICAgICAgICogLSAwOiBuZXZlcgorICAgICAgICAgKiAtIDE6IGlmUm9vbQorICAgICAgICAgKiAtIDI6IGFsd2F5cworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbVNob3dBc0FjdGlvbiA9IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX05FVkVSOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZTsKKyAgICAgICAgCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0R3JvdXBJZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1JZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1DYXRlZ29yeSA9IDA7CkBAIC0yNzYsNiArMzIyLDggQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIDApOworICAgICAgICAgICAgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX29uQ2xpY2spOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIApAQCAtMjk4LDEwICszNDYsMjMgQEAKICAgICAgICAgICAgICAgICAuc2V0VGl0bGVDb25kZW5zZWQoaXRlbVRpdGxlQ29uZGVuc2VkKQogICAgICAgICAgICAgICAgIC5zZXRJY29uKGl0ZW1JY29uUmVzSWQpCiAgICAgICAgICAgICAgICAgLnNldEFscGhhYmV0aWNTaG9ydGN1dChpdGVtQWxwaGFiZXRpY1Nob3J0Y3V0KQotICAgICAgICAgICAgICAgIC5zZXROdW1lcmljU2hvcnRjdXQoaXRlbU51bWVyaWNTaG9ydGN1dCk7CisgICAgICAgICAgICAgICAgLnNldE51bWVyaWNTaG9ydGN1dChpdGVtTnVtZXJpY1Nob3J0Y3V0KQorICAgICAgICAgICAgICAgIC5zZXRTaG93QXNBY3Rpb24oaXRlbVNob3dBc0FjdGlvbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpdGVtTGlzdGVuZXJNZXRob2ROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFuZHJvaWQ6b25DbGljayBhdHRyaWJ1dGUgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSB1c2VkIHdpdGhpbiBhIHJlc3RyaWN0ZWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdGVtLnNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIobUNvbnRleHQsIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgewotICAgICAgICAgICAgICAgICgoTWVudUl0ZW1JbXBsKSBpdGVtKS5zZXRFeGNsdXNpdmVDaGVja2FibGUodHJ1ZSk7CisgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnVJdGVtSW1wbCkgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpbXBsID0gKE1lbnVJdGVtSW1wbCkgaXRlbTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUNoZWNrYWJsZSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQppbmRleCBmY2ViZWM1ZC4uMjYwNGNmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQpAQCAtMzEsNiArMzEsMjEgQEAKICAqIEZvciBhIGZlYXR1cmUgc2V0IG9mIHNwZWNpZmljIG1lbnUgdHlwZXMsIHNlZSB7QGxpbmsgTWVudX0uCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTWVudUl0ZW0geworICAgIC8qCisgICAgICogVGhlc2Ugc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGF0dHJzLnhtbCBlbnVtIGNvbnN0YW50cyBmb3Igc2hvd0FzQWN0aW9uCisgICAgICovCisgICAgLyoqIE5ldmVyIHNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fTkVWRVIgPSAwOworICAgIC8qKiBTaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyIGlmIHRoZSBzeXN0ZW0gZGVjaWRlcyB0aGVyZSBpcyByb29tIGZvciBpdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9JRl9ST09NID0gMTsKKyAgICAvKioKKyAgICAgKiBBbHdheXMgc2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhci4KKyAgICAgKiBVc2Ugc3BhcmluZ2x5ISBJZiB0b28gbWFueSBpdGVtcyBhcmUgc2V0IHRvIGFsd2F5cyBzaG93IGluIHRoZSBBY3Rpb24gQmFyIGl0IGNhbgorICAgICAqIGNyb3dkIHRoZSBBY3Rpb24gQmFyIGFuZCBkZWdyYWRlIHRoZSB1c2VyIGV4cGVyaWVuY2Ugb24gZGV2aWNlcyB3aXRoIHNtYWxsZXIgc2NyZWVucy4KKyAgICAgKiBBIGdvb2QgcnVsZSBvZiB0aHVtYiBpcyB0byBoYXZlIG5vIG1vcmUgdGhhbiAyIGl0ZW1zIHNldCB0byBhbHdheXMgc2hvdyBhdCBhIHRpbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fQUxXQVlTID0gMjsKKyAgICAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSBtZW51IGl0ZW0gaXMKICAgICAgKiBjbGlja2VkLgpAQCAtMzgxLDQgKzM5NiwxNSBAQAogICAgICAqICAgICAgICAgbWVudSBpdGVtIHRvIHRoZSBtZW51LiBUaGlzIGNhbiBiZSBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBDb250ZXh0TWVudUluZm8gZ2V0TWVudUluZm8oKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyB0aGlzIGl0ZW0gc2hvdWxkIGRpc3BsYXkgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFjdGlvbiBCYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aW9uRW51bSBIb3cgdGhlIGl0ZW0gc2hvdWxkIGRpc3BsYXkuIE9uZSBvZgorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fQUxXQVlTfSwge0BsaW5rICNTSE9XX0FTX0FDVElPTl9JRl9ST09NfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX05FVkVSfS4gU0hPV19BU19BQ1RJT05fTkVWRVIgaXMgdGhlIGRlZmF1bHQuCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpb25CYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQppbmRleCA0NzA2MWMxLi4xMzI4NTI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCkBAIC03NzIsNyArNzcyLDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9pbnRlcklkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb2ludGVyIHRvIGJlIGZvdW5kLgogICAgICAqIEByZXR1cm4gUmV0dXJucyBlaXRoZXIgdGhlIGluZGV4IG9mIHRoZSBwb2ludGVyIChmb3IgdXNlIHdpdGgKLSAgICAgKiB7QGxpbmsgI2dldFgoaW50KSBldCBhbC4pLCBvciAtMSBpZiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSBmb3IKKyAgICAgKiB7QGxpbmsgI2dldFgoaW50KX0gZXQgYWwuKSwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUgZm9yCiAgICAgICogdGhhdCBwb2ludGVyIGlkZW50aWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBmaW5kUG9pbnRlckluZGV4KGludCBwb2ludGVySWQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKaW5kZXggYjg2MjNlNy4uNTcwNzkzYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIApAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CkBAIC01Niw2ICs1OCw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CkBAIC04ODcsNiArODkwLDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQgPSAweDEwMDAwMDAwOwogCiAgICAgLyoqCisgICAgICogPHA+SW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgaGllcmFyY2h5IHNob3VsZCBzdG9wIHNhdmluZyBzdGF0ZSB3aGVuCisgICAgICogaXQgcmVhY2hlcyB0aGlzIHZpZXcuICBJZiBzdGF0ZSBzYXZpbmcgaXMgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IGF0CisgICAgICogdGhlIHZpZXcsIGl0IHdpbGwgYmUgYWxsb3dlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRCA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiA8cD5NYXNrIGZvciB1c2Ugd2l0aCBzZXRGbGFncyBpbmRpY2F0aW5nIGJpdHMgdXNlZCBmb3IgUEFSRU5UX1NBVkVfRElTQUJMRUQuPC9wPgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0sgPSAweDIwMDAwMDAwOworCisgICAgLyoqCiAgICAgICogVmlldyBmbGFnIGluZGljYXRpbmcgd2hldGhlciB7QGxpbmsgI2FkZEZvY3VzYWJsZXMoQXJyYXlMaXN0LCBpbnQsIGludCl9CiAgICAgICogc2hvdWxkIGFkZCBhbGwgZm9jdXNhYmxlIFZpZXdzIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgZm9jdXNhYmxlIGluIHRvdWNoIG1vZGUuCiAgICAgICovCkBAIC0xNTIxLDYgKzE1MzgsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBS0VOX1NDUk9MTF9CQVJTX09OX0FUVEFDSCA9IDB4MDgwMDAwMDA7CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBwaXZvdFggb3IgcGl2b3RZIHdlcmUgZXhwbGljaXRseSBzZXQgYW5kIHdlIHNob3VsZCBub3QgYXNzdW1lIHRoZSBjZW50ZXIKKyAgICAgKiBmb3IgdHJhbnNmb3JtIG9wZXJhdGlvbnMKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJVk9UX0VYUExJQ0lUTFlfU0VUID0gMHgxMDAwMDAwMDsKKworICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvLgogICAgICAqIHtAaGlkZX0KICAgICAgKgpAQCAtMTU3MSw2ICsxNTk2LDEzNSBAQAogICAgIGludCBtVmlld0ZsYWdzOwogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtSW52ZXJzZU1hdHJpeDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeERpcnR5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQSB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuIFRoaXMgdmFyaWFibGUKKyAgICAgKiBpcyBvbmx5IHZhbGlkIGFmdGVyIGEgY2FsbCB0byBnZXRNYXRyaXgoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeElzSWRlbnRpdHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIENhbWVyYSBvYmplY3QgaXMgdXNlZCB0byBjb21wdXRlIGEgM0QgbWF0cml4IHdoZW4gcm90YXRpb25YIG9yIHJvdGF0aW9uWSBhcmUgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmEgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhpcyBtYXRyaXggaXMgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgbWF0cml4IGZvciAzRCByb3RhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXRyaXggbWF0cml4M0QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlc2UgcHJldiB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVjYWxjdWxhdGUgYSBjZW50ZXJlZCBwaXZvdCBwb2ludCB3aGVuIG5lY2Vzc2FyeS4gVGhlCisgICAgICogcGl2b3QgcG9pbnQgaXMgb25seSB1c2VkIGluIG1hdHJpeCBvcGVyYXRpb25zICh3aGVuIHJvdGF0aW9uLCBzY2FsZSwgb3IgdHJhbnNsYXRpb24gYXJlCisgICAgICogc2V0KSwgc28gdGhlcyB2YWx1ZXMgYXJlIG9ubHkgdXNlZCB0aGVuIGFzIHdlbGwuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aCA9IC0xOworICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSB2YWx1ZSB0byBjaGVjayBmb3IgZmxvYXQgdmFsdWVzIHRoYXQgYXJlIGNsb3NlIGVub3VnaCB0byB6ZXJvIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiB6ZXJvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE5PTlpFUk9fRVBTSUxPTiA9IC4wMDFmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uWSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyBsZWZ0IHByb3BlcnR5IChwb3N0LWxheW91dCkuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtVHJhbnNsYXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyB0b3AgcHJvcGVydHkgKHBvc3QtbGF5b3V0KS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVggPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVkgPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSBWaWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbUFscGhhID0gMWY7CisKKyAgICAvKioKICAgICAgKiBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHZpZXcncyBwYXJlbnQKICAgICAgKiB0byB0aGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzE5LDggKzE4NzMsOCBAQAogCiAgICAgcHJpdmF0ZSBpbnRbXSBtRHJhd2FibGVTdGF0ZSA9IG51bGw7CiAKLSAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Qml0bWFwPiBtRHJhd2luZ0NhY2hlOwotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxCaXRtYXA+IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKKyAgICBwcml2YXRlIEJpdG1hcCBtRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgQml0bWFwIG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgIC8qKgogICAgICAqIFdoZW4gdGhpcyB2aWV3IGhhcyBmb2N1cyBhbmQgdGhlIG5leHQgZm9jdXMgaXMge0BsaW5rICNGT0NVU19MRUZUfSwKQEAgLTI0MTMsMTEgKzI1NjcsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgdmlldydzIE9uTG9uZ0NsaWNrTGlzdGVuZXIsIGlmIGl0IGlzIGRlZmluZWQuIEludm9rZXMgdGhlIGNvbnRleHQgbWVudQotICAgICAqIGlmIHRoZSBPbkxvbmdDbGlja0xpc3RlbmVyIGRpZCBub3QgY29uc3VtZSB0aGUgZXZlbnQuCisgICAgICogQ2FsbCB0aGlzIHZpZXcncyBPbkxvbmdDbGlja0xpc3RlbmVyLCBpZiBpdCBpcyBkZWZpbmVkLiBJbnZva2VzIHRoZSBjb250ZXh0IG1lbnUgaWYgdGhlCisgICAgICogT25Mb25nQ2xpY2tMaXN0ZW5lciBkaWQgbm90IGNvbnN1bWUgdGhlIGV2ZW50LgogICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIHRoZXJlIHdhcyBhbiBhc3NpZ25lZCBPbkxvbmdDbGlja0xpc3RlbmVyIHRoYXQgd2FzIGNhbGxlZCwgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgb25lIG9mIHRoZSBhYm92ZSByZWNlaXZlcnMgY29uc3VtZWQgdGhlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUxvbmdDbGljaygpIHsKICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRCk7CkBAIC0yNDQ1LDYgKzI1OTgsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgY29udHJvbCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCBpcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKHRoaXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIGluIHRoaXMgdmlldy4KICAgICAgKiBAcGFyYW0gbCB0aGUga2V5IGxpc3RlbmVyIHRvIGF0dGFjaCB0byB0aGlzIHZpZXcKICAgICAgKi8KQEAgLTMzNTIsNiArMzUxNywzOCBAQAogCiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmlldyBzdGF0ZSBzYXZpbmcgZnJvbSBwYXJlbnQgaXMgZW5hYmxlZCwgZWxzZSBmYWxzZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUZyb21QYXJlbnRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBlbnRpcmUgaGllcmFyY2h5IHVuZGVyIHRoaXMgdmlldyB3aWxsIHNhdmUgaXRzCisgICAgICogc3RhdGUgd2hlbiBhIHN0YXRlIHNhdmluZyB0cmF2ZXJzYWwgb2NjdXJzIGZyb20gaXRzIHBhcmVudC4gIFRoZSBkZWZhdWx0CisgICAgICogaXMgdHJ1ZTsgaWYgZmFsc2UsIHRoZXNlIHZpZXdzIHdpbGwgbm90IGJlIHNhdmVkIHVubGVzcworICAgICAqIHtAbGluayAjc2F2ZUhpZXJhcmNoeVN0YXRlKFNwYXJzZUFycmF5KX0gaXMgY2FsbGVkIGRpcmVjdGx5IG9uIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIFNldCB0byBmYWxzZSB0byA8ZW0+ZGlzYWJsZTwvZW0+IHN0YXRlIHNhdmluZywgb3IgdHJ1ZQorICAgICAqICh0aGUgZGVmYXVsdCkgdG8gYWxsb3cgaXQuCisgICAgICoKKyAgICAgKiBAc2VlICNpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpCisgICAgICogQHNlZSAjc2V0SWQoaW50KQorICAgICAqIEBzZWUgI29uU2F2ZUluc3RhbmNlU3RhdGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc2V0RmxhZ3MoZW5hYmxlZCA/IDAgOiBQQVJFTlRfU0FWRV9ESVNBQkxFRCwgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSyk7CisgICAgfQorCisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBWaWV3IGlzIGFibGUgdG8gdGFrZSBmb2N1cy4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHZpZXcgY2FuIHRha2UgZm9jdXMsIG9yIGZhbHNlIG90aGVyd2lzZS4KQEAgLTQyMTgsNiArNDQxNSwxMCBAQAogICAgICAqIFNob3cgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhpcyB2aWV3LiBJdCBpcyBub3Qgc2FmZSB0byBob2xkIG9uIHRvIHRoZQogICAgICAqIG1lbnUgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2QuCiAgICAgICoKKyAgICAgKiBZb3Ugc2hvdWxkIG5vcm1hbGx5IG5vdCBvdmVybG9hZCB0aGlzIG1ldGhvZC4gT3ZlcmxvYWQKKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUpfSBvciBkZWZpbmUgYW4KKyAgICAgKiB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSB0byBhZGQgaXRlbXMgdG8gdGhlIGNvbnRleHQgbWVudS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBtZW51IFRoZSBjb250ZXh0IG1lbnUgdG8gcG9wdWxhdGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KSB7CkBAIC00MzcwLDkgKzQ1NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBCZSBsZW5pZW50IGFib3V0IG1vdmluZyBvdXRzaWRlIG9mIGJ1dHRvbnMKLSAgICAgICAgICAgICAgICAgICAgaW50IHNsb3AgPSBtVG91Y2hTbG9wOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHggPCAwIC0gc2xvcCkgfHwgKHggPj0gZ2V0V2lkdGgoKSArIHNsb3ApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPCAwIC0gc2xvcCkgfHwgKHkgPj0gZ2V0SGVpZ2h0KCkgKyBzbG9wKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50SW5WaWV3KHgsIHksIG1Ub3VjaFNsb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXRzaWRlIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVGFwQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApIHsKQEAgLTQ3MTgsNiArNDkxNywzNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGlzIHZpZXcsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgICAgKiByb2F0aW9uLCBzY2FsZSwgYW5kIHBpdm90IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSB2aWV3CisgICAgICovCisgICAgcHVibGljIE1hdHJpeCBnZXRNYXRyaXgoKSB7CisgICAgICAgIGhhc0lkZW50aXR5TWF0cml4KCk7CisgICAgICAgIHJldHVybiBtTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlCisgICAgICogY29uc2lkZXJlZCBub24temVyby4KKyAgICAgKiBAcGFyYW0gdmFsdWUgQSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBjaGVjayBmb3IgemVyby1uZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBwYXNzZWQtaW4gdmFsdWUgaXMgZmFyIGVub3VnaCBhd2F5IGZyb20gemVybyB0byBiZSBjb25zaWRlcmVkIG5vbi16ZXJvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub256ZXJvKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPCAtTk9OWkVST19FUFNJTE9OIHx8IHZhbHVlID4gTk9OWkVST19FUFNJTE9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvbXB1dGVzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlmIG5lY2Vzc2FyeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zZm9ybSBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzSWRlbnRpdHlNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgIG1NYXRyaXgucHJlUm90YXRlKG1Sb3RhdGlvbiwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICBtTWF0cml4LnByZVNjYWxlKG1TY2FsZVgsIG1TY2FsZVksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgaWYgKG5vbnplcm8obVJvdGF0aW9uWCkgfHwgbm9uemVybyhtUm90YXRpb25ZKSkgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWChtUm90YXRpb25YKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVkobVJvdGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5wb3N0Q29uY2F0KG1hdHJpeDNEKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgbU1hdHJpeElzSWRlbnRpdHkgPSBtTWF0cml4LmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWF0cml4SXNJZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1JbnZlcnNlTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LmludmVydChtSW52ZXJzZU1hdHJpeCk7CisgICAgICAgICAgICBtSW52ZXJzZU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnZlcnNlTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFJvdGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb24gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKGZsb2F0IHJvdGF0aW9uKSB7CisgICAgICAgIGlmIChtUm90YXRpb24gIT0gcm90YXRpb24pIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblkoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25ZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvblkgPSByb3RhdGlvblk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblgoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb25YIFRoZSBkZWdyZWVzIG9mIFggcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uWChmbG9hdCByb3RhdGlvblgpIHsKKyAgICAgICAgaWYgKG1Sb3RhdGlvblggIT0gcm90YXRpb25YKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geCBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBkZWZhdWx0IDEuMGYKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHggYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCB3aWR0aC4gQSB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNjYWxlWCBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWChmbG9hdCBzY2FsZVgpIHsKKyAgICAgICAgaWYgKG1TY2FsZVggIT0gc2NhbGVYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIGhlaWdodC4gQSB2YWx1ZSBvZiAxLCB0aGUgZGVmYXVsdCwgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVkoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiBZIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVkgVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVkoZmxvYXQgc2NhbGVZKSB7CisgICAgICAgIGlmIChtU2NhbGVZICE9IHNjYWxlWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFgoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHggbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcworICAgICAqIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9IGFuZCB7QGxpbmsgI3NldFNjYWxlWChmbG9hdCkgc2NhbGVkfS4KKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgcGl2b3QgcG9pbnQgaXMgY2VudGVyZWQgb24gdGhlIG9iamVjdC4KKyAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGlzYWJsZXMgdGhpcyBiZWhhdmlvciBhbmQgY2F1c2VzIHRoZSB2aWV3IHRvIHVzZSBvbmx5IHRoZQorICAgICAqIGV4cGxpY2l0bHkgc2V0IHBpdm90WCBhbmQgcGl2b3RZIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXZvdFggVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQaXZvdFgoZmxvYXQgcGl2b3RYKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gUElWT1RfRVhQTElDSVRMWV9TRVQ7CisgICAgICAgIGlmIChtUGl2b3RYICE9IHBpdm90WCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1QaXZvdFggPSBwaXZvdFg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUGl2b3RZID0gcGl2b3RZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucyB0aGUgdmlldyBpcworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgdGhlIHZpZXcgaXMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRvcCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHRvcCBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KQEAgLTQ3NTgsMTIgKzUyOTUsMTY5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblgoZmxvYXQpIHRyYW5zbGF0aW9uWH0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICByZXR1cm4gbUxlZnQgKyBtVHJhbnNsYXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSB0byBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgICogdGhlIHggdmFsdWUgcGFzc2VkIGluIGFuZCB0aGUgY3VycmVudCB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25YKHggLSBtTGVmdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVRvcCArIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KSB0cmFuc2xhdGlvbll9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeSB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5IFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHkpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25ZKHkgLSBtVG9wKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRyYW5zbGF0aW9uWCgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgZWZmZWN0aXZlbHkgcG9zaXRpb25zIHRoZSBvYmplY3QgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRpb25YIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgbGVmdCBwb3NpdGlvbiwKKyAgICAgKiBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRpb25YKGZsb2F0IHRyYW5zbGF0aW9uWCkgeworICAgICAgICBpZiAobVRyYW5zbGF0aW9uWCAhPSB0cmFuc2xhdGlvblgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25YID0gdHJhbnNsYXRpb25YOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWSA9IHRyYW5zbGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEhpdCByZWN0YW5nbGUgaW4gcGFyZW50J3MgY29vcmRpbmF0ZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBvdXRSZWN0IFRoZSBoaXQgcmVjdGFuZ2xlIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEhpdFJlY3QoUmVjdCBvdXRSZWN0KSB7Ci0gICAgICAgIG91dFJlY3Quc2V0KG1MZWZ0LCBtVG9wLCBtUmlnaHQsIG1Cb3R0b20pOworICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hdHJpeCBtID0gZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0RiB0bXBSZWN0ID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICB0bXBSZWN0LnNldCgtbVBpdm90WCwgLW1QaXZvdFksIGdldFdpZHRoKCkgLSBtUGl2b3RYLCBnZXRIZWlnaHQoKSAtIG1QaXZvdFkpOworICAgICAgICAgICAgbS5tYXBSZWN0KHRtcFJlY3QpOworICAgICAgICAgICAgb3V0UmVjdC5zZXQoKGludCkgdG1wUmVjdC5sZWZ0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QudG9wICsgbVRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgdG1wUmVjdC5yaWdodCArIG1MZWZ0LCAoaW50KSB0bXBSZWN0LmJvdHRvbSArIG1Ub3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGV0ZWN0cyB3aGV0aGVyIHRoZSBnaXZlbiBldmVudCBpcyBpbnNpZGUgdGhlIHZpZXcgYW5kLCBpZiBzbywKKyAgICAgKiBoYW5kbGVzIGl0IHZpYSB0aGUgZGlzcGF0Y2hFdmVudChNb3Rpb25FdmVudCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGV2IFRoZSBldmVudCB0aGF0IGlzIGJlaW5nIGRpc3BhdGNoZWQuCisgICAgICogQHBhcmFtIHBhcmVudFggVGhlIHggbG9jYXRpb24gb2YgdGhlIGV2ZW50IGluIHRoZSBwYXJlbnQncyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gcGFyZW50WSBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgZXZlbnQgaW4gdGhlIHBhcmVudCdzIGNvb3JkaW5hdGVzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGluc2lkZSB0aGlzIHZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldiwgZmxvYXQgcGFyZW50WCwgZmxvYXQgcGFyZW50WSkgeworICAgICAgICBmbG9hdCBsb2NhbFggPSBwYXJlbnRYIC0gbUxlZnQ7CisgICAgICAgIGZsb2F0IGxvY2FsWSA9IHBhcmVudFkgLSBtVG9wOworICAgICAgICBpZiAoIWhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSBsb2NhbFg7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0gbG9jYWxZOworICAgICAgICAgICAgZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIGxvY2FsWCA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICBsb2NhbFkgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbFggPj0gMCAmJiBsb2NhbFkgPj0gMCAmJiBsb2NhbFggPCAobVJpZ2h0IC0gbUxlZnQpICYmIGxvY2FsWSA8IChtQm90dG9tIC0gbVRvcCkpIHsKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIHNhZmVyIHRvIGNsb25lIHRoZSBldmVudCBoZXJlIGJ1dCB3ZSBkb24ndCBmb3IgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbWFueSBzdWJ0bGUgaW50ZXJhY3Rpb25zIGluIHRvdWNoIGV2ZW50IGRpc3BhdGNoOyBjaGFuZ2UgYXQgeW91ciBvd24gcmlzay4KKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24obG9jYWxYLCBsb2NhbFkpOworICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoVG91Y2hFdmVudChldik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBwb2ludCwgaW4gbG9jYWwgY29vcmRpbmF0ZXMsCisgICAgICogaXMgaW5zaWRlIHRoZSB2aWV3LCB3aGVyZSB0aGUgYXJlYSBvZiB0aGUgdmlldyBpcyBleHBhbmRlZCBieSB0aGUgc2xvcCBmYWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHByb2Nlc3NpbmcgdG91Y2gtbW92ZSBldmVudHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBldmVudAorICAgICAqIGlzIHN0aWxsIHdpdGhpbiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcG9pbnRJblZpZXcoZmxvYXQgbG9jYWxYLCBmbG9hdCBsb2NhbFksIGZsb2F0IHNsb3ApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsWCA+IC1zbG9wICYmIGxvY2FsWSA+IC1zbG9wICYmIGxvY2FsWCA8ICgobVJpZ2h0IC0gbUxlZnQpICsgc2xvcCkgJiYKKyAgICAgICAgICAgICAgICBsb2NhbFkgPCAoKG1Cb3R0b20gLSBtVG9wKSArIHNsb3ApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDgyNiw4ICs1NTIwLDM4IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgbnVtYmVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRUb3BBbmRCb3R0b20oaW50IG9mZnNldCkgewotICAgICAgICBtVG9wICs9IG9mZnNldDsKLSAgICAgICAgbUJvdHRvbSArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluVG9wOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpbnQgeUxvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IG1Ub3AgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBtQm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IG1Ub3A7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBtQm90dG9tICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgeUxvYywgbVJpZ2h0IC0gbUxlZnQsIG1heEJvdHRvbSAtIG1pblRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVG9wICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODM2LDggKzU1NjAsMzggQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBudW1lciBvZiBwaXhlbHMgdG8gb2Zmc2V0IHRoZSB2aWV3IGJ5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb2Zmc2V0TGVmdEFuZFJpZ2h0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbUxlZnQgKz0gb2Zmc2V0OwotICAgICAgICBtUmlnaHQgKz0gb2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChoYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pbkxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZWZ0ID0gbUxlZnQgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhMb2MgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZWZ0ID0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KDAsIDAsIG1heFJpZ2h0IC0gbWluTGVmdCwgbUJvdHRvbSAtIG1Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxlZnQgKz0gb2Zmc2V0OworICAgICAgICAgICAgbVJpZ2h0ICs9IG9mZnNldDsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNjI5Nyw4ICs3MDUxLDcgQEAKICAgICAgICAgaWYgKChtVmlld0ZsYWdzICYgRFJBV0lOR19DQUNIRV9FTkFCTEVEKSA9PSBEUkFXSU5HX0NBQ0hFX0VOQUJMRUQpIHsKICAgICAgICAgICAgIGJ1aWxkRHJhd2luZ0NhY2hlKGF1dG9TY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IChtRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbURyYXdpbmdDYWNoZS5nZXQoKSkgOgotICAgICAgICAgICAgICAgIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCA/IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUuZ2V0KCkpOworICAgICAgICByZXR1cm4gYXV0b1NjYWxlID8gbURyYXdpbmdDYWNoZSA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKICAgICB9CiAKICAgICAvKioKQEAgLTYzMTMsMTMgKzcwNjYsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZXN0cm95RHJhd2luZ0NhY2hlKCkgewogICAgICAgICBpZiAobURyYXdpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gbURyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUucmVjeWNsZSgpOwogICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpOwotICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSBiaXRtYXAucmVjeWNsZSgpOworICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02MzgwLDggKzcxMzEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJ1aWxkRHJhd2luZ0NhY2hlKGJvb2xlYW4gYXV0b1NjYWxlKSB7CiAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIERSQVdJTkdfQ0FDSEVfVkFMSUQpID09IDAgfHwgKGF1dG9TY2FsZSA/Ci0gICAgICAgICAgICAgICAgKG1EcmF3aW5nQ2FjaGUgPT0gbnVsbCB8fCBtRHJhd2luZ0NhY2hlLmdldCgpID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpID09IG51bGwpKSkgeworICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPT0gbnVsbCA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsKSkgewogCiAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewogICAgICAgICAgICAgICAgIFZpZXdEZWJ1Zy50cmFjZSh0aGlzLCBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlLkJVSUxEX0NBQ0hFKTsKQEAgLTY0MTQsOCArNzE2NCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gY2xlYXIgPSB0cnVlOwotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IGF1dG9TY2FsZSA/IChtRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbURyYXdpbmdDYWNoZS5nZXQoKSkgOgotICAgICAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyBtRHJhd2luZ0NhY2hlIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlOwogCiAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwgfHwgYml0bWFwLmdldFdpZHRoKCkgIT0gd2lkdGggfHwgYml0bWFwLmdldEhlaWdodCgpICE9IGhlaWdodCkgewogICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcgcXVhbGl0eTsKQEAgLTY0NDcsOSArNzE5Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5zZXREZW5zaXR5KGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChvcGFxdWUgJiYgdHJhbnNsdWNlbnRXaW5kb3cpIGJpdG1hcC5zZXRIYXNBbHBoYShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7CkBAIC02ODEyLDE2ICs3NTYxLDE2IEBACiAKICAgICAgICAgaWYgKHZlcnRpY2FsRWRnZXMpIHsKICAgICAgICAgICAgIHRvcEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFRvcEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIGJvdHRvbUZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldEJvdHRvbUZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChob3Jpem9udGFsRWRnZXMpIHsKICAgICAgICAgICAgIGxlZnRGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRMZWZ0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0xlZnQgPSBsZWZ0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIHJpZ2h0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0UmlnaHRGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1JpZ2h0ID0gcmlnaHRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIHNhdmVDb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKQEAgLTg1NjAsMTMgKzkzMDksMTIgQEAKICAgICAgICAgaWYgKG1BdHRhY2hJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAorICAgICAgICBpZiAoKGZsYWdzICYgSGFwdGljRmVlZGJhY2tDb25zdGFudHMuRkxBR19JR05PUkVfVklFV19TRVRUSU5HKSA9PSAwCiAgICAgICAgICAgICAgICAgJiYgIWlzSGFwdGljRmVlZGJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUF0dGFjaEluZm8ubVJvb3RDYWxsYmFja3MucGVyZm9ybUhhcHRpY0ZlZWRiYWNrKAotICAgICAgICAgICAgICAgIGZlZWRiYWNrQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjayhmZWVkYmFja0NvbnN0YW50LAorICAgICAgICAgICAgICAgIChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg2MzcsOCArOTM4NSw3IEBACiAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpIC0gZGVsYXlPZmZzZXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gc3RhdGVTZXQyKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhdGVTZXRVbmlvbihmaW5hbCBpbnRbXSBzdGF0ZVNldDEsIGZpbmFsIGludFtdIHN0YXRlU2V0MikgewogICAgICAgICBmaW5hbCBpbnQgc3RhdGVTZXQxTGVuZ3RoID0gc3RhdGVTZXQxLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0Mkxlbmd0aCA9IHN0YXRlU2V0Mi5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludFtdIG5ld1NldCA9IG5ldyBpbnRbc3RhdGVTZXQxTGVuZ3RoICsgc3RhdGVTZXQyTGVuZ3RoXTsKQEAgLTkxNTksNiArOTkwNiwxMyBAQAogICAgICAgICAgKi8KICAgICAgICAgZmluYWwgaW50W10gbUludmFsaWRhdGVDaGlsZExvY2F0aW9uID0gbmV3IGludFsyXTsKIAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHbG9iYWwgdG8gdGhlIHZpZXcgaGllcmFyY2h5IHVzZWQgYXMgYSB0ZW1wb3JhcnkgZm9yIGRlYWxpbmcgd2l0aAorICAgICAgICAgKiB4L3kgbG9jYXRpb24gd2hlbiB2aWV3IGlzIHRyYW5zZm9ybWVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgZmxvYXRbXSBtVG1wVHJhbnNmb3JtTG9jYXRpb24gPSBuZXcgZmxvYXRbMl07CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB2aWV3IHRyZWUgb2JzZXJ2ZXIgdXNlZCB0byBkaXNwYXRjaCBnbG9iYWwgZXZlbnRzIGxpa2UKICAgICAgICAgICogbGF5b3V0LCBwcmUtZHJhdywgdG91Y2ggbW9kZSBjaGFuZ2UsIGV0Yy4KQEAgLTkxOTUsNiArOTk0OSwxNiBAQAogICAgICAgICBmaW5hbCBSZWN0IG1UbXBJbnZhbFJlY3QgPSBuZXcgUmVjdCgpOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUZW1wb3JhcnkgZm9yIHVzZSBpbiBjb21wdXRpbmcgaGl0IGFyZWFzIHdpdGggdHJhbnNmb3JtZWQgdmlld3MKKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFJlY3RGIG1UbXBUcmFuc2Zvcm1SZWN0ID0gbmV3IFJlY3RGKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlbXBvcmFyeSBmb3IgdXNlIGluIGNvbXB1dGluZyBpbnZhbGlkYXRpb24gYXJlYXMgd2l0aCB0cmFuc2Zvcm1lZCB2aWV3cworICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgZmxvYXRbXSBtVG1wVHJhbnNmb3JtQm91bmRzID0gbmV3IGZsb2F0WzhdOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUZW1wb3JhcnkgbGlzdCBmb3IgdXNlIGluIGNvbGxlY3RpbmcgZm9jdXNhYmxlIGRlc2NlbmRlbnRzIG9mIGEgdmlldy4KICAgICAgICAgICovCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBtRm9jdXNhYmxlc1RlbXBMaXN0ID0gbmV3IEFycmF5TGlzdDxWaWV3PigyNCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQppbmRleCA3MTU5OTI5Li5lMmY5YzE1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKQEAgLTM0LDYgKzM1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CkBAIC04NiwxMyArODgsMjUgQEAKICAgICAvLyBUaGUgdmlldyBjb250YWluZWQgd2l0aGluIHRoaXMgVmlld0dyb3VwIHRoYXQgaGFzIG9yIGNvbnRhaW5zIGZvY3VzLgogICAgIHByaXZhdGUgVmlldyBtRm9jdXNlZDsKIAotICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIHRvIGFwcGx5IG9uIHRoZSBjaGlsZCBiZWluZyBkcmF3bgotICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb247CisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHdoZW4gZHJhd2luZyBjaGlsZHJlbiwgdG8KKyAgICAgKiBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1hdGlvbiBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byB0cmFjayB0aGUgY3VycmVudCBpbnZhbGlkYXRpb24gcmVnaW9uLgorICAgICAqLwogICAgIHByaXZhdGUgUmVjdEYgbUludmFsaWRhdGVSZWdpb247CiAKKyAgICAvKioKKyAgICAgKiBBIFRyYW5zZm9ybWF0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIGEgY29ycmVjdAorICAgICAqIGludmFsaWRhdGlvbiBhcmVhIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGF1dG9zY2FsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbiBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb247CisKICAgICAvLyBUYXJnZXQgb2YgTW90aW9uIGV2ZW50cwogICAgIHByaXZhdGUgVmlldyBtTW90aW9uVGFyZ2V0OwotICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogCiAgICAgLy8gTGF5b3V0IGFuaW1hdGlvbgogICAgIHByaXZhdGUgTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBtTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTQ2MSw2ICs0NzUsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQob3JpZ2luYWxWaWV3LCBjYWxsYmFjaykgOiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIEZpbmQgdGhlIG5lYXJlc3QgdmlldyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbiB0aGF0IHdhbnRzIHRvIHRha2UKICAgICAgKiBmb2N1cy4KICAgICAgKgpAQCAtODI3LDcgKzg0OCw2IEBACiAgICAgICAgIGZpbmFsIGZsb2F0IHlmID0gZXYuZ2V0WSgpOwogICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFhGbG9hdCA9IHhmICsgbVNjcm9sbFg7CiAgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWUZsb2F0ID0geWYgKyBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgUmVjdCBmcmFtZSA9IG1UZW1wUmVjdDsKIAogICAgICAgICBib29sZWFuIGRpc2FsbG93SW50ZXJjZXB0ID0gKG1Hcm91cEZsYWdzICYgRkxBR19ESVNBTExPV19JTlRFUkNFUFQpICE9IDA7CiAKQEAgLTg0NiwyOSArODY2LDE1IEBACiAgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKICAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdlIHdhbnQgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50IGRvd24sIGZpbmQgYSBjaGlsZAogICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFhJbnQgPSAoaW50KSBzY3JvbGxlZFhGbG9hdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsZWRZSW50ID0gKGludCkgc2Nyb2xsZWRZRmxvYXQ7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSA9PSBWSVNJQkxFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0SGl0UmVjdChmcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUuY29udGFpbnMoc2Nyb2xsZWRYSW50LCBzY3JvbGxlZFlJbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdmlldydzIGNvb3JkaW5hdGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIGNoaWxkLm1MZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSBjaGlsZC5tVG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudChldikpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZWQsIHdlIGhhdmUgYSB0YXJnZXQgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gY2hpbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXZlbnQgZGlkbid0IGdldCBoYW5kbGVkLCB0cnkgdGhlIG5leHQgdmlldy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgZXZlbnQncyBsb2NhdGlvbiwgaXQncyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYsIHNjcm9sbGVkWEZsb2F0LCBzY3JvbGxlZFlGbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC04OTgsMTEgKzkwNCwyMiBAQAogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudChldik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7CisgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICBpZiAoIXRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIHhjID0gbG9jYWxYWVswXTsKKyAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGlmIGhhdmUgYSB0YXJnZXQsIHNlZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGFuZCB3YW50IHRvIGludGVyY2VwdCBpdHMKICAgICAgICAgLy8gZXZlbnRzCiAgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgewotICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OwotICAgICAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CkBAIC05MjQsOCArOTQxLDYgQEAKIAogICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAogICAgICAgICAvLyBkaXNwYXRjaCB0aGUgZXZlbnQuCi0gICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKLSAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CiAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CiAKICAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CkBAIC0xMTgyLDcgKzExOTcsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTIwNyw3ICsxMjI1LDEwIEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgVmlldyBjID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoKGMubVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgYy5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NzcsMjIgKzE0OTgsMjUgQEAKICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gbUdyb3VwRmxhZ3M7CiAKICAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pID09IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uLmNsZWFyKCk7CiAgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKICAgICAgICAgfQogCiAgICAgICAgIFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybVRvQXBwbHkgPSBudWxsOworICAgICAgICBUcmFuc2Zvcm1hdGlvbiBpbnZhbGlkYXRpb25UcmFuc2Zvcm07CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gY2hpbGQuZ2V0QW5pbWF0aW9uKCk7CiAgICAgICAgIGJvb2xlYW4gY29uY2F0TWF0cml4ID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CisgICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gY2FjaGluZyA9IGZhbHNlOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgeworICAgICAgICAgICAgY2FjaGluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChhICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBhLmlzSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgICBhLmluaXRpYWxpemUoY3IgLSBjbCwgY2IgLSBjdCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwpAQCAtMTUwMCwxMCArMTUyNCwxNyBAQAogICAgICAgICAgICAgICAgIGNoaWxkLm9uQW5pbWF0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzY2FsaW5nUmVxdWlyZWQgPyBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSA6IDFmKTsKKyAgICAgICAgICAgIGlmIChzY2FsaW5nUmVxdWlyZWQgJiYgbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgIT0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgICAgICAgICBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0sIDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgdHJhbnNmb3JtVG9BcHBseSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogCiAgICAgICAgICAgICBjb25jYXRNYXRyaXggPSBhLndpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOwpAQCAtMTUyMCw3ICsxNTUxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGNsLCBjdCwgY3IsIGNiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIHRyYW5zZm9ybVRvQXBwbHkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgaW52YWxpZGF0aW9uVHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hpbGQgbmVlZCB0byBkcmF3IGFuIGFuaW1hdGlvbiwgcG90ZW50aWFsbHkgb2Zmc2NyZWVuLCBzbwogICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IGNhbmNlbCBpbnZhbGlkYXRlIHJlcXVlc3RzCkBAIC0xNTMzLDkgKzE1NjgsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSA9PQogICAgICAgICAgICAgICAgIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RyYW5zZm9ybSA9IGdldENoaWxkU3RhdGljVHJhbnNmb3JtYXRpb24oY2hpbGQsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNmb3JtVHlwZSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uLmdldFRyYW5zZm9ybWF0aW9uVHlwZSgpOwpAQCAtMTU0NSw2ICsxNTc3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbmNhdE1hdHJpeCB8PSAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKTsKKwogICAgICAgICAvLyBTZXRzIHRoZSBmbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGFsbG93IGRyYXcoKSBpbXBsZW1lbnRhdGlvbnMKICAgICAgICAgLy8gdG8gY2FsbCBpbnZhbGlkYXRlKCkgc3VjY2Vzc2Z1bGx5IHdoZW4gZG9pbmcgYW5pbWF0aW9ucwogICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IERSQVdOOwpAQCAtMTU1OSwxMiArMTU5Myw5IEBACiAgICAgICAgIGZpbmFsIGludCBzeCA9IGNoaWxkLm1TY3JvbGxYOwogICAgICAgICBmaW5hbCBpbnQgc3kgPSBjaGlsZC5tU2Nyb2xsWTsKIAotICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICBCaXRtYXAgY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgIGlmIChjYWNoaW5nKSB7CiAgICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOb0NhY2hlID0gY2FjaGUgPT0gbnVsbDsKQEAgLTE1ODEsMzYgKzE2MTIsNTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGFscGhhID0gMS4wZjsKKyAgICAgICAgZmxvYXQgYWxwaGEgPSBjaGlsZC5nZXRBbHBoYSgpOwogCi0gICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWSA9IC1zeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVkbyB0aGUgc2Nyb2xsIHRyYW5zbGF0ZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsIHx8IGFscGhhIDwgMS4wZiB8fCAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgaW50IHRyYW5zWCA9IDA7CisgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKKworICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7CisgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbHBoYSA9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uY2F0TWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGlvbiwgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQodHJhbnNmb3JtVG9BcHBseS5nZXRNYXRyaXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHRyYW5zZm9ybUFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1BbHBoYSA8IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgKj0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KGNoaWxkLmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZikgewogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbHBoYSA8IDEuMGYgJiYgaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBtdWx0aXBsaWVkQWxwaGEgPSAoaW50KSAoMjU1ICogYWxwaGEpOwotICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoc3gsIHN5LCBzeCArIGNyIC0gY2wsIHN5ICsgY2IgLSBjdCwgbXVsdGlwbGllZEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IEFMUEhBX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoY2hpbGQubVByaXZhdGVGbGFncyAmIEFMUEhBX1NFVCkgPT0gQUxQSEFfU0VUKSB7CkBAIC0xNjk3LDYgKzE3NDMsNyBAQAogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ3MCw2ICsyNTE3LDE1IEBACiAgICAgICAgICAgICBmaW5hbCBpbnRbXSBsb2NhdGlvbiA9IGF0dGFjaEluZm8ubUludmFsaWRhdGVDaGlsZExvY2F0aW9uOwogICAgICAgICAgICAgbG9jYXRpb25bQ0hJTERfTEVGVF9JTkRFWF0gPSBjaGlsZC5tTGVmdDsKICAgICAgICAgICAgIGxvY2F0aW9uW0NISUxEX1RPUF9JTkRFWF0gPSBjaGlsZC5tVG9wOworICAgICAgICAgICAgTWF0cml4IGNoaWxkTWF0cml4ID0gY2hpbGQuZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBpZiAoIWNoaWxkTWF0cml4LmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgIFJlY3RGIGJvdW5kaW5nUmVjdCA9IGF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICAgICAgYm91bmRpbmdSZWN0LnNldChkaXJ0eSk7CisgICAgICAgICAgICAgICAgY2hpbGRNYXRyaXgubWFwUmVjdChib3VuZGluZ1JlY3QpOworICAgICAgICAgICAgICAgIGRpcnR5LnNldCgoaW50KSBib3VuZGluZ1JlY3QubGVmdCwgKGludCkgYm91bmRpbmdSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QucmlnaHQgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QuYm90dG9tICsgMC41ZikpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQgaXMgZHJhd2luZyBhbiBhbmltYXRpb24sIHdlIHdhbnQgdG8gY29weSB0aGlzIGZsYWcgb250bwogICAgICAgICAgICAgLy8gb3Vyc2VsdmVzIGFuZCB0aGUgcGFyZW50IHRvIG1ha2Ugc3VyZSB0aGUgaW52YWxpZGF0ZSByZXF1ZXN0IGdvZXMKQEAgLTI1MDQsNiArMjU2MCwxOCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5pbnZhbGlkYXRlQ2hpbGRJblBhcmVudChsb2NhdGlvbiwgZGlydHkpOworICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgdHJhbnNmb3JtIG9uIGN1cnJlbnQgcGFyZW50CisgICAgICAgICAgICAgICAgICAgIE1hdHJpeCBtID0gdmlldy5nZXRNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVjdEYgYm91bmRpbmdSZWN0ID0gYXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC5zZXQoZGlydHkpOworICAgICAgICAgICAgICAgICAgICAgICAgbS5tYXBSZWN0KGJvdW5kaW5nUmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoKGludCkgYm91bmRpbmdSZWN0LmxlZnQsIChpbnQpIGJvdW5kaW5nUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QucmlnaHQgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5ib3R0b20gKyAwLjVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODcwLDcgKzI5MzgsNyBAQAogICAgICAqLwogICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJkcmF3aW5nIiwgbWFwcGluZyA9IHsKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9OT19DQUNIRSwgICAgICAgIHRvID0gIk5PTkUiKSwKLSAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTExfQ0FDSEVTLCAgICAgIHRvID0gIkFOSU1BVElPTiIpLAorICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FOSU1BVElPTl9DQUNIRSwgdG8gPSAiQU5JTUFUSU9OIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfU0NST0xMSU5HX0NBQ0hFLCB0byA9ICJTQ1JPTExJTkciKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTExfQ0FDSEVTLCAgICAgIHRvID0gIkFMTCIpCiAgICAgfSkKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKaW5kZXggYjQ1NmM1ZC4uZDdkNGMzZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKQEAgLTE2Miw2ICsxNjIsMjAgQEAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KTsKIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICogPHA+CisgICAgICogSW4gbW9zdCBjYXNlcywgYSBzdWJjbGFzcyBkb2VzIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuIEhvd2V2ZXIsIGlmIHRoZQorICAgICAqIHN1YmNsYXNzIGlzIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSB3aW5kb3cgbWFuYWdlciAoZm9yIGV4YW1wbGUsCisgICAgICoge0BsaW5rIFZpZXdNYW5hZ2VyI2FkZFZpZXcoVmlldywgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMpfSkKKyAgICAgKiB0aGVuIGl0IHNob3VsZCBvdmVycmlkZSB0aGlzIGFuZCBzdGFydCB0aGUgYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWxWaWV3IFRoZSBzb3VyY2UgdmlldyB3aGVyZSB0aGUgYWN0aW9uIG1vZGUgd2FzIGZpcnN0IGludm9rZWQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IHdhcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgcGFyZW50IHdoZW4gYSBjaGlsZCdzIGRyYXdhYmxlIHN0YXRlCiAgICAgICogaGFzIGNoYW5nZWQuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCA3Y2UwNGNmLi44YWJiZjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC01MiwxNSArNTEsMTAgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC4qOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAuKjsKLQogLyoqCiAgKiBUaGUgdG9wIG9mIGEgdmlldyBoaWVyYXJjaHksIGltcGxlbWVudGluZyB0aGUgbmVlZGVkIHByb3RvY29sIGJldHdlZW4gVmlldwogICogYW5kIHRoZSBXaW5kb3dNYW5hZ2VyLiAgVGhpcyBpcyBmb3IgdGhlIG1vc3QgcGFydCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgpAQCAtNjgsMTQgKzYyLDEyIEBACiAgKgogICoge0BoaWRlfQogICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayJ9KQotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsCi0gICAgICAgIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgeworQFN1cHByZXNzV2FybmluZ3MoeyJFbXB0eUNhdGNoQmxvY2siLCAiUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24ifSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBWaWV3Um9vdCBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBWaWV3UGFyZW50LCBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZXdSb290IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19GUFMgPSBmYWxzZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNvbnN0YW50Q29uZGl0aW9uYWxFeHByZXNzaW9uIn0pCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2UgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOwogICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQVcgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTEFZT1VUID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKQEAgLTIwNSwxNCArMTk3LDcgQEAKICAgICBpbnQgbUN1clNjcm9sbFk7CiAgICAgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCi0gICAgRUdMMTAgbUVnbDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBHTDExIG1HTDsKLSAgICBDYW52YXMgbUdsQ2FudmFzOwotICAgIGJvb2xlYW4gbVVzZUdMOwotICAgIGJvb2xlYW4gbUdsV2FudGVkOworICAgIEhhcmR3YXJlUmVuZGVyZXIgbUh3UmVuZGVyZXI7CiAKICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBtVmlld0NvbmZpZ3VyYXRpb247CiAKQEAgLTI0Miw4ICsyMjcsMTAgQEAKICAgICBwdWJsaWMgVmlld1Jvb3QoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKCk7CiAKLSAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSAmJiBsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgeworICAgICAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIEZvciBkZWJ1ZyBvbmx5CkBAIC0zMzEsMTIyICszMTgsMTggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0woKSB7Ci0gICAgICAgIGluaXRpYWxpemVHTElubmVyKCk7Ci0gICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8vIGdpdmUtdXAgb24gdXNpbmcgR0wKLSAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgbUdsV2FudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdMSW5uZXIoKSB7Ci0gICAgICAgIGZpbmFsIEVHTDEwIGVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKLSAgICAgICAgbUVnbCA9IGVnbDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTERpc3BsYXkgZWdsRGlzcGxheSA9IGVnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbERpc3BsYXk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5Ci0gICAgICAgICAqLwotICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKLSAgICAgICAgZWdsLmVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgdmVyc2lvbik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBvcGVuZ2wgc2Vzc2lvbgotICAgICAgICAgKiBhbmQgZ3JhYiB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiB0aGF0IG1hdGNoZXMgaXMKLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIGludFtdIGNvbmZpZ1NwZWMgPSB7Ci0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsICAgIDYsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsICAgIDAsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKLSAgICAgICAgfTsKLSAgICAgICAgZmluYWwgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbMV07Ci0gICAgICAgIGZpbmFsIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGNvbmZpZ1NwZWMsIGNvbmZpZ3MsIDEsIG51bV9jb25maWcpOwotICAgICAgICBmaW5hbCBFR0xDb25maWcgY29uZmlnID0gY29uZmlnc1swXTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gT3BlbkdMIEVTIGNvbnRleHQuIFRoaXMgbXVzdCBiZSBkb25lIG9ubHkgb25jZSwgYW4KLSAgICAgICAgICogT3BlbkdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQsIG51bGwpOwotICAgICAgICBtRWdsQ29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGVnbERpc3BsYXksIGNvbmZpZywgbUhvbGRlciwgbnVsbCk7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gc3VyZmFjZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBCZWZvcmUgd2UgY2FuIGlzc3VlIEdMIGNvbW1hbmRzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQotICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCi0gICAgICAgICAqLwotICAgICAgICBlZ2wuZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBHTCBpbnRlcmZhY2UuCi0gICAgICAgICAqIFRoaXMgaXMgc2ltcGx5IGRvbmUgYnkgY2FzdGluZyB0aGUgR0wgY29udGV4dCB0byBlaXRoZXIKLSAgICAgICAgICogR0wxMCBvciBHTDExLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgR0wxMSBnbCA9IChHTDExKSBjb250ZXh0LmdldEdMKCk7Ci0gICAgICAgIG1HTCA9IGdsOwotICAgICAgICBtR2xDYW52YXMgPSBuZXcgQ2FudmFzKGdsKTsKLSAgICAgICAgbVVzZUdMID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVzdHJveUdMKCkgewotICAgICAgICAvLyBpbmZvcm0gc2tpYSB0aGF0IHRoZSBjb250ZXh0IGlzIGdvbmUKLSAgICAgICAgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7Ci0KLSAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgbUVnbENvbnRleHQgPSBudWxsOwotICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgbUVnbCA9IG51bGw7Ci0gICAgICAgIG1HbENhbnZhcyA9IG51bGw7Ci0gICAgICAgIG1HTCA9IG51bGw7Ci0gICAgICAgIG1Vc2VHTCA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0VnbEVycm9ycygpIHsKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCByZXZlcnQgdG8KLSAgICAgICAgICAgICAgICAvLyBub3JtYWwgcmVuZGVyaW5nLgotICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTEuRUdMX0NPTlRFWFRfTE9TVCkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAotICAgICAgICAgICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBXZSBoYXZlIG9uZSBjaGlsZAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVmlldyB2aWV3LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywKLSAgICAgICAgICAgIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CisgICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLCBWaWV3IHBhbmVsUGFyZW50VmlldykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVZpZXcgPSB2aWV3OwogICAgICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzLmNvcHlGcm9tKGF0dHJzKTsKICAgICAgICAgICAgICAgICBhdHRycyA9IG1XaW5kb3dBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKGF0dHJzKTsKKwogICAgICAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgUm9vdFZpZXdTdXJmYWNlVGFrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXJDYWxsYmFjayA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSb290Vmlld1N1cmZhY2VUYWtlcil2aWV3KS53aWxsWW91VGFrZVRoZVN1cmZhY2UoKTsKQEAgLTU3Niw2ICs0NTksMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvbihXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycykgeworICAgICAgICAvLyBPbmx5IGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaWYgd2UgYXJlIG5vdCBpbiB0aGUgc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIGNyZWF0ZXMgVmlld1Jvb3RzIHRvIGRpc3BsYXkgYW5pbWF0ZWQgcHJldmlldyB3aW5kb3dzCisgICAgICAgIC8vIG9mIGxhdW5jaGluZyBhcHBzIGFuZCB3ZSBkb24ndCB3YW50IHRob3NlIHRvIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkCisgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgIT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChhdHRycyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChhdHRycy5mbGFncyAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zbHVjZW50ID0gYXR0cnMuZm9ybWF0ICE9IFBpeGVsRm9ybWF0Lk9QQVFVRTsKKyAgICAgICAgICAgICAgICBtSHdSZW5kZXJlciA9IEhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlR2xSZW5kZXJlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KCkgewogICAgICAgICByZXR1cm4gbVZpZXc7CiAgICAgfQpAQCAtNzMyLDggKzYyOSw2IEBACiAgICAgICAgIGJvb2xlYW4gdmlld1Zpc2liaWxpdHlDaGFuZ2VkID0gbVZpZXdWaXNpYmlsaXR5ICE9IHZpZXdWaXNpYmlsaXR5CiAgICAgICAgICAgICAgICAgfHwgbU5ld1N1cmZhY2VOZWVkZWQ7CiAKLSAgICAgICAgZmxvYXQgYXBwU2NhbGUgPSBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZTsKLQogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBudWxsOwogICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKSB7CiAgICAgICAgICAgICBtV2luZG93QXR0cmlidXRlc0NoYW5nZWQgPSBmYWxzZTsKQEAgLTc4MSw4ICs2NzYsOCBAQAogICAgICAgICAgICAgYXR0YWNoSW5mby5tV2luZG93VmlzaWJpbGl0eSA9IHZpZXdWaXNpYmlsaXR5OwogICAgICAgICAgICAgaG9zdC5kaXNwYXRjaFdpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpZXdWaXNpYmlsaXR5KTsKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgfHwgbU5ld1N1cmZhY2VOZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOworICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5HT05FKSB7CkBAIC04OTgsMTAgKzc5MywxMiBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZXNJbnRlcm5hbEluc2V0cyA9CiAgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tVHJlZU9ic2VydmVyLmhhc0NvbXB1dGVJbnRlcm5hbEluc2V0c0xpc3RlbmVycygpOworCiAgICAgICAgIGJvb2xlYW4gaW5zZXRzUGVuZGluZyA9IGZhbHNlOwogICAgICAgICBpbnQgcmVsYXlvdXRSZXN1bHQgPSAwOwotICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CisKKyAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgewogCiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5WSVNJQkxFKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3aW5kb3cgaXMgZ2l2aW5nIGludGVybmFsIGluc2V0cyB0byB0aGUgd2luZG93CkBAIC05MTMsMjYgKzgxMCwxOSBAQAogICAgICAgICAgICAgICAgIC8vIHdpbmRvdywgd2FpdGluZyB1bnRpbCB3ZSBjYW4gZmluaXNoIGxheWluZyBvdXQgdGhpcyB3aW5kb3cKICAgICAgICAgICAgICAgICAvLyBhbmQgZ2V0IGJhY2sgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyIHdpdGggdGhlIHVsdGltYXRlbHkKICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBpbnNldHMuCi0gICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlcy5tZW1vcnlUeXBlID09IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1XaW5kb3dBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluc2V0c1BlbmRpbmcgPSBjb21wdXRlc0ludGVybmFsSW5zZXRzICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdXJmYWNlSG9sZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlci5tU3VyZmFjZUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIG1EcmF3aW5nQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgYm9vbGVhbiBod0ludGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gY29udGVudEluc2V0c0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZUluc2V0c0NoYW5nZWQ7CiAgICAgICAgICAgICBib29sZWFuIGhhZFN1cmZhY2UgPSBtU3VyZmFjZS5pc1ZhbGlkKCk7CisKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IGZsID0gMDsKICAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKQEAgLTk5Miw5ICs4ODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFuc3BhcmVudFJlZ2lvbi5zZXRFbXB0eSgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkICYmICFtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplR0woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCA9IG1HbENhbnZhcyAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBod0ludGlhbGl6ZWQgPSBtSHdSZW5kZXJlci5pbml0aWFsaXplKG1Ib2xkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVN1cmZhY2UuaXNWYWxpZCgpKSB7CkBAIC0xMDcyLDkgKzk2MSw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBtR2xDYW52YXMuc2V0Vmlld3BvcnQoKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOworICAgICAgICAgICAgaWYgKGh3SW50aWFsaXplZCkgeworICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLnNldHVwKG1XaWR0aCwgbUhlaWdodCwgbUF0dGFjaEluZm8pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGZvY3VzQ2hhbmdlZER1ZVRvVG91Y2hNb2RlID0gZW5zdXJlVG91Y2hNb2RlTG9jYWxseSgKQEAgLTEzNDcsNyArMTIzNSw4IEBACiAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgICAgIHNGaXJzdERyYXdDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcG9zdChzRmlyc3REcmF3SGFuZGxlcnMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzgxLDUzICsxMjcwLDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChtVXNlR0wpIHsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwgJiYgbUh3UmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1HbENhbnZhczsKLSAgICAgICAgICAgICAgICBpZiAobUdMICE9IG51bGwgJiYgY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlQ2FudmFzKGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCB5b2ZmKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgewogICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE3MzksOCArMTU5MSw2IEBACiAgICAgfQogCiAgICAgdm9pZCBkaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICJEZXRhY2hpbmcgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7Ci0KICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgICAgIH0KQEAgLTE3NDksOCArMTU5OSw4IEBACiAgICAgICAgIG1BdHRhY2hJbmZvLm1Sb290VmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1TdXJmYWNlID0gbnVsbDsKIAotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBkZXN0cm95R0woKTsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koKTsKICAgICAgICAgfQogICAgICAgICBtU3VyZmFjZS5yZWxlYXNlKCk7CiAKQEAgLTE5MzQsMTggKzE3ODQsOCBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluVG91Y2hNb2RlID0gbXNnLmFyZzIgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlTG9jYWxseShpblRvdWNoTW9kZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbENhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmluaXRpYWxpemVJZk5lZWRlZChtV2lkdGgsIG1IZWlnaHQsIG1BdHRhY2hJbmZvLCBtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTk5NSw4ICsxODM1LDcgQEAKICAgICAgICAgICAgIGlmICgoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIElNRSBpcyB0cnlpbmcgdG8gc2F5IHRoaXMgZXZlbnQgaXMgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0hICBCYWQgYmFkIGJhZCEKLSAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZ3MoKSZ+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwgZXZlbnQuZ2V0RmxhZ3MoKSAmIH5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeSgoS2V5RXZlbnQpbXNnLm9iaiwgZmFsc2UpOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjQ3OSw4ICsyMzE4LDcgQEAKICAgICBwcml2YXRlIHZvaWQgZGVsaXZlcktleUV2ZW50KEtleUV2ZW50IGV2ZW50LCBib29sZWFuIHNlbmREb25lKSB7CiAgICAgICAgIC8vIElmIG1WaWV3IGlzIG51bGwsIHdlIGp1c3QgY29uc3VtZSB0aGUga2V5IGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndAogICAgICAgICAvLyBtYWtlIHNlbnNlIHRvIGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCkgOiB0cnVlOworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyA9PSBudWxsIHx8IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpOwogICAgICAgICBpZiAoaGFuZGxlZCkgewogICAgICAgICAgICAgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KApAQCAtMjUxNCw3ICsyMzUyLDYgQEAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VuZERvbmUgPSBzZXEgPj0gMDsKICAgICAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeShldmVudCwgc2VuZERvbmUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoCiAgICAgICAgICAgICAgICAgICAgICAgICBUQUcsICJUZWxsaW5nIHdpbmRvdyBtYW5hZ2VyIGtleSBpcyBmaW5pc2hlZCIpOwpAQCAtMjcxNSw3ICsyNTUyLDcgQEAKIAogICAgIHZvaWQgZG9EaWUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOworICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWRkZWQgJiYgIW1GaXJzdCkgewogICAgICAgICAgICAgICAgIGludCB2aWV3VmlzaWJpbGl0eSA9IG1WaWV3LmdldFZpc2liaWxpdHkoKTsKQEAgLTI3OTIsMTMgKzI2MjksMTIgQEAKICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKICAgICAgICAgICAgIGlmIChmYWxzZSAmJiBldmVudC5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuS0VZQ09ERV9DQU1FUkEpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKwogICAgICAgICAgICAgICAgIGRlYnVnKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODgwLDYgKzI3MTYsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKICAgICB9CiAKQEAgLTMzODAsOCArMzIyMCw0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2hvd0ZQUyhDYW52YXMgY2FudmFzLCBpbnQgZHVyYXRpb25NaWxsaXMpOwotCi0gICAgLy8gaW5mb3JtIHNraWEgdG8ganVzdCBhYmFuZG9uIGl0cyB0ZXh0dXJlIGNhY2hlIElEcwotICAgIC8vIGRvZXNuJ3QgY2FsbCBnbERlbGV0ZVRleHR1cmVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQppbmRleCAxMWMwOWMxLi5mMzJmZjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKQEAgLTU2LDExICs1NiwyMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQ09OVEVYVF9NRU5VID0gNjsKICAgICAvKiogRmxhZyBmb3IgY3VzdG9tIHRpdGxlLiBZb3UgY2Fubm90IGNvbWJpbmUgdGhpcyBmZWF0dXJlIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DVVNUT01fVElUTEUgPSA3OwotICAgIC8qKiBGbGFnIGZvciBhc2tpbmcgZm9yIGFuIE9wZW5HTCBlbmFibGVkIHdpbmRvdy4KLSAgICAgICAgQWxsIDJEIGdyYXBoaWNzIHdpbGwgYmUgaGFuZGxlZCBieSBPcGVuR0wgRVMuCi0gICAgICAgIEBoaWRlCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX09QRU5HTCA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZW5hYmxpbmcgdGhlIEFjdGlvbiBCYXIuCisgICAgICogVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIHNvbWUgZGV2aWNlcy4gVGhlIEFjdGlvbiBCYXIKKyAgICAgKiByZXBsYWNlcyB0aGUgdGl0bGUgYmFyIGFuZCBwcm92aWRlcyBhbiBhbHRlcm5hdGUgbG9jYXRpb24KKyAgICAgKiBmb3IgYW4gb24tc2NyZWVuIG1lbnUgYnV0dG9uIG9uIHNvbWUgZGV2aWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVIgPSA4OworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHNwZWNpZnlpbmcgdGhlIGJlaGF2aW9yIG9mIGFjdGlvbiBtb2RlcyB3aGVuIGFuIEFjdGlvbiBCYXIgaXMgbm90IHByZXNlbnQuCisgICAgICogSWYgb3ZlcmxheSBpcyBlbmFibGVkLCB0aGUgYWN0aW9uIG1vZGUgVUkgd2lsbCBiZSBhbGxvd2VkIHRvIGNvdmVyIGV4aXN0aW5nIHdpbmRvdyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSA9IDk7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyB0aGlzIHdpbmRvdyB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwgaWYgcG9zc2libGUuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAxMDsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBWSVNJQkxFICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PTiA9IC0xOwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIEdPTkUgKi8KQEAgLTI5Miw2ICszMDMsMTQgQEAKICAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZCgpIAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gb25TZWFyY2hSZXF1ZXN0ZWQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRvIGNvbnRyb2wgdGhlIGxpZmVjeWNsZSBvZiB0aGlzIGFjdGlvbiBtb2RlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEFjdGlvbk1vZGUgdGhhdCB3YXMgc3RhcnRlZCwgb3IgbnVsbCBpZiBpdCB3YXMgY2FuY2VsZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spOwogICAgIH0KIAogICAgIHB1YmxpYyBXaW5kb3coQ29udGV4dCBjb250ZXh0KSB7CkBAIC0zNjAsMjEgKzM3OSwzNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHdtIFRoZSBWaWV3TWFuYWdlciBmb3IgYWRkaW5nIG5ldyB3aW5kb3dzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwKLSAgICAgICAgICAgIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lKSB7CisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgICAgICBzZXRXaW5kb3dNYW5hZ2VyKHdtLCBhcHBUb2tlbiwgYXBwTmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCisgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQorICAgICAqIFdpbmRvdyBpdHNlbGYgLS0gdGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgIG1BcHBUb2tlbiA9IGFwcFRva2VuOwogICAgICAgICBtQXBwTmFtZSA9IGFwcE5hbWU7CiAgICAgICAgIGlmICh3bSA9PSBudWxsKSB7CiAgICAgICAgICAgICB3bSA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKTsKICAgICAgICAgfQotICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20pOworICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20sIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxXaW5kb3dNYW5hZ2VyIGltcGxlbWVudHMgV2luZG93TWFuYWdlciB7Ci0gICAgICAgIExvY2FsV2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtKSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFyZHdhcmVBY2NlbGVyYXRlZDsKKworICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlciA9IHdtOwogICAgICAgICAgICAgbURlZmF1bHREaXNwbGF5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGVmYXVsdERpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkpOworICAgICAgICAgICAgbUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBoYXJkd2FyZUFjY2VsZXJhdGVkOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CkBAIC00MjEsNiArNDU0LDkgQEAKICAgICAgICAgICAgIGlmICh3cC5wYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd3AucGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYXJkd2FyZUFjY2VsZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgd3AuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgfQogCkBAIC04MTcsNiArODUzLDggQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRvZ2dsZVBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCk7CisgICAgCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybVBhbmVsU2hvcnRjdXQoaW50IGZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBldmVudCwKQEAgLTk5Niw2ICsxMDM0LDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gbUZlYXR1cmVzOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSBJRCB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShpbnQgZmVhdHVyZSkgeworICAgICAgICByZXR1cm4gKGdldEZlYXR1cmVzKCkgJiAoMSA8PCBmZWF0dXJlKSkgIT0gMDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGZlYXR1cmUgYml0cyB0aGF0IGFyZSBiZWluZyBpbXBsZW1lbnRlZCBieSB0aGlzIFdpbmRvdy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggZWViYmM5My4uYzE0N2I3NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTcyLDYgKzcyLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNMRUZUfSBvciB7QGxpbmsgR3Jhdml0eSNSSUdIVH0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB4OwogICAgICAgICAKICAgICAgICAgLyoqCkBAIC03OSw2ICs4MCw3IEBACiAgICAgICAgICAqIFdoZW4gdXNpbmcge0BsaW5rIEdyYXZpdHkjVE9QfSBvciB7QGxpbmsgR3Jhdml0eSNCT1RUT019IGl0IHByb3ZpZGVzCiAgICAgICAgICAqIGFuIG9mZnNldCBmcm9tIHRoZSBnaXZlbiBlZGdlLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBpbnQgeTsKIAogICAgICAgICAvKioKQEAgLTg3LDYgKzg5LDcgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IGhvcml6b250YWxXZWlnaHQ7CiAKICAgICAgICAgLyoqCkBAIC05NSw4ICs5OCw5IEBACiAgICAgICAgICAqIHNob3VsZCBub3QgYmUgc3RyZXRjaGVkLiBPdGhlcndpc2UgdGhlIGV4dHJhIHBpeGVscyB3aWxsIGJlIHByby1yYXRlZAogICAgICAgICAgKiBhbW9uZyBhbGwgdmlld3Mgd2hvc2Ugd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiAwLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBmbG9hdCB2ZXJ0aWNhbFdlaWdodDsKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBnZW5lcmFsIHR5cGUgb2Ygd2luZG93LiAgVGhlcmUgYXJlIHRocmVlIG1haW4gY2xhc3NlcyBvZgogICAgICAgICAgKiB3aW5kb3cgdHlwZXM6CkBAIC0zODksNiArMzkzLDcgQEAKICAgICAgICAgICogQHNlZSAjRkxBR19GVUxMU0NSRUVOCiAgICAgICAgICAqIEBzZWUgI0ZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUworICAgICAgICAgKiBAc2VlICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVECiAgICAgICAgICAqLwogICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoZmxhZ01hcHBpbmcgPSB7CiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19CTFVSX0JFSElORCwgZXF1YWxzID0gRkxBR19CTFVSX0JFSElORCwKQEAgLTQyMCw3ICs0MjUsOSBAQAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sCiAgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sIG5hbWUgPSAiRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiIpLAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsCi0gICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsIG5hbWUgPSAiRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIpCiAgICAgICAgIH0pCiAgICAgICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAgICAgICAgIApAQCAtNjAzLDYgKzYxMCwxMiBAQAogICAgICAgICAgKiBpdCBpcyBjcmVhdGVkLgogICAgICAgICAgKiB7QGhpZGV9ICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1lTVEVNX0VSUk9SID0gMHg0MDAwMDAwMDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICAgICAqIFJlcXVlc3RpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSBpdCB3aWxsIGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDgwMDAwMDAwOyAgICAgICAgCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdpdmVuIGEgcGFydGljdWxhciBzZXQgb2Ygd2luZG93IG1hbmFnZXIgZmxhZ3MsIGRldGVybWluZSB3aGV0aGVyCkBAIC0xMDc1LDYgKzEwODgsNyBAQAogICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uID0gby5zY3JlZW5PcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IFNDUkVFTl9PUklFTlRBVElPTl9DSEFOR0VEOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhCmluZGV4IGMyMmY5OTEuLmZjNjE3MDAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEKQEAgLTYyMiw2ICs2MjIsNyBAQAogICAgICAgICBtUGFja2FnZU5hbWUgPSBudWxsOwogICAgICAgICBtQ29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgbUJlZm9yZVRleHQgPSBudWxsOworICAgICAgICBtUGFyY2VsYWJsZURhdGEgPSBudWxsOwogICAgICAgICBtVGV4dC5jbGVhcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQppbmRleCAwMTg2MjcwLi5mNDA2ZGE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQpAQCAtOTQsNyArOTQsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlU3luYykgewogICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQsIHNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CkBAIC0xMDQsMTMgKzEwNiwxNiBAQAogICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEge0BsaW5rIENvbnRleHR9LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIEFuIGludGVyZmFjZSB0byB0aGUgYmFja2luZyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlKSB7CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihjb250ZXh0LmdldE1haW5Mb29wZXIoKSk7Ci0gICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBpcyBkZWFkIiwgcmUpOwogICAgICAgICB9CkBAIC0xMjgsNiArMTMzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xpZW50IGludGVyZmFjZSB0aGlzIGluc3RhbmNlIHJlZ2lzdGVycyBpbgorICAgICAqIHRoZSBjZW50cmFsaXplZCBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICAgcmV0dXJuIChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpIG1DbGllbnQuYXNCaW5kZXIoKTsgCisgICAgfQorCisgICAgLyoqCiAgICAgICogU2VuZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uIElmIHRoaXMge0BsaW5rIEFjY2Vzc2liaWxpdHlNYW5hZ2VyfSBpcyBub3QKICAgICAgKiBlbmFibGVkIHRoZSBjYWxsIGlzIGEgTk9PUC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCmluZGV4IDMyNzg4YmUuLjc2MzM1NjlkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCkBAIC0yOSw3ICsyOSw3IEBACiAgKi8KIGludGVyZmFjZSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgewogCi0gICAgdm9pZCBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCk7CisgICAgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCk7CiAKICAgICBib29sZWFuIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoaW4gQWNjZXNzaWJpbGl0eUV2ZW50IHVpRXZlbnQpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhCmluZGV4IDM0OWI3ZTUuLmYzMzkyZDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhCkBAIC0xNzQsNyArMTc0LDEzIEBACiAgICAgICogRGVzaXJlZCBaIG9yZGVyIG1vZGUgZHVyaW5nIGFuaW1hdGlvbi4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBtWkFkanVzdG1lbnQ7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBzY2FsZWZhY3RvciB0byBhcHBseSB0byBwaXZvdCBwb2ludHMsIGV0Yy4gZHVyaW5nIGFuaW1hdGlvbi4gU3ViY2xhc3NlcyByZXRyaWV2ZSB0aGUKKyAgICAgKiB2YWx1ZSB2aWEgZ2V0U2NhbGVGYWN0b3IoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZUZhY3RvciA9IDFmOworCiAgICAgLyoqCiAgICAgICogRG9uJ3QgYW5pbWF0ZSB0aGUgd2FsbHBhcGVyLgogICAgICAqLwpAQCAtNTUzLDYgKzU1OSwxOSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9yIGlzIHNldCBieSB0aGUgY2FsbCB0byA8Y29kZT5nZXRUcmFuc2Zvcm1hdGlvbjwvY29kZT4uIE92ZXJyaWRlcyBvZiAKKyAgICAgKiB7QGxpbmsgI2dldFRyYW5zZm9ybWF0aW9uKGxvbmcsIFRyYW5zZm9ybWF0aW9uLCBmbG9hdCl9IHdpbGwgZ2V0IHRoaXMgdmFsdWUKKyAgICAgKiBkaXJlY3RseS4gT3ZlcnJpZGVzIG9mIHtAbGluayAjYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCwgVHJhbnNmb3JtYXRpb24pfSBjYW4KKyAgICAgKiBjYWxsIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgdmFsdWUuCisgICAgICogCisgICAgICogQHJldHVybiBmbG9hdCBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gcHJlLXNjYWxlZCB2YWx1ZXMgaW4KKyAgICAgKiBhbiBBbmltYXRpb24gc3VjaCBhcyB0aGUgcGl2b3QgcG9pbnRzIGluIHtAbGluayBTY2FsZUFuaW1hdGlvbn0gYW5kIHtAbGluayBSb3RhdGVBbmltYXRpb259LgorICAgICAqLworICAgIHByb3RlY3RlZCBmbG9hdCBnZXRTY2FsZUZhY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZUZhY3RvcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJZiBkZXRhY2hXYWxscGFwZXIgaXMgdHJ1ZSwgYW5kIHRoaXMgaXMgYSB3aW5kb3cgYW5pbWF0aW9uIG9mIGEgd2luZG93CiAgICAgICogdGhhdCBoYXMgYSB3YWxscGFwZXIgYmFja2dyb3VuZCwgdGhlbiB0aGUgd2luZG93IHdpbGwgYmUgZGV0YWNoZWQgZnJvbQogICAgICAqIHRoZSB3YWxscGFwZXIgd2hpbGUgaXQgcnVucy4gIFRoYXQgaXMsIHRoZSBhbmltYXRpb24gd2lsbCBvbmx5IGJlIGFwcGxpZWQKQEAgLTczNSw2ICs3NTQsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbihsb25nIGN1cnJlbnRUaW1lLCBUcmFuc2Zvcm1hdGlvbiBvdXRUcmFuc2Zvcm1hdGlvbikgeworCiAgICAgICAgIGlmIChtU3RhcnRUaW1lID09IC0xKSB7CiAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWU7CiAgICAgICAgIH0KQEAgLTgwNiw2ICs4MjYsMjQgQEAKIAogICAgICAgICByZXR1cm4gbU1vcmU7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGFwcGx5IGF0IGEgc3BlY2lmaWVkIHBvaW50IGluIHRpbWUuIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzCisgICAgICogbWV0aG9kIHNob3VsZCBhbHdheXMgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIFRyYW5zZm9ybWF0aW9uIG9yIGRvY3VtZW50IHRoZXkgYXJlIGRvaW5nCisgICAgICogb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFdoZXJlIHdlIGFyZSBpbiB0aGUgYW5pbWF0aW9uLiBUaGlzIGlzIHdhbGwgY2xvY2sgdGltZS4KKyAgICAgKiBAcGFyYW0gb3V0VHJhbnNmb3JtYXRpb24gQSB0cmFuZm9ybWF0aW9uIG9iamVjdCB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgICAqICAgICAgICBjYWxsZXIgYW5kIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBhbmltYXRpb24uCisgICAgICogQHBhcmFtIHNjYWxlIFNjYWxpbmcgZmFjdG9yIHRvIGFwcGx5IHRvIGFueSBpbnB1dHMgdG8gdGhlIHRyYW5zZm9ybSBvcGVyYXRpb24sIHN1Y2gKKyAgICAgKiAgICAgICAgcGl2b3QgcG9pbnRzIGJlaW5nIHJvdGF0ZWQgb3Igc2NhbGVkIGFyb3VuZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBpcyBzdGlsbCBydW5uaW5nCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24obG9uZyBjdXJyZW50VGltZSwgVHJhbnNmb3JtYXRpb24gb3V0VHJhbnNmb3JtYXRpb24sCisgICAgICAgICAgICBmbG9hdCBzY2FsZSkgeworICAgICAgICBtU2NhbGVGYWN0b3IgPSBzY2FsZTsKKyAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCBvdXRUcmFuc2Zvcm1hdGlvbik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+SW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhbmltYXRpb24gaGFzIHN0YXJ0ZWQgb3Igbm90LjwvcD4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEKaW5kZXggMTU0NmRjZC4uODczY2U1MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEKQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgZmluYWwgQW5pbWF0aW9uIGEgPSBhbmltYXRpb25zLmdldChpKTsKIAogICAgICAgICAgICAgdGVtcC5jbGVhcigpOwotICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIHRlbXApIHx8IG1vcmU7CisgICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgdGVtcCwgZ2V0U2NhbGVGYWN0b3IoKSkgfHwgbW9yZTsKICAgICAgICAgICAgIHQuY29tcG9zZSh0ZW1wKTsKIAogICAgICAgICAgICAgc3RhcnRlZCA9IHN0YXJ0ZWQgfHwgYS5oYXNTdGFydGVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQppbmRleCAzMDg4MzgyLi44ZTRjZjY3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKQEAgLTE2LDYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFuaW1hdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5TZXF1ZW5jZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIApAQCAtMjcsMTIgKzMzLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCiAgKiBEZWZpbmVzIGNvbW1vbiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBhbmltYXRpb25zLgogICoKICAqLwogcHVibGljIGNsYXNzIEFuaW1hdGlvblV0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBTZXF1ZW5jZXIgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs2NCw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtNzcsMTcgKzkyLDUzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcworICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZAorICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gd2hlbiB0aGUgYW5pbWF0aW9uIGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFuaW1hdGFibGUgbG9hZEFuaW1hdG9yKENvbnRleHQgY29udGV4dCwgaW50IGlkKQorICAgICAgICAgICAgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRBbmltYXRpb24oaWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGFibGVGcm9tWG1sKGNvbnRleHQsIHBhcnNlcik7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIE5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBhbmltYXRpb24gcmVzb3VyY2UgSUQgIzB4IiArCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTm90Rm91bmRFeGNlcHRpb24gcm5mID0gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0YWJsZSBjcmVhdGVBbmltYXRhYmxlRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoYywgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwgbnVsbCwgMCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlcikKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxNTEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxNzEsNjcgQEAKICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQW5pbWF0aW9uKGFuaW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgCisKKyAgICAgICAgcmV0dXJuIGFuaW07CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRhYmxlIGNyZWF0ZUFuaW1hdGFibGVGcm9tWG1sKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsCisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMsIFNlcXVlbmNlciBwYXJlbnQsIGludCBzZXF1ZW5jZU9yZGVyaW5nKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBBbmltYXRhYmxlIGFuaW0gPSBudWxsOworICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZT4gY2hpbGRBbmltcyA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyAgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygicHJvcGVydHkiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBuZXcgUHJvcGVydHlBbmltYXRvcihjLCBhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJhbmltYXRvciIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRvcihjLCBhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzZXF1ZW5jZXIiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gYy5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU2VxdWVuY2VyKTsKKyAgICAgICAgICAgICAgICBpbnQgb3JkZXJpbmcgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TZXF1ZW5jZXJfb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUT0dFVEhFUik7CisgICAgICAgICAgICAgICAgY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoYywgcGFyc2VyLCBhdHRycywgKFNlcXVlbmNlcikgYW5pbSwgIG9yZGVyaW5nKTsKKyAgICAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gYW5pbWF0b3IgbmFtZTogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRBbmltcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdGFibGU+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBjaGlsZEFuaW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFuaW1hdGFibGVbXSBhbmltc0FycmF5ID0gbmV3IEFuaW1hdGFibGVbY2hpbGRBbmltcy5zaXplKCldOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZSBhIDogY2hpbGRBbmltcykgeworICAgICAgICAgICAgICAgIGFuaW1zQXJyYXlbaW5kZXgrK10gPSBhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcXVlbmNlT3JkZXJpbmcgPT0gVE9HRVRIRVIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQucGxheVRvZ2V0aGVyKGFuaW1zQXJyYXkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQucGxheVNlcXVlbnRpYWxseShhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBhbmltOwogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQppbmRleCAyODRjY2NlLi41OGJmMDg0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQpAQCAtMTQ4LDExICsxNDgsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgZGVncmVlcyA9IG1Gcm9tRGVncmVlcyArICgobVRvRGVncmVlcyAtIG1Gcm9tRGVncmVlcykgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLQorICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CisgICAgICAgIAogICAgICAgICBpZiAobVBpdm90WCA9PSAwLjBmICYmIG1QaXZvdFkgPT0gMC4wZikgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMsIG1QaXZvdFggKiBzY2FsZSwgbVBpdm90WSAqIHNjYWxlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKaW5kZXggMWE1NmM4Yi4uODUzN2Q0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCkBAIC0xNjEsNiArMTYxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgc3ggPSAxLjBmOwogICAgICAgICBmbG9hdCBzeSA9IDEuMGY7CisgICAgICAgIGZsb2F0IHNjYWxlID0gZ2V0U2NhbGVGYWN0b3IoKTsKIAogICAgICAgICBpZiAobUZyb21YICE9IDEuMGYgfHwgbVRvWCAhPSAxLjBmKSB7CiAgICAgICAgICAgICBzeCA9IG1Gcm9tWCArICgobVRvWCAtIG1Gcm9tWCkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKQEAgLTE3Miw3ICsxNzMsNyBAQAogICAgICAgICBpZiAobVBpdm90WCA9PSAwICYmIG1QaXZvdFkgPT0gMCkgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3kpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIHNjYWxlICogbVBpdm90WCwgc2NhbGUgKiBtUGl2b3RZKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKworICAgIC8vIEhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIFZ3ZWJWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBhcyBhIHByb29mIG9mIGNvbmNlcHQgbGV0IHVzIGRvIHRoZSBzaW1wbGVzdCBleGFtcGxlCisKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTjoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJmb3J3YXJkIiwgInNlbnRlbmNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfUDoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJiYWNrd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgLy8gcHV0IHRoZSBzZWxlY3Rpb24gc3RyaW5nIGluIGFuIEFjY2Vzc2liaWxpdHlFdmVudCBhbmQgc2VuZCBpdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCk7CisgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgbVdlYlZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb2RpZnlTZWxlY3Rpb24oU3RyaW5nIGFsdGVyLCBTdHJpbmcgZGlyZWN0aW9uLCBTdHJpbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworCisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXZWJWaWV3Q29yZS5Nb2RpZnlTZWxlY3Rpb25EYXRhIGRhdGEgPSBuZXcgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSgpOworICAgICAgICBkYXRhLm1BbHRlciA9IGFsdGVyOworICAgICAgICBkYXRhLm1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGRhdGEubUdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRhdGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCAyMTlhNDY5Li5iMDIxZGVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC03Miw2ICs3Miw4IEBACiAgICAgLy8gcXVldWUgaGFzIGJlZW4gY2xlYXJlZCx0aGV5IGFyZSBpZ25vcmVkLgogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tNZXNzYWdlcyA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNEYXRhRGlyZWN0b3J5ID0gIiI7CisKICAgICAvLyBJcyB0aGlzIGZyYW1lIHRoZSBtYWluIGZyYW1lPwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNYWluRnJhbWU7CiAKQEAgLTIyNCw2ICsyMjYsMTEgQEAKICAgICAgICAgQXNzZXRNYW5hZ2VyIGFtID0gY29udGV4dC5nZXRBc3NldHMoKTsKICAgICAgICAgbmF0aXZlQ3JlYXRlRnJhbWUodywgYW0sIHByb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpKTsKIAorICAgICAgICBpZiAoc0RhdGFEaXJlY3RvcnkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgU3RyaW5nIGRpciA9IGFwcENvbnRleHQuZ2V0RmlsZXNEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIHNEYXRhRGlyZWN0b3J5ID0gIGRpci5zdWJzdHJpbmcoMCwgZGlyLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICB9CisKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuQlJPV1NFUl9GUkFNRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQnJvd3NlckZyYW1lIGNvbnN0cnVjdG9yOiB0aGlzPSIgKyB0aGlzKTsKICAgICAgICAgfQpAQCAtMjk0LDYgKzMwMSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gYXV0b25hbWUgSWYgZmFsc2UsIHRha2VzIGZpbGVuYW1lIHRvIGJlIGEgZmlsZS4gSWYgdHJ1ZSwgZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSBpbiB3aGljaCBhIGZpbGVuYW1lIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgdXJsIG9mIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVTYXZlV2ViQXJjaGl2ZShiYXNlbmFtZSwgYXV0b25hbWUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdvIGJhY2sgb3IgZm9yd2FyZCB0aGUgbnVtYmVyIG9mIHN0ZXBzIGdpdmVuLgogICAgICAqIEBwYXJhbSBzdGVwcyBBIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24KICAgICAgKiAgICAgICAgICAgICAgYW5kIG51bWJlciBvZiBzdGVwcyB0byBtb3ZlLgpAQCAtNTEwLDEyICs1MjksMjEgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZXh0ZXJuYWxSZXByZXNlbnRhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2aXN1YWwgdGV4dCBvZiB0aGUgY3VycmVudCBmcmFtZSwgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgorICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGZyYW1lcywgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgogICAgICAqIHRoZSBtZXNzYWdlIGFuZCBzZW5kcyB0aGUgbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIG1lc3NhZ2UgdG8gdXNlIHRvIHNlbmQgdGhlIHZpc3VhbCB0ZXh0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9jdW1lbnRBc1RleHQoTWVzc2FnZSBjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjay5vYmogPSBkb2N1bWVudEFzVGV4dCgpOzsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmFyZzEgIT0gMCkgeworICAgICAgICAgICAgLy8gRHVtcCB0b3AgZnJhbWUgYXMgdGV4dC4KKyAgICAgICAgICAgIHRleHQuYXBwZW5kKGRvY3VtZW50QXNUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcyICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgY2hpbGQgZnJhbWVzIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChjaGlsZEZyYW1lc0FzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjay5vYmogPSB0ZXh0LnRvU3RyaW5nKCk7CiAgICAgICAgIGNhbGxiYWNrLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIApAQCAtNTI0LDYgKzU1MiwxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBkb2N1bWVudEFzVGV4dCgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXh0IGRyYXduIG9uIHRoZSBjaGlsZCBmcmFtZXMgYXMgYSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgY2hpbGRGcmFtZXNBc1RleHQoKTsKKwogICAgIC8qCiAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYkNvcmUgdG8gaW5mb3JtIHRoZSBmcmFtZSB0aGF0CiAgICAgICogdGhlIEphdmFzY3JpcHQgd2luZG93IG9iamVjdCBoYXMgYmVlbiBjbGVhcmVkLgpAQCAtNjE3LDYgKzY1MCwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBKTkkuIEdldHMgdGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSBhcHBsaWNhdGlvbnMgZGF0YSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YURpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHNEYXRhRGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgogICAgICAqIFN0YXJ0IGxvYWRpbmcgYSByZXNvdXJjZS4KICAgICAgKiBAcGFyYW0gbG9hZGVySGFuZGxlIFRoZSBuYXRpdmUgUmVzb3VyY2VMb2FkZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZGF0YS4KQEAgLTc4NSwxMSArODI2LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBCcm93c2VyRnJhbWUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgbmV3IFdlYlZpZXcuCiAgICAgICovCiAgICAgcHJpdmF0ZSBCcm93c2VyRnJhbWUgY3JlYXRlV2luZG93KGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlKSB7Ci0gICAgICAgIFdlYlZpZXcgdyA9IG1DYWxsYmFja1Byb3h5LmNyZWF0ZVdpbmRvdyhkaWFsb2csIHVzZXJHZXN0dXJlKTsKLSAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHcuZ2V0V2ViVmlld0NvcmUoKS5nZXRCcm93c2VyRnJhbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFja1Byb3h5LmNyZWF0ZVdpbmRvdyhkaWFsb2csIHVzZXJHZXN0dXJlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0Niw2ICs4ODMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1VQTE9BRF9MQUJFTCA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU0VUX0xBQkVMID0gNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCTUlUX0xBQkVMID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU4gPSA3OwogCiAgICAgU3RyaW5nIGdldFJhd1Jlc0ZpbGVuYW1lKGludCBpZCkgewogICAgICAgICBpbnQgcmVzaWQ7CkBAIC04NzUsNiArOTEzLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnN1Ym1pdCk7CiAKKyAgICAgICAgICAgIGNhc2UgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX2ZpbGVfY2hvc2VuKTsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJnZXRSYXdSZXNGaWxlbmFtZSBnb3QgaW5jb21wYXRpYmxlIHJlc291cmNlIElEIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwpAQCAtMTAxMCw1ICsxMDUyLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBIYXNoTWFwIGdldEZvcm1UZXh0RGF0YSgpOwogCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIG5hdGl2ZVNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSk7CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9yaWVudGF0aW9uQ2hhbmdlZChpbnQgb3JpZW50YXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKaW5kZXggMGUwZTAzMi4uMWI1NjUxYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTQxLDYgKzQyLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyBhIHByb3h5IGNsYXNzIGZvciBoYW5kbGluZyBXZWJDb3JlIC0+IFVJIHRocmVhZCBtZXNzYWdpbmcuIEFsbApAQCAtMTEyLDYgKzExNCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9ISVNUT1JZX0lURU0gICAgICAgICAgICAgICAgICAgID0gMTM1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX0lOREVYX0NIQU5HRUQgICAgICAgICAgICAgICA9IDEzNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9DUkVERU5USUFMUyAgICAgICAgICAgICAgICAgICAgPSAxMzc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9JTlNUQUxMQUJMRV9XRUJBUFAgICAgICAgICAgICAgID0gMTM4OwogCiAgICAgLy8gTWVzc2FnZSB0cmlnZ2VyZWQgYnkgdGhlIGNsaWVudCB0byByZXN1bWUgZXhlY3V0aW9uCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwOwpAQCAtNTAwLDE4ICs1MDMsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNBbGVydChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcub2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNvbmZpcm0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDYW5jZWxhYmxlKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T25DYW5jZWxMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CkBAIC01MjUsNiArNTQyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQ29uZmlybShtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQpAQCAtNTY1LDYgKzU5MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc1Byb21wdChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMYXlvdXRJbmZsYXRlciBmYWN0b3J5ID0gTGF5b3V0SW5mbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20obUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZmFjdG9yeS5pbmZsYXRlKFIubGF5b3V0LmpzX3Byb21wdCwKQEAgLTYxNiw2ICs2NDksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNCZWZvcmVVbmxvYWQobVdlYlZpZXcsIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbSA9IG1Db250ZXh0LmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuanNfZGlhbG9nX2JlZm9yZV91bmxvYWQsIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCkBAIC03MjUsNyArNzY2LDggQEAKIAogICAgICAgICAgICAgY2FzZSBPUEVOX0ZJTEVfQ0hPT1NFUjoKICAgICAgICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKChVcGxvYWRGaWxlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIGRhdGEgPSAoVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKGRhdGEuZ2V0VXBsb2FkRmlsZSgpLCBkYXRhLmdldEFjY2VwdFR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03NTAsNiArNzkyLDkgQEAKICAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoCiAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCByZWFsbSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VUX0lOU1RBTExBQkxFX1dFQkFQUDoKKyAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50LnNldEluc3RhbGxhYmxlV2ViQXBwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwODcsMTAgKzExMzIsMTUgQEAKICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChpbnQgbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgLy8gU3luY2hyb25pemUgc28gdGhhdCBtTGF0ZXN0UHJvZ3Jlc3MgaXMgdXAtdG8tZGF0ZS4KICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsIHx8IG1MYXRlc3RQcm9ncmVzcyA9PSBuZXdQcm9ncmVzcykgeworICAgICAgICAgICAgLy8gdXBkYXRlIG1MYXRlc3RQcm9ncmVzcyBldmVuIG1XZWJDaHJvbWVDbGllbnQgaXMgbnVsbCBhcworICAgICAgICAgICAgLy8gV2ViVmlldy5nZXRQcm9ncmVzcygpIG5lZWRzIGl0CisgICAgICAgICAgICBpZiAobUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxhdGVzdFByb2dyZXNzID0gbmV3UHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShQUk9HUkVTUyk7CiAgICAgICAgICAgICAgICAgbVByb2dyZXNzVXBkYXRlUGVuZGluZyA9IHRydWU7CkBAIC0xMDk4LDcgKzExNDgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIFdlYlZpZXcgY3JlYXRlV2luZG93KGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlKSB7CisgICAgcHVibGljIEJyb3dzZXJGcmFtZSBjcmVhdGVXaW5kb3coYm9vbGVhbiBkaWFsb2csIGJvb2xlYW4gdXNlckdlc3R1cmUpIHsKICAgICAgICAgLy8gRG8gYW4gdW5zeW5jaHJvbml6ZWQgcXVpY2sgY2hlY2sgdG8gYXZvaWQgcG9zdGluZyBpZiBubyBjYWxsYmFjayBoYXMKICAgICAgICAgLy8gYmVlbiBzZXQuCiAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKQEAgLTExMjIsOSArMTE3MiwxNSBAQAogCiAgICAgICAgIFdlYlZpZXcgdyA9IHRyYW5zcG9ydC5nZXRXZWJWaWV3KCk7CiAgICAgICAgIGlmICh3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHcuZ2V0V2ViVmlld0NvcmUoKS5pbml0aWFsaXplU3Vid2luZG93KCk7CisgICAgICAgICAgICBXZWJWaWV3Q29yZSBjb3JlID0gdy5nZXRXZWJWaWV3Q29yZSgpOworICAgICAgICAgICAgLy8gSWYgV2ViVmlldy5kZXN0cm95KCkgaGFzIGJlZW4gY2FsbGVkLCBjb3JlIG1heSBiZSBudWxsLiAgU2tpcAorICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhhdCBjYXNlIGFuZCByZXR1cm4gbnVsbC4KKyAgICAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3JlLmluaXRpYWxpemVTdWJ3aW5kb3coKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29yZS5nZXRCcm93c2VyRnJhbWUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25SZXF1ZXN0Rm9jdXMoKSB7CkBAIC0xMTY2LDkgKzEyMjIsNyBAQAogICAgICAgICAvLyBmb3IgbnVsbC4KICAgICAgICAgV2ViSGlzdG9yeUl0ZW0gaSA9IG1CYWNrRm9yd2FyZExpc3QuZ2V0Q3VycmVudEl0ZW0oKTsKICAgICAgICAgaWYgKGkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHByZWNvbXBvc2VkIHx8IGkuZ2V0VG91Y2hJY29uVXJsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpLnNldFRvdWNoSWNvblVybCh1cmwsIHByZWNvbXBvc2VkKTsKICAgICAgICAgfQogICAgICAgICAvLyBEbyBhbiB1bnN5bmNocm9uaXplZCBxdWljayBjaGVjayB0byBhdm9pZCBwb3N0aW5nIGlmIG5vIGNhbGxiYWNrIGhhcwogICAgICAgICAvLyBiZWVuIHNldC4KQEAgLTE0MjYsNiArMTQ4MCwyNCBAQAogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSB7CisgICAgICAgIHByaXZhdGUgVXBsb2FkRmlsZSBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1BY2NlcHRUeXBlOworCisgICAgICAgIHB1YmxpYyBVcGxvYWRGaWxlTWVzc2FnZURhdGEoVXBsb2FkRmlsZSB1cGxvYWRGaWxlLCBTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gdXBsb2FkRmlsZTsKKyAgICAgICAgICAgIG1BY2NlcHRUeXBlID0gYWNjZXB0VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVcGxvYWRGaWxlIGdldFVwbG9hZEZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY2NlcHRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY2NlcHRUeXBlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBVcGxvYWRGaWxlIGltcGxlbWVudHMgVmFsdWVDYWxsYmFjazxVcmk+IHsKICAgICAgICAgcHJpdmF0ZSBVcmkgbVZhbHVlOwogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVWYWx1ZShVcmkgdmFsdWUpIHsKQEAgLTE0NDIsMTMgKzE1MTQsMTQgQEAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgV2ViVmlld0NvcmUgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBVcmkgb3BlbkZpbGVDaG9vc2VyKFN0cmluZyBhY2NlcHRUeXBlKSB7CiAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXlNZXNzYWdlID0gb2J0YWluTWVzc2FnZShPUEVOX0ZJTEVfQ0hPT1NFUik7CiAgICAgICAgIFVwbG9hZEZpbGUgdXBsb2FkRmlsZSA9IG5ldyBVcGxvYWRGaWxlKCk7Ci0gICAgICAgIG15TWVzc2FnZS5vYmogPSB1cGxvYWRGaWxlOworICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IG5ldyBVcGxvYWRGaWxlTWVzc2FnZURhdGEodXBsb2FkRmlsZSwgYWNjZXB0VHlwZSk7CisgICAgICAgIG15TWVzc2FnZS5vYmogPSBkYXRhOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG15TWVzc2FnZSk7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTQ3Nyw0ICsxNTUwLDExIEBACiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShISVNUT1JZX0lOREVYX0NIQU5HRUQsIGluZGV4LCAwLCBpdGVtKTsKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CisKKyAgICB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeworICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShTRVRfSU5TVEFMTEFCTEVfV0VCQVBQKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGIwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgc2ltcGx5IGEgY29udGFpbmVyIGZvciB0aGUgbWV0aG9kcyB1c2VkIHRvIGNvbmZpZ3VyZSBXZWJLaXQncworICogbW9jayBEZXZpY2VPcmllbnRhdGlvbkNsaWVudCBmb3IgdXNlIGluIExheW91dFRlc3RzLgorICoKKyAqIFRoaXMgY291bGQgYmUgcGFydCBvZiBXZWJWaWV3Q29yZSwgYnV0IGhhdmUgbW92ZWQgaXQgdG8gaXRzIG93biBjbGFzcyB0bworICogYXZvaWQgYmxvYXQgdGhlcmUuCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIFBhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgV2ViVmlld0NvcmUgc2hvdWxkIHVzZSBhIG1vY2sgRGV2aWNlT3JpZW50YXRpb24KKyAgICAgKiBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVzZU1vY2soV2ViVmlld0NvcmUgd2ViVmlld0NvcmUpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIG5hdGl2ZVVzZU1vY2sod2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBtb2NrIERldmljZU9yaWVudGF0aW9uIHNlcnZpY2UgZm9yIHRoZSBzdXBwbGllZCBXZWJWaWV3Q29yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TW9ja09yaWVudGF0aW9uKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlLCBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwKKyAgICAgICAgICAgIGRvdWJsZSBhbHBoYSwgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLAorICAgICAgICAgICAgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24od2ViVmlld0NvcmUsIGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKworICAgIC8vIE5hdGl2ZSBmdW5jdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVVc2VNb2NrKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24oV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCmluZGV4IDI0MzA2ZjQuLjkxZGUxZDggMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKQEAgLTQ1LDE0ICs0NSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmcm9tIHdoaWNoIHdlIG9idGFpbiB0aGUgc3lzdGVtIHNlcnZpY2UuCiAgICAgICogQHBhcmFtIG5hdGl2ZU9iamVjdCBUaGUgbmF0aXZlIG9iamVjdCB0byB3aGljaCB0aGlzIG9iamVjdCB3aWxsIHJlcG9ydCBwb3NpdGlvbiB1cGRhdGVzIGFuZAogICAgICAqICAgICBlcnJvcnMuCiAgICAgICovCi0gICAgcHVibGljIEdlb2xvY2F0aW9uU2VydmljZShsb25nIG5hdGl2ZU9iamVjdCkgeworICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBsb25nIG5hdGl2ZU9iamVjdCkgewogICAgICAgICBtTmF0aXZlT2JqZWN0ID0gbmF0aXZlT2JqZWN0OwogICAgICAgICAvLyBSZWdpc3RlciBuZXdMb2NhdGlvbkF2YWlsYWJsZSB3aXRoIHBsYXRmb3JtIHNlcnZpY2UuCi0gICAgICAgIEFjdGl2aXR5VGhyZWFkIHRocmVhZCA9IEFjdGl2aXR5VGhyZWFkLnN5c3RlbU1haW4oKTsKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gdGhyZWFkLmdldEFwcGxpY2F0aW9uKCk7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKICAgICAgICAgaWYgKG1Mb2NhdGlvbk1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGdldCBsb2NhdGlvbiBtYW5hZ2VyLiIpOwpAQCAtNjIsOSArNjEsMTAgQEAKICAgICAvKioKICAgICAgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CiAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICByZXR1cm4gbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlIHx8IG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlOwogICAgIH0KIAogICAgIC8qKgpAQCAtODcsNiArODcsOCBAQAogICAgICAgICAgICAgICAgIC8vIG9ubHkgdW5yZWdpc3RlciBmcm9tIGFsbCwgdGhlbiByZXJlZ2lzdGVyIHdpdGggYWxsIGJ1dCB0aGUgR1BTLgogICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwcm92aWRlcnMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB3ZSByZS1yZWdpc3Rlci4KKyAgICAgICAgICAgICAgICBtYXliZVJlcG9ydEVycm9yKCJUaGUgbGFzdCBsb2NhdGlvbiBwcm92aWRlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTYsMTEgKzE1OCwxNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIG1heSBmYWlsIGlmIHByb3ZpZGVycyBhcmUgbm90IHByZXNlbnQgb24gdGhlIGRldmljZS4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICBpZiAobUlzR3BzRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIDAsIDAsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2F1Z2h0IHNlY3VyaXR5IGV4Y2VwdGlvbiByZWdpc3RlcmluZyBmb3IgbG9jYXRpb24gdXBkYXRlcyBmcm9tIHN5c3RlbS4gIiArCkBAIC0xNzMsNiArMTgwLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckZyb21Mb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVtb3ZlVXBkYXRlcyh0aGlzKTsKKyAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkyODgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisvKioKKyAqIDxwPkhUTUw1IHN1cHBvcnQgY2xhc3MgZm9yIEF1ZGlvLgorICovCitjbGFzcyBIVE1MNUF1ZGlvIGV4dGVuZHMgSGFuZGxlcgorICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyIHsKKyAgICAvLyBMb2dnaW5nIHRhZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIkhUTUw1QXVkaW8iOworCisgICAgcHJpdmF0ZSBNZWRpYVBsYXllciBtTWVkaWFQbGF5ZXI7CisKKyAgICAvLyBUaGUgQysrIE1lZGlhUGxheWVyUHJpdmF0ZUFuZHJvaWQgb2JqZWN0LgorICAgIHByaXZhdGUgaW50IG1OYXRpdmVQb2ludGVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElETEUgICAgICAgID0gIDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElOSVRJQUxJWkVEID0gIDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSRVBBUkVEICAgID0gIDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgICAgID0gIDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENPTVBMRVRFICAgID0gIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBBVVNFRCAgICAgID0gIDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUT1BQRUQgICAgID0gLTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUk9SICAgICAgID0gLTE7CisKKyAgICBwcml2YXRlIGludCBtU3RhdGUgPSBJRExFOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFza1RvUGxheSA9IGZhbHNlOworCisgICAgLy8gVGltZXIgdGhyZWFkIC0+IFVJIHRocmVhZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFID0gMTAwOworCisgICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgdGltZXIgc2hvdWxkIGZpcmUgZXZlcnkgMjUwIG1zIG9yIGxlc3MuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVVUERBVEVfUEVSSU9EID0gMjUwOyAgLy8gbXMKKyAgICAvLyBUaGUgdGltZXIgZm9yIHRpbWV1cGF0ZSBldmVudHMuCisgICAgLy8gU2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2V2ZW50LW1lZGlhLXRpbWV1cGRhdGUKKyAgICBwcml2YXRlIFRpbWVyIG1UaW1lcjsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFRpbWV1cGRhdGVUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgSFRNTDVBdWRpby50aGlzLm9idGFpbk1lc3NhZ2UoVElNRVVQREFURSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgVElNRVVQREFURTogeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRVJST1IgJiYgbU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUocG9zaXRpb24sIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGV2ZW50IGxpc3RlbmVycyBmb3IgTWVkaWFQbGF5ZXIKKyAgICAvLyBUaG9zZSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgdGhyZWFkIHdlIGNyZWF0ZWQgdGhlIE1lZGlhUGxheWVyCisgICAgLy8gKGkuZS4gdGhlIHdlYnZpZXdjb3JlIHRocmVhZCBoZXJlKQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyIG1wLCBpbnQgcGVyY2VudCkgeworICAgICAgICBuYXRpdmVPbkJ1ZmZlcmluZyhwZXJjZW50LCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CisgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgbmF0aXZlT25FbmRlZChtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyCisgICAgcHVibGljIGJvb2xlYW4gb25FcnJvcihNZWRpYVBsYXllciBtcCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllciBtcCkgeworICAgICAgICBtU3RhdGUgPSBQUkVQQVJFRDsKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWV1cGRhdGVUYXNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVVQREFURV9QRVJJT0QsIFRJTUVVUERBVEVfUEVSSU9EKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVPblByZXBhcmVkKG1wLmdldER1cmF0aW9uKCksIDAsIDAsIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgaWYgKG1Bc2tUb1BsYXkpIHsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIHBsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvblNlZWtDb21wbGV0ZShNZWRpYVBsYXllciBtcCkgeworICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUobXAuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYXRpdmVQdHIgaXMgdGhlIEMrKyBwb2ludGVyIHRvIHRoZSBNZWRpYVBsYXllclByaXZhdGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIVE1MNUF1ZGlvKGludCBuYXRpdmVQdHIpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgbmF0aXZlIHB0cgorICAgICAgICBtTmF0aXZlUG9pbnRlciA9IG5hdGl2ZVB0cjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldE1lZGlhUGxheWVyKCkgeworICAgICAgICBpZiAobU1lZGlhUGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkNvbXBsZXRpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uRXJyb3JMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uUHJlcGFyZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERhdGFTb3VyY2UoU3RyaW5nIHVybCkgeworICAgICAgICBtVXJsID0gdXJsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJRExFKSB7CisgICAgICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UodXJsKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmVBc3luYygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjb3VsZG4ndCBsb2FkIHRoZSByZXNvdXJjZTogIiArIHVybCArICIgZXhjOiAiICsgZSk7CisgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheSgpIHsKKyAgICAgICAgaWYgKChtU3RhdGUgPT0gRVJST1IgfHwgbVN0YXRlID09IElETEUpICYmIG1VcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShtVXJsKTsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhdXNlKCkgeworICAgICAgICBpZiAobVN0YXRlID09IFNUQVJURUQpIHsKKyAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBQQVVTRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VlayhpbnQgbXNlYykgeworICAgICAgICBpZiAobVN0YXRlID49IFBSRVBBUkVEKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKG1zZWMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlYXJkb3duKCkgeworICAgICAgICBtTWVkaWFQbGF5ZXIucmVsZWFzZSgpOworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0TWF4VGltZVNlZWthYmxlKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkgLyAxMDAwLjBmOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25CdWZmZXJpbmcoaW50IHBlcmNlbnQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uRW5kZWQoaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25QcmVwYXJlZChpbnQgZHVyYXRpb24sIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25UaW1ldXBkYXRlKGludCBwb3NpdGlvbiwgaW50IG5hdGl2ZVBvaW50ZXIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCmluZGV4IGU3NjY2OTMuLmVjYWQyNjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKQEAgLTE2LDEwICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGZpbmFsIGNsYXNzIEpXZWJDb3JlSmF2YUJyaWRnZSBleHRlbmRzIEhhbmRsZXIgewpAQCAtNDksMTIgKzUxLDE1IEBACiAgICAgLyogcGFja2FnZSAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9QTFVHSU5TID0gMTAwOwogCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXA7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSldlYkNvcmVKYXZhQnJpZGdlIHRvIGludGVyZmFjZSB3aXRoCiAgICAgICogV2ViQ29yZSB0aW1lcnMgYW5kIGNvb2tpZXMuCiAgICAgICovCiAgICAgcHVibGljIEpXZWJDb3JlSmF2YUJyaWRnZSgpIHsKICAgICAgICAgbmF0aXZlQ29uc3RydWN0b3IoKTsKKwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjY3LDYgKzI3MiwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gQ2FsbGVkIG9uIHRoZSBXZWJDb3JlIHRocmVhZCB0aHJvdWdoIEpOSS4KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhaWxzYWZlIGZhbGxiYWNrIHRvIGp1c3QgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudC4KKyAgICAgICAgLy8gKFNlZSBPcGVuYWJsZUNvbHVtbnMgZG9jdW1lbnRhdGlvbiBpbiB0aGUgU0RLKQorICAgICAgICBVcmkgalVyaSA9IFVyaS5wYXJzZSh1cmkpOworICAgICAgICByZXR1cm4galVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRVcmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAucHV0KGNvbnRlbnRVcmksIHBhdGgpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZpbmFsaXplKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzaGFyZWRUaW1lckZpcmVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKaW5kZXggZTZmYTQwNS4uNWIyNTZmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgcHJpdmF0ZSBSZXF1ZXN0SGFuZGxlIG1SZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgUmVxdWVzdEhhbmRsZSBtU3NsRXJyb3JSZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgbG9uZyAgICAgbVBvc3RJZGVudGlmaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiAgbVNldE5hdGl2ZVJlc3BvbnNlOwogCiAgICAgLy8gUmVxdWVzdCBkYXRhLiBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gd2UgYXJlIGRvaW5nIGEgbG9hZCBmcm9tIHRoZQogICAgIC8vIGNhY2hlLiBJdCBpcyBuZWVkZWQgaWYgdGhlIGNhY2hlIHJldHVybnMgYSByZWRpcmVjdApAQCAtMTgxLDYgKzE4Miw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTmF0aXZlTG9hZGVyKCkgewogICAgICAgICBzTmF0aXZlTG9hZGVyQ291bnQgLT0gMTsKICAgICAgICAgbU5hdGl2ZUxvYWRlciA9IDA7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qCkBAIC0xMDg2LDEzICsxMDg4LDE4IEBACiAgICAgICAgIC8vIHJlcXVlc3Qgd2l0aCBzb21lIGNyZWRlbnRpYWxzIHRoZW4gZG9uJ3QgY29tbWl0IHRoZSBoZWFkZXJzCiAgICAgICAgIC8vIG9mIHRoaXMgcmVzcG9uc2U7IHdhaXQgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdCB3aXRoIHRoZQogICAgICAgICAvLyBjcmVkZW50aWFscy4KLSAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpCisgICAgICAgIGlmIChtQXV0aEhlYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAvLyBDb21taXQgdGhlIGhlYWRlcnMgdG8gV2ViQ29yZQorICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXROYXRpdmVSZXNwb25zZSgpIHsKICAgICAgICAgaW50IG5hdGl2ZVJlc3BvbnNlID0gY3JlYXRlTmF0aXZlUmVzcG9uc2UoKTsKICAgICAgICAgLy8gVGhlIG5hdGl2ZSBjb2RlIGRlbGV0ZXMgdGhlIG5hdGl2ZSByZXNwb25zZSBvYmplY3QuCiAgICAgICAgIG5hdGl2ZVJlY2VpdmVkUmVzcG9uc2UobmF0aXZlUmVzcG9uc2UpOworICAgICAgICBtU2V0TmF0aXZlUmVzcG9uc2UgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEyNyw2ICsxMTM0LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tbWl0TG9hZCgpIHsKICAgICAgICAgaWYgKG1DYW5jZWxsZWQpIHJldHVybjsKKyAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzTWFpblBhZ2VMb2FkZXIpIHsKICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gc0NlcnRpZmljYXRlVHlwZU1hcC5nZXQobU1pbWVUeXBlKTsKQEAgLTExOTcsNiArMTIwNywxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtTmF0aXZlTG9hZGVyICE9IDApIHsKICAgICAgICAgICAgIFBlcmZDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGVyZkNoZWNrZXIoKTsKKyAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgIGNoZWNrZXIucmVzcG9uc2VBbGVydCgicmVzIG5hdGl2ZUZpbmlzaGVkIik7CiAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpAQCAtMTMxMiw2ICsxMzI2LDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1Db250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLm9wZW5fcGVybWlzc2lvbl9kZW55KQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICsgcmVkaXJlY3RUbzsKKyAgICAgICAgICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYXRpdmVBZGREYXRhKHRleHQuZ2V0Qnl0ZXMoKSwgdGV4dC5sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjMWFjMTgwLi5mMDAwMDViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMTYsMzUgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGxpYmNvcmUubmV0Lk1pbWVVdGlsczsKIAogLyoqCiAgKiBUd28td2F5IG1hcCB0aGF0IG1hcHMgTUlNRS10eXBlcyB0byBmaWxlIGV4dGVuc2lvbnMgYW5kIHZpY2UgdmVyc2EuCisgKgorICogPHA+U2VlIGFsc28ge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21OYW1lfQorICogYW5kIHtAbGluayBqYXZhLm5ldC5VUkxDb25uZWN0aW9uI2d1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtfS4gVGhpcworICogY2xhc3MgYW5kIHtAY29kZSBVUkxDb25uZWN0aW9ufSBzaGFyZSB0aGUgc2FtZSBNSU1FLXR5cGUgZGF0YWJhc2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBNaW1lVHlwZU1hcCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWltZVR5cGVNYXAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7CiAKLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gTUlNRS10eXBlIG1hcCBpbnN0YW5jZToKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBNSU1FLXR5cGUgdG8gZmlsZSBleHRlbnNpb24gbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwOwotCi0gICAgLyoqCi0gICAgICogRmlsZSBleHRlbnNpb24gdG8gTUlNRSB0eXBlIG1hcHBpbmc6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTUlNRS10eXBlIG1hcC4KLSAgICAgKi8KICAgICBwcml2YXRlIE1pbWVUeXBlTWFwKCkgewotICAgICAgICBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTUsNyArNDIsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiB1cmwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbkZyb21VcmwoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHVybCkpIHsKICAgICAgICAgICAgIGludCBxdWVyeSA9IHVybC5sYXN0SW5kZXhPZignPycpOwogICAgICAgICAgICAgaWYgKHF1ZXJ5ID4gMCkgewogICAgICAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgcXVlcnkpOwpAQCAtNjYsNyArNTMsNyBAQAogCiAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsZW5hbWUgY29udGFpbnMgc3BlY2lhbCBjaGFyYWN0ZXJzLCB3ZSBkb24ndAogICAgICAgICAgICAgLy8gY29uc2lkZXIgaXQgdmFsaWQgZm9yIG91ciBtYXRjaGluZyBwdXJwb3NlczoKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IDAgJiYKKyAgICAgICAgICAgIGlmICghZmlsZW5hbWUuaXNFbXB0eSgpICYmCiAgICAgICAgICAgICAgICAgUGF0dGVybi5tYXRjaGVzKCJbYS16QS1aXzAtOVxcLlxcLVxcKFxcKVxcJV0rIiwgZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaW50IGRvdFBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgICAgICAgaWYgKDAgPD0gZG90UG9zKSB7CkBAIC03OSwzNiArNjYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIGFuIGVudHJ5IGludG8gdGhlIG1hcC4gVGhpcyBkb2VzIG5vdCBjaGVjayBpZiB0aGUgaXRlbSBhbHJlYWR5Ci0gICAgICogZXhpc3RzLCBpdCB0cnVzdHMgdGhlIGNhbGxlciEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEVudHJ5KFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICAvLwotICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIHggLS0+IHkgbWFwcGluZywgd2UgZG8gbm90IHdhbnQgdG8KLSAgICAgICAgLy8gb3ZlcnJpZGUgaXQgd2l0aCBhbm90aGVyIG1hcHBpbmcgeCAtLT4gPwotICAgICAgICAvLyB0aGlzIGlzIG1vc3RseSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIG1pbWUtdHlwZSBtYXAgYmVsb3cKLSAgICAgICAgLy8gaXMgY29uc3RydWN0ZWQgKGlmIGEgbWltZSB0eXBlIG1hcHMgdG8gc2V2ZXJhbCBleHRlbnNpb25zCi0gICAgICAgIC8vIHRoZSBmaXJzdCBleHRlbnNpb24gaXMgY29uc2lkZXJlZCB0aGUgbW9zdCBwb3B1bGFyIGFuZCBpcwotICAgICAgICAvLyBhZGRlZCBmaXJzdDsgd2UgZG8gbm90IHdhbnQgdG8gb3ZlcndyaXRlIGl0IGxhdGVyKS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCFtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLnB1dChtaW1lVHlwZSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLnB1dChleHRlbnNpb24sIG1pbWVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gTUlNRSB0eXBlIGhhcyBhbiBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqIEBwYXJhbSBtaW1lVHlwZSBBIE1JTUUgdHlwZSAoaS5lLiB0ZXh0L3BsYWluKQogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYSBtaW1lVHlwZSBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuaGFzTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE3LDE2ICs4MCwxMiBAQAogICAgICAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbiBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5nZXQoZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzTWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CiAgICAgfQogCiAgICAgLy8gU3RhdGljIG1ldGhvZCBjYWxsZWQgYnkgam5pLgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0U2luZ2xldG9uKCkuZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNSwxMCArOTQsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5jb250YWluc0tleShleHRlbnNpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OSwxMSArMTA1LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBNSU1FIHR5cGUgb3IgbnVsbCBpZmYgdGhlcmUgaXMgbm9uZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbkZyb21NaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzRXh0ZW5zaW9uRnJvbU1pbWVUeXBlKG1pbWVUeXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MSwzNjMgKzExMyw2IEBACiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBNSU1FLXR5cGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWltZVR5cGVNYXAgZ2V0U2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc01pbWVUeXBlTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcCA9IG5ldyBNaW1lVHlwZU1hcCgpOwotCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGJhc2VkIG9uIC9ldGMvbWltZS50eXBlcyBkYXRhIG1pbnVzCi0gICAgICAgICAgICAvLyBjaGVtaWNhbC8qIE1JTUUgdHlwZXMgYW5kIE1JTUUgdHlwZXMgdGhhdCBkb24ndCBtYXAgdG8gYW55Ci0gICAgICAgICAgICAvLyBmaWxlIGV4dGVuc2lvbnMuIFdlIGFsc28gZXhjbHVkZSB0b3AtbGV2ZWwgZG9tYWluIG5hbWVzIHRvCi0gICAgICAgICAgICAvLyBkZWFsIHdpdGggY2FzZXMgbGlrZToKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBtYWlsLmdvb2dsZS5jb20vYS9nb29nbGUuY29tCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gYW5kICJhY3RpdmUiIE1JTUUgdHlwZXMgKGR1ZSB0byBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzKS4KLQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vYW5kcmV3LWluc2V0IiwgImV6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9kc3B0eXBlIiwgInRzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vaHRhIiwgImh0YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIiwgImhxeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYSIsICJuYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbXNhY2Nlc3MiLCAibWRiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZGEiLCAib2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZ2ciLCAib2dnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZGYiLCAicGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIsICJrZXkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiLCAicGdwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzIiwgInByZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmFyIiwgInJhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmRmK3htbCIsICJyZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3Jzcyt4bWwiLCAicnNzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi96aXAiLCAiemlwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmUiLCAKLSAgICAgICAgICAgICAgICAgICAgImFwayIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEiLCAiY2R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCIsICJzdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIiwgIm9kYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIsICJvZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIiwgIm9kZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIsICJvZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0IiwgIm9kcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0IiwgIm9kdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLCAib2RtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIiwgIm90dCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLCAib3RoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG90Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAiZG9jeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgImRvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAieGx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHB0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBwcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAicHB0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJwb3R4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyIsCi0gICAgICAgICAgICAgICAgICAgICJwcHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQucmltLmNvZCIsICJjb2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zbWFmIiwgIm1tZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5jYWxjIiwgInNkYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3IiwgInNkYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3MiLCAic2RwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiLCAic21mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciIsCi0gICAgICAgICAgICAgICAgICAgICJzZHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInZvciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyLWdsb2JhbCIsICJzZ2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiLCAic3hjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSIsICJzdGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciLCAic3hkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSIsICJzdGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MiLCAic3hpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZSIsICJzdGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiLCAic3htIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiLCAic3h3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbCIsICJzeGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUiLCAic3R3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQudmlzaW8iLCAidnNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFiaXdvcmQiLCAiYWJ3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFwcGxlLWRpc2tpbWFnZSIsICJkbWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYmNwaW8iLCAiYmNwaW8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYml0dG9ycmVudCIsICJ0b3JyZW50Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNkZiIsICJjZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RsaW5rIiwgInZjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jaGVzcy1wZ24iLCAicGduIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNwaW8iLCAiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJkZWIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiLCAidWRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkY3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZGlyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImR4ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kbXMiLCAiZG1zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRvb20iLCAid2FkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWR2aSIsICJkdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZmxhYyIsICJmbGFjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAiZ3NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmLloiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnJlZW1pbmQiLCAibW0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nbnVtZXJpYyIsICJnbnVtZXJpYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nby1zZ2YiLCAic2dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdyYXBoaW5nLWNhbGN1bGF0b3IiLCAiZ2NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAiZ3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRheiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1oZGYiLCAiaGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWljYSIsICJpY2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaW50ZXJuZXQtc2lnbnVwIiwgImlucyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaXNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWlwaG9uZSIsICJpaWkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSIsICJpc28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtam1vbCIsICJqbXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2NoYXJ0IiwgImNocnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2lsbHVzdHJhdG9yIiwgImtpbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rc3ByZWFkIiwgImtzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta3dvcmQiLCAia3d0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxhdGV4IiwgImxhdGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxoYSIsICJsaGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbHpoIiwgImx6aCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1sengiLCAibHp4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJtYWtlciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmcmFtZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJib29rIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1pZiIsICJtaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXMtd21kIiwgIndtZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bXoiLCAid216Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zaSIsICJtc2kiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZyIsICJwYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbndjIiwgIm53YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vYmplY3QiLCAibyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vei1hcHBsaWNhdGlvbiIsICJvemEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczEyIiwgInAxMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcCIsICJwN3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczctY3JsIiwgImNybCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1xdWlja3RpbWVwbGF5ZXIiLCAicXRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNoYXIiLCAic2hhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giLCAic3dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN0dWZmaXQiLCAic2l0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNwaW8iLCAic3Y0Y3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zdjRjcmMiLCAic3Y0Y3JjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRhciIsICJ0YXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpbmZvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRleGluZm8iLCAidGV4aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZiIsICJ0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInJvZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIiwgIm1hbiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC11c3RhciIsICJ1c3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSIsICJzcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2luZ3oiLCAid3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2ViYXJjaGl2ZSIsICJ3ZWJhcmNoaXZlIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS11c2VyLWNlcnQiLCAiY3J0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXhjZiIsICJ4Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGZpZyIsICJmaWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJ4aHRtbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9hbXIiLCAiYW1yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgIm1pZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAia2FyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgInhtZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbW9iaWxlLXhtZiIsICJteG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBlZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wMyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtNGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWd1cmwiLCAibTN1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9wcnMuc2lkIiwgInNpZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtYWlmZiIsICJhaWZjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWdzbSIsICJnc20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXMtd21hIiwgIndtYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13YXgiLCAid2F4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1yZWFsYXVkaW8iLCAicmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2NwbHMiLCAicGxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXNkMiIsICJzZDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtd2F2IiwgIndhdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvYm1wIiwgImJtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvZ2lmIiwgImdpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImN1ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWVmIiwgImllZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BjeCIsICJwY3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BuZyIsICJwbmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9zdmcreG1sIiwgInN2Z3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3RpZmYiLCAidGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdnUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLndhcC53Ym1wIiwgIndibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY211LXJhc3RlciIsICJyYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxkcmF3IiwgImNkciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXdwYXR0ZXJuIiwgInBhdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXd0ZW1wbGF0ZSIsICJjZHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxwaG90b3BhaW50IiwgImNwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1pY29uIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qZyIsICJhcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtam5nIiwgImpuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1tcy1ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBob3Rvc2hvcCIsICJwc2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtYW55bWFwIiwgInBubSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAiLCAicGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAiLCAicGdtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCIsICJwcG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcmdiIiwgInJnYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14Yml0bWFwIiwgInhibSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14cGl4bWFwIiwgInhwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14d2luZG93ZHVtcCIsICJ4d2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9pZ2VzIiwgImlnZXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibXNoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9tZXNoIiwgIm1lc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAic2lsbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY2FsZW5kYXIiLCAiaWN6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NvbW1hLXNlcGFyYXRlZC12YWx1ZXMiLCAiY3N2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NzcyIsICJjc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2gzMjMiLCAiMzIzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2l1bHMiLCAidWxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L21hdGhtbCIsICJtbWwiKTsKLSAgICAgICAgICAgIC8vIGFkZCBpdCBmaXJzdCBzbyBpdCB3aWxsIGJlIHRoZSBkZWZhdWx0IGZvciBFeHRlbnNpb25Gcm9tTWltZVR5cGUKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAidHh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImFzYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0ZXh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImRpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAicG8iKTsgICAgIC8vIHJlc2VydmUgInBvdCIgZm9yIHZuZC5tcy1wb3dlcnBvaW50Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3JpY2h0ZXh0IiwgInJ0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9ydGYiLCAicnRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RleG1hY3MiLCAidHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4dCIsICJwaHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIiwgInRzdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94bWwiLCAieG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYmlidGV4IiwgImJpYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWJvbyIsICJib28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaCsrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImhwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiYysrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImNwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jaGRyIiwgImgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jb21wb25lbnQiLCAiaHRjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NoIiwgImNzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNzcmMiLCAiYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWRzcmMiLCAiZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWhhc2tlbGwiLCAiaHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1qYXZhIiwgImphdmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1saXRlcmF0ZS1oYXNrZWxsIiwgImxocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LW1vYyIsICJtb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wYXNjYWwiLCAicCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wY3MtZ2NkIiwgImdjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXNldGV4dCIsICJldHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10Y2wiLCAidGNsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgInRleCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJsdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAic3R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImNscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYWxlbmRhciIsICJ2Y3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC12Y2FyZCIsICJ2Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2dwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2cyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kbCIsICJkbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZHYiLCAiZGlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZmxpIiwgImZsaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbTR2IiwgIm00diIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wNCIsICJtcDQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAiVk9CIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9xdWlja3RpbWUiLCAicXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJtb3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3ZuZC5tcGVndXJsIiwgIm14dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1sYS1hc2YiLCAibHNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbW5nIiwgIm1uZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy1hc2YiLCAiYXNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd20iLCAid20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd212IiwgIndtdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXgiLCAid214Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXd2eCIsICJ3dngiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXN2aWRlbyIsICJhdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtc2dpLW1vdmllIiwgIm1vdmllIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayIsICJpY2UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtZXBvYy94LXNpc3gtYXBwIiwgInNpc3giKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBzTWltZVR5cGVNYXA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKaW5kZXggNTk4ZjIwZC4uMGYwMzI1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuKjsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTc2LDYgKzgxLDE5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBIdHRwQXV0aEhhbmRsZXIgbUh0dHBBdXRoSGFuZGxlcjsKIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnRseSB1c2VkIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBhIHJvYW1pbmcgcGhvbmUKKyAgICAgKiBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUm9hbWluZzsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBpZiB3ZSBhcmUgcm9hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJvYW1pbmdNb25pdG9yIG1Sb2FtaW5nTW9uaXRvcjsKKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbmV0d29yay4KICAgICAgKi8KQEAgLTEwNyw2ICsxMjUsNyBAQAogICAgICAgICBpZiAoKytzUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICAgICAgc05ldHdvcmsubW9uaXRvclJvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMjEsNiArMTQwLDcgQEAKICAgICAgICAgaWYgKC0tc1BsYXRmb3JtTm90aWZpY2F0aW9uRW5hYmxlUmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKHNOZXR3b3JrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzTmV0d29yay5tUmVxdWVzdFF1ZXVlLmRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5zdG9wTW9uaXRvcmluZ1JvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTM2LDEyICsxNTYsMzkgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuCiAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKS5lcXVhbHMoV2ViVmlld0NvcmUuVEhSRUFEX05BTUUpKTsKICAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Tc2xFcnJvckhhbmRsZXIgPSBuZXcgU3NsRXJyb3JIYW5kbGVyKCk7CiAgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVyKHRoaXMpOwogCiAgICAgICAgIG1SZXF1ZXN0UXVldWUgPSBuZXcgUmVxdWVzdFF1ZXVlKGNvbnRleHQpOwogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgUm9hbWluZ01vbml0b3IgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSAoTmV0d29ya0luZm8paW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1Sb2FtaW5nID0gaW5mby5pc1JvYW1pbmcoKTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1vbml0b3JSb2FtaW5nKCkgeworICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBuZXcgUm9hbWluZ01vbml0b3IoKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHNOZXR3b3JrLm1Sb2FtaW5nTW9uaXRvciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcE1vbml0b3JpbmdSb2FtaW5nKCkgeworICAgICAgICBpZiAobVJvYW1pbmdNb25pdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUm9hbWluZ01vbml0b3IpOworICAgICAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcXVlc3QgYSB1cmwgZnJvbSBlaXRoZXIgdGhlIG5ldHdvcmsgb3IgdGhlIGZpbGUgc3lzdGVtLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBsb2FkLgpAQCAtMTcwLDYgKzIxNywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZWZldGNoLCBhYm9ydCBpdCBpZiB3ZSdyZSByb2FtaW5nLgorICAgICAgICBpZiAobVJvYW1pbmcgJiYgaGVhZGVycy5jb250YWluc0tleSgiWC1Nb3oiKSAmJiAicHJlZmV0Y2giLmVxdWFscyhoZWFkZXJzLmdldCgiWC1Nb3oiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGxhbWUuICBQYXNzIGFuIElucHV0U3RyZWFtIGluLCByYXRoZXIgdGhhbgogICAgICAgICAgICBtYWtpbmcgdGhpcyBsYW1lIG9uZSBoZXJlICovCiAgICAgICAgIElucHV0U3RyZWFtIGJvZHlQcm92aWRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKaW5kZXggMWQ1YWFjNy4uZTgzYmVmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMzE0LDEwICszMTQsMzcgQEAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKiBAcGFyYW0gdXBsb2FkRmlsZSBBIFZhbHVlQ2FsbGJhY2sgdG8gc2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdXBsb2FkLgotICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLmEKKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgdGFnCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSkgeworICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgdXBsb2FkRmlsZS5vblJlY2VpdmVWYWx1ZShudWxsKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RhcnQoV2ViVmlldyB2aWV3KSB7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQgd2UgY2FuY2VsIHRoZSBzZWxlY3Rpb24gYWdhaW4sIHRodXMgZGlzYWJsaW5nCisgICAgICAgIC8vIHRleHQgc2VsZWN0aW9uIHVubGVzcyB0aGUgY2hyb21lIGNsaWVudCBzdXBwb3J0cyBpdC4KKyAgICAgICAgdmlldy5ub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGNvcGllZCBvciBjYW5jZWxlZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uRG9uZShXZWJWaWV3IHZpZXcpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgcGFnZSBiZWluZyB2aWV3ZWQgaXMgd2ViIGFwcCBjYXBhYmxlLAorICAgICAqIGkuZS4gaGFzIHNwZWNpZmllZCB0aGUgZnVsbHNjcmVlbi13ZWItYXBwLWNhcGFibGUgbWV0YSB0YWcuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCmluZGV4IDQyOGE1OWMuLjdjMGU0NzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCkBAIC0xOCw2ICsxOCw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIAoraW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKIC8qKgogICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyBpbiBhbiBlbnRyeSBpbiB0aGUgYmFjay9mb3J3YXJkIGxpc3QKICAqIG9mIGEgV2ViVmlldy4gRWFjaCBXZWJIaXN0b3J5SXRlbSBpcyBhIHNuYXBzaG90IG9mIHRoZSByZXF1ZXN0ZWQgaGlzdG9yeQpAQCAtMzksOCArNDIsMTIgQEAKICAgICBwcml2YXRlIEJpdG1hcCBtRmF2aWNvbjsKICAgICAvLyBUaGUgcHJlLWZsYXR0ZW5lZCBkYXRhIHVzZWQgZm9yIHNhdmluZyB0aGUgc3RhdGUuCiAgICAgcHJpdmF0ZSBieXRlW10gbUZsYXR0ZW5lZERhdGE7Ci0gICAgLy8gVGhlIGFwcGxlLXRvdWNoLWljb24gdXJsIGZvciB1c2Ugd2hlbiBhZGRpbmcgdGhlIHNpdGUgdG8gdGhlIGhvbWUgc2NyZWVuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybDsKKyAgICAvLyBUaGUgYXBwbGUtdG91Y2gtaWNvbiB1cmwgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgc2l0ZSB0byB0aGUgaG9tZSBzY3JlZW4sCisgICAgLy8gYXMgb2J0YWluZWQgZnJvbSBhIDxsaW5rPiBlbGVtZW50IGluIHRoZSBwYWdlLgorICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25VcmxGcm9tTGluazsKKyAgICAvLyBJZiBubyA8bGluaz4gaXMgc3BlY2lmaWVkLCB0aGlzIGhvbGRzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZQorICAgIC8vIGFwcGxlLXRvdWNoLWljb24uCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CiAgICAgLy8gQ3VzdG9tIGNsaWVudCBkYXRhIHRoYXQgaXMgbm90IGZsYXR0ZW5lZCBvciByZWFkIGJ5IG5hdGl2ZSBjb2RlLgogICAgIHByaXZhdGUgT2JqZWN0IG1DdXN0b21EYXRhOwogCkBAIC0xMzIsMTAgKzEzOSwyOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0b3VjaCBpY29uIHVybC4KKyAgICAgKiBJZiBubyB0b3VjaCBpY29uIDxsaW5rPiB0YWcgd2FzIHNwZWNpZmllZCwgcmV0dXJucworICAgICAqIDxob3N0Pi9hcHBsZS10b3VjaC1pY29uLnBuZy4gVGhlIERvd25sb2FkVG91Y2hJY29uIGNsYXNzIHRoYXQKKyAgICAgKiBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgdG91Y2ggaWNvbiB3aWxsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZQorICAgICAqIHRoYXQgZmlsZSBkb2VzIG5vdCBleGlzdC4gQW4gaWNvbiBzZXQgYnkgYSA8bGluaz4gdGFnIGlzIGFsd2F5cworICAgICAqIHVzZWQgaW4gcHJlZmVyZW5jZSB0byBhbiBpY29uIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25Vcmw7CisgICAgICAgIGlmIChtVG91Y2hJY29uVXJsRnJvbUxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxGcm9tTGluazsKKyAgICAgICAgfSBlbHNlIGlmIChtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobU9yaWdpbmFsVXJsKTsKKyAgICAgICAgICAgIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0ID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9hcHBsZS10b3VjaC1pY29uLnBuZyIpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzEsMTEgKzE5NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdG91Y2ggaWNvbiB1cmwuCisgICAgICogU2V0IHRoZSB0b3VjaCBpY29uIHVybC4gV2lsbCBub3Qgb3ZlcndyaXRlIGFuIGljb24gdGhhdCBoYXMgYmVlbgorICAgICAqIHNldCBhbHJlYWR5IGZyb20gYSA8bGluaz4gdGFnLCB1bmxlc3MgdGhlIG5ldyBpY29uIGlzIHByZWNvbXBvc2VkLgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgLypwYWNrYWdlKi8gdm9pZCBzZXRUb3VjaEljb25VcmwoU3RyaW5nIHVybCkgewotICAgICAgICBtVG91Y2hJY29uVXJsID0gdXJsOworICAgIC8qcGFja2FnZSovIHZvaWQgc2V0VG91Y2hJY29uVXJsKFN0cmluZyB1cmwsIGJvb2xlYW4gcHJlY29tcG9zZWQpIHsKKyAgICAgICAgaWYgKHByZWNvbXBvc2VkIHx8IG1Ub3VjaEljb25VcmxGcm9tTGluayA9PSBudWxsKSB7CisgICAgICAgICAgICBtVG91Y2hJY29uVXJsRnJvbUxpbmsgPSB1cmw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKaW5kZXggYjc2N2YxMS4uNmU4OWE4YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKLWltcG9ydCBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX05PX0NBQ0hFID0gMjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIERvbid0IHVzZSB0aGUgbmV0d29yaywgbG9hZCBmcm9tIGNhY2hlIG9ubHkuCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRDYWNoZU1vZGV9LgpAQCAtMTc4LDEyICsxNzgsMTUgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlV2lkZVZpZXdwb3J0ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVN1cHBvcnRNdWx0aXBsZVdpbmRvd3MgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU2hyaW5rc1N0YW5kYWxvbmVJbWFnZXNUb0ZpdCA9IGZhbHNlOworICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgIG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSA9IDA7IC8vIDAgbWVhbnMgZGVmYXVsdAorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Qcml2YXRlQnJvd3NpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgLy8gSFRNTDUgQVBJIGZsYWdzCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFwcENhY2hlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1EYXRhYmFzZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRG9tU3RvcmFnZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtV29ya2Vyc0VuYWJsZWQgPSBmYWxzZTsgIC8vIG9ubHkgYWZmZWN0cyBWOC4KICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtR2VvbG9jYXRpb25FbmFibGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmYWxzZTsKICAgICAvLyBIVE1MNSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICBtQXBwQ2FjaGVNYXhTaXplID0gTG9uZy5NQVhfVkFMVUU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgbUFwcENhY2hlUGF0aCA9ICIiOwpAQCAtMjA3LDYgKzIxMCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQWxsb3dGaWxlQWNjZXNzID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTG9hZFdpdGhPdmVydmlld01vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbiA9IGZhbHNlOwogCiAgICAgLy8gcHJpdmF0ZSBXZWJTZXR0aW5ncywgbm90IGFjY2Vzc2libGUgYnkgdGhlIGhvc3QgYWN0aXZpdHkKICAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgICAgICBtRG91YmxlVGFwVG9hc3RDb3VudCA9IDM7CkBAIC0yOTYsMTMgKzMwMCwxMyBAQAogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IEludGVsIE1hYyBPUyBYIDEwXzVfNzsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUzMC4xNyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIFNhZmFyaS81MzAuMTciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJUEhPTkVfVVNFUkFHRU5UID0gCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPQogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChpUGhvbmU7IFU7IENQVSBpUGhvbmUgT1MgM18wIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSIKICAgICAgICAgICAgICsgIiBBcHBsZVdlYktpdC81MjguMTggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCIKICAgICAgICAgICAgICsgIiBNb2JpbGUvN0EzNDEgU2FmYXJpLzUyOC4xNiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlIHNMb2NhbGU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNMb2NrRm9yTG9jYWxlU2V0dGluZ3M7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBQYWNrYWdlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2xpZW50cyBmcm9tIGNyZWF0aW5nIGEgbmV3IHNldHRpbmdzCiAgICAgICogaW5zdGFuY2UuCkBAIC0zMjcsNiArMzMxLDggQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFID0gImVuLVVTIjsKKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIHJldHVybnMgY3VycmVudCBBY2NlcHRMYW5ndWFnZSBTdHJpbmcuCiAgICAgICogQHJldHVybiBDdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KQEAgLTMzNiwzMiArMzQyLDUzIEBACiAgICAgICAgIHN5bmNocm9uaXplZChzTG9ja0ZvckxvY2FsZVNldHRpbmdzKSB7CiAgICAgICAgICAgICBsb2NhbGUgPSBzTG9jYWxlOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsYW5ndWFnZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoYnVmZmVyLCBsb2NhbGUpOworCisgICAgICAgIGlmICghTG9jYWxlLlVTLmVxdWFscyhsb2NhbGUpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFsb2NhbGUuZXF1YWxzKExvY2FsZS5VUykpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlIHVzID0gTG9jYWxlLlVTOwotICAgICAgICAgICAgaWYgKHVzLmdldExhbmd1YWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodXMuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSB1cy5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG9ic29sZXRlIGxhbmd1YWdlIGNvZGVzLCBpbmNsdWRpbmcgSGVicmV3L0luZG9uZXNpYW4vWWlkZGlzaCwKKyAgICAgKiB0byBuZXcgc3RhbmRhcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KFN0cmluZyBsYW5nQ29kZSkgeworICAgICAgICBpZiAobGFuZ0NvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJpdyIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSGVicmV3CisgICAgICAgICAgICByZXR1cm4gImhlIjsKKyAgICAgICAgfSBlbHNlIGlmICgiaW4iLmVxdWFscyhsYW5nQ29kZSkpIHsKKyAgICAgICAgICAgIC8vIEluZG9uZXNpYW4KKyAgICAgICAgICAgIHJldHVybiAiaWQiOworICAgICAgICB9IGVsc2UgaWYgKCJqaSIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gWWlkZGlzaAorICAgICAgICAgICAgcmV0dXJuICJ5aSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhbmdDb2RlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoU3RyaW5nQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsYW5ndWFnZSk7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIG1Db250ZXh0IGFuZCByZXR1cm5zIGN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KQEAgLTM3OSwxMSArNDA2LDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvICIxLjAiCiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIxLjAiKTsKLSAgICAgICAgfSAgCisgICAgICAgIH0KICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyAiKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7CiAgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsYW5ndWFnZSkpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwogICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKQEAgLTQwNiwxMSArNDMzLDEzIEBACiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgQnVpbGQvIik7CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGlkKTsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcgbW9iaWxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50KS50b1N0cmluZygpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFRleHQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnQpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGJhc2UsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGJhc2UsIGJ1ZmZlciwgbW9iaWxlKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBFbmFibGVzIGR1bXBpbmcgdGhlIHBhZ2VzIG5hdmlnYXRpb24gY2FjaGUgdG8gYSB0ZXh0IGZpbGUuCiAgICAgICovCkBAIC00MjYsNiArNDU1LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSWYgV2ViVmlldyBvbmx5IHN1cHBvcnRzIHRvdWNoLCBhIGRpZmZlcmVudCBuYXZpZ2F0aW9uIG1vZGVsIHdpbGwgYmUKKyAgICAgKiBhcHBsaWVkLiBPdGhlcndpc2UsIHRoZSBuYXZpZ2F0aW9uIHRvIHN1cHBvcnQgYm90aCB0b3VjaCBhbmQga2V5Ym9hcmQKKyAgICAgKiB3aWxsIGJlIHVzZWQuCisgICAgICogQGhpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0VG91Y2hPbmx5KGJvb2xlYW4gdG91Y2hPbmx5KSB7CisgICAgICAgIG1TdXBwb3J0VG91bmNoT25seSA9IHRvdWNoT25seTsKKyAgICB9CisgICAgICovCisKKyAgICBib29sZWFuIHN1cHBvcnRUb3VjaE9ubHkoKSB7CisgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5LCB1c2UgbUxpZ2h0VG91Y2hFbmFibGVkIGZvciBtU3VwcG9ydFRvdW5jaE9ubHkKKyAgICAgICAgcmV0dXJuIG1MaWdodFRvdWNoRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyBzdXBwb3J0cyB6b29tCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydFpvb20oYm9vbGVhbiBzdXBwb3J0KSB7CkBAIC00NDcsMTQgKzQ5MSwxNCBAQAogICAgICAgICBtQnVpbHRJblpvb21Db250cm9scyA9IGVuYWJsZWQ7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KG1Db250ZXh0KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHpvb20gbWVjaGFuaXNtIGJ1aWx0IGludG8gV2ViVmlldyBpcyBiZWluZyB1c2VkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSB7CiAgICAgICAgIHJldHVybiBtQnVpbHRJblpvb21Db250cm9sczsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBmaWxlIGFjY2VzcyB3aXRoaW4gV2ViVmlldy4gRmlsZSBhY2Nlc3MgaXMgZW5hYmxlZCBieQogICAgICAqIGRlZmF1bHQuCkBAIC00ODUsNiArNTI5LDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgd2lsbCBlbmFibGUgc21vb3RoIHRyYW5zaXRpb24gd2hpbGUgcGFubmluZyBvcgorICAgICAqIHpvb21pbmcuIElmIGl0IGlzIHRydWUsIFdlYlZpZXcgd2lsbCBjaG9vc2UgYSBzb2x1dGlvbiB0byBtYXhpbWl6ZSB0aGUKKyAgICAgKiBwZXJmb3JtYW5jZS4gZS5nLiB0aGUgV2ViVmlldydzIGNvbnRlbnQgbWF5IG5vdCBiZSB1cGRhdGVkIGR1cmluZyB0aGUKKyAgICAgKiB0cmFuc2l0aW9uLiBJZiBpdCBpcyBmYWxzZSwgV2ViVmlldyB3aWxsIGtlZXAgaXRzIGZpZGVsaXR5LiBUaGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVNtb290aFRyYW5zaXRpb24oYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBXZWJWaWV3IGVuYWJsZXMgc21vb3RoIHRyYW5zaXRpb24gd2hpbGUgcGFubmluZyBvcgorICAgICAqIHpvb21pbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uOworICAgIH0KKworICAgIC8qKgogICAgICAqIFN0b3JlIHdoZXRoZXIgdGhlIFdlYlZpZXcgaXMgc2F2aW5nIGZvcm0gZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRm9ybURhdGEoYm9vbGVhbiBzYXZlKSB7CkBAIC05ODQsOCArMTA0Nyw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5TmV0d29ya0FjY2VzcygpIHsKICAgICAgICAgaWYgKCFtQmxvY2tOZXR3b3JrTG9hZHMpIHsKLSAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsIAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlQaWQoKSwgYW5kcm9pZC5vcy5Qcm9jZXNzLm15VWlkKCkpICE9IAorICAgICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAoIlBlcm1pc3Npb24gZGVuaWVkIC0gIiArCkBAIC0xMDExLDYgKzEwNzQsNyBAQAogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI3NldFBsdWdpblN0YXRlfQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFBsdWdpbnNFbmFibGVkKGJvb2xlYW4gZmxhZykgewogICAgICAgICBzZXRQbHVnaW5TdGF0ZShQbHVnaW5TdGF0ZS5PTik7CiAgICAgfQpAQCAtMTE3Niw2ICsxMjQwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIFhTUyBBdWRpdG9yIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIGZsYWcgV2hldGhlciBYU1MgQXVkaXRvciBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgTGF5b3V0VGVzdENvbnRyb2xsZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVhTU0F1ZGl0b3JFbmFibGVkICE9IGZsYWcpIHsKKyAgICAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgamF2YXNjcmlwdCBpcyBlbmFibGVkLiA8Yj5Ob3RlOiBUaGUgZGVmYXVsdCBpcyBmYWxzZS48L2I+CiAgICAgICogQHJldHVybiBUcnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4KICAgICAgKi8KQEAgLTExODgsNiArMTI2NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmIHBsdWdpbnMgYXJlIGVuYWJsZWQuCiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVwbGFjZWQgYnkge0BsaW5rICNnZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBnZXRQbHVnaW5zRW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIG1QbHVnaW5TdGF0ZSA9PSBQbHVnaW5TdGF0ZS5PTjsKICAgICB9CkBAIC0xMjU2LDcgKzEzMzMsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRVc2VyQWdlbnRTdHJpbmcoU3RyaW5nIHVhKSB7CiAgICAgICAgIGlmICh1YSA9PSBudWxsIHx8IHVhLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZChzTG9ja0ZvckxvY2FsZVNldHRpbmdzKSB7Ci0gICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOyAKKyAgICAgICAgICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgaWYgKCFzTG9jYWxlLmVxdWFscyhjdXJyZW50TG9jYWxlKSkgewogICAgICAgICAgICAgICAgICAgICBzTG9jYWxlID0gY3VycmVudExvY2FsZTsKICAgICAgICAgICAgICAgICAgICAgbUFjY2VwdExhbmd1YWdlID0gZ2V0Q3VycmVudEFjY2VwdExhbmd1YWdlKCk7CkBAIC0xMzExLDExICsxMzg4LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1BY2NlcHRMYW5ndWFnZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBXZWJWaWV3IHdoZXRoZXIgaXQgbmVlZHMgdG8gc2V0IGEgbm9kZSB0byBoYXZlIGZvY3VzIHdoZW4KICAgICAgKiB7QGxpbmsgV2ViVmlldyNyZXF1ZXN0Rm9jdXMoaW50LCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QpfSBpcyBjYWxsZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmxhZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE5lZWRJbml0aWFsRm9jdXMoYm9vbGVhbiBmbGFnKSB7CkBAIC0xMzQyLDcgKzE0MTksNyBAQAogICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuUFJJT1JJVFkpKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIE92ZXJyaWRlIHRoZSB3YXkgdGhlIGNhY2hlIGlzIHVzZWQuIFRoZSB3YXkgdGhlIGNhY2hlIGlzIHVzZWQgaXMgYmFzZWQKICAgICAgKiBvbiB0aGUgbmF2aWdhdGlvbiBvcHRpb24uIEZvciBhIG5vcm1hbCBwYWdlIGxvYWQsIHRoZSBjYWNoZSBpcyBjaGVja2VkCkBAIC0xMzU2LDcgKzE0MzMsNyBAQAogICAgICAgICAgICAgbU92ZXJyaWRlQ2FjaGVNb2RlID0gbW9kZTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciBvdmVycmlkaW5nIHRoZSBjYWNoZSBtb2RlLiBGb3IgYSBmdWxsCiAgICAgICogZGVzY3JpcHRpb24sIHNlZSB0aGUge0BsaW5rICNzZXRDYWNoZU1vZGUoaW50KX0gZnVuY3Rpb24uCkBAIC0xMzY0LDcgKzE0NDEsNyBAQAogICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVNb2RlKCkgewogICAgICAgICByZXR1cm4gbU92ZXJyaWRlQ2FjaGVNb2RlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIElmIHNldCwgd2Via2l0IGFsdGVybmF0ZWx5IHNocmlua3MgYW5kIGV4cGFuZHMgaW1hZ2VzIHZpZXdlZCBvdXRzaWRlCiAgICAgICogb2YgYW4gSFRNTCBwYWdlIHRvIGZpdCB0aGUgc2NyZWVuLiBUaGlzIGNvbmZsaWN0cyB3aXRoIGF0dGVtcHRzIGJ5CkBAIC0xMzc5LDYgKzE0NTYsMzcgQEAKICAgICAgICAgfQogICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBtYXhpbXVtIGRlY29kZWQgaW1hZ2Ugc2l6ZS4gVGhlIGRlZmF1bHQgaXMKKyAgICAgKiAyIG1lZ3MgZm9yIHNtYWxsIG1lbW9yeSBkZXZpY2VzIGFuZCA4IG1lZ3MgZm9yIGxhcmdlIG1lbW9yeSBkZXZpY2VzLgorICAgICAqIEBwYXJhbSBzaXplIFRoZSBtYXhpbXVtIGRlY29kZWQgc2l6ZSwgb3IgemVybyB0byBzZXQgdG8gdGhlIGRlZmF1bHQuCisgICAgICogQGhpZGUgcGVuZGluZyBhcGkgY291bmNpbCBhcHByb3ZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1EZWNvZGVkSW1hZ2VTaXplKGxvbmcgc2l6ZSkgeworICAgICAgICBpZiAobU1heGltdW1EZWNvZGVkSW1hZ2VTaXplICE9IHNpemUpIHsKKyAgICAgICAgICAgIG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVByaXZhdGVCcm93c2luZ0VuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gZmxhZyBXaGV0aGVyIHByaXZhdGUgYnJvd3Npbmcgc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVByaXZhdGVCcm93c2luZ0VuYWJsZWQgIT0gZmxhZykgeworICAgICAgICAgICAgbVByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludCBnZXREb3VibGVUYXBUb2FzdENvdW50KCkgewogICAgICAgICByZXR1cm4gbURvdWJsZVRhcFRvYXN0Q291bnQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQppbmRleCAxOWFiZWMxLi5lYjM2YjVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwpAQCAtMzAwLDYgKzMwMSwzMyBAQAogICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbiBnZW5lcmFsLCBUZXh0VmlldyBtYWtlcyBhIGNhbGwgdG8gSW5wdXRNZXRob2RNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbgorICAgICAqIGluIG9uRHJhdy4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgV2ViVGV4dFZpZXcsIHdlIGRvIG5vdCBkcmF3LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJWaWV3Lm9uRHJhdyB0byB0YWtlIGNhcmUgb2YgdGhlIHBhcnQgdGhhdAorICAgICAqIG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgb25EcmF3U3Vic3RpdHV0ZSgpIHsKKyAgICAgICAgaWYgKCF3aWxsTm90RHJhdygpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgV2ViVGV4dFZpZXcgaXMgc2V0IHRvIGRyYXcsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYQorICAgICAgICAgICAgLy8gcGFzc3dvcmQsIG9uRHJhdyBjYWxscyB1cGRhdGVTZWxlY3Rpb24oKSwgc28gdGhpcyBjb2RlIHBhdGggaXMKKyAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKKyAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCisgICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoc3ApOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoc3ApOworICAgICAgICAgICAgaW50IGNhbmRTdGFydCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZEVuZCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5FbmQoc3ApOworICAgICAgICAgICAgaW1tLnVwZGF0ZVNlbGVjdGlvbih0aGlzLCBzZWxTdGFydCwgc2VsRW5kLCBjYW5kU3RhcnQsIGNhbmRFbmQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgLy8gb25EcmF3IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgcGFzc3dvcmQgZmllbGRzLiAgSWYgV2ViVGV4dFZpZXcgaXMKQEAgLTM2MCwxOSArMzg4LDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2VsZWN0aW9uQ2hhbmdlZChpbnQgc2VsU3RhcnQsIGludCBzZWxFbmQpIHsKLSAgICAgICAgaWYgKG1JblNldFRleHRBbmRLZWVwU2VsZWN0aW9uKSByZXR1cm47Ci0gICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKLSAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCi0gICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwotICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7Ci0gICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKLSAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7Ci0gICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCFtRnJvbVdlYktpdCAmJiAhbUZyb21Gb2N1c0NoYW5nZSAmJiAhbUZyb21TZXRJbnB1dFR5cGUKLSAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcgIT0gbnVsbCAmJiAhbUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9URVhUX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblNlbGVjdGlvbkNoYW5nZWQgc2VsU3RhcnQ9IiArIHNlbFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsRW5kPSIgKyBzZWxFbmQpOwpAQCAtNDgxLDkgKzQ5OCwxMCBAQAogICAgICAgICAgICAgLy8gdG8gYmlnIGZvciB0aGUgY2FzZSBvZiBhIHNtYWxsIHRleHRmaWVsZC4KICAgICAgICAgICAgIGludCBzbWFsbGVyU2xvcCA9IHNsb3AvMjsKICAgICAgICAgICAgIGlmIChkeCA+IHNtYWxsZXJTbG9wIHx8IGR5ID4gc21hbGxlclNsb3ApIHsKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhTY3JvbGxYID0gKGZsb2F0KSBUb3VjaC5nZXRNYXhTY3JvbGxYKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dCgpLCBtU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IGdldExheW91dCgpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAib25Ub3VjaEV2ZW50IHg9IiArIG1TY3JvbGxYICsgIiB5PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2Nyb2xsWSArICIgbWF4WD0iICsgbWF4U2Nyb2xsWCk7CkBAIC02NjcsNiArNjg1LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24odGV4dCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24pOwogICAgICAgICB9CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSBtV2ViVmlldy5pbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE5LDE0ICs5MzgsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCA0Y2EyMTBmLi40NGYwMzZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE4LDM1ICsxOCwzMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLldpZGdldDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29ybmVyUGF0aEVmZmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQ7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKQEAgLTY0LDMyICs2MiwzNCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkRldmljZU9yaWVudGF0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJUZXh0Vmlldy5BdXRvQ29tcGxldGVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoRXZlbnREYXRhOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoSGlnaGxpZ2h0RGF0YTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9sczsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTk3LDggKzk3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCiAvKioKICAqIDxwPkEgVmlldyB0aGF0IGRpc3BsYXlzIHdlYiBwYWdlcy4gVGhpcyBjbGFzcyBpcyB0aGUgYmFzaXMgdXBvbiB3aGljaCB5b3UKICAqIGNhbiByb2xsIHlvdXIgb3duIHdlYiBicm93c2VyIG9yIHNpbXBseSBkaXNwbGF5IHNvbWUgb25saW5lIGNvbnRlbnQgd2l0aGluIHlvdXIgQWN0aXZpdHkuCkBAIC0yOTMsNyArMjkxLDcgQEAKICAqIHByb3BlcnR5IHRvIHtAY29kZSBkZXZpY2UtZHBpfS4gVGhpcyBzdG9wcyBBbmRyb2lkIGZyb20gcGVyZm9ybWluZyBzY2FsaW5nIGluIHlvdXIgd2ViIHBhZ2UgYW5kCiAgKiBhbGxvd3MgeW91IHRvIG1ha2UgdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBmb3IgZWFjaCBkZW5zaXR5IHZpYSBDU1MgYW5kIEphdmFTY3JpcHQuPC9wPgogICoKLSAqIAorICoKICAqLwogQFdpZGdldAogcHVibGljIGNsYXNzIFdlYlZpZXcgZXh0ZW5kcyBBYnNvbHV0ZUxheW91dApAQCAtMzEwLDQ5ICszMDgsNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAid2VidmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlbmRlZFpvb21Db250cm9scyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKLSAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOwotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOwotICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20sIGJvb2xlYW4gY2FuWm9vbU91dCkgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICBzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKLSAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKLSAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWm9vbUNvbnRyb2xzICAgIG1QbHVzTWludXNab29tQ29udHJvbHM7Ci0gICAgfQorICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOwogCiAgICAgLyoqCiAgICAgICogIFRyYW5zcG9ydGF0aW9uIG9iamVjdCBmb3IgcmV0dXJuaW5nIFdlYlZpZXcgYWNyb3NzIHRocmVhZCBib3VuZGFyaWVzLgpAQCAtMzk4LDYgKzM1NCw4IEBACiAgICAgLy8gbW9yZSBrZXkgZXZlbnRzLgogICAgIHByaXZhdGUgaW50IG1UZXh0R2VuZXJhdGlvbjsKIAorICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBpbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpIHsgbVRleHRHZW5lcmF0aW9uKys7IH0KKwogICAgIC8vIFVzZWQgYnkgV2ViVmlld0NvcmUgdG8gY3JlYXRlIGNoaWxkIHZpZXdzLgogICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVmlld01hbmFnZXIgbVZpZXdNYW5hZ2VyOwogCkBAIC00NDUsNiArNDAzLDE0IEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtTGFzdFZlbFg7CiAgICAgcHJpdmF0ZSBmbG9hdCBtTGFzdFZlbFk7CiAKKyAgICAvLyBBIHBvaW50ZXIgdG8gdGhlIG5hdGl2ZSBzY3JvbGxhYmxlIGxheWVyIHdoZW4gZHJhZ2dpbmcgbGF5ZXJzLiAgT25seQorICAgIC8vIHZhbGlkIHdoZW4gbVRvdWNoTW9kZSBpcyBUT1VDSF9EUkFHX0xBWUVSX01PREUuCisgICAgcHJpdmF0ZSBpbnQgbVNjcm9sbGluZ0xheWVyOworCisgICAgLy8gb25seSB0cmlnZ2VyIGFjY2VsZXJhdGVkIGZsaW5nIGlmIHRoZSBuZXcgdmVsb2NpdHkgaXMgYXQgbGVhc3QKKyAgICAvLyBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gdGltZXMgb2YgdGhlIHByZXZpb3VzIHZlbG9jaXR5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OID0gMC4yZjsKKwogICAgIC8qKgogICAgICAqIFRvdWNoIG1vZGUKICAgICAgKi8KQEAgLTQ1Niw4ICs0MjIsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TSE9SVFBSRVNTX01PREUgPSA1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET1VCTEVfVEFQX01PREUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TRUxFQ1RfTU9ERSA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1BJTkNIX0RSQUcgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9QSU5DSF9EUkFHID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRFJBR19MQVlFUl9NT0RFID0gOTsKIAogICAgIC8vIFdoZXRoZXIgdG8gZm9yd2FyZCB0aGUgdG91Y2ggZXZlbnRzIHRvIFdlYkNvcmUKICAgICBwcml2YXRlIGJvb2xlYW4gbUZvcndhcmRUb3VjaEV2ZW50cyA9IGZhbHNlOwpAQCAtNDk2LDEwICs0NjIsNiBAQAogICAgIC8vIHRydWUgaWYgb25QYXVzZSBoYXMgYmVlbiBjYWxsZWQgKGFuZCBub3Qgb25SZXN1bWUpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1BhdXNlZDsKIAotICAgIC8vIHRydWUgaWYsIGR1cmluZyBhIHRyYW5zaXRpb24gdG8gYSBuZXcgcGFnZSwgd2UncmUgZGVsYXlpbmcKLSAgICAvLyBkZWxldGluZyBhIHJvb3QgbGF5ZXIgdW50aWwgdGhlcmUncyBzb21ldGhpbmcgdG8gZHJhdyBvZiB0aGUgbmV3IHBhZ2UuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EZWxheWVkRGVsZXRlUm9vdExheWVyOwotCiAgICAgLyoqCiAgICAgICogQ3VzdG9taXphYmxlIGNvbnN0YW50CiAgICAgICovCkBAIC01MjEsOSArNDgzLDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZMSU5HX1RJTUUgPSAyNTA7CiAgICAgLy8gZHJhdyB1bmZpbHRlcmVkIGFmdGVyIGRyYWcgaXMgaGVsZCB3aXRob3V0IG1vdmVtZW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfVElNRSA9IDEwMDsKLSAgICAvLyBUaGUgdGltZSB0aGF0IHRoZSBab29tIENvbnRyb2xzIGFyZSB2aXNpYmxlIGJlZm9yZSBmYWRpbmcgYXdheQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWk9PTV9DT05UUk9MU19USU1FT1VUID0KLSAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFpvb21Db250cm9sc1RpbWVvdXQoKTsKICAgICAvLyBUaGUgYW1vdW50IG9mIGNvbnRlbnQgdG8gb3ZlcmxhcCBiZXR3ZWVuIHR3byBzY3JlZW5zIHdoZW4gZ29pbmcgdGhyb3VnaAogICAgIC8vIHBhZ2VzIHdpdGggdGhlIHNwYWNlIGJhciwgaW4gcGl4ZWxzLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NDUk9MTF9PVkVSTEFQID0gMjQ7CkBAIC01NjQsMTUgKzUyMywyNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX0lHTk9SRSAgICAgICAgICA9IDM7CiAgICAgcHJpdmF0ZSBpbnQgbUhlbGRNb3Rpb25sZXNzOwogCi0gICAgLy8gd2hldGhlciBzdXBwb3J0IG11bHRpLXRvdWNoCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdXBwb3J0TXVsdGlUb3VjaDsKLSAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgLy8gQW4gaW5zdGFuY2UgZm9yIGluamVjdGluZyBhY2Nlc3NpYmlsaXR5IGluIFdlYlZpZXdzIHdpdGggZGlzYWJsZWQKKyAgICAvLyBKYXZhU2NyaXB0IG9yIG9uZXMgZm9yIHdoaWNoIG5vIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGV4aXN0cworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUluamVjdG9yIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3I7CiAKLSAgICAvLyB0aGUgYW5jaG9yIHBvaW50IGluIHRoZSBkb2N1bWVudCBzcGFjZSB3aGVyZSBWSUVXX1NJWkVfQ0hBTkdFRCBzaG91bGQKLSAgICAvLyBhcHBseSB0bwotICAgIHByaXZhdGUgaW50IG1BbmNob3JYOwotICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworICAgIC8vIHRoZSBjb2xvciB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG91Y2ggcmVjdGFuZ2xlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtSGlnaHRsaWdodENvbG9yID0gMHgzMzAwMDAwMDsKKyAgICAvLyB0aGUgcm91bmQgY29ybmVyIGZvciB0aGUgaGlnaGxpZ2h0IHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUT1VDSF9ISUdITElHSFRfQVJDID0gNS4wZjsKKyAgICAvLyB0aGUgcmVnaW9uIGluZGljYXRpbmcgd2hlcmUgdGhlIHVzZXIgdG91Y2hlZCBvbiB0aGUgc2NyZWVuCisgICAgcHJpdmF0ZSBSZWdpb24gbVRvdWNoSGlnaGxpZ2h0UmVnaW9uID0gbmV3IFJlZ2lvbigpOworICAgIC8vIHRoZSBwYWludCBmb3IgdGhlIHRvdWNoIGhpZ2hsaWdodAorICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoSGlnaHRsaWdodFBhaW50OworICAgIC8vIGRlYnVnIG9ubHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RPVUNIX0hJR0hMSUdIVCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0hJR0hMSUdIVF9FTEFQU0VfVElNRSA9IDIwMDA7CisgICAgcHJpdmF0ZSBQYWludCBtVG91Y2hDcm9zc0hhaXJDb2xvcjsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRYOworICAgIHByaXZhdGUgaW50IG1Ub3VjaEhpZ2hsaWdodFk7CiAKICAgICAvKgogICAgICAqIFByaXZhdGUgbWVzc2FnZSBpZHMKQEAgLTYwNiw3ICs1NzQsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQgICAgICAgICA9IDEwNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhURklFTERfVEVYVF9NU0dfSUQgICAgICAgPSAxMDg7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfWk9PTV9SQU5HRSAgICAgICAgICAgICAgICAgID0gMTA5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9PVVRfT0ZfUExVR0lOICAgICAgICAgICAgICAgICA9IDExMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSEFORExFRF9OQVZfS0VZICAgICAgICAgICAgICAgICAgPSAxMTA7CiAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9URVhUX0VOVFJZICAgICAgICAgICAgICAgICAgID0gMTExOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCAgICAgICA9IDExMjsKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfUkVDVF9NU0dfSUQgICAgICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02MjAsMTYgKzU4OCwxOSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19GVUxMU0NSRUVOICAgICAgICAgICAgICAgICAgICA9IDEyMDsKICAgICBzdGF0aWMgZmluYWwgaW50IEhJREVfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgc3RhdGljIGZpbmFsIGludCBET01fRk9DVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgID0gMTIyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEICAgICAgICAgICA9IDEyMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9ST09UX0xBWUVSX01TR19JRCAgICAgICAgICAgICAgPSAxMjQ7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0JBU0VfQ09OVEVOVCAgICAgICAgICAgICAgID0gMTIzOworICAgIC8vIDEyNDsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgc3RhdGljIGZpbmFsIGludCBGSU5EX0FHQUlOICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0ZJVF9SRUNUICAgICAgICAgICAgICAgICAgICA9IDEyNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEID0gMTI4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NDUk9MTEJBUl9NT0RFUyAgICAgICAgICAgICAgICA9IDEyOTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCAgICAgICAgICAgPSAxMzA7CisgICAgc3RhdGljIGZpbmFsIGludCBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTICAgICAgICAgID0gMTMxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEICAgICAgICAgICA9IDEzMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9QQUNLQUdFX01TR19JRCA9IFNDUk9MTF9UT19NU0dfSUQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfU0NST0xMQkFSX01PREVTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIYW5kbGVyUHJpdmF0ZURlYnVnU3RyaW5nID0gewogICAgICAgICAiUkVNRU1CRVJfUEFTU1dPUkQiLCAvLyAgICAgICAgICAgICAgPSAxOwpAQCAtNjU0LDcgKzYyNSw3IEBACiAgICAgICAgICJXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRCIsIC8vICAgICA9IDEwNzsKICAgICAgICAgIlVQREFURV9URVhURklFTERfVEVYVF9NU0dfSUQiLCAvLyAgID0gMTA4OwogICAgICAgICAiVVBEQVRFX1pPT01fUkFOR0UiLCAvLyAgICAgICAgICAgICAgPSAxMDk7Ci0gICAgICAgICJNT1ZFX09VVF9PRl9QTFVHSU4iLCAvLyAgICAgICAgICAgICA9IDExMDsKKyAgICAgICAgIlVOSEFORExFRF9OQVZfS0VZIiwgLy8gICAgICAgICAgICAgID0gMTEwOwogICAgICAgICAiQ0xFQVJfVEVYVF9FTlRSWSIsIC8vICAgICAgICAgICAgICAgPSAxMTE7CiAgICAgICAgICJVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gICA9IDExMjsKICAgICAgICAgIlNIT1dfUkVDVF9NU0dfSUQiLCAvLyAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjY3LDEzICs2MzgsMTYgQEAKICAgICAgICAgIlNIT1dfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIwOwogICAgICAgICAiSElERV9GVUxMU0NSRUVOIiwgLy8gICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgICAgICJET01fRk9DVVNfQ0hBTkdFRCIsIC8vICAgICAgICAgICAgICA9IDEyMjsKLSAgICAgICAgIklNTUVESUFURV9SRVBBSU5UX01TR19JRCIsIC8vICAgICAgID0gMTIzOwotICAgICAgICAiU0VUX1JPT1RfTEFZRVJfTVNHX0lEIiwgLy8gICAgICAgICAgPSAxMjQ7CisgICAgICAgICJSRVBMQUNFX0JBU0VfQ09OVEVOVCIsIC8vICAgICAgICAgICA9IDEyMzsKKyAgICAgICAgIjEyNCIsIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI0OwogICAgICAgICAiUkVUVVJOX0xBQkVMIiwgLy8gICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgICAgICJGSU5EX0FHQUlOIiwgLy8gICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICAgICAgIkNFTlRFUl9GSVRfUkVDVCIsIC8vICAgICAgICAgICAgICAgID0gMTI3OwogICAgICAgICAiUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQiLCAvLyA9IDEyODsKLSAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiIC8vICAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VUX1NDUk9MTEJBUl9NT0RFUyIsIC8vICAgICAgICAgICAgPSAxMjk7CisgICAgICAgICJTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQiLCAvLyAgICAgICA9IDEzMDsKKyAgICAgICAgIlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMiLCAvLyAgICAgID0gMTMxOworICAgICAgICAiU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEIiAvLyAgICAgICAgPSAxMzI7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKQEAgLTY4Niw0OSArNjYwLDkgQEAKICAgICAvLyB0aGUgbWluaW11bSBwcmVmZXJyZWQgd2lkdGggaXMgaHVnZSwgYW4gdXBwZXIgbGltaXQgaXMgbmVlZGVkLgogICAgIHN0YXRpYyBpbnQgc01heFZpZXdwb3J0V2lkdGggPSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwogCi0gICAgLy8gZGVmYXVsdCBzY2FsZSBsaW1pdC4gRGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgLy8gc2NhbGUgbGltaXQsIHdoaWNoIGNhbiBiZSBzZXQgdGhyb3VnaCB2aWV3cG9ydCBtZXRhIHRhZyBpbiB0aGUgd2ViIHBhZ2UKLSAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotCiAgICAgLy8gaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LiAwIG1lYW5zIHVzaW5nIGRlZmF1bHQuCiAgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IDA7CiAKLSAgICAvLyB3aGlsZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKLSAgICAvLyBjdXJyZW50IHdpbmRvdy4gVGhlIHBhZ2UgaXMgYWxpdmUsIGluIGFub3RoZXIgd29yZHMsIHlvdSBjYW4gY2xpY2sgdG8KLSAgICAvLyBmb2xsb3cgdGhlIGxpbmtzLiBEb3VibGUgdGFwIHdpbGwgdG9nZ2xlIGJldHdlZW4gem9vbSBvdmVydmlldyBtb2RlIGFuZAotICAgIC8vIHRoZSBsYXN0IHpvb20gc2NhbGUuCi0gICAgYm9vbGVhbiBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLQotICAgIC8vIGlkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZSBlc3BuLAotICAgIC8vIGVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdmlld3BvcnQgc2l6ZSBpcy4KLSAgICBpbnQgbVpvb21PdmVydmlld1dpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKLQotICAgIC8vIGRlZmF1bHQgc2NhbGUuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgotICAgIHN0YXRpYyBpbnQgREVGQVVMVF9TQ0FMRV9QRVJDRU5UOwotICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7Ci0KLSAgICAvLyBzZXQgdG8gdHJ1ZSB0ZW1wb3JhcmlseSBkdXJpbmcgU2NhbGVHZXN0dXJlIHRyaWdnZXJlZCB6b29tCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLQotICAgIC8vIGNvbXB1dGVkIHNjYWxlIGFuZCBpbnZlcnNlLCBmcm9tIG1ab29tV2lkdGguCi0gICAgcHJpdmF0ZSBmbG9hdCBtQWN0dWFsU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52QWN0dWFsU2NhbGU7Ci0gICAgLy8gaWYgdGhpcyBpcyBub24temVybywgaXQgaXMgdXNlZCBvbiBkcmF3aW5nIHJhdGhlciB0aGFuIG1BY3R1YWxTY2FsZQotICAgIHByaXZhdGUgZmxvYXQgbVpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZJbml0aWFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkZpbmFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWDsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFk7Ci0gICAgcHJpdmF0ZSBsb25nIG1ab29tU3RhcnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclNjcm9sbCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOwpAQCAtNzUyLDYgKzY4NiwxOSBAQAogICAgIHByaXZhdGUgaW50IG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogICAgIHByaXZhdGUgaW50IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBTQ1JPTExCQVJfQVVUTzsKIAorICAgIC8vIHRoZSBhbGlhcyB2aWEgd2hpY2ggYWNjZXNzaWJpbGl0eSBKYXZhU2NyaXB0IGludGVyZmFjZSBpcyBleHBvc2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFID0gImFjY2Vzc2liaWxpdHkiOworCisgICAgLy8gSmF2YVNjcmlwdCB0byBpbmplY3QgdGhlIHNjcmlwdCBjaG9vc2VyIHdoaWNoIHdpbGwKKyAgICAvLyBwaWNrIHRoZSByaWdodCBzY3JpcHQgZm9yIHRoZSBjdXJyZW50IFVSTAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQgPQorICAgICAgICAiamF2YXNjcmlwdDooZnVuY3Rpb24oKSB7IiArCisgICAgICAgICIgICAgdmFyIGNob29zZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnNyYyA9ICdodHRwczovL3NzbC5nc3RhdGljLmNvbS9hY2Nlc3NpYmlsaXR5L2phdmFzY3JpcHQvYW5kcm9pZC9BbmRyb2lkU2NyaXB0Q2hvb3Nlci51c2VyLmpzJzsiICsKKyAgICAgICAgIiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGNob29zZXIpOyIgKworICAgICAgICAiICB9KSgpOyI7CisKICAgICAvLyBVc2VkIHRvIG1hdGNoIGtleSBkb3ducyBhbmQga2V5IHVwcwogICAgIHByaXZhdGUgYm9vbGVhbiBtR290S2V5RG93bjsKIApAQCAtODU2LDQzICs4MDMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIFZpZXcgY29udGFpbmluZyB0aGUgem9vbSBjb250cm9scwotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOwotCi0gICAgLy8gbVpvb21CdXR0b25zQ29udHJvbGxlciB3aWxsIGJlIGxhenkgaW5pdGlhbGl6ZWQgaW4KLSAgICAvLyBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci0KLSAgICAvLyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20uICBUaGV5IGFyZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7Ci0KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciBtWm9vbUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7Ci0gICAgICAgICAgICBpZiAoem9vbUluKSB7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBhIENvbnRleHQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgpAQCAtOTE3LDcgKzgyNywxOCBAQAogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGxheW91dCBwYXJhbWV0ZXJzIGFuZCBhIGRlZmF1bHQgc3R5bGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCisgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCisgICAgICovCisgICAgcHVibGljIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsLCBwcml2YXRlQnJvd3NpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTI4LDUxICs4NDksNDEgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KICAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KLSAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50YXJlZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGVyZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCiAgICAgICogb2JqZWN0IGltcGxlbWVudGluZyB0aG9zZSBpbnRlcmZhY2VzLCBhcyB2YWx1ZXMuCiAgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcywgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOworCisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KS5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoamF2YXNjcmlwdEludGVyZmFjZXMpOworICAgICAgICB9CiAKICAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eShjb250ZXh0LCB0aGlzKTsKICAgICAgICAgbVZpZXdNYW5hZ2VyID0gbmV3IFZpZXdNYW5hZ2VyKHRoaXMpOwogICAgICAgICBtV2ViVmlld0NvcmUgPSBuZXcgV2ViVmlld0NvcmUoY29udGV4dCwgdGhpcywgbUNhbGxiYWNrUHJveHksIGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKICAgICAgICAgbURhdGFiYXNlID0gV2ViVmlld0RhdGFiYXNlLmdldEluc3RhbmNlKGNvbnRleHQpOwogICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoY29udGV4dCk7CisgICAgICAgIG1ab29tTWFuYWdlciA9IG5ldyBab29tTWFuYWdlcih0aGlzLCBtQ2FsbGJhY2tQcm94eSk7CiAKKyAgICAgICAgLyogVGhlIGluaXQgbWV0aG9kIG11c3QgZm9sbG93IHRoZSBjcmVhdGlvbiBvZiBjZXJ0YWluIG1lbWJlciB2YXJpYWJsZXMsCisgICAgICAgICAqIHN1Y2ggYXMgdGhlIG1ab29tTWFuYWdlci4KKyAgICAgICAgICovCisgICAgICAgIGluaXQoKTsKICAgICAgICAgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoY29udGV4dCk7CisKKyAgICAgICAgaWYgKHByaXZhdGVCcm93c2luZykgeworICAgICAgICAgICAgc3RhcnRQcml2YXRlQnJvd3NpbmcoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOwotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1BY3R1YWxTY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1BY3R1YWxTY2FsZSA+IG1NaW5ab29tU2NhbGUgJiYgIW1Jblpvb21PdmVydmlldzsKLSAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zLCBhcyB3ZWxsIGFzIHRoZSBmaXQgdG8gcGFnZQotICAgICAgICAgICAgLy8gYnV0dG9uLCBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbgotICAgICAgICAgICAgLy8gb3Igb3V0LgotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTk5MiwzNCArOTAzLDM4IEBACiAgICAgICAgIC8vIHVzZSBvbmUgbGluZSBoZWlnaHQsIDE2IGJhc2VkIG9uIG91ciBjdXJyZW50IGRlZmF1bHQgZm9udCwgZm9yIGhvdwogICAgICAgICAvLyBmYXIgd2UgYWxsb3cgYSB0b3VjaCBiZSBhd2F5IGZyb20gdGhlIGVkZ2Ugb2YgYSBsaW5rCiAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgIC8vIGRlbnNpdHkgYWRqdXN0ZWQgc2NhbGUgZmFjdG9ycwotICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBtQWN0dWFsU2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gZGVuc2l0eTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgIERFRkFVTFRfTUlOX1pPT01fU0NBTEUgPSAwLjI1ZiAqIGRlbnNpdHk7Ci0gICAgICAgIG1NYXhab29tU2NhbGUgPSBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgICAgICBtTWluWm9vbVNjYWxlID0gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CiAgICAgICAgIG1NYXhpbXVtRmxpbmcgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaW52ZXJzZSBvZiB0aGUgZGVuc2l0eSBzcXVhcmVkLgorICAgICAgICBEUkFHX0xBWUVSX0lOVkVSU0VfREVOU0lUWV9TUVVBUkVEID0gMSAvIChkZW5zaXR5ICogZGVuc2l0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwb3NlcyBhY2Nlc3NpYmlsaXR5IEFQSXMgdG8gSmF2YVNjcmlwdCBieSBhcHBlbmRpbmcgdGhlbSB0byB0aGUgSmF2YVNjcmlwdAorICAgICAqIGludGVyZmFjZXMgbWFwIHByb3ZpZGVkIGJ5IHRoZSBXZWJWaWV3IGNsaWVudC4gSW4gY2FzZSBvZiBjb25mbGljdGluZworICAgICAqIGFsaWFzIHdpdGggdGhlIG9uZSBvZiB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgdGhlIHVzZXIgc3BlY2lmaWVkIG9uZSB3aW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIEEgbWFwIHdpdGggaW50ZXJmYWNlcyB0byBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzLmNvbnRhaW5zS2V5KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFKSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiSmF2YVNjcmlwdCBpbnRlcmZhY2UgbWFwcGVkIHRvIFwiIiArIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFCisgICAgICAgICAgICAgICAgICAgICsgIlwiIG92ZXJyaWRlcyB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgSmF2YVNjcmlwdCBpbnRlcmZhY2UuIE5vIGFjY2Vzc2liaWxpdHkiCisgICAgICAgICAgICAgICAgICAgICsgIkFQSSB3aWxsIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdCEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGV4cG9zZSB0aGUgVFRTIGZvciBub3cgLi4uCisgICAgICAgIGphdmFzY3JpcHRJbnRlcmZhY2VzLnB1dChBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICBuZXcgVGV4dFRvU3BlZWNoKGdldENvbnRleHQoKSwgbnVsbCkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShpbnQgem9vbURlbnNpdHkpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKKyAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQogICAgICAgICAgICAgICAgICogMTAwIC8gem9vbURlbnNpdHk7Ci0gICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiAwLjAxKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGRlbnNpdHkgLyBtRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW1pdHMKLSAgICAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUgKiBzY2FsZUZhY3RvciwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9CisgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZGVuc2l0eSk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG9uU2F2ZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLApAQCAtMTEzNiwxNCArMTA1MSwxNiBAQAogICAgICAqIHJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpLiBEb2VzIG5vdCBjYXJlIGFib3V0CiAgICAgICogc2Nyb2xsaW5nCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CisgICAgaW50IGdldFRpdGxlSGVpZ2h0KCkgewogICAgICAgICByZXR1cm4gbVRpdGxlQmFyICE9IG51bGwgPyBtVGl0bGVCYXIuZ2V0SGVpZ2h0KCkgOiAwOwogICAgIH0KIAogICAgIC8qCiAgICAgICogUmV0dXJuIHRoZSBhbW91bnQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KSB0aGF0IGlzIHZpc2libGUKKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgeworICAgIHB1YmxpYyBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgewogICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIG1TY3JvbGxZLCAwKTsKICAgICB9CiAKQEAgLTE0MDQsMjkgKzEzMjEsMjMgQEAKICAgICAgICAgLy8gbm93IHVwZGF0ZSB0aGUgYnVuZGxlCiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxYIiwgbVNjcm9sbFgpOwogICAgICAgICBiLnB1dEludCgic2Nyb2xsWSIsIG1TY3JvbGxZKTsKLSAgICAgICAgYi5wdXRGbG9hdCgic2NhbGUiLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICBiLnB1dEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbVRleHRXcmFwU2NhbGUpOwotICAgICAgICBiLnB1dEJvb2xlYW4oIm92ZXJ2aWV3IiwgbUluWm9vbU92ZXJ2aWV3KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUoYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN0b3JlSGlzdG9yeVBpY3R1cmVGaWVsZHMoUGljdHVyZSBwLCBCdW5kbGUgYikgewogICAgICAgICBpbnQgc3ggPSBiLmdldEludCgic2Nyb2xsWCIsIDApOwogICAgICAgICBpbnQgc3kgPSBiLmdldEludCgic2Nyb2xsWSIsIDApOwotICAgICAgICBmbG9hdCBzY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisKICAgICAgICAgbURyYXdIaXN0b3J5ID0gdHJ1ZTsKICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gcDsKICAgICAgICAgbVNjcm9sbFggPSBzeDsKICAgICAgICAgbVNjcm9sbFkgPSBzeTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnJlc3RvcmVab29tU3RhdGUoYik7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIG1IaXN0b3J5V2lkdGggPSBNYXRoLnJvdW5kKHAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKICAgICAgICAgbUhpc3RvcnlIZWlnaHQgPSBNYXRoLnJvdW5kKHAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7Ci0gICAgICAgIC8vIGFzIGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSBvZiB0aGUgdmlldyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHNldCB1cAotICAgICAgICAvLyBtQWN0dWFsU2NhbGUsIHNvIHRoYXQgd2hlbiBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkLCB0aGUgcmVzdCB3aWxsCi0gICAgICAgIC8vIGJlIHNldCBjb3JyZWN0bHkKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBiLmdldEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgc2NhbGUpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtMTYzOCw2ICsxNTQ5LDQ1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBzYXZlV2ViQXJjaGl2ZShmaWxlbmFtZSwgZmFsc2UsIG51bGwpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSB7CisgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSAoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1CYXNlbmFtZSA9IGJhc2VuYW1lOworICAgICAgICAgICAgbUF1dG9uYW1lID0gYXV0b25hbWU7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgU3RyaW5nIG1CYXNlbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBib29sZWFuIG1BdXRvbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gbUNhbGxiYWNrOworICAgICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBtUmVzdWx0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBiYXNlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGJhc2VuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdGhlIHdlYiBhcmNoaXZlIGhhcyBiZWVuIHNhdmVkLiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGZvciBvblJlY2VpdmVWYWx1ZSB3aWxsIGVpdGhlciBiZSB0aGUgZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkLCBvciBudWxsIGlmIHNhdmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgZmlsZSBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNBVkVfV0VCQVJDSElWRSwKKyAgICAgICAgICAgIG5ldyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UoYmFzZW5hbWUsIGF1dG9uYW1lLCBjYWxsYmFjaykpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGN1cnJlbnQgbG9hZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKQEAgLTE3MzcsNiArMTY4NywzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZCBpbiB0aGlzIFdlYlZpZXcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkICgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNldHRpbmdzKCkuaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UHJpdmF0ZUJyb3dzaW5nICgpIHsKKyAgICAgICAgYm9vbGVhbiB3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkID0gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisKKyAgICAgICAgZ2V0U2V0dGluZ3MoKS5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworCisgICAgICAgIGlmICghd2FzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBkYXRhID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAyNCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGZpbGUgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKGNvbS5hbmRyb2lkLmludGVybmFsLlIucmF3LmluY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UpKTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgICAgICAgICAgd2hpbGUgKChzaXplID0gZmlsZS5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSB0aGlzIGlzIGEgc3RhdGljIHJlc291cmNlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZERhdGFXaXRoQmFzZVVSTChudWxsLCBkYXRhLnRvU3RyaW5nKCksICJ0ZXh0L2h0bWwiLCAidXRmLTgiLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBleHRlbmRTY3JvbGwoaW50IHkpIHsKICAgICAgICAgaW50IGZpbmFsWSA9IG1TY3JvbGxlci5nZXRGaW5hbFkoKTsKICAgICAgICAgaW50IG5ld1kgPSBwaW5Mb2NZKGZpbmFsWSArIHkpOwpAQCAtMTgwNiw2ICsxNzg0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBjbGVhclZpZXcoKSB7CiAgICAgICAgIG1Db250ZW50V2lkdGggPSAwOwogICAgICAgICBtQ29udGVudEhlaWdodCA9IDA7CisgICAgICAgIG5hdGl2ZVNldEJhc2VMYXllcigwKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkNMRUFSX0NPTlRFTlQpOwogICAgIH0KIApAQCAtMTgxOSw4ICsxNzk4LDkgQEAKICAgICAgKiAgICAgICAgIGJvdW5kcyBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgUGljdHVyZSBjYXB0dXJlUGljdHVyZSgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gbVdlYlZpZXdDb3JlKSByZXR1cm4gbnVsbDsgLy8gY2hlY2sgZm9yIG91dCBvZiBtZW1vcnkgdGFiCi0gICAgICAgIHJldHVybiBtV2ViVmlld0NvcmUuY29weUNvbnRlbnRQaWN0dXJlKCk7CisgICAgICAgIFBpY3R1cmUgcmVzdWx0ID0gbmV3IFBpY3R1cmUoKTsKKyAgICAgICAgbmF0aXZlQ29weUJhc2VDb250ZW50VG9QaWN0dXJlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODQ5LDcgKzE4MjksNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNjYWxlKCkgewotICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODYxLDcgKzE4NDEsNyBAQAogICAgICAqIEBwYXJhbSBzY2FsZUluUGVyY2VudCBUaGUgaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTY2FsZShpbnQgc2NhbGVJblBlcmNlbnQpIHsKLSAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IHNjYWxlSW5QZXJjZW50OworICAgICAgICBtWm9vbU1hbmFnZXIuc2V0SW5pdGlhbFNjYWxlSW5QZXJjZW50KHNjYWxlSW5QZXJjZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NzUsMTMgKzE4NTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5OTYsNyArMTk3MCw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgeworICAgIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgewogLy8gICAgICAgIExvZy5kKExPR1RBRywgIi0tIHBpbkxvYyAiICsgeCArICIgIiArIHZpZXdNYXggKyAiICIgKyBkb2NNYXgpOwogICAgICAgICBpZiAoZG9jTWF4IDwgdmlld01heCkgeyAgIC8vIHRoZSBkb2MgaGFzIHJvb20gb24gdGhlIHNpZGVzIGZvciAiYmxhbmsiCiAgICAgICAgICAgICAvLyBwaW4gdGhlIHNob3J0IGRvY3VtZW50IHRvIHRoZSB0b3AvbGVmdCBvZiB0aGUgc2NyZWVuCkBAIC0yMDEzLDEyICsxOTg3LDEyIEBACiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB4IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NYKGludCB4KSB7CisgICAgaW50IHBpbkxvY1goaW50IHgpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh4LCBnZXRWaWV3V2lkdGgoKSwgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpKTsKICAgICB9CiAKICAgICAvLyBFeHBlY3RzIHkgaW4gdmlldyBjb29yZGluYXRlcwotICAgIHByaXZhdGUgaW50IHBpbkxvY1koaW50IHkpIHsKKyAgICBpbnQgcGluTG9jWShpbnQgeSkgewogICAgICAgICByZXR1cm4gcGluTG9jKHksIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwKICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgfQpAQCAtMjA2OCw3ICsyMDQyLDcgQEAKICAgICAgKiBoZWlnaHQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdmlld1RvQ29udGVudERpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwOTQsNyArMjA2OCw3IEBACiAgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WGYoaW50IHgpIHsKLSAgICAgICAgcmV0dXJuIHggKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiB4ICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAzLDcgKzIwNzcsNyBAQAogICAgICAqIGVtYmVkZGVkIGludG8gdGhlIFdlYlZpZXcuIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGZsb2F0LgogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgdmlld1RvQ29udGVudFlmKGludCB5KSB7Ci0gICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbUludkFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4gKHkgLSBnZXRUaXRsZUhlaWdodCgpKSAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjExMyw3ICsyMDg3LDcgQEAKICAgICAgKiBoZWlnaHQuCiAgICAgICovCiAgICAgLypwYWNrYWdlKi8gaW50IGNvbnRlbnRUb1ZpZXdEaW1lbnNpb24oaW50IGQpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTU0LDcgKzIxMjgsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldywgZ2l2ZW4gcmVjdGFuZ2xlIGNvb3JkaW5hdGVzIGluCiAgICAgLy8gY29udGVudCBzcGFjZQogICAgIHByaXZhdGUgdm9pZCB2aWV3SW52YWxpZGF0ZShpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgaW52YWxpZGF0ZSgoaW50KU1hdGguZmxvb3IobCAqIHNjYWxlKSwKICAgICAgICAgICAgICAgICAgICAoaW50KU1hdGguZmxvb3IodCAqIHNjYWxlKSArIGR5LApAQCAtMjE2NSw3ICsyMTM5LDcgQEAKICAgICAvLyBDYWxsZWQgYnkgSk5JIHRvIGludmFsaWRhdGUgdGhlIFZpZXcgYWZ0ZXIgYSBkZWxheSwgZ2l2ZW4gcmVjdGFuZ2xlCiAgICAgLy8gY29vcmRpbmF0ZXMgaW4gY29udGVudCBzcGFjZQogICAgIHByaXZhdGUgdm9pZCB2aWV3SW52YWxpZGF0ZURlbGF5ZWQobG9uZyBkZWxheSwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIGZpbmFsIGludCBkeSA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZChkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLApAQCAtMjIwMywxMyArMjE3Nyw3IEBACiAgICAgICAgICAgICAvLyB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCiAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewogICAgICAgICAgICAgICAgIC8vIHJlcGluIG91ciBzY3JvbGwsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIG5ldyBjb250ZW50IHNpemUKLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkpOwotICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKHBpbkxvY1gobVNjcm9sbFgpLCBwaW5Mb2NZKG1TY3JvbGxZKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2Nyb2xsLiAgUmVwaW4gdGhlIGZpbmFsIHNjcm9sbAogICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi4KQEAgLTIyMjEsNzcgKzIxODksMTIgQEAKICAgICAgICAgY29udGVudFNpemVDaGFuZ2VkKHVwZGF0ZUxheW91dCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldE5ld1pvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcFNjYWxlLAotICAgICAgICAgICAgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgICAgICAvLyBzZXQgbUluWm9vbU92ZXJ2aWV3IGZvciBub24gbW9iaWxlIHNpdGVzCi0gICAgICAgICAgICBpZiAoc2NhbGUgPCBtRGVmYXVsdFNjYWxlKSBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cGRhdGVUZXh0V3JhcFNjYWxlKSB7Ci0gICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgLy8gcmVzZXQgbUxhc3RIZWlnaHRTZW50IHRvIGZvcmNlIFZJRVdfU0laRV9DSEFOR0VEIHNlbnQgdG8gV2ViS2l0Ci0gICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgfHwgZm9yY2UpIHsKLSAgICAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBoaXN0b3J5IFBpY3R1cmUgaXMgZHJhd24sIGRvbid0IHVwZGF0ZSBzY3JvbGwuIFRoZXkgd2lsbAotICAgICAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHNjcm9sbCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8ganVtcAotICAgICAgICAgICAgICAgIC8vIGkuZS4ga2VlcCB0aGUgY2VudGVyIG9mIHRoZSBkb2MgaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlldwotCi0gICAgICAgICAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gc2NhbGUgKiBtSW52QWN0dWFsU2NhbGU7ICAgLy8gb2xkIGludmVyc2UKLSAgICAgICAgICAgICAgICBmbG9hdCBzeCA9IHJhdGlvICogb2xkWCArIChyYXRpbyAtIDEpICogbVpvb21DZW50ZXJYOwotICAgICAgICAgICAgICAgIGZsb2F0IHN5ID0gcmF0aW8gKiBvbGRZICsgKHJhdGlvIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICogKG1ab29tQ2VudGVyWSAtIGdldFRpdGxlSGVpZ2h0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvdXIgbmV3IHNjYWxlIGFuZCBpbnZlcnNlCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotCi0gICAgICAgICAgICAgICAgLy8gU2NhbGUgYWxsIHRoZSBjaGlsZCB2aWV3cwotICAgICAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zY2FsZUFsbCgpOwotCi0gICAgICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3QgaGF2ZSBhbmltYXRpb24gZm9yIHNjYWxpbmcsIGRvbid0IGRvIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIC8vIGZvciBzY3JvbGxpbmcsIGFzIGl0IGNhdXNlcyB3ZWlyZCBpbnRlcm1lZGlhdGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgcGluU2Nyb2xsVG8oTWF0aC5yb3VuZChzeCksIE1hdGgucm91bmQoc3kpKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1goTWF0aC5yb3VuZChzeCkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShNYXRoLnJvdW5kKHN5KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgd2Via2l0Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGlzIGFkanVzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHpvb20gYW5pbWF0aW9uLiBCdXQgd2Ugd2FudCB0byB1cGRhdGUgdGhlIFdlYktpdCBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSB6b29tIGFuaW1hdGlvbi4gU2VlIGNvbW1lbnRzIGluIG9uU2NhbGVFbmQoKS4KLSAgICAgICAgICAgICAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIFVzZWQgdG8gYXZvaWQgc2VuZGluZyBtYW55IHZpc2libGUgcmVjdCBtZXNzYWdlcy4KICAgICBwcml2YXRlIFJlY3QgbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CiAgICAgcHJpdmF0ZSBSZWN0IG1MYXN0R2xvYmFsUmVjdDsKIAotICAgIHByaXZhdGUgUmVjdCBzZW5kT3VyVmlzaWJsZVJlY3QoKSB7Ci0gICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSByZXR1cm4gbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CisgICAgUmVjdCBzZW5kT3VyVmlzaWJsZVJlY3QoKSB7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CiAKICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChyZWN0KTsKQEAgLTIzMjQsOSArMjIyNyw2IEBACiAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgZ2V0R2xvYmFsVmlzaWJsZVJlY3QociwgcCk7CiAgICAgICAgIHIub2Zmc2V0KC1wLngsIC1wLnkpOwotICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICByLmJvdHRvbSAtPSBtRmluZEhlaWdodDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFNldHMgciB0byBiZSBvdXIgdmlzaWJsZSByZWN0YW5nbGUgaW4gY29udGVudCBjb29yZGluYXRlcwpAQCAtMjM3MywxNiArMjI3MywxOSBAQAogCiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSB1bnpvb21lZCB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgaWYgdGhleSBkaWZmZXIgZnJvbSB0aGUgbGFzdAotICAgICAqIHZhbHVlcyB3ZSBzZW50LCBzZW5kIHRoZW0gdG8gd2Via2l0ICh0byBiZSB1c2VkIGhhcyBuZXcgdmlld3BvcnQpCisgICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgYXMgbmV3IHZpZXdwb3J0KQorICAgICAqCisgICAgICogQHBhcmFtIGZvcmNlIGVuc3VyZXMgdGhhdCB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIHdlYmtpdCBldmVuIGlmIHRoZSB3aWR0aAorICAgICAqIG9yIGhlaWdodCBoYXMgbm90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbWVzc2FnZQogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIG5ldyB2YWx1ZXMgd2VyZSBzZW50CiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oKSB7Ci0gICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBzZW5kVmlld1NpemVab29tKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCBuZXdXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKTsKLSAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CisgICAgICAgIGludCBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKGdldFZpZXdIZWlnaHQoKSAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICAgICAgLyoKICAgICAgICAgICogQmVjYXVzZSB0aGUgbmF0aXZlIHNpZGUgbWF5IGhhdmUgYWxyZWFkeSBkb25lIGEgbGF5b3V0IGJlZm9yZSB0aGUKICAgICAgICAgICogVmlldyBzeXN0ZW0gd2FzIGFibGUgdG8gbWVhc3VyZSB1cywgd2UgaGF2ZSB0byBzZW5kIGEgaGVpZ2h0IG9mIDAgdG8KQEAgLTIzOTUsMTkgKzIyOTgsMjAgQEAKICAgICAgICAgICAgIG5ld0hlaWdodCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gQXZvaWQgc2VuZGluZyBhbm90aGVyIG1lc3NhZ2UgaWYgdGhlIGRpbWVuc2lvbnMgaGF2ZSBub3QgY2hhbmdlZC4KLSAgICAgICAgaWYgKG5ld1dpZHRoICE9IG1MYXN0V2lkdGhTZW50IHx8IG5ld0hlaWdodCAhPSBtTGFzdEhlaWdodFNlbnQpIHsKKyAgICAgICAgaWYgKG5ld1dpZHRoICE9IG1MYXN0V2lkdGhTZW50IHx8IG5ld0hlaWdodCAhPSBtTGFzdEhlaWdodFNlbnQgfHwgZm9yY2UpIHsKICAgICAgICAgICAgIFZpZXdTaXplRGF0YSBkYXRhID0gbmV3IFZpZXdTaXplRGF0YSgpOwogICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBuZXdXaWR0aDsKICAgICAgICAgICAgIGRhdGEubUhlaWdodCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1UZXh0V3JhcFNjYWxlKTs7Ci0gICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tU2NhbGUgIT0gMCAmJiAhbUhlaWdodENhbk1lYXN1cmU7Ci0gICAgICAgICAgICBkYXRhLm1BbmNob3JYID0gbUFuY2hvclg7Ci0gICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbUFuY2hvclk7CisgICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggLyBtWm9vbU1hbmFnZXIuZ2V0VGV4dFdyYXBTY2FsZSgpKTsKKyAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CisgICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKQorICAgICAgICAgICAgICAgICAgICAmJiAhbUhlaWdodENhbk1lYXN1cmU7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JYID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWCgpOworICAgICAgICAgICAgZGF0YS5tQW5jaG9yWSA9IG1ab29tTWFuYWdlci5nZXREb2N1bWVudEFuY2hvclkoKTsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5WSUVXX1NJWkVfQ0hBTkdFRCwgZGF0YSk7CiAgICAgICAgICAgICBtTGFzdFdpZHRoU2VudCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgbUxhc3RIZWlnaHRTZW50ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgbUFuY2hvclggPSBtQW5jaG9yWSA9IDA7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuY2xlYXJEb2N1bWVudEFuY2hvcigpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjQxOCwxMiArMjMyMiwxMiBAQAogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlXaWR0aDsKICAgICAgICAgfSBlbHNlIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQzMiwxMiArMjMzNiwxMiBAQAogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7CiAgICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7CisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKICAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCiAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTA1LDcgKzI0MDksOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LgorICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LCBvcgorICAgICAqIGEgVVJMIG9uIHRoaXMgc2l0ZSdzIHNlcnZlciBwb2ludGluZyB0byB0aGUgc3RhbmRhcmQgbG9jYXRpb24gb2YgYQorICAgICAqIHRvdWNoIGljb24uCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKQEAgLTI2ODIsMTkgKzI1ODgsMjIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaW5kSXNVcChib29sZWFuIGlzVXApIHsKICAgICAgICAgbUZpbmRJc1VwID0gaXNVcDsKLSAgICAgICAgaWYgKGlzVXApIHsKLSAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0ICsgbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCiAgICAgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGlzVXApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXgoKSB7CisgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbmF0aXZlRmluZEluZGV4KCk7CisgICAgfQorCiAgICAgLy8gVXNlZCB0byBrbm93IHdoZXRoZXIgdGhlIGZpbmQgZGlhbG9nIGlzIG9wZW4uICBBZmZlY3RzIHdoZXRoZXIKICAgICAvLyBvciBub3Qgd2UgZHJhdyB0aGUgaGlnaGxpZ2h0cyBmb3IgbWF0Y2hlcy4KICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmRJc1VwOwogCi0gICAgcHJpdmF0ZSBpbnQgbUZpbmRIZWlnaHQ7CiAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzdHJpbmcgc2VudCwgc28gd2UgY2FuIHNlYXJjaCBhZ2FpbiBhZnRlciBhbgogICAgIC8vIG9yaWVudGF0aW9uIGNoYW5nZSBvciB0aGUgZGlzbWlzc2FsIG9mIHRoZSBzb2Z0IGtleWJvYXJkLgogICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RmluZDsKQEAgLTI3NjksOCArMjY3OCw2IEBACiAgICAgICAgIH0KICAgICAgICAgY2xlYXJNYXRjaGVzKCk7CiAgICAgICAgIHNldEZpbmRJc1VwKGZhbHNlKTsKLSAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgLSBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBkaWFsb2cgaGFzIGJlZW4gcmVtb3ZlZCwgZW5zdXJlIHRoYXQgd2Ugc2Nyb2xsIHRvIGEKICAgICAgICAgLy8gbG9jYXRpb24gdGhhdCBpcyBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhZ2UuCiAgICAgICAgIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBtU2Nyb2xsWSwgZmFsc2UsIDApOwpAQCAtMjc3OCwxNiArMjY4NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kRGlhbG9nSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgInNldEZpbmREaWFsb2dIZWlnaHQgaGVpZ2h0PSIgKyBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIG1GaW5kSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFF1ZXJ5IHRoZSBkb2N1bWVudCB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGltYWdlIHJlZmVyZW5jZXMuIFRoZQogICAgICAqIG1lc3NhZ2Ugb2JqZWN0IHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFyZzEgYmVpbmcgc2V0IHRvIDEgaWYgaW1hZ2VzCiAgICAgICogd2VyZSBmb3VuZCBhbmQgMCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBpbWFnZXMuCkBAIC0yODAwLDYgKzI2OTcsMTYgQEAKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkRPQ19IQVNfSU1BR0VTLCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVxdWVzdCB0aGUgc2Nyb2xsZXIgdG8gYWJvcnQgYW55IG9uZ29pbmcgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BTY3JvbGwoKSB7CisgICAgICAgIG1TY3JvbGxlci5mb3JjZUZpbmlzaGVkKHRydWUpOworICAgICAgICBtTGFzdFZlbG9jaXR5ID0gMDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjb21wdXRlU2Nyb2xsKCkgewogICAgICAgICBpZiAobVNjcm9sbGVyLmNvbXB1dGVTY3JvbGxPZmZzZXQoKSkgewpAQCAtMjgxMCw2ICsyNzE3LDExIEBACiAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgogICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewogICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYm9ydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5jb21wdXRlU2Nyb2xsKCk7CkBAIC0yODk4LDYgKzI4MTAsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYWdlVGhhdE5lZWRzVG9TbGlkZVRpdGxlQmFyT2ZmU2NyZWVuID0gbnVsbDsKICAgICAgICAgfQorCisgICAgICAgIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpbmplY3RzIGFjY2Vzc2liaWxpdHkgaW4gdGhlIGxvYWRlZCBkb2N1bWVudCBpZiBhY2Nlc3NpYmlsaXR5CisgICAgICogaXMgZW5hYmxlZC4gSWYgSmF2YVNjcmlwdCBpcyBlbmFibGVkIHdlIHRyeSB0byBpbmplY3QgYSBVUkwgc3BlY2lmaWMgc2NyaXB0LgorICAgICAqIElmIG5vIFVSTCBzcGVjaWZpYyBzY3JpcHQgaXMgZm91bmQgb3IgSmF2YVNjcmlwdCBpcyBkaXNhYmxlZCB3ZSBmYWxsYmFjayB0bworICAgICAqIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIGxvYWRlZCBieSB0aGlzIHtAbGluayBXZWJWaWV3fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEphdmFTY3JpcHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkVXJsKEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBuZXcgQWNjZXNzaWJpbGl0eUluamVjdG9yKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBhY2Nlc3NpYmlsaXR5IHdhcyB0dXJuZWQgb2ZmIGJldHdlZW4gcmVsb2FkcworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMTQsNyArMjk0OSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCByZXF1ZXN0IGEgbGF5b3V0LCB0cnkgdG8gc2VuZCBvdXIgdmlldyBzaXplIHRvIHRoZQogICAgICAgICAgICAgLy8gbmF0aXZlIHNpZGUgdG8gZW5zdXJlIHRoYXQgV2ViQ29yZSBoYXMgdGhlIGNvcnJlY3QgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTQ0LDcgKzMwNzksNyBAQAogICAgICAqICAgICAgICAgc2V0dGluZ3MuCiAgICAgICovCiAgICAgcHVibGljIFdlYlNldHRpbmdzIGdldFNldHRpbmdzKCkgewotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7CisgICAgICAgIHJldHVybiAobVdlYlZpZXdDb3JlICE9IG51bGwpID8gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkgOiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI4NSw3ICszMjIwLDQ3IEBACiAgICAgICAgIGlmIChBVVRPX1JFRFJBV19IQUNLICYmIG1BdXRvUmVkcmF3KSB7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgbVdlYlRleHRWaWV3Lm9uRHJhd1N1YnN0aXR1dGUoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNpZ25hbFJlcGFpbnREb25lKCk7CisKKyAgICAgICAgLy8gcGFpbnQgdGhlIGhpZ2hsaWdodCBpbiB0aGUgZW5kCisgICAgICAgIGlmICghbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldENvbG9yKG1IaWdodGxpZ2h0Q29sb3IpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldFBhdGhFZmZlY3QobmV3IENvcm5lclBhdGhFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9ISUdITElHSFRfQVJDKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kYXJ5UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldE5hdkR1bXAoKSkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoSGlnaGxpZ2h0WCB8IG1Ub3VjaEhpZ2hsaWdodFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaENyb3NzSGFpckNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvci5zZXRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYIC0gbU5hdlNsb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1OYXZTbG9wICsgMSwgbVRvdWNoSGlnaGxpZ2h0WSArIG1OYXZTbG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEsIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKG1Ub3VjaEhpZ2hsaWdodFggKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVUb3VjaEhpZ2hsaWdodChib29sZWFuIHJlbW92ZVBlbmRpbmdNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMzMDYsMjcgKzMyODEsMzUgQEAKICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNsaWNrIHNvIHRoYXQgdGhlIHRleHRmaWVsZCBpcyBpbiBmb2N1cwogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbVdlYlRleHRWaWV3LnBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCk7CiAgICAgICAgIH0KKyAgICAgICAgLyogaWYgbG9uZyBjbGljayBicmluZ3MgdXAgYSBjb250ZXh0IG1lbnUsIHRoZSBzdXBlciBmdW5jdGlvbgorICAgICAgICAgKiByZXR1cm5zIHRydWUgYW5kIHdlJ3JlIGRvbmUuIE90aGVyd2lzZSwgbm90aGluZyBoYXBwZW5lZCB3aGVuCisgICAgICAgICAqIHRoZSB1c2VyIGNsaWNrZWQuICovCisgICAgICAgIGlmIChzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8qIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYWxyZWFkeSBoYW5kbGVkIHRoZSBsb25nCisgICAgICAgICAqIGNsaWNrIGFjdGlvbiwgbG9vayBmb3IgYSB3b3JkIHVuZGVyIHRoZSAgY2xpY2suIElmIG9uZSBpcyBmb3VuZCwKKyAgICAgICAgICogYW5pbWF0ZSB0aGUgdGV4dCBzZWxlY3Rpb24gaW50byB2aWV3LgorICAgICAgICAgKiBGSVhNRTogbm8gYW5pbWF0aW9uIGNvZGUgeWV0ICovCisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgcmV0dXJuIGZhbHNlOyAvLyBsb25nIGNsaWNrIGRvZXMgbm90aGluZyBvbiBzZWxlY3Rpb24KKyAgICAgICAgaW50IHggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtTGFzdFRvdWNoWCArIG1TY3JvbGxYKTsKKyAgICAgICAgaW50IHkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKKyAgICAgICAgc2V0VXBTZWxlY3QoKTsKKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZVdvcmRTZWxlY3Rpb24oeCwgeSkpIHsKKyAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOworICAgICAgICAgICAgZ2V0V2ViQ2hyb21lQ2xpZW50KCkub25TZWxlY3Rpb25TdGFydCh0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpbkFuaW1hdGVab29tKCkgewotICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lZWQgdG8gYWRqdXN0IHRoZSBXZWJUZXh0VmlldyBhZnRlciBhIGNoYW5nZSBpbiB6b29tLCBzaW5jZSBtQWN0dWFsU2NhbGUKLSAgICAgKiBoYXMgY2hhbmdlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHBhc3N3b3JkIGZpZWxkcywgd2hpY2ggYXJlCi0gICAgICogZHJhd24gYnkgdGhlIFdlYlRleHRWaWV3LCBzaW5jZSBpdCBjb252ZXlzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB3aGF0Ci0gICAgICogd2Via2l0IGRyYXdzLiAgVGh1cyB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gaXQgdG8gc2hvdyBpbiB0aGUgY29ycmVjdAotICAgICAqIHBsYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXc7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoYm9vbGVhbiBhbGxvd0ludGVyc2VjdCkgewogICAgICAgICBSZWN0IGNvbnRlbnRCb3VuZHMgPSBuYXRpdmVGb2N1c0NhbmRpZGF0ZU5vZGVCb3VuZHMoKTsKICAgICAgICAgUmVjdCB2Qm94ID0gY29udGVudFRvVmlld1JlY3QoY29udGVudEJvdW5kcyk7CkBAIC0zMzU0LDI1ICszMzM3LDU0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmFzLCBib29sZWFuIGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgIC8vIElmIG1OYXRpdmVDbGFzcyBpcyAwLCB3ZSBzaG91bGQgbm90IHJlYWNoIGhlcmUsIHNvIHdlIGRvIG5vdAotICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGl0IGFnYWluLgotICAgICAgICBpZiAoYW5pbWF0aW9uc1J1bm5pbmcpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG1XZWJWaWV3Q29yZS5tWm9vbUZpbHRlcik7CisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3IG1pc3BsYWNlZC4KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZURyYXdFeHRyYXMoY2FudmFzLCBleHRyYXMpOwotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb25ab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAorICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUgV2ViVGV4dFZpZXcgb25jZQorICAgICAgICAgICAgLy8gYWdhaW4uCisgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKGdldFdlYlZpZXdDb3JlKCkpOworICAgICAgICBvblpvb21BbmltYXRpb25TdGFydCgpOworICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUc7CisKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVpvb21GaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFpPT01fQklUUywgUGFpbnQuTElORUFSX1RFWFRfRkxBRyk7CisgICAgLy8gSWYgd2UgbmVlZCB0byB0cmFkZSBiZXR0ZXIgcXVhbGl0eSBmb3Igc3BlZWQsIHNldCBtU2Nyb2xsRmlsdGVyIHRvIG51bGwKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVNjcm9sbEZpbHRlciA9CisgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOworCiAgICAgcHJpdmF0ZSB2b2lkIGRyYXdDb3JlQW5kQ3Vyc29yUmluZyhDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCiAgICAgICAgIGJvb2xlYW4gZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1BY3R1YWxTY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSwgbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICAgICAgY2FudmFzLmRyYXdQaWN0dXJlKG1IaXN0b3J5UGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CiAKLSAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tU2NhbGUgIT0gMDsKKyAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpOwogICAgICAgICBib29sZWFuIGFuaW1hdGVTY3JvbGwgPSAoKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpCiAgICAgICAgICAgICAgICAgfHwgbVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKQogICAgICAgICAgICAgICAgICYmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSB8fApAQCAtMzM5MSw1OSArMzQwMyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFuaW1hdGVab29tKSB7Ci0gICAgICAgICAgICBmbG9hdCB6b29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSAoaW50KSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtWm9vbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSAxLjBmIC8gKG1JbnZJbml0aWFsWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOwotICAgICAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBkb25lIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSBhZ2FpbiB0byBkcmF3IHdpdGggdGhlIGZpbmFsIGZpbHRlcnMKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldykgewotICAgICAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLiBBcyB3ZSBuZWVkIHRvIHVzZQotICAgICAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgcGluTG9jWC9ZIGRpcmVjdGx5LiBDb3B5IHRoZSBsb2dpYyBoZXJlLgotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICAgICAgICAgIGludCB0eCA9IE1hdGgucm91bmQoc2NhbGUgKiAobUluaXRpYWxTY3JvbGxYICsgbVpvb21DZW50ZXJYKQotICAgICAgICAgICAgICAgICAgICAtIG1ab29tQ2VudGVyWCk7Ci0gICAgICAgICAgICB0eCA9IC1waW5Mb2ModHgsIGdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1Db250ZW50V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1TY3JvbGxYOwotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGludCB0eSA9IE1hdGgucm91bmQoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7Ci0gICAgICAgICAgICB0eSA9IC0odHkgPD0gdGl0bGVIZWlnaHQgPyBNYXRoLm1heCh0eSwgMCkgOiBwaW5Mb2ModHkKLSAgICAgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1Db250ZW50SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHgsIHR5KTsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7Ci0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmICFtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgJiYgbVpvb21TY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIFdlYlRleHRWaWV3IGlzIHVwLiAgS2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBhZGp1c3QKLSAgICAgICAgICAgICAgICAvLyBpdHMgc2l6ZSBhbmQgcGxhY2VtZW50IHdoZW4gd2UgZmluaXNoIHpvb21pbmcKLSAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuYW5pbWF0ZVpvb20oY2FudmFzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gVUlBbmltYXRpb25zUnVubmluZyA9IGZhbHNlOwpAQCAtMzQ1NSwzOSArMzQxNyw0MiBAQAogICAgICAgICAgICAgLy8gd2UgYXNrIGZvciBhIHJlcGFpbnQuCiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIGNvbG9yLAotICAgICAgICAgICAgICAgIChhbmltYXRlWm9vbSB8fCBtUHJldmlld1pvb21Pbmx5IHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpLAotICAgICAgICAgICAgICAgIGFuaW1hdGVTY3JvbGwpOwotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKKwogICAgICAgICAvLyBkZWNpZGUgd2hpY2ggYWRvcm5tZW50cyB0byBkcmF3CiAgICAgICAgIGludCBleHRyYXMgPSBEUkFXX0VYVFJBU19OT05FOworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAibUZpbmRJc1VwPSIgKyBtRmluZElzVXAKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1TZWxlY3RpbmdUZXh0PSIgKyBtU2VsZWN0aW5nVGV4dAorICAgICAgICAgICAgICAgICAgICArICIgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCk9IgorICAgICAgICAgICAgICAgICAgICArIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmltYXRlWm9vbT0iICsgYW5pbWF0ZVpvb20pOworICAgICAgICB9CiAgICAgICAgIGlmIChtRmluZElzVXApIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIEZpbmREaWFsb2cgaXMgdXAsIG9ubHkgZHJhdyB0aGUgbWF0Y2hlcyBpZiB3ZSBhcmUgbm90IGluCi0gICAgICAgICAgICAvLyB0aGUgcHJvY2VzcyBvZiBzY3JvbGxpbmcgdGhlbSBpbnRvIHZpZXcuCi0gICAgICAgICAgICBpZiAoIWFuaW1hdGVTY3JvbGwpIHsKLSAgICAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19GSU5EOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7Ci0gICAgICAgICAgICBpZiAoIWFuaW1hdGVab29tICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfU0VMRUNUSU9OOwotICAgICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblJlZ2lvbihtVG91Y2hTZWxlY3Rpb24gfHwgbUV4dGVuZFNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcighbVRvdWNoU2VsZWN0aW9uLCBtSW52QWN0dWFsU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCwgbVNlbGVjdFkgLSBnZXRUaXRsZUhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19GSU5EOworICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19TRUxFQ1RJT047CisgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKG1EcmF3U2VsZWN0aW9uUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCksCisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RYLCBtU2VsZWN0WSAtIGdldFRpdGxlSGVpZ2h0KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19DVVJTT1JfUklORzsKICAgICAgICAgfQotICAgICAgICBkcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzLCBVSUFuaW1hdGlvbnNSdW5uaW5nKTsKKyAgICAgICAgRHJhd0ZpbHRlciBkZiA9IG51bGw7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNab29tQW5pbWF0aW5nKCkgfHwgVUlBbmltYXRpb25zUnVubmluZykgeworICAgICAgICAgICAgZGYgPSBtWm9vbUZpbHRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChhbmltYXRlU2Nyb2xsKSB7CisgICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOworICAgICAgICBpbnQgY29udGVudCA9IG5hdGl2ZURyYXcoY2FudmFzLCBjb2xvciwgZXh0cmFzLCB0cnVlKTsKKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CisgICAgICAgIGlmIChjb250ZW50ICE9IDApIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCwgY29udGVudCwgMCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXh0cmFzID09IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HKSB7CiAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREUpIHsKICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfU0hPUlRQUkVTU19NT0RFOwotICAgICAgICAgICAgICAgIEhpdFRlc3RSZXN1bHQgaGl0VGVzdCA9IGdldEhpdFRlc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGl0VGVzdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBoaXRUZXN0Lm1UeXBlID09IEhpdFRlc3RSZXN1bHQuVU5LTk9XTl9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Gb2N1c1NpemVDaGFuZ2VkKSB7CkBAIC0zNTEyLDEwICszNDc3LDE0IEBACiAgICAgICAgIHJldHVybiBtRHJhd0hpc3Rvcnk7CiAgICAgfQogCisgICAgaW50IGdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKSB7CisgICAgICAgIHJldHVybiAobUhpc3RvcnlQaWN0dXJlICE9IG51bGwpID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkgOiAwOworICAgIH0KKwogICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKICAgICB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkgewogICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybjsgLy8gQ2FsbGJhY2tQcm94eSBtYXkgdHJpZ2dlciB0aGlzCi0gICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgbVdlYlZpZXdDb3JlLnBpY3R1cmVSZWFkeSgpKSB7CisgICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgKGdldFByb2dyZXNzKCkgPT0gMTAwIHx8IG5hdGl2ZUhhc0NvbnRlbnQoKSkpIHsKICAgICAgICAgICAgIG1EcmF3SGlzdG9yeSA9IGZhbHNlOwogICAgICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gbnVsbDsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTM1NjYsNyArMzUzNSw5IEBACiAgICAgICogIEBwYXJhbSAgZW5kICAgICBFbmQgb2Ygc2VsZWN0aW9uLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM1ODUsMTMgKzM1NTYsMTAgQEAKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKIAogICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAotICAgICAgICBib29sZWFuIHpvb20gPSBtQWN0dWFsU2NhbGUgPCBtRGVmYXVsdFNjYWxlOworICAgICAgICBib29sZWFuIHpvb20gPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSA8IG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1RleHRWaWV3KSB7CiAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM3ODAsNiArMzc0OCwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBEUlQgb24gVUkgdGhyZWFkLCBuZWVkIHRvIHByb3h5IHRvIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlVTRV9NT0NLX0RFVklDRV9PUklFTlRBVElPTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBXZWJDb3JlIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBoaWRlIGRlYnVnIG9ubHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIERldmljZU9yaWVudGF0aW9uTWFuYWdlci5zZXRNb2NrT3JpZW50YXRpb24obVdlYlZpZXdDb3JlLCBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVCZXRhLCBiZXRhLCBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEdW1wIHRoZSBWOCBjb3VudGVycyB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICogTm90ZSB0aGF0IHlvdSBuZWVkIGEgYnVpbGQgd2l0aCBWOCBhbmQgV0VCQ09SRV9JTlNUUlVNRU5UQVRJT04gc2V0IHRvCiAgICAgICogdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZG8gbm90aGluZy4KQEAgLTM3OTUsNiArMzc4MywxOSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtR290Q2VudGVyRG93biA9IGZhbHNlOwogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlNdWx0aXBsZShpbnQga2V5Q29kZSwgaW50IHJlcGVhdENvdW50LCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBzZW5kIGNvbXBsZXggY2hhcmFjdGVycyB0byB3ZWJraXQgZm9yIHVzZSBieSBKUyBhbmQgcGx1Z2lucworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZlbnQuZ2V0Q2hhcmFjdGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBhc3MgdGhlIGtleSB0byBET00KKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5LRVlfRE9XTiwgZXZlbnQpOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLktFWV9VUCwgZXZlbnQpOworICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgYXMgRE9NIGhhbmRsZXMgdGhlIGtleQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleURvd24gYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCkBAIC0zODE3LDE3ICszODE4LDE5IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CiAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCi0gICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2hpZnRJc1ByZXNzZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRVcFNlbGVjdFhZKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzg0NCwxMSArMzg0NywxMSBAQAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNoaWZ0SXNQcmVzc2VkKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBpbnQgeFJhdGUgPSBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUCiAgICAgICAgICAgICAgICAgICAgID8gLTEgOiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIGludCB5UmF0ZSA9IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQID8KQEAgLTM4NjgsNyArMzg3MSw3IEBACiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpIHsKICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXNjYXJkIHByZXNzIGlmIGNvcHkgaW4gcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUdvdENlbnRlckRvd24gPSB0cnVlOwpAQCAtMzg4NiwxMCArMzg4OSw4IEBACiAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewogICAgICAgICAgICAgLy8gdHVybiBvZmYgY29weSBzZWxlY3QgaWYgYSBzaGlmdC1rZXkgY29tYm8gaXMgcHJlc3NlZAotICAgICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0VMRUNUX01PREUpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOworICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKQEAgLTM5NzEsMjMgKzM5NzIsMjcgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQorICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb21taXRDb3B5KCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29weVNlbGVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgeworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGFsd2F5cyBoYW5kbGUgdGhlIG5hdmlnYXRpb24ga2V5cyBpbiB0aGUgVUkgdGhyZWFkCkBAIC00MDAwLDExICs0MDA1LDEzIEBACiAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTE9OR19QUkVTU19DRU5URVIpOwogICAgICAgICAgICAgbUdvdENlbnRlckRvd24gPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBpZiAobUV4dGVuZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjb21taXRDb3B5KCk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyBkcmF3IHRoZSBpLWJlYW0gaW5zdGVhZCBvZiB0aGUgYXJyb3cKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGRpc2NhcmQgcHJlc3MgaWYgY29weSBpbiBwcm9ncmVzcwpAQCAtNDA0OSw5ICs0MDU2LDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0VXBTZWxlY3RYWSgpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwU2VsZWN0KCkgeworICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCisgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHJldHVybjsKKyAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSByZXR1cm47CiAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBtRHJhd1NlbGVjdGlvblBvaW50ZXIgPSB0cnVlOworICAgICAgICAvLyBkb24ndCBsZXQgdGhlIHBpY3R1cmUgY2hhbmdlIGR1cmluZyB0ZXh0IHNlbGVjdGlvbgorICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgbmF0aXZlUmVzZXRTZWxlY3Rpb24oKTsKICAgICAgICAgaWYgKG5hdGl2ZUhhc0N1cnNvck5vZGUoKSkgewogICAgICAgICAgICAgUmVjdCByZWN0ID0gbmF0aXZlQ3Vyc29yTm9kZUJvdW5kcygpOwogICAgICAgICAgICAgbVNlbGVjdFggPSBjb250ZW50VG9WaWV3WChyZWN0LmxlZnQpOwpAQCAtNDA3MSw0MCArNDA4Nyw3OCBAQAogICAgICAqIERvIG5vdCByZWx5IG9uIHRoaXMgZnVuY3Rpb25hbGl0eTsgaXQgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW11bGF0ZVNoaWZ0SGVsZCgpIHsKLSAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAotICAgICAgICBzZXRVcFNlbGVjdFhZKCk7CisgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbW1pdENvcHkoKSB7CisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7CisgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSBzZXRVcFNlbGVjdCgpOworICAgICAgICBuYXRpdmVTZWxlY3RBbGwoKTsKKyAgICAgICAgbURyYXdTZWxlY3Rpb25Qb2ludGVyID0gZmFsc2U7CisgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3REaWFsb2dJc1VwKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGluZ1RleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKSB7CisgICAgICAgIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7CisgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkRvbmUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgZ2V0V2ViQ2hyb21lQ2xpZW50KCkub25TZWxlY3Rpb25Eb25lKHRoaXMpOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZWRyYXcgd2l0aG91dCBzZWxlY3Rpb24KKyAgICAgICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb3B5U2VsZWN0aW9uKCkgewogICAgICAgICBib29sZWFuIGNvcGllZFNvbWV0aGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUV4dGVuZFNlbGVjdGlvbikgewotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IG5hdGl2ZUdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSAiIikgewotICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImNvbW1pdENvcHkgXCIiICsgc2VsZWN0aW9uICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRfY29waWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwotICAgICAgICAgICAgICAgIGNvcGllZFNvbWV0aGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSUNsaXBib2FyZCBjbGlwID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnNldENsaXBib2FyZFRleHQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNsaXBib2FyZCBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSAiIikgeworICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJjb3B5U2VsZWN0aW9uIFwiIiArIHNlbGVjdGlvbiArICJcIiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0X2NvcGllZAorICAgICAgICAgICAgICAgICAgICAsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgY29waWVkU29tZXRoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY20gPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisgICAgICAgICAgICBjbS5zZXRUZXh0KHNlbGVjdGlvbik7CiAgICAgICAgIH0KLSAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVtb3ZlIHNlbGVjdGlvbiByZWdpb24gYW5kIHBvaW50ZXIKLSAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0VMRUNUX01PREUpIHsKLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvcGllZFNvbWV0aGluZzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdldFNlbGVjdGlvbigpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CkBAIC00MTE0LDExICs0MTY4LDIxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CiAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOwogICAgICAgICBpZiAoaGFzV2luZG93Rm9jdXMoKSkgc2V0QWN0aXZlKGZhbHNlKTsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBUaGUgem9vbU1hbmFnZXIgbWF5IGJlIG51bGwgaWYgdGhlIHdlYnZpZXcgaXMgY3JlYXRlZCBmcm9tIFhNTCB0aGF0CisgICAgICAgIC8vIHNwZWNpZmllcyB0aGUgdmlldydzIHZpc2liaWxpdHkgcGFyYW0gYXMgbm90IHZpc2libGUgKHNlZSBodHRwOi8vYi8yNzk0ODQxKQorICAgICAgICBpZiAodmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgJiYgbVpvb21NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgV2ViVmlldyBubyBsb25nZXIgbmVlZHMgdG8gaW1wbGVtZW50CiAgICAgICogVmlld0dyb3VwLk9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIuICBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgbm93LgpAQCAtNDE2MywxNyArNDIyNywxNCBAQAogICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB0aGUgZmlyc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwgJiYgZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpKSkgeworICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuaXNab29tUGlja2VyVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91ciB3aW5kb3cKLSAgICAgICAgICAgICAgICAgKiBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcgaWYKLSAgICAgICAgICAgICAgICAgKiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKKyAgICAgICAgICAgICAgICAgKiBUaGUgZXh0ZXJuYWwgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91cgorICAgICAgICAgICAgICAgICAqIHdpbmRvdyBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcKKyAgICAgICAgICAgICAgICAgKiBpZiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKICAgICAgICAgICAgICAgICAgKiB0aGUgdXNlciBjYW4gc3RpbGwgbmF2aWdhdGUgdGhlIHdlYiBwYWdlIHdpdGggdGhlIHpvb20KICAgICAgICAgICAgICAgICAgKiBjb250cm9scyBzaG93aW5nLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgaGFzIGxvc3QgZm9jdXMsIHN0b3AgZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CkBAIC00MjYyLDgxICs0MzIzLDI0IEBACiAgICAgICAgICAgICAvLyBzeXN0ZW0gd29uJ3QgY2FsbCBvblNpemVDaGFuZ2VkIGlmIHRoZSBkaW1lbnNpb24gaXMgbm90IGNoYW5nZWQuCiAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2FsbCBzZW5kVmlld1NpemVab29tKCkgZXhwbGljaXRseSB0bwogICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBXZWJLaXQgYWJvdXQgdGhlIG5ldyBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OwotICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKLQotICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKFdlYlZpZXcgd2ViVmlldywgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgewotICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OwotICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXcubVdlYlZpZXdDb3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0TmV3Wm9vbVNjYWxlKG1XZWJWaWV3Lm1BY3R1YWxTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1ab29tU2NhbGUgPT0gMCkgeyAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSB6b29taW5nCi0gICAgICAgICAgICAvLyBUbyBhbmNob3IgYXQgdG9wIGxlZnQgY29ybmVyLgotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpc2libGVUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIGFkanVzdCB0aGUgbWF4IHZpZXdwb3J0IHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgdmlldyBkaW1lbnNpb25zLiBUaGlzCiAgICAgICAgIC8vIGlzIHRvIGVuc3VyZSB0aGUgc2NhbGluZyBpcyBub3QgZ29pbmcgaW5zYW5lLiBTbyBkbyBub3Qgc2hyaW5rIGl0IGlmCiAgICAgICAgIC8vIHRoZSB2aWV3IHNpemUgaXMgdGVtcG9yYXJpbHkgc21hbGxlciwgZS5nLiB3aGVuIHNvZnQga2V5Ym9hcmQgaXMgdXAuCi0gICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSk7CisgICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CiAgICAgICAgIGlmIChuZXdNYXhWaWV3cG9ydFdpZHRoID4gc01heFZpZXdwb3J0V2lkdGgpIHsKICAgICAgICAgICAgIHNNYXhWaWV3cG9ydFdpZHRoID0gbmV3TWF4Vmlld3BvcnRXaWR0aDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCi0gICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCi0gICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KLSAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIGdldFZpZXdXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1EcmF3SGlzdG9yeSA/IG1IaXN0b3J5UGljdHVyZS5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKLSAgICAgICAgICAgICAgICBmbG9hdCBpbml0aWFsU2NhbGUgPSBtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmOwotICAgICAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlID4gaW5pdGlhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBpbml0aWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0KLSAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKLSAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgc2V0TmV3Wm9vbVNjYWxlKCkgd2lsbAotICAgICAgICAvLyBjYWxsIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncwotICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgotICAgICAgICAvLyA8Yi8+Ci0gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgd2lkdGggY2hhbmdlZC4KLSAgICAgICAgcG9zdChuZXcgUG9zdFNjYWxlKHRoaXMsIHcgIT0gb3cpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQzNDcsNyArNDM1MSw3IEBACiAgICAgICAgIC8vIGFzIGdldFZpc2libGVUaXRsZUhlaWdodC4KICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgewotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNTUsOSArNDM1OSwxMSBAQAogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IHRydWU7CiAKLSAgICAgICAgLy8gVGV4dGZpZWxkcyBhbmQgcGx1Z2lucyBuZWVkIHRvIHJlY2VpdmUgdGhlIHNoaWZ0IHVwIGtleSBldmVuIGlmCi0gICAgICAgIC8vIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5IHdhcyBoZWxkIGRvd24uCi0gICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSkgeworICAgICAgICAvLyBUZXh0ZmllbGRzLCBwbHVnaW5zLCBhbmQgY29udGVudEVkaXRhYmxlIG5vZGVzIG5lZWQgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgLy8gc2hpZnQgdXAga2V5IGV2ZW4gaWYgYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkKKyAgICAgICAgLy8gd2FzIGhlbGQgZG93bi4KKyAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSkgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICAgICAgbUdvdEtleURvd24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ1OTEsODEgKzQ1OTcsNiBAQAogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXIgbURyYWdUcmFja2VyOwogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXJIYW5kbGVyIG1EcmFnVHJhY2tlckhhbmRsZXI7CiAKLSAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCi0gICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgem9vbSBvdmVydmlldyBtb2RlIHNvIHRoYXQgdGhlIHBhZ2Ugd29uJ3QgYXV0byBncm93Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgIC8vIG1pc3BsYWNlZC4KLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpKTsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93Tm93LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7Ci0gICAgICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOwotICAgICAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lKTsKLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gKGZsb2F0KSAoTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpCi0gICAgICAgICAgICAgICAgICAgICogbUFjdHVhbFNjYWxlICogMTAwKSAvIDEwMC4wKTsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBoaXRGb2N1c2VkUGx1Z2luKGludCBjb250ZW50WCwgaW50IGNvbnRlbnRZKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJuYXRpdmVGb2N1c0lzUGx1Z2luKCk9IiArIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSk7CkBAIC00Njc5LDcgKzQ2MTAsNyBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkgewogICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCB8fCAobUZvcndhcmRUb3VjaEV2ZW50cwotICAgICAgICAgICAgICAgICYmIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfU0VMRUNUX01PREUKKyAgICAgICAgICAgICAgICAmJiAhbVNlbGVjdGluZ1RleHQKICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX0lHTk9SRSk7CiAgICAgfQogCkBAIC00Njg3LDYgKzQ2MTgsNDEgQEAKICAgICAgICAgcmV0dXJuIG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGw7CiAgICAgfQogCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCisgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMKKyAgICAgICAgLy8gaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFCisgICAgICAgIC8vIGFzIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KKyAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7CisgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CisgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLCBtTGFzdFRvdWNoVGltZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZmxvYXQgZ2VzdHVyZVgsIGZsb2F0IGdlc3R1cmVZKSB7CisgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgeworICAgICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgZ2VzdHVyZVggKyBtU2Nyb2xsWCk7CisgICAgICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBnZXN0dXJlWSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgIG1TY3JvbGxpbmdMYXllciA9IG5hdGl2ZVNjcm9sbGFibGVMYXllcihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgaWYgKG1TY3JvbGxpbmdMYXllciAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDEvKGRlbnNpdHkgKiBkZW5zaXR5KSB1c2VkIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzLgorICAgIC8vIENvbXB1dGVkIGluIGluaXQoKS4KKyAgICBwcml2YXRlIGZsb2F0IERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisKKyAgICAvLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzIHJlcG9ydGVkIGluIG9uVG91Y2hFdmVudCBzY2FsZWQgYnkgdGhlCisgICAgLy8gZGVuc2l0eSBvZiB0aGUgc2NyZWVuLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSA9IDIwMDAwOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhaXNDbGlja2FibGUoKSB8fCAhaXNMb25nQ2xpY2thYmxlKCkpIHsKQEAgLTQ2OTgsNTUgKzQ2NjQsMTA0IEBACiAgICAgICAgICAgICAgICAgICAgICsgbVRvdWNoTW9kZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYWN0aW9uOwotICAgICAgICBmbG9hdCB4LCB5OworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKCk7CisgICAgICAgIGZsb2F0IHkgPSBldi5nZXRZKCk7CiAgICAgICAgIGxvbmcgZXZlbnRUaW1lID0gZXYuZ2V0RXZlbnRUaW1lKCk7CiAKKyAgICAgICAgZmluYWwgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IgPQorICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCk7CisgICAgICAgIGJvb2xlYW4gc2tpcFNjYWxlR2VzdHVyZSA9IGZhbHNlOworICAgICAgICAvLyBTZXQgdG8gdGhlIG1pZC1wb2ludCBvZiBhIHR3by1maW5nZXIgZ2VzdHVyZSB1c2VkIHRvIGRldGVjdCBpZiB0aGUKKyAgICAgICAgLy8gdXNlciBoYXMgdG91Y2hlZCBhIGxheWVyLgorICAgICAgICBmbG9hdCBnZXN0dXJlWCA9IHg7CisgICAgICAgIGZsb2F0IGdlc3R1cmVZID0geTsKKyAgICAgICAgaWYgKGRldGVjdG9yID09IG51bGwgfHwgIWRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICAvLyBUaGUgZ2VzdHVyZSBmb3Igc2Nyb2xsaW5nIGEgbGF5ZXIgaXMgdHdvIGZpbmdlcnMgY2xvc2UgdG9nZXRoZXIuCisgICAgICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIGdpdmluZyBXZWJLaXQgYW4gb3B0aW9uIHRvIGhhbmRsZQorICAgICAgICAgICAgLy8gbXVsdGktdG91Y2ggZXZlbnRzIGxhdGVyLgorICAgICAgICAgICAgaWYgKGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGR4ID0gZXYuZ2V0WCgxKSAtIGV2LmdldFgoMCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZHkgPSBldi5nZXRZKDEpIC0gZXYuZ2V0WSgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaXN0ID0gKGR4ICogZHggKyBkeSAqIGR5KSAqCisgICAgICAgICAgICAgICAgICAgICAgICBEUkFHX0xBWUVSX0lOVkVSU0VfREVOU0lUWV9TUVVBUkVEOworICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXBwcm94aW1hdGUgY2VudGVyIHRvIGRldGVybWluZSBpZiB0aGUgZ2VzdHVyZSBpcyBpbgorICAgICAgICAgICAgICAgIC8vIGEgbGF5ZXIuCisgICAgICAgICAgICAgICAgZ2VzdHVyZVggPSBldi5nZXRYKDApICsgKGR4ICogLjVmKTsKKyAgICAgICAgICAgICAgICBnZXN0dXJlWSA9IGV2LmdldFkoMCkgKyAoZHkgKiAuNWYpOworICAgICAgICAgICAgICAgIC8vIE5vdyB1c2UgYSBjb25zaXN0ZW50IHBvaW50IGZvciB0cmFja2luZyBtb3ZlbWVudC4KKyAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0WCgwKSA8IGV2LmdldFgoMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMCk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBldi5nZXRYKDEpOworICAgICAgICAgICAgICAgICAgICB5ID0gZXYuZ2V0WSgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSkgeworICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGVHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmdlcnMgbW92ZWQgdG9vIGZhciBhcGFydCB3aGlsZSBkcmFnZ2luZywgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgdHJ5aW5nIHRvIHpvb20uCisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gRklYTUU6IHdlIG1heSBjb25zaWRlciB0byBnaXZlIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlIG11bHRpLXRvdWNoCiAgICAgICAgIC8vIGV2ZW50cyBsYXRlci4KLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgICAgIG1TY2FsZURldGVjdG9yLm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY2FsZURldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeCA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWCgpOwotICAgICAgICAgICAgICAgIHkgPSBtU2NhbGVEZXRlY3Rvci5nZXRGb2N1c1koKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKSAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgewotICAgICAgICAgICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbUxhc3RUb3VjaFgvWSB0byB0aGUgcmVtYWluaW5nIHBvaW50Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHggb3IgeSBpbmRpY2F0ZSBpdCBpcyBvbiB0aGUgZWRnZSwgc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2UgZGlzYWxsb3cgem9vbSwgc2tpcCBtdWx0aS1wb2ludGVyIGFjdGlvbgorICAgICAgICBpZiAobVpvb21NYW5hZ2VyLnN1cHBvcnRzTXVsdGlUb3VjaFpvb20oKSAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEgJiYKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSAmJiAhc2tpcFNjYWxlR2VzdHVyZSkgeworCisgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvd3Mgem9vbSwgc2tpcCBtdWx0aS1wb2ludGVyIGFjdGlvbgorICAgICAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1pvb21TY2FsZUZpeGVkKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICAgICAgeCA9IGV2LmdldFgoKTsKLSAgICAgICAgICAgIHkgPSBldi5nZXRZKCk7CisKKyAgICAgICAgICAgIGlmICghZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0QWN0aW9uTWFza2VkKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGZha2UgcG9pbnRlciBkb3duIGV2ZW50IGluIG9yZGVyIHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gdGhlIHpvb20gc2NhbGUgZGV0ZWN0b3IuCisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgdGVtcCA9IE1vdGlvbkV2ZW50Lm9idGFpbihldik7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIG9yaWdpbmFsIGV2ZW50IGFuZCBzZXQgaXQgdG8KKyAgICAgICAgICAgICAgICAvLyBBQ1RJT05fUE9JTlRFUl9ET1dOLgorICAgICAgICAgICAgICAgIHRlbXAuc2V0QWN0aW9uKHRlbXAuZ2V0QWN0aW9uKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgfk1vdGlvbkV2ZW50LkFDVElPTl9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pOworICAgICAgICAgICAgICAgIGRldGVjdG9yLm9uVG91Y2hFdmVudCh0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKKworICAgICAgICAgICAgaWYgKGRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHggPSBkZXRlY3Rvci5nZXRGb2N1c1goKTsKKyAgICAgICAgICAgIHkgPSBkZXRlY3Rvci5nZXRGb2N1c1koKTsKKyAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUb3VjaCgpOworICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgbUxhc3RUb3VjaFgvWSB0byB0aGUgcmVtYWluaW5nIHBvaW50CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OworICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgorICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBEdWUgdG8gdGhlIHRvdWNoIHNjcmVlbiBlZGdlIGVmZmVjdCwgYSB0b3VjaCBjbG9zZXIgdG8gdGhlIGVkZ2UKICAgICAgICAgLy8gYWx3YXlzIHNuYXBwZWQgdG8gdGhlIGVkZ2UuIEFzIGdldFZpZXdXaWR0aCgpIGNhbiBiZSBkaWZmZXJlbnQgZnJvbQogICAgICAgICAvLyBnZXRXaWR0aCgpIGR1ZSB0byB0aGUgc2Nyb2xsYmFyLCBhZGp1c3RpbmcgdGhlIHBvaW50IHRvIG1hdGNoCiAgICAgICAgIC8vIGdldFZpZXdXaWR0aCgpLiBTYW1lIGFwcGxpZWQgdG8gdGhlIGhlaWdodC4KLSAgICAgICAgaWYgKHggPiBnZXRWaWV3V2lkdGgoKSAtIDEpIHsKLSAgICAgICAgICAgIHggPSBnZXRWaWV3V2lkdGgoKSAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgPiBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxKSB7Ci0gICAgICAgICAgICB5ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMTsKLSAgICAgICAgfQorICAgICAgICB4ID0gTWF0aC5taW4oeCwgZ2V0Vmlld1dpZHRoKCkgLSAxKTsKKyAgICAgICAgeSA9IE1hdGgubWluKHksIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDEpOwogCiAgICAgICAgIGZsb2F0IGZEZWx0YVggPSBtTGFzdFRvdWNoWCAtIHg7CiAgICAgICAgIGZsb2F0IGZEZWx0YVkgPSBtTGFzdFRvdWNoWSAtIHk7CkBAIC00NzY3LDE4ICs0NzgyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9EUkFHX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5GdWxsU2NyZWVuTW9kZSgpICYmIG1TaGlmdElzUHJlc3NlZCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCA9IG1TY3JvbGxYICsgKGludCkgeDsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFkgPSBtU2Nyb2xsWSArIChpbnQpIHk7Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TRUxFQ1RfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInNlbGVjdD0iICsgbVNlbGVjdFggKyAiLCIgKyBtU2VsZWN0WSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVRvdWNoU2VsZWN0aW9uID0gbUV4dGVuZFNlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gZHJhdyB0aGUgaS1iZWFtIGluc3RlYWQgb2YgdGhlIGFycm93CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NzkwLDE3ICs0Nzk4LDQ1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd1NlbGVjdGlvblBvaW50ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25TdGFydGVkID0gbmF0aXZlU3RhcnRTZWxlY3Rpb24oY29udGVudFgsIGNvbnRlbnRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2VsZWN0PSIgKyBjb250ZW50WCArICIsIiArIGNvbnRlbnRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBsaW5rCiAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCkBAIC00ODI0LDE3ICs0ODYwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNDg1NSwyNCArNDg4OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC00ODkyLDIwICs0OTI2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Ub3VjaE1vZGUgPSAiICsgbVRvdWNoTW9kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXYpOwotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TRUxFQ1RfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFggPSBtU2Nyb2xsWCArIChpbnQpIHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WSA9IG1TY3JvbGxZICsgKGludCkgeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAieHRlbmQ9IiArIG1TZWxlY3RYICsgIiwiICsgbVNlbGVjdFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0ICYmIG1TZWxlY3Rpb25TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJleHRlbmQ9IiArIGNvbnRlbnRYICsgIiwiICsgY29udGVudFkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV4dGVuZFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTQ5MzIsNiArNDk2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBTY2FsZUdlc3R1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZ2VzdHVyZVgsIGdlc3R1cmVZKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ5NDAsMTcgKzQ5NzksMTkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBkbyBwYW4KLSAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFggKyBkZWx0YVgpOwotICAgICAgICAgICAgICAgIGludCBuZXdEZWx0YVggPSBuZXdTY3JvbGxYIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gbmV3RGVsdGFYOwotICAgICAgICAgICAgICAgICAgICBmRGVsdGFYID0gKGZsb2F0KSBuZXdEZWx0YVg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBuZXdTY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSArIGRlbHRhWSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWSA9IG5ld1Njcm9sbFkgLSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgewotICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSBuZXdEZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGZEZWx0YVkgPSAoZmxvYXQpIG5ld0RlbHRhWTsKKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYICsgZGVsdGFYKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWCA9IG5ld1Njcm9sbFggLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEZWx0YVggPSAoZmxvYXQpIG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkgKyBkZWx0YVkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFZID0gbmV3U2Nyb2xsWSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWSA9IChmbG9hdCkgbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4ga2VlcFNjcm9sbEJhcnNWaXNpYmxlID0gZmFsc2U7CkBAIC01MDE4LDcgKzUwNTksOSBAQAogCiAgICAgICAgICAgICAgICAgZG9EcmFnKGRlbHRhWCwgZGVsdGFZKTsKIAotICAgICAgICAgICAgICAgIGlmIChrZWVwU2Nyb2xsQmFyc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBzY3JvbGxiYXJzIHdoZW4gZHJhZ2dpbmcgYSBsYXllci4KKyAgICAgICAgICAgICAgICBpZiAoa2VlcFNjcm9sbEJhcnNWaXNpYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobUhlbGRNb3Rpb25sZXNzICE9IE1PVElPTkxFU1NfVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtNTAzMyw2ICs1MDc2LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0ZvY3VzZWQoKSkgcmVxdWVzdEZvY3VzKCk7CiAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aGUgdG91Y2ggZXZlbnRzIGZyb20gVUkgdGhyZWFkIHRvIFdlYkNvcmUgdGhyZWFkCiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CkBAIC01MDQxLDEwICs1MDg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFVwVGltZSA9IGV2ZW50VGltZTsKQEAgLTUwNTksMjAgKzUwOTksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfU0VMRUNUX01PREU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDb3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0lOSVRfTU9ERTogLy8gdGFwCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX1NIT1JUUFJFU1NfTU9ERToKQEAgLTUwODQsOSArNTExNiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbXB1dGVNYXhTY3JvbGxYKCkgPiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbXB1dGVNYXhTY3JvbGxZKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSB0YWtlcyBjb250cm9sIGJhY2ssIGNhbmNlbCBXZWJDb3JlIHRvdWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGNvbnRlbnRYLCBjb250ZW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHBlcmZvcm1lZCBhIHZlcnkgcXVpY2sgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFdlYkNvcmUgaGFzIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgYW55IGNhbGwgdG8gcHJldmVudERlZmF1bHQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpTIHRvdWNoIGhhbmRsZXIgd2lsbCBub3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIHlldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVuY2Ugd2Ugd2lsbCBzZWUgYm90aCB0aGUgVUkgKG5vdykgYW5kIFdlYkNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoZW4gY29udGV4dCBzd2l0Y2hlcykgaGFuZGxpbmcgdGhlIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHdlYiBkZXZlbG9wZXIgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc2VzIHByZXZlbnREZWZhdWx0IGluIHRoZWlyIHRvdWNoIGhhbmRsZXIuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG5hdHVyZSBvZiBvdXIgYXN5bmNocm9ub3VzIHRvdWNoIG1vZGVsLgorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IHJld3JpdGUgZHJhZyBjb2RlIGhlcmUsIGJ1dCB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSBmbGluZyBpZiBpdCBhcHBsaWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZWR1Y2VQcmlvcml0eSgpOwpAQCAtNTEwMyw3ICs1MTQzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcHBpbmcgb24gc2VsZWN0aW9uIG9yIGNvbnRyb2xzIGRvZXMgbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJpZ2dlciBkb3VibGUgdGFwIGlmIHRoZSBXZWJWaWV3IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYW5ab29tSW4oKSB8fCBjYW5ab29tT3V0KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX1NJTkdMRV9UQVAsIFZpZXdDb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG91YmxlVGFwVGltZW91dCgpKTsKQEAgLTUxMzgsNiArNTE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9EUkFHX1NUQVJUX01PREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19MQVlFUl9NT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9VQ0hfRFJBR19TVEFSVF9NT0RFIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGFzIHdlIGFsbW9zdCBjZXJ0YWluIHdpbGwgZ2V0IGEgTU9WRS4gQnV0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHBvc3NpYmxlIG9uIGVtdWxhdG9yLgpAQCAtNTE5NCw0MCArNTI0NSwyNiBAQAogICAgICAgICBpZiAoIW1EcmFnRnJvbVRleHRJbnB1dCkgewogICAgICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOwogICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLnN1cHBvcnRab29tKCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAmJiAhZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuaXNWaXNpYmxlKCkKLSAgICAgICAgICAgICAgICAmJiBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZQotICAgICAgICAgICAgICAgICYmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gc2V0dGluZ3MuZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpOwotICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldyAmJiBjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOwotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvRHJhZyhpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKSB7CiAgICAgICAgIGlmICgoZGVsdGFYIHwgZGVsdGFZKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICBkZWx0YVggPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKGRlbHRhWCk7CisgICAgICAgICAgICAgICAgZGVsdGFZID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVkpOworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTY3JvbGxMYXllcihtU2Nyb2xsaW5nTGF5ZXIsIGRlbHRhWCwgZGVsdGFZKSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgZGVsdGFZKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHNob3dQbHVzTWludXMgPSBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZTsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwgJiYgc2hvd1BsdXNNaW51cykgewotICAgICAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5zaG93KHNob3dQbHVzTWludXMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIua2VlcFpvb21QaWNrZXJWaXNpYmxlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BUb3VjaCgpIHsKQEAgLTUyNTQsNyArNTI5MSw4IEBACiAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUgfHwKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgfQpAQCAtNTI2Miw2ICs1MzAwLDkgQEAKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNXSVRDSF9UT19MT05HUFJFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRFJBR19IRUxEX01PVElPTkxFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQVdBS0VOX1NDUk9MTF9CQVJTKTsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgfQogICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKQEAgLTUyNzMsOCArNTMxNCwxMCBAQAogICAgIHByaXZhdGUgZmxvYXQgbVRyYWNrYmFsbFJlbWFpbnNZID0gMC4wZjsKICAgICBwcml2YXRlIGludCBtVHJhY2tiYWxsWE1vdmUgPSAwOwogICAgIHByaXZhdGUgaW50IG1UcmFja2JhbGxZTW92ZSA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3Rpb25TdGFydGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FeHRlbmRTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRvdWNoU2VsZWN0aW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfS0VZX1RJTUVPVVQgPSAxMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfVElNRU9VVCA9IDIwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tCQUxMX1dBSVQgPSAxMDA7CkBAIC01MzEzLDEwICs1MzU2LDggQEAKICAgICAgICAgICAgIGlmIChldi5nZXRZKCkgPCAwKSBwYWdlVXAodHJ1ZSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBib29sZWFuIHNoaWZ0UHJlc3NlZCA9IG1TaGlmdElzUHJlc3NlZCAmJiAobU5hdGl2ZUNsYXNzID09IDAKLSAgICAgICAgICAgICAgICB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKTsKICAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBpZiAoc2hpZnRQcmVzc2VkKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZGlzY2FyZCBwcmVzcyBpZiBjb3B5IGluIHByb2dyZXNzCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVHJhY2tiYWxsRG93biA9IHRydWU7CkBAIC01MzQxLDExICs1MzgyLDEzIEBACiAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTE9OR19QUkVTU19DRU5URVIpOwogICAgICAgICAgICAgbVRyYWNrYmFsbERvd24gPSBmYWxzZTsKICAgICAgICAgICAgIG1UcmFja2JhbGxVcFRpbWUgPSB0aW1lOwotICAgICAgICAgICAgaWYgKHNoaWZ0UHJlc3NlZCkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgaWYgKG1FeHRlbmRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWl0Q29weSgpOworICAgICAgICAgICAgICAgICAgICBjb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtRXh0ZW5kU2VsZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gZHJhdyB0aGUgaS1iZWFtIGluc3RlYWQgb2YgdGhlIGFycm93CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXNjYXJkIHByZXNzIGlmIGNvcHkgaW4gcHJvZ3Jlc3MKQEAgLTU0MTIsOCArNTQ1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB5UmF0ZT0iICsgeVJhdGUKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKHZpZXdUb0NvbnRlbnRYKG1TZWxlY3RYKSwKLSAgICAgICAgICAgICAgICB2aWV3VG9Db250ZW50WShtU2VsZWN0WSksIG1FeHRlbmRTZWxlY3Rpb24pOworICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKHZpZXdUb0NvbnRlbnRYKG1TZWxlY3RYKSwgdmlld1RvQ29udGVudFkobVNlbGVjdFkpKTsKICAgICAgICAgaW50IHNjcm9sbFggPSBtU2VsZWN0WCA8IG1TY3JvbGxYID8gLVNFTEVDVF9DVVJTT1JfT0ZGU0VUCiAgICAgICAgICAgICAgICAgOiBtU2VsZWN0WCA+IG1heFggLSBTRUxFQ1RfQ1VSU09SX09GRlNFVCA/IFNFTEVDVF9DVVJTT1JfT0ZGU0VUCiAgICAgICAgICAgICAgICAgOiAwOwpAQCAtNTQ3OSw3ICs1NTIxLDE2IEBACiAgICAgICAgIGZsb2F0IHlSYXRlID0gbVRyYWNrYmFsbFJlbWFpbnNZICogMTAwMCAvIGVsYXBzZWQ7CiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKICAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtU2hpZnRJc1ByZXNzZWQgJiYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgaWYgKCFtRHJhd1NlbGVjdGlvblBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBzZWxlY3Rpb24gd2FzIG1hZGUgYnkgdG91Y2gsIGRpc2FibGluZyBkcmF3aW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBwb2ludGVyLiBBbGxvdyB0aGUgdHJhY2tiYWxsIHRvIGFkanVzdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBvZiB0aGUgdG91Y2ggY29udHJvbC4KKyAgICAgICAgICAgICAgICBtU2VsZWN0WCA9IGNvbnRlbnRUb1ZpZXdYKG5hdGl2ZVNlbGVjdGlvblgoKSk7CisgICAgICAgICAgICAgICAgbVNlbGVjdFkgPSBjb250ZW50VG9WaWV3WShuYXRpdmVTZWxlY3Rpb25ZKCkpOworICAgICAgICAgICAgICAgIG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbW92ZVNlbGVjdGlvbihzY2FsZVRyYWNrYmFsbFgoeFJhdGUsIHZpZXdXaWR0aCksCiAgICAgICAgICAgICAgICAgICAgIHNjYWxlVHJhY2tiYWxsWSh5UmF0ZSwgdmlld0hlaWdodCkpOwogICAgICAgICAgICAgbVRyYWNrYmFsbFJlbWFpbnNYID0gbVRyYWNrYmFsbFJlbWFpbnNZID0gMDsKQEAgLTU1MTcsMTEgKzU1NjgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTU2MCw2ICs1NjExLDE5IEBACiAgICAgICAgICAgICAgICAgLSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksIDApOwogICAgIH0KIAorICAgIGJvb2xlYW4gdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CisgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7CisgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CisgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZmxpbmdTY3JvbGwoaW50IHZ4LCBpbnQgdnkpIHsKICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgdngsIHZ5LCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAogICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwpAQCAtNTU5NSwxMyArNTY1OSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZsb2F0IGN1cnJlbnRWZWxvY2l0eSA9IG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKTsKLSAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHsKKyAgICAgICAgZmxvYXQgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDAgJiYgdmVsb2NpdHkKKyAgICAgICAgICAgICAgICA+IG1MYXN0VmVsb2NpdHkgKiBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04pIHsKICAgICAgICAgICAgIGZsb2F0IGRlbHRhUiA9IChmbG9hdCkgKE1hdGguYWJzKE1hdGguYXRhbjIobUxhc3RWZWxZLCBtTGFzdFZlbFgpCiAgICAgICAgICAgICAgICAgICAgIC0gTWF0aC5hdGFuMih2eSwgdngpKSk7CiAgICAgICAgICAgICBmaW5hbCBmbG9hdCBjaXJjbGUgPSAoZmxvYXQpIChNYXRoLlBJKSAqIDIuMGY7CiAgICAgICAgICAgICBpZiAoZGVsdGFSID4gY2lyY2xlICogMC45ZiB8fCBkZWx0YVIgPCBjaXJjbGUgKiAwLjFmKSB7CiAgICAgICAgICAgICAgICAgdnggKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxYIC8gbUxhc3RWZWxvY2l0eTsKICAgICAgICAgICAgICAgICB2eSArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFkgLyBtTGFzdFZlbG9jaXR5OworICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZG9GbGluZyB2eD0gIiArIHZ4ICsgIiB2eT0iICsgdnkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU2MTcsNDUgKzU2ODQsMTUgQEAKICAgICAgICAgfQogICAgICAgICBtTGFzdFZlbFggPSB2eDsKICAgICAgICAgbUxhc3RWZWxZID0gdnk7Ci0gICAgICAgIG1MYXN0VmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5OwogCiAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZKTsKLSAgICAgICAgLy8gVE9ETzogZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eSwgaWYgdGhlIHJhbmdlIGlzCi0gICAgICAgIC8vIHNtYWxsLCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RvcCBiZWZvcmUgZHVyYXRpb24gaXMgdXAuIFdlIG1heQotICAgICAgICAvLyB3YW50IHRvIGNhbGN1bGF0ZSBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIGlzIGdvaW5nIHRvIHJ1biB0byBwcmVjaXNlbHkKLSAgICAgICAgLy8gcmVzdW1lIHRoZSB3ZWJjb3JlIHVwZGF0ZS4KICAgICAgICAgZmluYWwgaW50IHRpbWUgPSBtU2Nyb2xsZXIuZ2V0RHVyYXRpb24oKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZLCB0aW1lKTsKICAgICAgICAgYXdha2VuU2Nyb2xsQmFycyh0aW1lKTsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB6b29tV2l0aFByZXZpZXcoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWSA9IG1TY3JvbGxZOwotCi0gICAgICAgIC8vIHNuYXAgdG8gREVGQVVMVF9TQ0FMRSBpZiBpdCBpcyBjbG9zZQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIHVwZGF0ZVRleHRXcmFwU2NhbGUsIGZhbHNlKTsKLQotICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0Ci0gICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKLSAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB2aWV3IGNvbnRhaW5pbmcgem9vbSBjb250cm9scyBpLmUuICsvLSBidXR0b25zLiBUaGUgY2FsbGVyIGlzCiAgICAgICogaW4gY2hhcmdlIG9mIGluc3RhbGxpbmcgdGhpcyB2aWV3IHRvIHRoZSB2aWV3IGhpZXJhcmNoeS4gVGhpcyB2aWV3IHdpbGwKQEAgLTU2NzUsODEgKzU3MTIsMjkgQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtWm9vbUNvbnRyb2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMgPSBjcmVhdGVab29tQ29udHJvbHMoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc2V0IHRvIFZJU0lCTEUgZmlyc3Qgc28gdGhhdCBnZXRNZWFzdXJlZEhlaWdodCgpIGluCi0gICAgICAgICAgICAgKiB7QGxpbmsgI29uU2l6ZUNoYW5nZWQoKX0gY2FuIHJldHVybiB0aGUgbWVhc3VyZWQgdmFsdWUgZm9yIHByb3BlcgotICAgICAgICAgICAgICogbGF5b3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RXh0ZXJuYWxab29tUGlja2VyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7Ci0gICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtQ29udGV4dAotICAgICAgICAgICAgLCBudWxsKTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0RGVmYXVsdFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB3aGljaCBjYW4gYmUgdXNlZCB0byBhZGQKLSAgICAgKiBhZGRpdGlvbmFsIGJ1dHRvbnMgdG8gdGhlIHpvb20gY29udHJvbHMgd2luZG93LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIGNsYXNzLAotICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBpdCBpcyB1bmF2YWlsYWJsZS4KLSAgICAgKiBAaGlkZQorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIGluLgogICAgICAqLwotICAgIHB1YmxpYyBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobVpvb21MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgotICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQotICAgICAgICAgICAgLy8gcmlnaHQuCi0gICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKLSAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGZyYW1lUGFyYW1zID0gKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zOwotICAgICAgICAgICAgICAgIGZyYW1lUGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlJJR0hUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBvdXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NzU3LDE1ICs1NzQyLDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBpbiBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDEuMjVmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tSW4oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU3NzMsMTQgKzU3NTAsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDAuOGYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21PdXQoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewpAQCAtNTg4MSw3ICs1ODUxLDE0IEBACiAgICAgICAgIC8vIG1MYXN0VG91Y2hYIGFuZCBtTGFzdFRvdWNoWSBhcmUgdGhlIHBvaW50IGluIHRoZSBjdXJyZW50IHZpZXdwb3J0CiAgICAgICAgIGludCBjb250ZW50WCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1MYXN0VG91Y2hYICsgbVNjcm9sbFgpOwogICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKLSAgICAgICAgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgeworICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhIHRvdWNoVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhKCk7CisgICAgICAgICAgICAvLyB1c2UgIjAiIGFzIGdlbmVyYXRpb24gaWQgdG8gaW5mb3JtIFdlYktpdCB0byB1c2UgdGhlIHNhbWUgeC95IGFzCisgICAgICAgICAgICAvLyBpdCB1c2VkIHdoZW4gcHJvY2Vzc2luZyBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTCisgICAgICAgICAgICB0b3VjaFVwRGF0YS5tTW92ZUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX1VQLCB0b3VjaFVwRGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5Nb3Rpb25VcERhdGEgbW90aW9uVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlCiAgICAgICAgICAgICAgICAgICAgIC5Nb3Rpb25VcERhdGEoKTsKICAgICAgICAgICAgIG1vdGlvblVwRGF0YS5tRnJhbWUgPSBuYXRpdmVDYWNoZUhpdEZyYW1lUG9pbnRlcigpOwpAQCAtNTkwOSwyNyArNTg4NiwxNiBAQAogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB2aWV3IChQbHVnaW4pIGlzIGZ1bGx5IHZpc2libGUgYW5kIG1heGltaXplZCBpbnNpZGUKICAgICAgKiB0aGUgV2ViVmlldy4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgewotICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwotICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwKLSAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICByZXR1cm4gIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFggKyB2aWV3V2lkdGgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZICsgdmlld0hlaWdodDsKICAgICB9CiAKICAgICAvKgpAQCAtNTkzOCwyMiArNTkwNCwxOSBAQAogICAgICAqIGFuaW1hdGVkIHNjcm9sbCB0byBjZW50ZXIgaXQuIElmIHRoZSB6b29tIG5lZWRzIHRvIGJlIGNoYW5nZWQsIGZpbmQgdGhlCiAgICAgICogem9vbSBjZW50ZXIgYW5kIGRvIGEgc21vb3RoIHpvb20gdHJhbnNpdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgeworICAgIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgewogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CiAgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwogICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gZG9jV2lkdGgsIChmbG9hdCkgdmlld0hlaWdodAogICAgICAgICAgICAgICAgIC8gZG9jSGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CiAgICAgICAgICAgICBwaW5TY3JvbGxUbyhjb250ZW50VG9WaWV3WChkb2NYICsgZG9jV2lkdGggLyAyKSAtIHZpZXdXaWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUb1ZpZXdZKGRvY1kgKyBkb2NIZWlnaHQgLyAyKSAtIHZpZXdIZWlnaHQgLyAyLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogbUFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CisgICAgICAgICAgICBmbG9hdCBhY3R1YWxTY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBhY3R1YWxTY2FsZSAtIG1TY3JvbGxYOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdYID0gZG9jWCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdXaWR0aCA9IGRvY1dpZHRoICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCBuZXdNYXhXaWR0aCA9IG1Db250ZW50V2lkdGggKiBzY2FsZTsKQEAgLTU5NjQsOSArNTkyNyw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblggPiAobmV3TWF4V2lkdGggLSByZWN0Vmlld1ggLSByZWN0Vmlld1dpZHRoKSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblggPSB2aWV3V2lkdGggLSAobmV3TWF4V2lkdGggLSByZWN0Vmlld1gpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogbUFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogYWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1kgPSBkb2NZICogc2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdIZWlnaHQgPSBkb2NIZWlnaHQgKiBzY2FsZTsKQEAgLTU5NzgsMTA5ICs1OTQxLDEwIEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblkgPiAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZIC0gcmVjdFZpZXdIZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWSA9IHZpZXdIZWlnaHQgLSAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoc2NhbGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1heWJlIGNhbGxlZCBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpLiBBcyB3ZSBjYW4ndCBnZXQgc2V0dGluZ3MsCi0gICAgICAgICAgICAvLyBqdXN0IGhpZGUgem9vbSBjb250cm9sIGZvciBib3RoIHN0eWxlcy4KLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUnVsZSBmb3IgZG91YmxlIHRhcDoKLSAgICAvLyAxLiBpZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3Qgc2FtZSBhcyB0aGUgdGV4dCB3cmFwIHNjYWxlIGFuZCBsYXlvdXQKLSAgICAvLyAgICBhbGdvcml0aG0gaXMgTkFSUk9XX0NPTFVNTlMsIGZpdCB0byBjb2x1bW47Ci0gICAgLy8gMi4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgbm90IG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBvdmVydmlldyBtb2RlOwotICAgIC8vIDMuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBkZWZhdWx0IHNjYWxlLgotICAgIHByaXZhdGUgdm9pZCBkb0RvdWJsZVRhcCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IG1MYXN0VG91Y2hZOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSB6b29tIGNvbnRyb2wgYWZ0ZXIgZG91YmxlIHRhcAotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgVmlld01hbmFnZXIuQ2hpbGRWaWV3IHBsdWdpbiA9IG1WaWV3TWFuYWdlci5oaXRUZXN0KG1BbmNob3JYLCBtQW5jaG9yWSk7Ci0gICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzUGx1Z2luRml0T25TY3JlZW4ocGx1Z2luKSkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldygoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3QocGx1Z2luLngsIHBsdWdpbi55LCBwbHVnaW4ud2lkdGgsIHBsdWdpbi5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gem9vbVRvRGVmYXVsdCA9IGZhbHNlOwotICAgICAgICBpZiAoKHNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09IFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUykKLSAgICAgICAgICAgICAgICAmJiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmbG9hdCBvdmVydmlld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBvdmVydmlld1NjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICBmbG9hdCBuZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbmV3U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG5ld1NjYWxlLCB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6b29tVG9EZWZhdWx0KSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBpZiAobGVmdCAhPSBOT19MRUZURURHRSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIG1EZWZhdWx0U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSh2aWV3TGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKHpvb21DZW50ZXJYLCB6b29tQ2VudGVyWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc3RhcnRab29tQW5pbWF0aW9uKHNjYWxlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYwOTIsNiArNTk1Niw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoaW50IGRpcmVjdGlvbiwgUmVjdCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpIHsKKyAgICAgICAgLy8gRklYTUU6IElmIGEgc3Vid2luZG93IGlzIHNob3dpbmcgZmluZCwgYW5kIHRoZSB1c2VyIHRvdWNoZXMgdGhlCisgICAgICAgIC8vIGJhY2tncm91bmQgd2luZG93LCBpdCBjYW4gc3RlYWwgZm9jdXMuCisgICAgICAgIGlmIChtRmluZElzVXApIHJldHVybiBmYWxzZTsKICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gbVdlYlRleHRWaWV3LnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24sCkBAIC02MTc5LDYgKzYwNDYsMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbihWaWV3IGNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZSkgeworICAgICAgICAvLyBkb24ndCBzY3JvbGwgd2hpbGUgaW4gem9vbSBhbmltYXRpb24uIFdoZW4gaXQgaXMgZG9uZSwgd2Ugd2lsbCBhZGp1c3QKKyAgICAgICAgLy8gdGhlIG5lY2Vzc2FyeSBjb21wb25lbnRzIChlLmcuLCBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUpCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmVjdC5vZmZzZXQoY2hpbGQuZ2V0TGVmdCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWCgpLAogICAgICAgICAgICAgICAgIGNoaWxkLmdldFRvcCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWSgpKTsKIApAQCAtNjMyMSw3ICs2MTk0LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTV0lUQ0hfVE9fU0hPUlRQUkVTUzogewogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjMzNSw2ICs2MjA5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX0xPTkdQUkVTUzogeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpIHx8IG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M7CkBAIC02MzQ2LDE1ICs2MjIzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02Mzg3LDcwICs2MjU5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ29udGVudFNjcm9sbFRvKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1pPT01fUkFOR0U6IHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IChXZWJWaWV3Q29yZS5WaWV3U3RhdGUpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1TY3JvbGxYIGNvbnRhaW5zIHRoZSBuZXcgbWluUHJlZldpZHRoCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIGdldFZpZXdXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksIHZpZXdTdGF0ZS5tU2Nyb2xsWCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0VfQkFTRV9DT05URU5UOiB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIE5FV19QSUNUVVJFX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwcmV2aW91c2x5IGRlbGF5ZWQgZGVsZXRpbmcgYSByb290Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxheWVyLCBkbyBpdCBub3cuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVsYXllZERlbGV0ZVJvb3RMYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcigwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIG5ldyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3Lm1WaWV3UG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlV2lkZVZpZXdwb3J0ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3Lm1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubU1pblByZWZXaWR0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCAhPSBtVGV4dFdyYXBTY2FsZSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB1c2VXaWRlVmlld3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBNYXRoLmFicyhzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSBsYXlvdXQgKGkuZS4gcmVxdWVzdCBhIGxheW91dCBmcm9tIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHN5c3RlbSkgaWYgdGhlIGxhc3QgdmlldyBzaXplIHRoYXQgd2Ugc2VudCB0bwogICAgICAgICAgICAgICAgICAgICAvLyBXZWJDb3JlIG1hdGNoZXMgdGhlIHZpZXcgc2l6ZSBvZiB0aGUgcGljdHVyZSB3ZSBqdXN0CkBAIC02NDU4LDQ1ICs2Mjk2LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXBkYXRlTGF5b3V0ID0gdmlld1NpemUueCA9PSBtTGFzdFdpZHRoU2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXdTaXplLnkgPT0gbUxhc3RIZWlnaHRTZW50OwogICAgICAgICAgICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShkcmF3Lm1XaWR0aEhlaWdodC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChtRmluZElzVXAgPyBtRmluZEhlaWdodCA6IDApLCB1cGRhdGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnksIHVwZGF0ZUxheW91dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IGIgPSBkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIk5FV19QSUNUVVJFX01TR19JRCB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubGVmdCsiLCIrYi50b3ArIiwiK2IucmlnaHQrIiwiK2IuYm90dG9tKyJ9Iik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUNvbnRlbnRSZWN0KGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVBpY3R1cmVMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGljdHVyZUxpc3RlbmVyLm9uTmV3UGljdHVyZShXZWJWaWV3LnRoaXMsIGNhcHR1cmVQaWN0dXJlKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VXaWRlVmlld3BvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSBNYXRoLm1pbihzTWF4Vmlld3BvcnRXaWR0aCwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KChpbnQpICh2aWV3V2lkdGggLyBtRGVmYXVsdFNjYWxlKSwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoZHJhdy5tTWluUHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tVmlld1BvaW50LngpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSAmJiBtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoKGZsb2F0KSB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVpvb21PdmVydmlld1dpZHRoLCBNYXRoLmFicyhtQWN0dWFsU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Jlc3RvcmVTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjUzMCwxNCArNjM0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb2Z0S2V5Ym9hcmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lECiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyB0ZXh0ZmllbGQgd2FzIGluIGZvY3VzLCBhbmQgdGhlIHVzZXIgdG91Y2hlZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhdXNpbmcgaXQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UsIHRoZW4gV2ViVGV4dFZpZXcgaGFzIG5vdAotICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIHNldCB1cCB5ZXQuICBSZWJ1aWxkIGl0IHNvIGl0IGNhbiBzZXQgaXRzIHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NTU1LDcgKzYzNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTU9WRV9PVVRfT0ZfUExVR0lOOgorICAgICAgICAgICAgICAgIGNhc2UgVU5IQU5ETEVEX05BVl9LRVk6CiAgICAgICAgICAgICAgICAgICAgIG5hdkhhbmRsZWRLZXkobXNnLmFyZzEsIDEsIGZhbHNlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9FTlRSWV9NU0dfSUQ6CkBAIC02NTgwLDIzICs2MzkyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUk9PVF9MQVlFUl9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gbXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bGwgaW5kaWNhdGVzIGRlbGV0aW5nIHRoZSBvbGQgbGF5ZXIsIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgZG8gc28gdW50aWwgd2UndmUgZ290IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBhZ2UgdG8gZGlzcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRSb290TGF5ZXIobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRk9STV9EQVRBOgogICAgICAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGVBZGFwdGVyIGFkYXB0ZXIgPSAoQXV0b0NvbXBsZXRlQWRhcHRlcikgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1XZWJUZXh0Vmlldy5pc1NhbWVUZXh0RmllbGQobXNnLmFyZzEpKSB7CkBAIC02NjQwLDMzICs2NDM1LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZlbnREZWZhdWx0ID0gbXNnLmFyZzIgPT0gMSA/IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUFJFVkVOVF9ERUZBVUxUX05POwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmFyZzIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkZWZhdWx0IGlzIG5vdCBjYWxsZWQgaW4gV2ViQ29yZSwgc28gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIG5lZWRzIHRvIGJlIHJlcHJvY2Vzc2VkIGluIFVJCiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSAoVG91Y2hFdmVudERhdGEpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRlZC5tQWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNuYXBwaW5nIGluIGRlZmVyIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19NT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFYID0gcGluTG9jWCgoaW50KSAobVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB0ZWQubVZpZXdYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gcGluTG9jWSgoaW50KSAobVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB0ZWQubVZpZXdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CkBAIC02NjgwLDkgKzY0ODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9ET1VCTEVUQVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvRG91YmxlVGFwKCkgbmVlZHMgbUxhc3RUb3VjaFgvWSBhcyBhbmNob3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHRlZC5tVmlld1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRG91YmxlVGFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkgLSBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmhhbmRsZURvdWJsZVRhcChtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0xPTkdQUkVTUzoKQEAgLTY2OTAsNyArNjQ5Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXRUZXN0ICE9IG51bGwgJiYgaGl0VGVzdC5tVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEhpdFRlc3RSZXN1bHQuVU5LTk9XTl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgxNCw3ICs2NjE1LDYgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQ0VOVEVSX0ZJVF9SRUNUOgogICAgICAgICAgICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChyLmxlZnQsIHIudG9wLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNjgyMyw2ICs2NjIzLDQzIEBACiAgICAgICAgICAgICAgICAgICAgIG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBtc2cuYXJnMjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblN0cmluZyA9IChTdHJpbmcpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yLm9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKHNlbGVjdGlvblN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IChBcnJheUxpc3Q8UmVjdD4pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlY3QgcmVjdCA6IHJlY3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCB2aWV3UmVjdCA9IGNvbnRlbnRUb1ZpZXdSZWN0KHJlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgc2l0ZXMsIGxpa2Ugc3RvcmllcyBpbiBueXRpbWVzLmNvbSwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW91c2UgZXZlbnQgaGFuZGxlciBpbiB0aGUgdG9wIGRpdi4gSXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBmcmllbmRseSB0byBoaWdobGlnaHQgdGhlIGRpdiBpZiBpdCBjb3ZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgc2NyZWVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3UmVjdC53aWR0aCgpIDwgZ2V0V2lkdGgoKSA+PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB2aWV3UmVjdC5oZWlnaHQoKSA8IGdldEhlaWdodCgpID4+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnVuaW9uKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSh2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiU2tpcCB0aGUgaHVnZSBzZWxlY3Rpb24gcmVjdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9IChTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVNZXNzYWdlLm1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tQ2FsbGJhY2sub25SZWNlaXZlVmFsdWUoc2F2ZU1lc3NhZ2UubVJlc3VsdEZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTcxMzAsMzcgKzY5NjcsNiBAQAogICAgICAgICAgICAgICAgIG5ldyBJbnZva2VMaXN0Qm94KGFycmF5LCBlbmFibGVkQXJyYXksIHNlbGVjdGVkQXJyYXkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUsCi0gICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoLCBib29sZWFuIHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pblByZWZXaWR0aCA+IE1hdGgubWF4KDAsIHZpZXdXaWR0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbWluUHJlZldpZHRoOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0TG9hZFdpdGhPdmVydmlld01vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWluU2NhbGU7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1heFNjYWxlID09IDApIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKgogICAgICAqIFJlcXVlc3QgYSBkcm9wZG93biBtZW51IGZvciBhIGxpc3Rib3ggd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG9yIGEgc2luZ2xlCiAgICAgICogPHNlbGVjdD4gZWxlbWVudC4KQEAgLTcyNDMsNyArNzA0OSw3IEBACiAgICAgICAgIC8vIEZJWE1FIHRoZSBkaXZpc29yIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBzb21ld2hlcmUKICAgICAgICAgLy8gdGhlIGNsb3Nlc3QgdGhpbmcgdG9kYXkgaXMgaGFyZC1jb2RlZCBpbnRvIFNjcm9sbFZpZXcuamF2YQogICAgICAgICAvLyAoZnJvbSBTY3JvbGxWaWV3LmphdmEsIGxpbmUgMzYzKSAgIGludCBtYXhKdW1wID0gaGVpZ2h0LzI7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyNTQsMTAgKzcwNjAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXNzIHRoZSBrZXkgdG8gdGhlIHBsdWdpbi4gIFRoaXMgYXNzdW1lcyB0aGF0IG5hdGl2ZUZvY3VzSXNQbHVnaW4oKQotICAgICAqIHJldHVybmVkIHRydWUuCisgICAgICogUGFzcyB0aGUga2V5IGRpcmVjdGx5IHRvIHRoZSBwYWdlLiAgVGhpcyBhc3N1bWVzIHRoYXQKKyAgICAgKiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSByZXR1cm5lZCB0cnVlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CisgICAgcHJpdmF0ZSB2b2lkIGxldFBhZ2VIYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CiAgICAgICAgIGludCBrZXlFdmVudEFjdGlvbjsKICAgICAgICAgaW50IGV2ZW50SHViQWN0aW9uOwogICAgICAgICBpZiAoZG93bikgewpAQCAtNzM1NCw3ICs3MTYwLDcgQEAKICAgICAgKiBAaGlkZSBvbmx5IG5lZWRzIHRvIGJlIGFjY2Vzc2libGUgdG8gQnJvd3NlciBhbmQgdGVzdGluZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXdQYWdlKENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLCAwLCAwLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03Mzk4LDkgKzcyMDQsMTggQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlYnVnRHVtcCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlc3Ryb3koKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvciBhbmQgZXh0cmEuIElmCisgICAgICogInNwbGl0SWZOZWVkZWQiIGlzIHRydWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDAsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNVVNUIGJlIHBhc3NlZCB0byBXZWJWaWV3Q29yZSB3aXRoIFNQTElUX1BJQ1RVUkVfU0VUIG1lc3NhZ2Ugc28gdGhhdCB0aGUKKyAgICAgKiBuYXRpdmUgYWxsb2NhdGlvbiBjYW4gYmUgZnJlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZURyYXcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLCBpbnQgZXh0cmEsCisgICAgICAgICAgICBib29sZWFuIHNwbGl0SWZOZWVkZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGaW5kQWxsKFN0cmluZyBmaW5kTG93ZXIsIFN0cmluZyBmaW5kVXBwZXIpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUZpbmROZXh0KGJvb2xlYW4gZm9yd2FyZCk7CiAgICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50ICAgICAgbmF0aXZlRm9jdXNDYW5kaWRhdGVGcmFtZVBvaW50ZXIoKTsKQEAgLTc0MjcsNiArNzI0Miw3IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlSGFzQ3Vyc29yTm9kZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0ZvY3VzTm9kZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIaXRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgICBuYXRpdmVJbWFnZVVSSShpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUluc3RydW1lbnRSZXBvcnQoKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBib29sZWFuIG5hdGl2ZU1vdmVDdXJzb3JUb05leHRUZXh0SW5wdXQoKTsKQEAgLTc0MzYsMjkgKzcyNTIsNTAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVNb3ZlQ3Vyc29yKGludCBrZXlDb2RlLCBpbnQgY291bnQsCiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5LAotICAgICAgICAgICAgYm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGJvb2xlYW4gZm9jdXNlZCwKICAgICAgICAgICAgIGJvb2xlYW4gcHJlc3NlZCwgYm9vbGVhbiBpbnZhbGlkYXRlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXNldFNlbGVjdGlvbigpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNlbGVjdEFsbCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNlbGVjdEJlc3RBdChSZWN0IHJlY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVNlbGVjdGlvblgoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVTZWxlY3Rpb25ZKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlRmluZEluZGV4KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RmluZElzRW1wdHkoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNVcChib29sZWFuIGlzVXApOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayhib29sZWFuIGZvbGxvd2VkKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKGJvb2xlYW4gbWVhc3VyZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Um9vdExheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0QmFzZUxheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlUmVwbGFjZUJhc2VDb250ZW50KGludCBjb250ZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVDb3B5QmFzZUNvbnRlbnRUb1BpY3R1cmUoUGljdHVyZSBwaWN0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIYXNDb250ZW50KCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihib29sZWFuIHNldCwKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgeCwgaW50IHksIGJvb2xlYW4gZXh0ZW5kU2VsZWN0aW9uKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOworICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBSZWN0ICAgICBuYXRpdmVTdWJ0cmFjdExheWVycyhSZWN0IGNvbnRlbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVRleHRHZW5lcmF0aW9uKCk7CiAgICAgLy8gTmV2ZXIgY2FsbCB0aGlzIHZlcnNpb24gZXhjZXB0IGJ5IHVwZGF0ZUNhY2hlZFRleHRmaWVsZChTdHJpbmcpIC0KICAgICAvLyB3ZSBhbHdheXMgd2FudCB0byBwYXNzIGluIG91ciBnZW5lcmF0aW9uIG51bWJlci4KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVVcGRhdGVDYWNoZWRUZXh0ZmllbGQoU3RyaW5nIHVwZGF0ZWRUZXh0LAogICAgICAgICAgICAgaW50IGdlbmVyYXRpb24pOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVdvcmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICAvLyByZXR1cm4gTk9fTEVGVEVER0UgbWVhbnMgZmFpbHVyZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKGludCB4LCBpbnQgeSwgZmxvYXQgc2NhbGUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKKyAgICBuYXRpdmUgaW50IG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisKKyAgICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2Nyb2xsYWJsZSBMYXllckFuZHJvaWQgYXQgdGhlIGdpdmVuIHBvaW50LgorICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVNjcm9sbGFibGVMYXllcihpbnQgeCwgaW50IHkpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVNjcm9sbExheWVyKGludCBsYXllciwgaW50IGR4LCBpbnQgZHkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQppbmRleCA0MTE4MTE5Li45ZWM5N2NkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtMTcsMTQgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludEZsYWdzRHJhd0ZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CkBAIC0zMywxNCArMjcsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk9wZW5hYmxlQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNyw3ICsxMTAsNyBAQAogICAgIHByaXZhdGUgaW50IG1WaWV3cG9ydERlbnNpdHlEcGkgPSAtMTsKIAogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjYWxlID0gMDsKLSAgICBwcml2YXRlIGludCBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gMDsKKyAgICBwcml2YXRlIGludCBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICBwcml2YXRlIGludCBtUmVzdG9yZWRYID0gMDsKICAgICBwcml2YXRlIGludCBtUmVzdG9yZWRZID0gMDsKIApAQCAtMjc5LDM0ICsyNzIsMzYgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBKTkkuICBPcGVuIGEgZmlsZSBjaG9vc2VyIHRvIHVwbG9hZCBhIGZpbGUuCi0gICAgICogQHJldHVybiBTdHJpbmcgdmVyc2lvbiBvZiB0aGUgVVJJIHBsdXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICogRklYTUU6IEp1c3QgcmV0dXJuIHRoZSBVUkkgaGVyZSwgYW5kIGluIEZpbGVTeXN0ZW06OnBhdGhHZXRGaWxlTmFtZSwgY2FsbAotICAgICAqIGludG8gSmF2YSB0byBnZXQgdGhlIGZpbGVuYW1lLgorICAgICAqIEBwYXJhbSBhY2NlcHRUeXBlIFRoZSB2YWx1ZSBvZiB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZQorICAgICAqICAgICAgICAgaW5wdXQgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGlja2VyLgorICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSS4KICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBvcGVuRmlsZUNob29zZXIoKSB7Ci0gICAgICAgIFVyaSB1cmkgPSBtQ2FsbGJhY2tQcm94eS5vcGVuRmlsZUNob29zZXIoKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gIiI7Ci0gICAgICAgIC8vIEZpbmQgb3V0IHRoZSBuYW1lLCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBVUkkuCi0gICAgICAgIC8vIFdlYmtpdCB3aWxsIHRyZWF0IHRoZSBuYW1lIGFzIHRoZSBmaWxlbmFtZSwgYW5kCi0gICAgICAgIC8vIHRoZSBVUkkgYXMgdGhlIHBhdGguICBUaGUgVVJJIHdpbGwgYmUgdXNlZAotICAgICAgICAvLyBpbiBCcm93c2VyRnJhbWUgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YS4KLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAotICAgICAgICAgICAgICAgIHVyaSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBPcGVuYWJsZUNvbHVtbnMuRElTUExBWV9OQU1FIH0sCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoMCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgIFVyaSB1cmkgPSBtQ2FsbGJhY2tQcm94eS5vcGVuRmlsZUNob29zZXIoYWNjZXB0VHlwZSk7CisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gIiI7CisgICAgICAgICAgICAvLyBOb3RlIC0gcXVlcnlpbmcgZm9yIE1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhLkRBVEEKKyAgICAgICAgICAgIC8vIHNlZW1zIHRvIHdvcmsgZm9yIGFsbCBjb250ZW50IFVSSXMsIG5vdCBqdXN0IGltYWdlcworICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhLkRBVEEgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZVBhdGggPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdXJpU3RyaW5nID0gdXJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2Uuc3RvcmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoZmlsZVBhdGgsIHVyaVN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gdXJpU3RyaW5nOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmkudG9TdHJpbmcoKSArICIvIiArIG5hbWU7CisgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKICAgICAvKioKQEAgLTQyNCw2ICs0MTksMTMgQEAKICAgICAgICAgcmV0dXJuIG1DYWxsYmFja1Byb3h5Lm9uSnNUaW1lb3V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSB3ZWJ2aWV3IHRoYXQgdGhpcyBpcyBhbiBpbnN0YWxsYWJsZSB3ZWIgYXBwLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeworICAgICAgICBtQ2FsbGJhY2tQcm94eS5zZXRJbnN0YWxsYWJsZVdlYkFwcCgpOworICAgIH0KKwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEpOSSBtZXRob2RzCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MzYsMzUgKzQzOCwxOCBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ2xlYXJDb250ZW50KCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBmbGF0IHBpY3R1cmUgZnJvbSB0aGUgc2V0IG9mIHBpY3R1cmVzLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlKTsKLQotICAgIC8qKgotICAgICAqIERyYXcgdGhlIHBpY3R1cmUgc2V0IHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yLiBSZXR1cm5zIHRydWUKLSAgICAgKiBpZiBzb21lIGluZGl2aWR1YWwgcGljdHVyZSB0b29rIHRvbyBsb25nIHRvIGRyYXcgYW5kIGNhbiBiZQotICAgICAqIHNwbGl0IGludG8gcGFydHMuIENhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVEcmF3Q29udGVudChDYW52YXMgY2FudmFzLCBpbnQgY29sb3IpOwotCi0gICAgLyoqCi0gICAgICogY2hlY2sgdG8gc2VlIGlmIHBpY3R1cmUgaXMgYmxhbmsgYW5kIGluIHByb2dyZXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVQaWN0dXJlUmVhZHkoKTsKLQotICAgIC8qKgogICAgICAqIFJlZHJhdyBhIHBvcnRpb24gb2YgdGhlIHBpY3R1cmUgc2V0LiBUaGUgUG9pbnQgd2ggcmV0dXJucyB0aGUKICAgICAgKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBvdmVyYWxsIHBpY3R1cmUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVSZWNvcmRDb250ZW50KFJlZ2lvbiBpbnZhbFJlZ2lvbiwgUG9pbnQgd2gpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVSZWNvcmRDb250ZW50KFJlZ2lvbiBpbnZhbFJlZ2lvbiwgUG9pbnQgd2gpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVGb2N1c0JvdW5kc0NoYW5nZWQoKTsKIAogICAgIC8qKgotICAgICAqIFNwbGl0cyBzbG93IHBhcnRzIG9mIHRoZSBwaWN0dXJlIHNldC4gQ2FsbGVkIGZyb20gdGhlIHdlYmtpdAotICAgICAqIHRocmVhZCBhZnRlciBuYXRpdmVEcmF3Q29udGVudCByZXR1cm5zIHRydWUuCisgICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0IHRocmVhZCBhZnRlcgorICAgICAqIFdlYlZpZXcubmF0aXZlRHJhdygpIHJldHVybnMgY29udGVudCB0byBiZSBzcGxpdC4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNwbGl0Q29udGVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KGludCBjb250ZW50KTsKIAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlS2V5KGludCBrZXlDb2RlLCBpbnQgdW5pY2hhciwKICAgICAgICAgICAgIGludCByZXBlYXRDb3VudCwgYm9vbGVhbiBpc1NoaWZ0LCBib29sZWFuIGlzQWx0LCBib29sZWFuIGlzU3ltLApAQCAtNDgwLDEyICs0NjUsMTIgQEAKICAgICAgICAgb2YgbGF5b3V0L2xpbmUtYnJlYWtpbmcuIFRoZXNlIGNvb3JkaW5hdGVzIGFyZSBpbiBkb2N1bWVudCBzcGFjZSwKICAgICAgICAgd2hpY2ggaXMgdGhlIHNhbWUgYXMgVmlldyBjb29yZHMgdW5sZXNzIHdlIGhhdmUgem9vbWVkIHRoZSBkb2N1bWVudAogICAgICAgICAoc2VlIG5hdGl2ZVNldFpvb20pLgotICAgICAgICBzY3JlZW5XaWR0aCBpcyB1c2VkIGJ5IGxheW91dCB0byB3cmFwIGNvbHVtbiBhcm91bmQuIElmIHZpZXdwb3J0IHVzZXMKLSAgICAgICAgZml4ZWQgc2l6ZSwgc2NyZWVuV2lkdGggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHdpZHRoIHdpdGggem9vbWluZy4KKyAgICAgICAgdGV4dFdyYXBXaWR0aCBpcyB1c2VkIGJ5IGxheW91dCB0byB3cmFwIGNvbHVtbiBhcm91bmQuIElmIHZpZXdwb3J0IHVzZXMKKyAgICAgICAgZml4ZWQgc2l6ZSwgdGV4dFdyYXBXaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgogICAgICAgICBzaG91bGQgdGhpcyBiZSBjYWxsZWQgbmF0aXZlU2V0Vmlld1BvcnRTaXplPwogICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcmVlbldpZHRoLAotICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCByZWFsU2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQsIGludCBhbmNob3JYLAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB0ZXh0V3JhcFdpZHRoLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCiAgICAgICAgICAgICBpbnQgYW5jaG9yWSwgYm9vbGVhbiBpZ25vcmVIZWlnaHQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKTsKQEAgLTU3Niw3ICs1NjEsMTggQEAKICAgICAvKioKICAgICAgKiBQcm92aWRlIFdlYkNvcmUgd2l0aCB0aGUgcHJldmlvdXNseSB2aXN0ZWQgbGlua3MgZnJvbSB0aGUgaGlzdG9yeSBkYXRhYmFzZQogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgIG5hdGl2ZVByb3ZpZGVWaXNpdGVkSGlzdG9yeShTdHJpbmdbXSBoaXN0b3J5KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVByb3ZpZGVWaXNpdGVkSGlzdG9yeShTdHJpbmdbXSBoaXN0b3J5KTsKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHRlciBTcGVjaWZpZXMgaG93IHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IFRoZSBncmFudWxhcml0eSBvZiB0aGUgc2VsZWN0aW9uIG1vZGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdGlvbiBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIG5hdGl2ZU1vZGlmeVNlbGVjdGlvbihTdHJpbmcgYWx0ZXIsIFN0cmluZyBkaXJlY3Rpb24sIFN0cmluZyBncmFudWxhcml0eSk7CiAKICAgICAvLyBFdmVudEh1YiBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRIdWIgbUV2ZW50SHViOwpAQCAtNjk3LDYgKzY5MywxMiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIFRvdWNoSGlnaGxpZ2h0RGF0YSB7CisgICAgICAgIGludCBtWDsKKyAgICAgICAgaW50IG1ZOworICAgICAgICBpbnQgbVNsb3A7CisgICAgfQorCiAgICAgLy8gbUFjdGlvbiBvZiBUb3VjaEV2ZW50RGF0YSBjYW4gYmUgTW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkgd2hpY2ggdXNlcyB0aGUKICAgICAvLyBsYXN0IHR3byBieXRlcyBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKICAgICBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9MT05HUFJFU1MgPSAweDEwMDsKQEAgLTcwOCw4ICs3MTAsNiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgICAgIGludCBtTWV0YVN0YXRlOwogICAgICAgICBib29sZWFuIG1SZXByb2Nlc3M7Ci0gICAgICAgIGZsb2F0IG1WaWV3WDsKLSAgICAgICAgZmxvYXQgbVZpZXdZOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBHZW9sb2NhdGlvblBlcm1pc3Npb25zRGF0YSB7CkBAIC03MTgsNyArNzE4LDExIEBACiAgICAgICAgIGJvb2xlYW4gbVJlbWVtYmVyOwogICAgIH0KIAotCisgICAgc3RhdGljIGNsYXNzIE1vZGlmeVNlbGVjdGlvbkRhdGEgeworICAgICAgICBTdHJpbmcgbUFsdGVyOworICAgICAgICBTdHJpbmcgbURpcmVjdGlvbjsKKyAgICAgICAgU3RyaW5nIG1HcmFudWxhcml0eTsKKyAgICB9CiAKICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgICAgICJSRVFVRVNUX0xBQkVMIiwgLy8gOTcKQEAgLTc3MSw2ICs3NzUsNyBAQAogICAgICAgICAgICAgIk9OX1JFU1VNRSIsICAgIC8vID0gMTQ0CiAgICAgICAgICAgICAiRlJFRV9NRU1PUlkiLCAgLy8gPSAxNDUKICAgICAgICAgICAgICJWQUxJRF9OT0RFX0JPVU5EUyIsIC8vID0gMTQ2CisgICAgICAgICAgICAiU0FWRV9XRUJBUkNISVZFIiwgLy8gPSAxNDcKICAgICAgICAgfTsKIAogICAgIGNsYXNzIEV2ZW50SHViIHsKQEAgLTgzNyw2ICs4NDIsOSBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEZSRUVfTUVNT1JZID0gMTQ1OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFZBTElEX05PREVfQk9VTkRTID0gMTQ2OwogCisgICAgICAgIC8vIExvYWQgYW5kIHNhdmUgd2ViIGFyY2hpdmVzCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9XRUJBUkNISVZFID0gMTQ3OworCiAgICAgICAgIC8vIE5ldHdvcmstYmFzZWQgbWVzc2FnaW5nCiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfU1NMX1BSRUZfVEFCTEUgPSAxNTA7CiAKQEAgLTg2NSw2ICs4NzMsMTQgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBBRERfUEFDS0FHRV9OQU1FID0gMTg1OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9QQUNLQUdFX05BTUUgPSAxODY7CiAKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTID0gMTg3OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODg7CisKKyAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBzdXBwb3J0CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9ESUZZX1NFTEVDVElPTiA9IDE5MDsKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVTRV9NT0NLX0RFVklDRV9PUklFTlRBVElPTiA9IDE5MTsKKwogICAgICAgICAvLyBwcml2YXRlIG1lc3NhZ2UgaWRzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNUUk9ZID0gICAgIDIwMDsKIApAQCAtMTIzOCw2ICsxMjU0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ESUZZX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlTZWxlY3Rpb25EYXRhIG1vZGlmeVNlbGVjdGlvbkRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTW9kaWZ5U2VsZWN0aW9uRGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uRGF0YS5tQWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1EaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1HcmFudWxhcml0eSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VMRUNUSU9OX1NUUklOR19DSEFOR0VELCBzZWxlY3Rpb25TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTElTVEJPWF9DSE9JQ0VTOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSBjaG9pY2VzID0gKFNwYXJzZUJvb2xlYW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmo7CkBAIC0xMjc4LDYgKzEzMDcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRKc0ZsYWdzKChTdHJpbmcpbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0FWRV9XRUJBUkNISVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIHNhdmVNZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXcuU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU1lc3NhZ2UubVJlc3VsdEZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlV2ViQXJjaGl2ZShzYXZlTWVzc2FnZS5tQmFzZW5hbWUsIHNhdmVNZXNzYWdlLm1BdXRvbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVELCBzYXZlTWVzc2FnZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VPTE9DQVRJT05fUEVSTUlTU0lPTlNfUFJPVklERToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zRGF0YSBkYXRhID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZW9sb2NhdGlvblBlcm1pc3Npb25zRGF0YSkgbXNnLm9iajsKQEAgLTEyOTEsNyArMTMyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1BMSVRfUElDVFVSRV9TRVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU3BsaXRDb250ZW50KG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuUkVQTEFDRV9CQVNFX0NPTlRFTlQsIG1zZy5hcmcxLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTM1Nyw2ICsxMzk3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnJlbW92ZVBhY2thZ2VOYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZCA9IChUb3VjaEhpZ2hsaWdodERhdGEpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFJlY3Q+IHJlY3RzID0gbmF0aXZlR2V0VG91Y2hIaWdobGlnaHRSZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQubVgsIGQubVksIGQubVNsb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTLCByZWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVTRV9NT0NLX0RFVklDRV9PUklFTlRBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CkBAIC0xNTYyLDI0ICsxNjIxLDM5IEBACiAgICAgICAgIG1Ccm93c2VyRnJhbWUubG9hZFVybCh1cmwsIGV4dHJhSGVhZGVycyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGF1dG9uYW1lKSB7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIiBDT1JFIHNhdmVXZWJBcmNoaXZlICIgKyBmaWxlbmFtZSArICIgIiArIGF1dG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJyb3dzZXJGcmFtZS5zYXZlV2ViQXJjaGl2ZShmaWxlbmFtZSwgYXV0b25hbWUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBrZXkoS2V5RXZlbnQgZXZ0LCBib29sZWFuIGlzRG93bikgewogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJDT1JFIGtleSBhdCAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLCAiCiAgICAgICAgICAgICAgICAgICAgICsgZXZ0KTsKICAgICAgICAgfQogICAgICAgICBpbnQga2V5Q29kZSA9IGV2dC5nZXRLZXlDb2RlKCk7Ci0gICAgICAgIGlmICghbmF0aXZlS2V5KGtleUNvZGUsIGV2dC5nZXRVbmljb2RlQ2hhcigpLAotICAgICAgICAgICAgICAgIGV2dC5nZXRSZXBlYXRDb3VudCgpLCBldnQuaXNTaGlmdFByZXNzZWQoKSwgZXZ0LmlzQWx0UHJlc3NlZCgpLAotICAgICAgICAgICAgICAgIGV2dC5pc1N5bVByZXNzZWQoKSwKKyAgICAgICAgaW50IHVuaWNvZGVDaGFyID0gZXZ0LmdldFVuaWNvZGVDaGFyKCk7CisKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOICYmIGV2dC5nZXRDaGFyYWN0ZXJzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGV2dC5nZXRDaGFyYWN0ZXJzKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAvLyB3ZSBzaG91bGQgb25seSByZWNlaXZlIGluZGl2aWR1YWwgY29tcGxleCBjaGFyYWN0ZXJzCisgICAgICAgICAgICB1bmljb2RlQ2hhciA9IGV2dC5nZXRDaGFyYWN0ZXJzKCkuY29kZVBvaW50QXQoMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5hdGl2ZUtleShrZXlDb2RlLCB1bmljb2RlQ2hhciwgZXZ0LmdldFJlcGVhdENvdW50KCksIGV2dC5pc1NoaWZ0UHJlc3NlZCgpLAorICAgICAgICAgICAgICAgIGV2dC5pc0FsdFByZXNzZWQoKSwgZXZ0LmlzU3ltUHJlc3NlZCgpLAogICAgICAgICAgICAgICAgIGlzRG93bikgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSKSB7CiAgICAgICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleTogYXJyb3cgdW51c2VkIGJ5IHBsdWdpbjogIiArIGtleUNvZGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwYWdlOiAiICsga2V5Q29kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGV2dC5pc0Rvd24oKSkgewogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5NT1ZFX09VVF9PRl9QTFVHSU4sIGtleUNvZGUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVU5IQU5ETEVEX05BVl9LRVksIGtleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE2NzUsNiArMTc0OSwxNCBAQAogICAgICAgICByZXR1cm4gdXNlZFF1b3RhOwogICAgIH0KIAorICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZAorICAgIHZvaWQgc3BsaXRDb250ZW50KGludCBjb250ZW50KSB7CisgICAgICAgIGlmICghbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkKSB7CisgICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVXNlZCB0byBhdm9pZCBwb3N0aW5nIG1vcmUgdGhhbiBvbmUgZHJhdyBtZXNzYWdlLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzU2NoZWR1bGVkOwogCkBAIC0xNjg0LDExICsxNzY2LDExIEBACiAgICAgLy8gVXNlZCB0byBzdXNwZW5kIGRyYXdpbmcuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1EcmF3SXNQYXVzZWQ7CiAKLSAgICAvLyBtUmVzdG9yZVN0YXRlIGlzIHNldCBpbiBkaWRGaXJzdExheW91dCgpLCBhbmQgcmVzZXQgaW4gdGhlIG5leHQKLSAgICAvLyB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgaXQgdG8gdGhlIFVJIHRocmVhZC4KLSAgICBwcml2YXRlIFJlc3RvcmVTdGF0ZSBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAvLyBtSW5pdGlhbFZpZXdTdGF0ZSBpcyBzZXQgYnkgZGlkRmlyc3RMYXlvdXQoKSBhbmQgdGhlbiByZXNldCBpbiB0aGUKKyAgICAvLyBuZXh0IHdlYmtpdERyYXcgYWZ0ZXIgcGFzc2luZyB0aGUgc3RhdGUgdG8gdGhlIFVJIHRocmVhZC4KKyAgICBwcml2YXRlIFZpZXdTdGF0ZSBtSW5pdGlhbFZpZXdTdGF0ZSA9IG51bGw7CiAKLSAgICBzdGF0aWMgY2xhc3MgUmVzdG9yZVN0YXRlIHsKKyAgICBzdGF0aWMgY2xhc3MgVmlld1N0YXRlIHsKICAgICAgICAgZmxvYXQgbU1pblNjYWxlOwogICAgICAgICBmbG9hdCBtTWF4U2NhbGU7CiAgICAgICAgIGZsb2F0IG1WaWV3U2NhbGU7CkBAIC0xNzAxLDE1ICsxNzgzLDE3IEBACiAKICAgICBzdGF0aWMgY2xhc3MgRHJhd0RhdGEgewogICAgICAgICBEcmF3RGF0YSgpIHsKKyAgICAgICAgICAgIG1CYXNlTGF5ZXIgPSAwOwogICAgICAgICAgICAgbUludmFsUmVnaW9uID0gbmV3IFJlZ2lvbigpOwogICAgICAgICAgICAgbVdpZHRoSGVpZ2h0ID0gbmV3IFBvaW50KCk7CiAgICAgICAgIH0KKyAgICAgICAgaW50IG1CYXNlTGF5ZXI7CiAgICAgICAgIFJlZ2lvbiBtSW52YWxSZWdpb247CiAgICAgICAgIFBvaW50IG1WaWV3UG9pbnQ7CiAgICAgICAgIFBvaW50IG1XaWR0aEhlaWdodDsKICAgICAgICAgaW50IG1NaW5QcmVmV2lkdGg7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZSBtUmVzdG9yZVN0YXRlOyAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgLy8gb25seSBub24tbnVsbCBpZiBpdCBpcyBmb3IgdGhlIGZpcnN0IHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgVmlld1N0YXRlIG1WaWV3U3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbUZvY3VzU2l6ZUNoYW5nZWQ7CiAgICAgfQogCkBAIC0xNzE3LDggKzE4MDEsOCBAQAogICAgICAgICBtRHJhd0lzU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgIERyYXdEYXRhIGRyYXcgPSBuZXcgRHJhd0RhdGEoKTsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBzdGFydCIpOwotICAgICAgICBpZiAobmF0aXZlUmVjb3JkQ29udGVudChkcmF3Lm1JbnZhbFJlZ2lvbiwgZHJhdy5tV2lkdGhIZWlnaHQpCi0gICAgICAgICAgICAgICAgPT0gZmFsc2UpIHsKKyAgICAgICAgZHJhdy5tQmFzZUxheWVyID0gbmF0aXZlUmVjb3JkQ29udGVudChkcmF3Lm1JbnZhbFJlZ2lvbiwgZHJhdy5tV2lkdGhIZWlnaHQpOworICAgICAgICBpZiAoZHJhdy5tQmFzZUxheWVyID09IDApIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgYWJvcnQiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTczNCw5ICsxODE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1WaWV3cG9ydFdpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJlc3RvcmVTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJhdy5tUmVzdG9yZVN0YXRlID0gbVJlc3RvcmVTdGF0ZTsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHJhdy5tVmlld1N0YXRlID0gbUluaXRpYWxWaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBORVdfUElDVFVSRV9NU0dfSUQiKTsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKQEAgLTE3NTEsNTEgKzE4MzUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIG5vdCBvdXIgdGhyZWFkCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOwotCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOwotICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOwotCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGRyYXdDb250ZW50UGljdHVyZShDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1pvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKLSAgICAgICAgaWYgKGFuaW1hdGluZ1pvb20pIHsKLSAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOwotICAgICAgICBib29sZWFuIHRvb2tUb29Mb25nID0gbmF0aXZlRHJhd0NvbnRlbnQoY2FudmFzLCBjb2xvcik7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgICAgICBpZiAodG9va1Rvb0xvbmcgJiYgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwaWN0dXJlUmVhZHkoKSB7Ci0gICAgICAgIHJldHVybiAwICE9IG1OYXRpdmVDbGFzcyA/IG5hdGl2ZVBpY3R1cmVSZWFkeSgpIDogZmFsc2U7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIFBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkgewotICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7Ci0gICAgICAgIGlmICgwICE9IG1OYXRpdmVDbGFzcykgewotICAgICAgICAgICAgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIHJlZHVjZVByaW9yaXR5KCkgewogICAgICAgICAvLyByZW1vdmUgdGhlIHBlbmRpbmcgUkVEVUNFX1BSSU9SSVRZIGFuZCBSRVNVTUVfUFJJT1JJVFkgbWVzc2FnZXMKICAgICAgICAgc1dlYkNvcmVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFdlYkNvcmVUaHJlYWQuUkVEVUNFX1BSSU9SSVRZKTsKQEAgLTE4MTcsNiArMTg1Niw4IEBACiAgICAgICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZCB3aGlsZSBXRUJLSVRfRFJBVyBpcyBqdXN0IHB1bGxlZCBvdXQgb2YgdGhlCiAgICAgICAgIC8vIHF1ZXVlIGluIFdlYkNvcmUgdGhyZWFkIHRvIGJlIGV4ZWN1dGVkLiBUaGVuIHVwZGF0ZSB3b24ndCBiZSBibG9ja2VkLgogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7CkBAIC0xODI5LDYgKzE4NzAsMTAgQEAKIAogICAgIHN0YXRpYyB2b2lkIHJlc3VtZVVwZGF0ZVBpY3R1cmUoV2ViVmlld0NvcmUgY29yZSkgewogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpZiBtRHJhd0lzUGF1c2VkIGlzIHRydWUsIGlnbm9yZSB0aGUgc2V0dGluZywgY29udGludWUgdG8gcmVzdW1lCisgICAgICAgICAgICBpZiAoIWNvcmUubURyYXdJc1BhdXNlZAorICAgICAgICAgICAgICAgICAgICAmJiAhY29yZS5nZXRTZXR0aW5ncygpLmVuYWJsZVNtb290aFRyYW5zaXRpb24oKSkgcmV0dXJuOworCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvcmUpIHsKICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNQYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7CkBAIC0xOTcxLDI0ICsyMDE2LDYgQEAKICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRJbW1lZGlhdGVSZXBhaW50KCkgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiAhbVJlcGFpbnRTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2V0Um9vdExheWVyKGludCBsYXllcikgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfUk9PVF9MQVlFUl9NU0dfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiBwYWNrYWdlICovIFdlYlZpZXcgZ2V0V2ViVmlldygpIHsKICAgICAgICAgcmV0dXJuIG1XZWJWaWV3OwogICAgIH0KQEAgLTIwMDUsMTggKzIwMzIsMjQgQEAKIAogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKLSAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVSZXN0b3JlU3RhdGUpOworICAgICAgICBib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7CisgICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlVmlld1N0YXRlKTsKICAgICAgICAgLy8gaWYgdXBkYXRlUmVzdG9yZVN0YXRlIGlzIHRydWUsIFZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpIHdpbGwKLSAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHJlc3RvcmUgdGhlIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKKyAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHVwZGF0ZXMgaXRzIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKICAgICAgICAgLy8gaXMgZmFsc2UsIHN0YXJ0IHRvIGRyYXcgbm93IGFzIGl0IGlzIHJlYWR5LgotICAgICAgICBpZiAoIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgICAgICBpZiAoIXVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB0b3VjaCBoaWdobGlnaHQgd2hlbiBtb3ZpbmcgdG8gYSBuZXcgcGFnZQorICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB0aGUgcmVzdG9yZWQgb2Zmc2V0IGFuZCBzY2FsZXMKICAgICAgICAgbVdlYmtpdFNjcm9sbFggPSBtV2Via2l0U2Nyb2xsWSA9IG1SZXN0b3JlZFggPSBtUmVzdG9yZWRZCi0gICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCkBAIC0yMDMwLDE1ICsyMDYzLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgc2V0dGluZ3MgZnJvbSBXZWJLaXQKICAgICAgICAgc2V0Vmlld3BvcnRTZXR0aW5nc0Zyb21OYXRpdmUoKTsKIAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMDgwLDE3ICsyMTE1LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBtVmlld3BvcnRXaWR0aCBpcyAwLCBpdCBtZWFucyBkZXZpY2Utd2lkdGgsIGFsd2F5cyB1cGRhdGUuCi0gICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgIFJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlVmlld1N0YXRlKSB7CisgICAgICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICAgICAgdmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgIC8vIGFzIG1WaWV3cG9ydFdpZHRoIGlzIG5vdCAwLCBpdCBpcyBub3QgbW9iaWxlIHNpdGUuCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gZm9yIG5vbi1tb2JpbGUgc2l0ZSwgd2UgZG9uJ3QgbmVlZCBtaW5QcmVmV2lkdGgsIHNldCBpdCBhcyAwCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFggPSAwOworICAgICAgICAgICAgdmlld1N0YXRlLm1TY3JvbGxYID0gMDsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgcmVzdG9yZVN0YXRlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgdmlld1N0YXRlKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTExLDMyICsyMTQ2LDMxIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3ZWJWaWV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdwb3J0V2lkdGggKiBtQ3VycmVudFZpZXdTY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CiAgICAgICAgIGlmIChtUmVzdG9yZWRTY2FsZSA+IDApIHsKLSAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRJbml0aWFsU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydEluaXRpYWxTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwICYmIG1WaWV3cG9ydFdpZHRoIDwgd2ViVmlld1dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgd2ViVmlld1dpZHRoIC8gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAgICAgLy8gMCB3aWxsIHRyaWdnZXIgV2ViVmlldyB0byB0dXJuIG9uIHpvb20gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE3NywxNSArMjIxMSwxNSBAQAogICAgICAgICAgICAgICAgIC8vIG1WaWV3U2NhbGUgYXMgMCBtZWFucyBpdCBpcyBpbiB6b29tIG92ZXJ2aWV3IG1vZGUuIFNvIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgZXhhY3Qgc2NhbGUuIElmIG1SZXN0b3JlZFNjYWxlIGlzIG5vbi16ZXJvLCB1c2UgaXQ7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIG1UZXh0V3JhcFNjYWxlIGFzIHRoZSBpbml0aWFsIHNjYWxlLgotICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID09IDAKKyAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgPyAobVJlc3RvcmVkU2NhbGUgPiAwID8gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXR1cFZpZXdwb3J0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlc3RvcmVkU2NhbGU9IiArIG1SZXN0b3JlZFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aCAvIGRhdGEubVNjYWxlKTsKQEAgLTIxOTgsNyArMjIzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAvIGRhdGEubVNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3VycmVudFZpZXdIZWlnaHQgKiBkYXRhLm1XaWR0aCAvIHZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CiAgICAgICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IGRhdGEubUFuY2hvclkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgVklFV19TSVpFX0NIQU5HRUQgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHdlCkBAIC0yMjExLDIwICsyMjQ1LDEyIEBACiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUsIGludCB0ZXh0V3JhcFNjYWxlKSB7CiAgICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUmVzdG9yZWRTY2FsZSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyZWVuV2lkdGhTY2FsZShpbnQgc2NhbGUpIHsKLSAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IHRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NjIsNiArMjQ4OCwxMCBAQAogICAgICAgICAgICAgICAgIGhNb2RlLCB2TW9kZSkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpIHsKKyAgICAgICAgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLnVzZU1vY2sodGhpcyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQYXVzZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzdW1lKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGcmVlTWVtb3J5KCk7CkBAIC0yNDY5LDQgKzI0OTksNiBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVmFsaWROb2RlQW5kQm91bmRzKGludCBmcmFtZSwgaW50IG5vZGUsCiAgICAgICAgICAgICBSZWN0IGJvdW5kcyk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBBcnJheUxpc3Q8UmVjdD4gbmF0aXZlR2V0VG91Y2hIaWdobGlnaHRSZWN0cyhpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgc2xvcCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKaW5kZXggN2FjZDliYS4uZDdiNDQ1MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQpAQCAtMTczLDExMiArMTczLDE0MCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZVRyYW5zYWN0aW9uUmVmY291bnQ7CiAKLSAgICBwcml2YXRlIFdlYlZpZXdEYXRhYmFzZSgpIHsKKyAgICAvLyBJbml0aWFsbHkgdHJ1ZSB1bnRpbCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgY29tcGxldGVzLgorICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW5pdChjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworCiAgICAgICAgIC8vIFNpbmdsZXRvbiBvbmx5LCB1c2UgZ2V0SW5zdGFuY2UoKQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFdlYlZpZXdEYXRhYmFzZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKG1JbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFdlYlZpZXdEYXRhYmFzZShjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KIAotICAgICAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBEQVRBQkFTRV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcGVyIHRhYmxlIE11dGV4IGxvY2ssIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2ssIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMgZXhwYW5zaXZlCi0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShDQUNIRV9EQVRBQkFTRV9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtQ2FjaGVEYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsIAotICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiIAotICAgICAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIGNhc2UgdGhhdCB0aGUgZGF0YWJhc2Ugd2FzIHVwZGF0ZWQgYW5kIHRoZSAKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSB3ZXJlIGV4aXN0aW5nIGNhY2hlIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBDYWNoZU1hbmFnZXIucmVtb3ZlQWxsQ2FjaGVGaWxlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5leGVjU1FMKCJQUkFHTUEgcmVhZF91bmNvbW1pdHRlZCA9IHRydWU7Iik7Ci0gICAgICAgICAgICAgICAgLy8gYXMgb25seSBSRUFEIGNhbiBiZSBjYWxsZWQgaW4gdGhlIG5vbi1XZWJWaWV3V29ya2VyVGhyZWFkLAotICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrCi0gICAgICAgICAgICAgICAgLy8gdG8gdXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KLSAgICAgICAgICAgICAgICBtQ2FjaGVJbnNlcnRlciA9IG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOwotICAgICAgICAgICAgICAgIG1DYWNoZVVybENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9VUkxfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9GSUxFX1BBVEhfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMYXN0TW9kaWZ5Q29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRVRhZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FVEFHX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRXhwaXJlc1N0cmluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZU1pbWVUeXBlQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX01JTUVUWVBFX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRU5DT0RJTkdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVIdHRwU3RhdHVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTG9jYXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTE9DQVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRMRU5HVEhfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDb250ZW50RGlzcG9zaXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ3Jvc3NEb21haW5Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ1JPU1NET01BSU5fQ09MKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsCisgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYgorICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgcGVyIHRhYmxlIE11dGV4IGxvY2ssIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2ssIHRoaXMKKyAgICAgICAgLy8gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYXMgZGF0YWJhc2UncyBSZWVudHJhbnRMb2NrIGlzCisgICAgICAgIC8vIGV4cGFuc2l2ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtQ2FjaGVEYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsCisgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYgorICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgYm9vdHN0cmFwQ2FjaGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRXJhc2UgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtIGluIHRoZQorICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlCisgICAgICAgICAgICAvLyB0aGVyZSB3ZXJlIGV4aXN0aW5nIGNhY2hlIGNvbnRlbnQKKyAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgcmVhZF91bmNvbW1pdHRlZCB0byBzcGVlZCB1cCBSRUFECisgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKKyAgICAgICAgLy8gYXMgb25seSBSRUFEIGNhbiBiZSBjYWxsZWQgaW4gdGhlCisgICAgICAgIC8vIG5vbi1XZWJWaWV3V29ya2VyVGhyZWFkLCBhbmQgcmVhZF91bmNvbW1pdHRlZCBpcyB1c2VkLAorICAgICAgICAvLyB3ZSBjYW4gdHVybiBvZmYgZGF0YWJhc2UgbG9jayB0byB1c2UgdHJhbnNhY3Rpb24uCisgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB1c2UgSW5zZXJ0SGVscGVyIGZvciBmYXN0ZXIgaW5zZXJ0aW9uCisgICAgICAgIG1DYWNoZUluc2VydGVyID0KKyAgICAgICAgICAgICAgICBuZXcgRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIobUNhY2hlRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGUiKTsKKyAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9VUkxfQ09MKTsKKyAgICAgICAgbUNhY2hlRmlsZVBhdGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOworICAgICAgICBtQ2FjaGVMYXN0TW9kaWZ5Q29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MQVNUX01PRElGWV9DT0wpOworICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FVEFHX0NPTCk7CisgICAgICAgIG1DYWNoZUV4cGlyZXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc1N0cmluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19TVFJJTkdfQ09MKTsKKyAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX01JTUVUWVBFX0NPTCk7CisgICAgICAgIG1DYWNoZUVuY29kaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOworICAgICAgICBtQ2FjaGVIdHRwU3RhdHVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9IVFRQX1NUQVRVU19DT0wpOworICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTE9DQVRJT05fQ09MKTsKKyAgICAgICAgbUNhY2hlQ29udGVudExlbmd0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50RGlzcG9zaXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRESVNQT1NJVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ1JPU1NET01BSU5fQ09MKTsKKworICAgICAgICAvLyBUaHJlYWQgZG9uZSwgbm90aWZ5LgorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBub3RpZnkoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZ3JhZGVEYXRhYmFzZSgpIHsKQEAgLTM5MSw4ICs0MTksMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdhaXQgZm9yIHRoZSBiYWNrZ3JvdW5kIGluaXRpYWxpemF0aW9uIHRocmVhZCB0byBjb21wbGV0ZSBhbmQgY2hlY2sgdGhlCisgICAgLy8gZGF0YWJhc2UgY3JlYXRpb24gc3RhdHVzLgorICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0luaXRpYWxpemVkKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHdoaWxlICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiQ2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGF0YWJhc2UgIT0gbnVsbDsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzRW50cmllcyhpbnQgdGFibGVJZCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC00MjIsNyArNDY3LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8Q29va2llPiBnZXRDb29raWVzRm9yRG9tYWluKFN0cmluZyBkb21haW4pIHsKICAgICAgICAgQXJyYXlMaXN0PENvb2tpZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29va2llPigpOwotICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBsaXN0OwogICAgICAgICB9CiAKQEAgLTQ4MSw3ICs1MjYsNyBAQAogICAgICAqICAgICAgICAgICAgZGVsZXRlZC4KICAgICAgKi8KICAgICB2b2lkIGRlbGV0ZUNvb2tpZXMoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHBhdGgsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUwMSw3ICs1NDYsNyBAQAogICAgICAqLwogICAgIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKICAgICAgICAgaWYgKGNvb2tpZS5kb21haW4gPT0gbnVsbCB8fCBjb29raWUucGF0aCA9PSBudWxsIHx8IGNvb2tpZS5uYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01MzQsNyArNTc5LDcgQEAKICAgICAgKiBDbGVhciBjb29raWUgZGF0YWJhc2UKICAgICAgKi8KICAgICB2b2lkIGNsZWFyQ29va2llcygpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTQ3LDcgKzU5Miw3IEBACiAgICAgICogQ2xlYXIgc2Vzc2lvbiBjb29raWVzLCB3aGljaCBtZWFucyBjb29raWUgZG9lc24ndCBoYXZlIEVYUElSRVMuCiAgICAgICovCiAgICAgdm9pZCBjbGVhclNlc3Npb25Db29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NjQsNyArNjA5LDcgQEAKICAgICAgKiBAcGFyYW0gbm93IFRpbWUgZm9yIG5vdwogICAgICAqLwogICAgIHZvaWQgY2xlYXJFeHBpcmVkQ29va2llcyhsb25nIG5vdykgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02MjAsNyArNjY1LDcgQEAKICAgICAgKiBAcmV0dXJuIENhY2hlUmVzdWx0IFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICBDYWNoZVJlc3VsdCBnZXRDYWNoZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC02NjAsNyArNzA1LDcgQEAKICAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwKICAgICAgKi8KICAgICB2b2lkIHJlbW92ZUNhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02NzQsNyArNzE5LDcgQEAKICAgICAgKiBAcGFyYW0gYyBUaGUgQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0CiAgICAgICovCiAgICAgdm9pZCBhZGRDYWNoZShTdHJpbmcgdXJsLCBDYWNoZVJlc3VsdCBjKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNzAwLDcgKzc0NSw3IEBACiAgICAgICogQ2xlYXIgY2FjaGUgZGF0YWJhc2UKICAgICAgKi8KICAgICB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNzA4LDcgKzc1Myw3IEBACiAgICAgfQogCiAgICAgYm9vbGVhbiBoYXNDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC04MzQsNyArODc5LDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0LCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC04NTYsNyArOTAxLDcgQEAKICAgICAgKiAgICAgICAgIFN0cmluZ1sxXSBpcyBwYXNzd29yZC4gUmV0dXJuIG51bGwgaWYgaXQgY2FuJ3QgZmluZCBhbnl0aGluZy4KICAgICAgKi8KICAgICBTdHJpbmdbXSBnZXRVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCkgewotICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC05MDIsNyArOTQ3LDcgQEAKICAgICAgKiBDbGVhciBwYXNzd29yZCBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTI3LDcgKzk3Miw3IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSwgU3RyaW5nIHVzZXJuYW1lLAogICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTk1Miw3ICs5OTcsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtKSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCl7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKXsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTk5OSw3ICsxMDQ0LDcgQEAKICAgICAgKiBDbGVhciBIVFRQIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTEwMjAsNyArMTA2NSw3IEBACiAgICAgICogQHBhcmFtIGZvcm1kYXRhIFRoZSBmb3JtIGRhdGEgaW4gSGFzaE1hcAogICAgICAqLwogICAgIHZvaWQgc2V0Rm9ybURhdGEoU3RyaW5nIHVybCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybWRhdGEpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IGZvcm1kYXRhID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IGZvcm1kYXRhID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTEwNjksNyArMTExNCw3IEBACiAgICAgICovCiAgICAgQXJyYXlMaXN0PFN0cmluZz4gZ2V0Rm9ybURhdGEoU3RyaW5nIHVybCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBuYW1lID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgICB9CiAKQEAgLTExMjksNyArMTE3NCw3IEBACiAgICAgICogQ2xlYXIgZm9ybSBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyRm9ybURhdGEoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTllOGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW50ZXJmYWNlIFpvb21Db250cm9sQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gYmUgbWFkZSB2aXNpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdygpOworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9sIHRvIGRpc2FwcGVhcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhpZGUoKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgdGhlIGNvbnRyb2wgdG8gdXBkYXRlIGl0cyBzdGF0ZSBpZiBuZWNlc3NhcnkgaW4gcmVzcG9uc2UgdG8gYQorICAgICAqIGNoYW5nZSBpbiB0aGUgcGFnZXMgem9vbSBsZXZlbC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtYXggem9vbSBsZXZlbCBpcworICAgICAqIHJlYWNoZWQgdGhlbiB0aGUgY29udHJvbCBjYW4gZGlzYWJsZSB0aGUgYnV0dG9uIGZvciB6b29taW5nIGluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFbWJlZGRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOWU3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFbWJlZGRlZC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b25zQ29udHJvbGxlcjsKKworY2xhc3MgWm9vbUNvbnRyb2xFbWJlZGRlZCBpbXBsZW1lbnRzIFpvb21Db250cm9sQmFzZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFpvb21NYW5hZ2VyIG1ab29tTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvLyBUaGUgY29udHJvbGxlciBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgaW4gZ2V0Q29udHJvbHMoKSBmb3IgcGVyZm9ybWFuY2UuCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEVtYmVkZGVkKFpvb21NYW5hZ2VyIHpvb21NYW5hZ2VyLCBXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyID0gem9vbU1hbmFnZXI7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpZiAoIWdldENvbnRyb2xzKCkuaXNWaXNpYmxlKCkgJiYgIW1ab29tTWFuYWdlci5pc1pvb21TY2FsZUZpeGVkKCkpIHsKKworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOworCisgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7CisgICAgICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1XZWJWaWV3LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmRvdWJsZV90YXBfdG9hc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCAmJiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tSW4gPSBtWm9vbU1hbmFnZXIuY2FuWm9vbUluKCk7CisgICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkgJiYgIW1ab29tTWFuYWdlci5pc0luWm9vbU92ZXJ2aWV3KCk7CisgICAgICAgIGlmICghY2FuWm9vbUluICYmICFjYW5ab29tT3V0KSB7CisgICAgICAgICAgICAvLyBIaWRlIHRoZSB6b29tIGluIGFuZCBvdXQgYnV0dG9ucyBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbiBvciBvdXQKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbUluRW5hYmxlZChjYW5ab29tSW4pOworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tT3V0RW5hYmxlZChjYW5ab29tT3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcihtV2ViVmlldyk7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldE9uWm9vbUxpc3RlbmVyKG5ldyBab29tTGlzdGVuZXIoKSk7CisgICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgorICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQorICAgICAgICAgICAgLy8gcmlnaHQuCisgICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKKyAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICAgICAgKChGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHBhcmFtcykuZ3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBab29tTGlzdGVuZXIgaW1wbGVtZW50cyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnN3aXRjaE91dERyYXdIaXN0b3J5KCk7CisgICAgICAgICAgICAgICAgLy8gQnJpbmcgYmFjayB0aGUgaGlkZGVuIHpvb20gY29udHJvbHMuCisgICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblpvb20oYm9vbGVhbiB6b29tSW4pIHsKKyAgICAgICAgICAgIGlmICh6b29tSW4pIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tSW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbU91dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRXh0ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUzMTNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRXh0ZXJuYWwuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BEZXByZWNhdGVkCitjbGFzcyBab29tQ29udHJvbEV4dGVybmFsIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8vIFRoZSB0aW1lIHRoYXQgdGhlIGV4dGVybmFsIGNvbnRyb2xzIGFyZSB2aXNpYmxlIGJlZm9yZSBmYWRpbmcgYXdheQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWk9PTV9DT05UUk9MU19USU1FT1VUID0KKyAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFpvb21Db250cm9sc1RpbWVvdXQoKTsKKyAgICAvLyBUaGUgdmlldyBjb250YWluaW5nIHRoZSBleHRlcm5hbCB6b29tIGNvbnRyb2xzCisgICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBtWm9vbUNvbnRyb2xzOworICAgIHByaXZhdGUgUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICBwdWJsaWMgWm9vbUNvbnRyb2xFeHRlcm5hbChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGdldENvbnRyb2xzKCkuc2hvdyh0cnVlKTsKKyAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLCBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHMgIT0gbnVsbCAmJiBtWm9vbUNvbnRyb2xzLmlzU2hvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7IH0KKworICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyBnZXRDb250cm9scygpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21Db250cm9scyA9IGNyZWF0ZVpvb21Db250cm9scygpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbmVlZCB0byBiZSBzZXQgdG8gVklTSUJMRSBmaXJzdCBzbyB0aGF0IGdldE1lYXN1cmVkSGVpZ2h0KCkgaW4KKyAgICAgICAgICAgICAqIHtAbGluayAjb25TaXplQ2hhbmdlZCgpfSBjYW4gcmV0dXJuIHRoZSBtZWFzdXJlZCB2YWx1ZSBmb3IgcHJvcGVyCisgICAgICAgICAgICAgKiBsYXlvdXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVpvb21Db250cm9sUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7CisgICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtV2ViVmlldy5nZXRDb250ZXh0KCkpOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLCBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbU91dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlbmRlZFpvb21Db250cm9scyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKworICAgICAgICBwcml2YXRlIGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9scyBtUGx1c01pbnVzWm9vbUNvbnRyb2xzOworCisgICAgICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuem9vbV9tYWduaWZ5LCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMgPSAoYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzKSBmaW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbUNvbnRyb2xzKTsKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21NYWduaWZ5KS5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBWaWV3LkdPTkUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdyhib29sZWFuIHNob3dab29tKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoc2hvd1pvb20gPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICAgICAgZmFkZShWaWV3LlZJU0lCTEUsIDAuMGYsIDEuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgICAgIGZhZGUoVmlldy5HT05FLCAxLjBmLCAwLjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmYWRlKGludCB2aXNpYmlsaXR5LCBmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgeworICAgICAgICAgICAgQWxwaGFBbmltYXRpb24gYW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbihzdGFydEFscGhhLCBlbmRBbHBoYSk7CisgICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKDUwMCk7CisgICAgICAgICAgICBzdGFydEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgIHNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsOTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU2NhbGVHZXN0dXJlRGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogVGhlIFpvb21NYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyB0aGUgV2ViVmlldydzIGN1cnJlbnQgem9vbQorICogbGV2ZWwgc3RhdGUuICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbHMKKyAqIGFzIHdlbGwgYXMgYW55IGFuaW1hdGlvbiBvZiB0aGUgV2ViVmlldyBkdWUgdG8gem9vbWluZy4KKyAqCisgKiBDdXJyZW50bHksIHRoZXJlIGFyZSB0d28gbWV0aG9kcyBmb3IgYW5pbWF0aW5nIHRoZSB6b29tIG9mIGEgV2ViVmlldy4KKyAqCisgKiAoMSkgVGhlIGZpcnN0IG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgc3RhcnRab29tQW5pbWF0aW9uKC4uLikgYW5kIGlzIGEgZml4ZWQKKyAqIGxlbmd0aCBhbmltYXRpb24gd2hlcmUgdGhlIGZpbmFsIHpvb20gc2NhbGUgaXMga25vd24gYXQgc3RhcnR1cC4gIFRoaXMgdHlwZSBvZgorICogYW5pbWF0aW9uIG5vdGlmaWVzIHdlYmtpdCBvZiB0aGUgZmluYWwgc2NhbGUgQkVGT1JFIGl0IGFuaW1hdGVzLiBUaGUgYW5pbWF0aW9uCisgKiBpcyB0aGVuIGRvbmUgYnkgc2NhbGluZyB0aGUgQ0FOVkFTIGluY3JlbWVudGFsbHkgYmFzZWQgb24gYSBzdGVwcGluZyBmdW5jdGlvbi4KKyAqCisgKiAoMikgVGhlIHNlY29uZCBtZXRob2QgaXMgdHJpZ2dlcmVkIGJ5IGEgbXVsdGktdG91Y2ggcGluY2ggYW5kIHRoZSBuZXcgc2NhbGUKKyAqIGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIHVzZXIncyBnZXN0dXJlLiBUaGlzIHR5cGUgb2YgYW5pbWF0aW9uCisgKiBvbmx5IG5vdGlmaWVzIHdlYmtpdCBvZiBuZXcgc2NhbGUgQUZURVIgdGhlIGdlc3R1cmUgaXMgY29tcGxldGUuIFRoZSBhbmltYXRpb24KKyAqIGVmZmVjdCBpcyBhY2hpZXZlZCBieSBzY2FsaW5nIHRoZSBWSUVXUyAoYm90aCBXZWJWaWV3IGFuZCBWaWV3TWFuYWdlci5DaGlsZFZpZXcpCisgKiB0byB0aGUgbmV3IHNjYWxlIGluIHJlc3BvbnNlIHRvIGV2ZW50cyByZWxhdGVkIHRvIHRoZSB1c2VyJ3MgZ2VzdHVyZS4KKyAqLworY2xhc3MgWm9vbU1hbmFnZXIgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAid2Vidmlld1pvb20iOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tQcm94eSBtQ2FsbGJhY2tQcm94eTsKKworICAgIC8vIFdpZGdldHMgcmVzcG9uc2libGUgZm9yIHRoZSBvbi1zY3JlZW4gem9vbSBmdW5jdGlvbnMgb2YgdGhlIFdlYlZpZXcuCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEVtYmVkZGVkIG1FbWJlZGRlZFpvb21Db250cm9sOworICAgIHByaXZhdGUgWm9vbUNvbnRyb2xFeHRlcm5hbCBtRXh0ZXJuYWxab29tQ29udHJvbDsKKworICAgIC8qCisgICAgICogVGhlIHNjYWxlIGZhY3RvcnMgdGhhdCBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgZm9yIHRoZQorICAgICAqIGRlZmF1bHQgem9vbSBzY2FsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SID0gNC4wMGY7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiA9IDAuMjVmOworCisgICAgLy8gVGhlIGRlZmF1bHQgc2NhbGUgbGltaXRzLCB3aGljaCBhcmUgZGVwZW5kZW50IG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkuCisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0TWluWm9vbVNjYWxlOworCisgICAgLy8gVGhlIGFjdHVhbCBzY2FsZSBsaW1pdHMsIHdoaWNoIGNhbiBiZSBzZXQgdGhyb3VnaCBhIHdlYnBhZ2UncyB2aWV3cG9ydAorICAgIC8vIG1ldGEtdGFnLgorICAgIHByaXZhdGUgZmxvYXQgbU1heFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1NaW5ab29tU2NhbGU7CisKKyAgICAvLyBMb2NrcyB0aGUgbWluaW11bSBab29tU2NhbGUgdG8gdGhlIHZhbHVlIGN1cnJlbnRseSBzZXQgaW4gbU1pblpvb21TY2FsZS4KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKworICAgIC8qCisgICAgICogV2hlbiBsb2FkaW5nIGEgbmV3IHBhZ2UgdGhlIFdlYlZpZXcgZG9lcyBub3QgaW5pdGlhbGx5IGtub3cgdGhlIGZpbmFsCisgICAgICogd2lkdGggb2YgdGhlIHBhZ2UuIFRoZXJlZm9yZSwgd2hlbiBhIG5ldyBwYWdlIGlzIGxvYWRlZCBpbiBvdmVydmlldyBtb2RlCisgICAgICogdGhlIG92ZXJ2aWV3IHNjYWxlIGlzIGluaXRpYWxpemVkIHRvIGEgZGVmYXVsdCB2YWx1ZS4gVGhpcyBmbGFnIGlzIHRoZW4KKyAgICAgKiBzZXQgYW5kIHVzZWQgdG8gbm90aWZ5IHRoZSBab29tTWFuYWdlciB0byB0YWtlIHRoZSB3aWR0aCBvZiB0aGUgbmV4dAorICAgICAqIHBpY3R1cmUgZnJvbSB3ZWJraXQgYW5kIHVzZSB0aGF0IHdpZHRoIHRvIGVudGVyIGludG8gem9vbSBvdmVydmlldyBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbFpvb21PdmVydmlldyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBXaGVuIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUsIHRoZSBwYWdlJ3Mgd2lkdGggaXMgZnVsbHkgZml0IHRvIHRoZQorICAgICAqIGN1cnJlbnQgd2luZG93LiBBZGRpdGlvbmFsbHkgd2hpbGUgdGhlIHBhZ2UgaXMgaW4gdGhpcyBzdGF0ZSBpdCBpcworICAgICAqIGFjdGl2ZSwgaW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gY2xpY2sgdG8gZm9sbG93IHRoZSBsaW5rcy4gV2UgY2FjaGUgYQorICAgICAqIGJvb2xlYW4gdG8gZW5hYmxlIHVzIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIG92ZXJ2aWV3CisgICAgICogbW9kZSwgYnV0IHRoaXMgdmFsdWUgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgYnkgY2hhbmdlcyB0byB0aGUgem9vbQorICAgICAqIHNjYWxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtWm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52Wm9vbU92ZXJ2aWV3V2lkdGg7CisKKyAgICAvKgorICAgICAqIFRoZXNlIHZhcmlhYmxlcyB0cmFjayB0aGUgY2VudGVyIHBvaW50IG9mIHRoZSB6b29tIGFuZCB0aGV5IGFyZSB1c2VkIHRvCisgICAgICogZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uIFRoZXkgYXJlIHN0b3JlZCBpbiB2aWV3CisgICAgICogY29vcmRpbmF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7CisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7CisKKyAgICAvKgorICAgICAqIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgc2NyZWVuIHNob3VsZCBiZQorICAgICAqIGNlbnRlcmVkIGFmdGVyIHpvb21pbmcuIEluIG90aGVyIHdvcmRzIGl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjZW50ZXIKKyAgICAgKiBwb2ludCBvZiB0aGUgdmlzaWJsZSBkb2N1bWVudCBhZnRlciB0aGUgcGFnZSBoYXMgZmluaXNoZWQgem9vbWluZy4gVGhpcworICAgICAqIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSB6b29tIG1heSBoYXZlIHBvdGVudGlhbGx5IHJlZmxvd2VkIHRoZSB0ZXh0IGFuZAorICAgICAqIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBwcm9wZXIgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgcmVtYWlucyBvbiB0aGUKKyAgICAgKiBzY3JlZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbUFuY2hvclg7CisgICAgcHJpdmF0ZSBpbnQgbUFuY2hvclk7CisKKyAgICAvLyBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbHVtbiB3aWR0aCBmb3IgdGV4dAorICAgIHByaXZhdGUgZmxvYXQgbVRleHRXcmFwU2NhbGU7CisKKyAgICAvKgorICAgICAqIFRoZSBkZWZhdWx0IHpvb20gc2NhbGUgaXMgdGhlIHNjYWxlIGZhY3RvciB1c2VkIHdoZW4gdGhlIHVzZXIgdHJpZ2dlcnMgYQorICAgICAqIHpvb20gaW4gYnkgZG91YmxlIHRhcHBpbmcgb24gdGhlIFdlYlZpZXcuIFRoZSB2YWx1ZSBpcyBpbml0aWFsbHkgc2V0CisgICAgICogYmFzZWQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eSwgYnV0IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIHZpYSB0aGUKKyAgICAgKiBXZWJTZXR0aW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0U2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52RGVmYXVsdFNjYWxlOworCisgICAgLy8gdGhlIGN1cnJlbnQgY29tcHV0ZWQgem9vbSBzY2FsZSBhbmQgaXRzIGludmVyc2UuCisgICAgcHJpdmF0ZSBmbG9hdCBtQWN0dWFsU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52QWN0dWFsU2NhbGU7CisgICAgCisgICAgLyoKKyAgICAgKiBUaGUgaW5pdGlhbCBzY2FsZSBmb3IgdGhlIFdlYlZpZXcuIDAgbWVhbnMgZGVmYXVsdC4gSWYgaW5pdGlhbCBzY2FsZSBpcworICAgICAqIGdyZWF0ZXIgdGhhbiAwIHRoZSBXZWJWaWV3IHN0YXJ0cyB3aXRoIHRoaXMgdmFsdWUgYXMgaXRzIGluaXRpYWwgc2NhbGUuIFRoZQorICAgICAqIHZhbHVlIGlzIGNvbnZlcnRlZCBmcm9tIGFuIGludGVnZXIgcGVyY2VudGFnZSBzbyBpdCBpcyBndWFyZW50ZWVkIHRvIGhhdmUKKyAgICAgKiBubyBtb3JlIHRoYW4gMiBzaWduaWZpY2FudCBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwuICBUaGlzIHJlc3RyaWN0aW9uCisgICAgICogYWxsb3dzIHVzIHRvIGNvbnZlcnQgdGhlIHNjYWxlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBlcmNlbnRhZ2UgYnkgc2ltcGx5CisgICAgICogbXVsdGlwbHlpbmcgdGhlIHZhbHVlIGJ5IDEwMC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1Jbml0aWFsU2NhbGU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCA9IDAuMDFmOworCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgYW5pbWF0aW5nIHpvb20uIElmCisgICAgICogbVpvb21TY2FsZSBpcyBub24temVybyB0aGVuIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgem9vbSBhbmltYXRpb24uIFRoZQorICAgICAqIG90aGVyIHZhcmlhYmxlcyBhcmUgdXNlZCBhcyBhIGNhY2hlIChlLmcuIGludmVyc2UpIG9yIGFzIGEgd2F5IHRvIHN0b3JlCisgICAgICogdGhlIHN0YXRlIG9mIHRoZSB2aWV3IHByaW9yIHRvIGFuaW1hdGluZyAoZS5nLiBpbml0aWFsIHNjcm9sbCBjb29yZHMpLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkZpbmFsWm9vbVNjYWxlOworICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWDsKKyAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFk7CisgICAgcHJpdmF0ZSBsb25nIG1ab29tU3RhcnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9BTklNQVRJT05fTEVOR1RIID0gNTAwOworCisgICAgLy8gd2hldGhlciBzdXBwb3J0IG11bHRpLXRvdWNoCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdXBwb3J0TXVsdGlUb3VjaDsKKworICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCisgICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisKKyAgICBwdWJsaWMgWm9vbU1hbmFnZXIoV2ViVmlldyB3ZWJWaWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrUHJveHk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlCisgICAgICAgICAqIEVTUE4gYW5kIEVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdGhlCisgICAgICAgICAqIHZpZXdwb3J0IHNpemUgaXMuCisgICAgICAgICAqLworICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYm90aCB0aGUgZGVmYXVsdCBhbmQgYWN0dWFsIHpvb20gc2NhbGUgdG8gdGhlIGdpdmVuIGRlbnNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKKyAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGRlZmF1bHQgem9vbSBzY2FsZSB1c2luZyB0aGUgZ2l2ZW4gZGVuc2l0eS4gSXQgd2lsbCBhbHNvIHJlc2V0CisgICAgICogdGhlIGN1cnJlbnQgbWluIGFuZCBtYXggem9vbSBzY2FsZXMgdG8gdGhlIGRlZmF1bHQgYm91bmRhcmllcyBhcyB3ZWxsIGFzCisgICAgICogZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWxscyB3aXRoaW4gdGhvc2UgYm91bmRhcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZGVmYXVsdCBkZW5zaXR5CisgICAgICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBzY2FsZSBpZiBpdCBmYWxscyBvdXRzaWRlIHRoZSBuZXcgem9vbSBib3VuZHMKKyAgICAgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRab29tU2NhbGUoZmxvYXQgZGVmYXVsdFNjYWxlKSB7CisgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1JbnZEZWZhdWx0U2NhbGUgPSAxIC8gZGVmYXVsdFNjYWxlOworICAgICAgICBtRGVmYXVsdE1heFpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtRGVmYXVsdE1pblpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludlNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRUZXh0V3JhcFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVRleHRXcmFwU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludkRlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZEZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRNYXhab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RG9jdW1lbnRBbmNob3JYKCkgeworICAgICAgICByZXR1cm4gbUFuY2hvclg7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclkoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckRvY3VtZW50QW5jaG9yKCkgeworICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRab29tQ2VudGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVpvb21DZW50ZXJYID0geDsKKyAgICAgICAgbVpvb21DZW50ZXJZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoaW50IHNjYWxlSW5QZXJjZW50KSB7CisgICAgICAgIG1Jbml0aWFsU2NhbGUgPSBzY2FsZUluUGVyY2VudCAqIDAuMDFmOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBjb21wdXRlU2NhbGVXaXRoTGltaXRzKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKKyAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNab29tU2NhbGVGaXhlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGUgPj0gbU1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KGZsb2F0IHNjYWxlQSwgZmxvYXQgc2NhbGVCKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhzY2FsZUEgLSBzY2FsZUIpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdpbGxTY2FsZVRyaWdnZXJab29tKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIHJldHVybiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoc2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbU1heFpvb21TY2FsZSAtIG1BY3R1YWxTY2FsZSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhblpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgeworICAgICAgICByZXR1cm4gem9vbSgxLjI1Zik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIHpvb20oMC44Zik7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzIGFuZCBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIHpvb20oZmxvYXQgem9vbU11bHRpcGxpZXIpIHsKKyAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKKyAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgorICAgICAgICBtWm9vbUNlbnRlclggPSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIC41ZjsKKyAgICAgICAgbVpvb21DZW50ZXJZID0gbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpICogLjVmOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0Wm9vbUFuaW1hdGlvbihtQWN0dWFsU2NhbGUgKiB6b29tTXVsdGlwbGllciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGVzIGFuIGFuaW1hdGVkIHpvb20gb2YgdGhlIFdlYlZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5ldyBzY2FsZSB0cmlnZ2VyZWQgYW4gYW5pbWF0aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRab29tQW5pbWF0aW9uKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1Jbml0aWFsU2Nyb2xsWCA9IG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworCisgICAgICAgIC8vIHNuYXAgdG8gREVGQVVMVF9TQ0FMRSBpZiBpdCBpcyBjbG9zZQorICAgICAgICBpZiAoIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbURlZmF1bHRTY2FsZSkpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbURlZmF1bHRTY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgaWYgKG9sZFNjYWxlICE9IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgLy8gdXNlIG1ab29tUGlja2VyU2NhbGUgdG8gc2VlIHpvb20gcHJldmlldyBmaXJzdAorICAgICAgICAgICAgbVpvb21TdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbUludkluaXRpYWxab29tU2NhbGUgPSAxLjBmIC8gb2xkU2NhbGU7CisgICAgICAgICAgICBtSW52RmluYWxab29tU2NhbGUgPSAxLjBmIC8gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVpvb21TY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBXZWJWaWV3J3MgZHJhd2luZyBjb2RlIHdoZW4gYSBmaXhlZCBsZW5ndGggem9vbQorICAgICAqIGFuaW1hdGlvbiBpcyBvY2N1cnJpbmcuIEl0cyBwdXJwb3NlIGlzIHRvIGFuaW1hdGUgdGhlIHpvb21pbmcgb2YgdGhlIGNhbnZhcworICAgICAqIHRvIHRoZSBkZXNpcmVkIHNjYWxlIHdoaWNoIHdhcyBzcGVjaWZpZWQgaW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikuCisgICAgICoKKyAgICAgKiBBIGZpeGVkIGxlbmd0aCBhbmltYXRpb24gYmVnaW5zIHdoZW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikgaXMgY2FsbGVkIGFuZAorICAgICAqIGNvbnRpbnVlcyB1bnRpbCB0aGUgWk9PTV9BTklNQVRJT05fTEVOR1RIIHRpbWUgaGFzIGVsYXBzZWQuIER1cmluZyB0aGF0CisgICAgICogaW50ZXJ2YWwgZWFjaCB0aW1lIHRoZSBXZWJWaWV3IGRyYXdzIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hpY2ggaXMgCisgICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIFdlYlZpZXcgY2FuIGNoZWNrIHRvIHNlZSBpZiBzdWNoIGFuIGFuaW1hdGlvbiBpcyBjdXJyZW50bHkKKyAgICAgKiBpbiBwcm9ncmVzcyBieSBjYWxsaW5nIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZVpvb20oQ2FudmFzIGNhbnZhcykgeworICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJBIFdlYlZpZXcgaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIGEgZml4ZWQgbGVuZ3RoICIKKyAgICAgICAgICAgICAgICAgICAgKyAiem9vbSBhbmltYXRpb24gd2hlbiBubyB6b29tIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB6b29tU2NhbGU7CisgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1ab29tU3RhcnQpOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKKyAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKKyAgICAgICAgICAgIHpvb21TY2FsZSA9IDEuMGYgLyAobUludkluaXRpYWxab29tU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKKyAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBmaW5pc2hlZCBhbmltYXRpbmcKKyAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24uIFNpbmNlIHdlIG5lZWQgdG8gdXNlCisgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHRoZSBXZWJWaWV3J3MgcGluTG9jWC9ZIGZ1bmN0aW9ucyBkaXJlY3RseS4KKyAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICAgICAgaW50IHR4ID0gTWF0aC5yb3VuZChzY2FsZSAqIChtSW5pdGlhbFNjcm9sbFggKyBtWm9vbUNlbnRlclgpIC0gbVpvb21DZW50ZXJYKTsKKyAgICAgICAgdHggPSAtV2ViVmlldy5waW5Mb2ModHgsIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRXaWR0aCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgaW50IHR5ID0gTWF0aC5yb3VuZChzY2FsZQorICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQorICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7CisgICAgICAgIHR5ID0gLSh0eSA8PSB0aXRsZUhlaWdodCA/IE1hdGgubWF4KHR5LCAwKSA6IFdlYlZpZXcucGluTG9jKHR5CisgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRIZWlnaHQoKQorICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0eCwgdHkpOworICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbUFuaW1hdGluZygpIHsKKyAgICAgICAgcmV0dXJuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgfHwgbVBpbmNoVG9ab29tQW5pbWF0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgeworICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hab29tU2NhbGUoYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHJlZmxvd1RleHQsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCwgYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzU2NhbGVMZXNzVGhhbk1pblpvb20gPSBzY2FsZSA8IG1NaW5ab29tU2NhbGU7CisgICAgICAgIHNjYWxlID0gY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlCisgICAgICAgIGlmIChpc1NjYWxlTGVzc1RoYW5NaW5ab29tICYmIG1NaW5ab29tU2NhbGUgPCBtRGVmYXVsdFNjYWxlKSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmbG93VGV4dCkgeworICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgfHwgZm9yY2UpIHsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgZmxvYXQgb2xkSW52U2NhbGUgPSBtSW52QWN0dWFsU2NhbGU7CisKKyAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QaW5jaFRvWm9vbUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKKworICAgICAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBoaXN0b3J5IFBpY3R1cmUgaXMgZHJhd24sIGRvbid0IHVwZGF0ZSBzY3JvbGwuIFRoZXkgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHNjcm9sbCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8ganVtcAorICAgICAgICAgICAgICAgIC8vIGkuZS4ga2VlcCB0aGUgY2VudGVyIG9mIHRoZSBkb2MgaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlldworICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gc2NhbGUgKiBvbGRJbnZTY2FsZTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeCA9IHJhdGlvICogb2xkWCArIChyYXRpbyAtIDEpICogbVpvb21DZW50ZXJYOworICAgICAgICAgICAgICAgIGZsb2F0IHN5ID0gcmF0aW8gKiBvbGRZICsgKHJhdGlvIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICogKG1ab29tQ2VudGVyWSAtIG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAgLy8gU2NhbGUgYWxsIHRoZSBjaGlsZCB2aWV3cworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5zY2FsZUFsbCgpOworCisgICAgICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3QgaGF2ZSBhbmltYXRpb24gZm9yIHNjYWxpbmcsIGRvbid0IGRvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIC8vIGZvciBzY3JvbGxpbmcsIGFzIGl0IGNhdXNlcyB3ZWlyZCBpbnRlcm1lZGlhdGUgc3RhdGUKKyAgICAgICAgICAgICAgICBpbnQgc2Nyb2xsWCA9IG1XZWJWaWV3LnBpbkxvY1goTWF0aC5yb3VuZChzeCkpOworICAgICAgICAgICAgICAgIGludCBzY3JvbGxZID0gbVdlYlZpZXcucGluTG9jWShNYXRoLnJvdW5kKHN5KSk7CisgICAgICAgICAgICAgICAgaWYoIW1XZWJWaWV3LnVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKHNjcm9sbFgsIHNjcm9sbFkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgorICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5zZW5kT3VyVmlzaWJsZVJlY3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSB3ZSBuZWVkIHRvIHJlZmxvdyB0aGUgdGV4dCB0aGVuIGZvcmNlIHRoZSBWSUVXX1NJWkVfQ0hBTkdFRAorICAgICAgICAgICAgLy8gZXZlbnQgdG8gYmUgc2VudCB0byBXZWJLaXQKKyAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRWaWV3U2l6ZVpvb20ocmVmbG93VGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG91YmxlIHRhcCBnZXN0dXJlIGNhbiByZXN1bHQgaW4gZGlmZmVyZW50IGJlaGF2aW9ycyBkZXBlbmRpbmcgb24gdGhlCisgICAgICogY29udGVudCB0aGF0IGlzIHRhcHBlZC4KKyAgICAgKgorICAgICAqICgxKSBQTFVHSU5TOiBJZiB0aGUgdGFwcyBvY2N1ciBvbiBhIHBsdWdpbiB0aGVuIHdlIG1heGltaXplIHRoZSBwbHVnaW4gb24KKyAgICAgKiB0aGUgc2NyZWVuLiBJZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbWF4aW1pemVkIHRoZW4gem9vbSB0aGUgdXNlciBpbnRvCisgICAgICogb3ZlcnZpZXcgbW9kZS4KKyAgICAgKgorICAgICAqICgyKSBIVE1ML09USEVSOiBJZiB0aGUgdGFwcyBvY2N1ciBvdXRzaWRlIGEgcGx1Z2luIHRoZW4gdGhlIGZvbGxvd2luZworICAgICAqIGhldXJpc3RpYyBpcyB1c2VkLgorICAgICAqICAgQS4gSWYgdGhlIGN1cnJlbnQgc2NhbGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIHRoZQorICAgICAqICAgICAgbGF5b3V0IGFsZ29yaXRobSBzcGVjaWZpZXMgdGhlIHVzZSBvZiBOQVJST1dfQ09MVU1OUywgdGhlbiBmaXQgdG8KKyAgICAgKiAgICAgIGNvbHVtbiBieSByZWZsb3dpbmcgdGhlIHRleHQuCisgICAgICogICBCLiBJZiB0aGUgcGFnZSBpcyBub3QgaW4gb3ZlcnZpZXcgbW9kZSB0aGVuIGNoYW5nZSB0byBvdmVydmlldyBtb2RlLgorICAgICAqICAgQy4gSWYgdGhlIHBhZ2UgaXMgaW4gb3Zlcm1vZGUgdGhlbiBjaGFuZ2UgdG8gdGhlIGRlZmF1bHQgc2NhbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRG91YmxlVGFwKGZsb2F0IGxhc3RUb3VjaFgsIGZsb2F0IGxhc3RUb3VjaFkpIHsKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCB8fCBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbUNlbnRlcihsYXN0VG91Y2hYLCBsYXN0VG91Y2hZKTsKKyAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBsYXN0VG91Y2hYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBsYXN0VG91Y2hZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIGRvdWJsZSB0YXAgd2FzIG9uIGEgcGx1Z2luIHRoZW4gZWl0aGVyIHpvb20gdG8gbWF4aW1pemUgdGhlCisgICAgICAgICAqIHBsdWdpbiBvbiB0aGUgc2NyZWVuIG9yIHNjYWxlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKKyAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7CisgICAgICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TCisgICAgICAgICAgICAgICAgJiYgd2lsbFNjYWxlVHJpZ2dlclpvb20obVRleHRXcmFwU2NhbGUpKSB7CisgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKKyAgICAgICAgICAgIHpvb21Ub092ZXJ2aWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tVG9EZWZhdWx0TGV2ZWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tT3ZlcnZpZXdXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gd2lkdGg7CisgICAgICAgIG1JbnZab29tT3ZlcnZpZXdXaWR0aCA9IDEuMGYgLyB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldFpvb21PdmVydmlld1NjYWxlKCkgeworICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgKiBtSW52Wm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblpvb21PdmVydmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Jblpvb21PdmVydmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvT3ZlcnZpZXcoKSB7CisgICAgICAgIGlmICghd2lsbFNjYWxlVHJpZ2dlclpvb20oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSkpIHJldHVybjsKKworICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIGlmIChzY3JvbGxZIDwgbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub0RlZmF1bHRMZXZlbCgpIHsKKyAgICAgICAgaW50IGxlZnQgPSBtV2ViVmlldy5uYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgaWYgKGxlZnQgIT0gV2ViVmlldy5OT19MRUZURURHRSkgeworICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IG1XZWJWaWV3LmNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCisgICAgICAgICAgICAgICAgICAgIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQorICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIG1EZWZhdWx0U2NhbGUgLyAobURlZmF1bHRTY2FsZSAtIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNjcm9sbEJ5KHZpZXdMZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0Wm9vbUFuaW1hdGlvbihtRGVmYXVsdFNjYWxlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhlIHByZWNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0IG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbDsKKworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIG1TdXBwb3J0TXVsdGlUb3VjaCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKKyAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKKyAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbmV3IFNjYWxlR2VzdHVyZURldGVjdG9yKGNvbnRleHQsIG5ldyBTY2FsZURldGVjdG9yTGlzdGVuZXIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlUb3VjaFpvb20oKSB7CisgICAgICAgIHJldHVybiBtU3VwcG9ydE11bHRpVG91Y2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIGNhbGxlciB0aGF0IHRoZSBab29tTWFuYWdlciBpcyByZXF1ZXN0aW5nIHRoYXQgc2NhbGUgcmVsYXRlZAorICAgICAqIHVwZGF0ZXMgc2hvdWxkIG5vdCBiZSBzZW50IHRvIHdlYmtpdC4gVGhpcyBjYW4gb2NjdXIgaW4gY2FzZXMgd2hlcmUgdGhlCisgICAgICogWm9vbU1hbmFnZXIgaXMgcGVyZm9ybWluZyBhbiBhbmltYXRpb24gYW5kIGRvZXMgbm90IHdhbnQgd2Via2l0IHRvIHVwZGF0ZQorICAgICAqIHVudGlsIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2NhbGUgcmVsYXRlZCB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQgYW5kCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpIHsKKyAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgYW5pbWF0aW5nIGEgbXVsdGktdG91Y2ggem9vbSBwcmV2ZW50cyB1cGRhdGVzLCBidXQKKyAgICAgICAgLy8gb3RoZXJzIGNhbiBhZGQgdGhlaXIgb3duIGNvbmRpdGlvbnMgdG8gdGhpcyBtZXRob2QgaWYgbmVjZXNzYXJ5LgorICAgICAgICByZXR1cm4gbVBpbmNoVG9ab29tQW5pbWF0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBTY2FsZUdlc3R1cmVEZXRlY3RvciBnZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRGV0ZWN0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTY2FsZURldGVjdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIuc3RhcnRab29tKCk7CisgICAgICAgICAgICBtV2ViVmlldy5vblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLnJvdW5kKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkgKiBtQWN0dWFsU2NhbGUgKiAxMDApICogMC4wMWY7CisgICAgICAgICAgICBpZiAod2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCisgICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0Wm9vbUNlbnRlcihkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCkpOworICAgICAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGlmIChtUGluY2hUb1pvb21BbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtUGluY2hUb1pvb21BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlZmxvdyB3aGVuIHpvb20gaW47IHdoZW4gem9vbSBvdXQsIGRvIHJlZmxvdyBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgc2NhbGUgaXMgYWxtb3N0IG1pbmltdW0gc2NhbGU7CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZWZsb3dOb3cgPSAhY2FuWm9vbU91dCgpIHx8IChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgIC8vIGZvcmNlIHpvb20gYWZ0ZXIgbVByZXZpZXdab29tT25seSBpcyBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgdmlldyBzaXplIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBXZWJLaXQKKyAgICAgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHJlZmxvd05vdyk7CisgICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgdG8gZHJhdyB3aXRob3V0IHpvb20gZmlsdGVyCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIuZW5kWm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvbkVuZChkZXRlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG93LCBpbnQgb2gpIHsKKyAgICAgICAgLy8gcmVzZXQgem9vbSBhbmQgYW5jaG9yIHRvIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmVlbgorICAgICAgICAvLyB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgem9vbWluZworICAgICAgICBpZiAoIWlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIGludCB2aXNpYmxlVGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRWaXNpYmxlVGl0bGVIZWlnaHQoKTsKKyAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICBtWm9vbUNlbnRlclkgPSB2aXNpYmxlVGl0bGVIZWlnaHQ7CisgICAgICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKHZpc2libGVUaXRsZUhlaWdodCArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgbU1pblpvb21TY2FsZSBpZiB0aGUgbWluaW11bSB6b29tIHNjYWxlIGlzIG5vdCBmaXhlZAorICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2UgZnJvbSBuYXJyb3cgc2NyZWVuIHRvIHdpZGUgc2NyZWVuLCB0aGUgbmV3IHZpZXdXaWR0aAorICAgICAgICAgICAgLy8gY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9sZCBjb250ZW50IHdpZHRoLiBXZSBsaW1pdCB0aGUgbWluaW11bQorICAgICAgICAgICAgLy8gc2NhbGUgdG8gMS4wZi4gVGhlIHByb3BlciBtaW5pbXVtIHNjYWxlIHdpbGwgYmUgY2FsY3VsYXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgbmV3IHBpY3R1cmUgc2hvd3MgdXAuCisgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gTWF0aC5taW4oMS4wZiwgKGZsb2F0KSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAvIChtV2ViVmlldy5kcmF3SGlzdG9yeSgpID8gbVdlYlZpZXcuZ2V0SGlzdG9yeVBpY3R1cmVXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCAmJiBtSW5pdGlhbFNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtSW5pdGlhbFNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvLyBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkIGR1cmluZyBXZWJWaWV3IGxheW91dC4gQW5kIGFueQorICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCkgaXMgYmxvY2tlZCBkdXJpbmcgbGF5b3V0LiBBcyByZWZyZXNoWm9vbVNjYWxlKCkgd2lsbAorICAgICAgICAvLyBjYXVzZSBpdHMgY2hpbGQgVmlldyB0byByZXBvc2l0aW9uIGl0c2VsZiB0aHJvdWdoIFZpZXdNYW5hZ2VyJ3MKKyAgICAgICAgLy8gc2NhbGVBbGwoKSwgd2UgbmVlZCB0byBwb3N0IGEgUnVubmFibGUgdG8gZW5zdXJlIHJlcXVlc3RMYXlvdXQoKS4KKyAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBvbmx5IHVwZGF0ZSB0aGUgdGV4dCB3cmFwIHNjYWxlIGlmIHRoZSB3aWR0aCBjaGFuZ2VkLgorICAgICAgICBtV2ViVmlldy5wb3N0KG5ldyBQb3N0U2NhbGUodyAhPSBvdykpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKKworICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKGJvb2xlYW4gdXBkYXRlVGV4dFdyYXApIHsKKyAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCA9IHVwZGF0ZVRleHRXcmFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFdlYlZpZXdDb3JlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBmb3JjZSwgaW4gY2FzZSBvdXIgaGVpZ2h0IGNoYW5nZWQsIGluIHdoaWNoIGNhc2Ugd2UKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KKyAgICAgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKG1VcGRhdGVUZXh0V3JhcCk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcHJvZHVjZXMgYSBuZXcgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCk7CisKKyAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bworICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQorICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKKyAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCisgICAgICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChNYXRoLm1pbihXZWJWaWV3LnNNYXhWaWV3cG9ydFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgoaW50KSAodmlld1dpZHRoICogbUludkRlZmF1bHRTY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZHJhd0RhdGEubU1pblByZWZXaWR0aCwgZHJhd0RhdGEubVZpZXdQb2ludC54KSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB6b29tT3ZlcnZpZXdTY2FsZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgorICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IChtSW5ab29tT3ZlcnZpZXcKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKSAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSkpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgICAgICAgICBzZXRab29tU2NhbGUoem9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyBhZnRlciBXZWJraXQgY29tcGxldGVzIHRoZSBpbml0aWFsIHBhZ2UgbGF5b3V0LiBJdAorICAgICAqIGlzIGNhbGxlZCB3aGVuIHZpc2l0aW5nIGEgcGFnZSBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgd2VsbCBhcyB3aGVuIHRoZQorICAgICAqIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gYSBwYWdlIChpbiB3aGljaCBjYXNlIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlCisgICAgICogem9vbSBsZXZlbHMgdG8gdGhlIHN0YXRlIHRoZXkgd2VyZSB3aGVuIHlvdSBsZWZ0IHRoZSBwYWdlKS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRmlyc3RMYXlvdXQoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGFzc2VydCBkcmF3RGF0YSAhPSBudWxsOworICAgICAgICBhc3NlcnQgZHJhd0RhdGEubVZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3RGF0YS5tVmlld1N0YXRlOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXdEYXRhLm1WaWV3UG9pbnQ7CisgICAgICAgIHVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIHZpZXdTaXplLngsIGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZmxvd1RleHQ7CisKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdTdGF0ZS5tVmlld1NjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gdmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIHNjYWxlID0gdmlld1N0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCisgICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKKyAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQorICAgICAgICBtQWN0dWFsU2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gbUFjdHVhbFNjYWxlOworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEJhc2UgZ2V0Q3VycmVudFpvb21Db250cm9sKCkgeworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbWJlZGRlZFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFbWJlZGRlZCh0aGlzLCBtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRlcm5hbFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFeHRlcm5hbChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3Nab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIHJldHVybiAoY29udHJvbCAhPSBudWxsKSA/IGNvbnRyb2wuaXNWaXNpYmxlKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVtYmVkZGVkIHpvb20gY29udHJvbCBpbnRlcmNlcHRzIHRvdWNoIGV2ZW50cyBhbmQgYXV0b21hdGljYWxseSBzdGF5cworICAgICAqIHZpc2libGUuIFRoZSBleHRlcm5hbCBjb250cm9sIG5lZWRzIHRvIGNvbnN0YW50bHkgcmVmcmVzaCBpdHMgaW50ZXJuYWwKKyAgICAgKiB0aW1lciB0byBzdGF5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQga2VlcFpvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0RXh0ZXJuYWxab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbC5nZXRDb250cm9scygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhjNjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJydW50aW1lOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8qKgorICogVGhlIHJ1bnRpbWUgdXNlZCB0byBkaXNwbGF5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb25zLgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFdlYlJ1bnRpbWVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR1RBRyA9ICJXZWJSdW50aW1lQWN0aXZpdHkiOworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgVVJMIG1CYXNlVXJsOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1TcGxhc2hTY3JlZW47CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlbnNpdGl2ZUZlYXR1cmVzIHsKKyAgICAgICAgLy8gQWxsIG9mIHRoZSBzZW5zaXRpdmUgZmVhdHVyZXMKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvbjsKKyAgICAgICAgLy8gT24gQW5kcm9pZCwgdGhlIEJyb3dzZXIgZG9lc24ndCBwcm9tcHQgZm9yIGRhdGFiYXNlIGFjY2Vzcywgc28gd2UgZG9uJ3QgcmVxdWlyZSBhbgorICAgICAgICAvLyBleHBsaWNpdCBwZXJtaXNzaW9uIGhlcmUgaW4gdGhlIFdlYlJ1bnRpbWVBY3Rpdml0eSwgYW5kIHRoZXJlJ3Mgbm8gQW5kcm9pZCBzeXN0ZW0KKyAgICAgICAgLy8gcGVybWlzc2lvbiByZXF1aXJlZCBmb3IgaXQgZWl0aGVyLgorICAgICAgICAvL3ByaXZhdGUgYm9vbGVhbiBtRGF0YWJhc2U7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0R2VvbG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUdlb2xvY2F0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uKGJvb2xlYW4gZ2VvbG9jYXRpb24pIHsKKyAgICAgICAgICAgIG1HZW9sb2NhdGlvbiA9IGdlb2xvY2F0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpCisgICAgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIENhbid0IGdldCBtZXRhIGRhdGEgdXNpbmcgZ2V0QXBwbGljYXRpb25JbmZvKCkgYXMgaXQgZG9lc24ndCBwYXNzIEdFVF9NRVRBX0RBVEEKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSh0aGlzLCBnZXRDbGFzcygpKTsKKyAgICAgICAgQWN0aXZpdHlJbmZvIGFjdGl2aXR5SW5mbyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3Rpdml0eUluZm8gPSBwYWNrYWdlTWFuYWdlci5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50TmFtZSwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgIH0gY2F0Y2ggKFBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJGYWlsZWQgdG8gZmluZCBjb21wb25lbnQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHlJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkZhaWxlZCB0byBnZXQgYWN0aXZpdHkgaW5mbyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQnVuZGxlIG1ldGFEYXRhID0gYWN0aXZpdHlJbmZvLm1ldGFEYXRhOworICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiTm8gbWV0YSBkYXRhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdXJsID0gbWV0YURhdGEuZ2V0U3RyaW5nKCJhbmRyb2lkLndlYnJ1bnRpbWUudXJsIik7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiTm8gVVJMIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJhc2VVcmwgPSBuZXcgVVJMKHVybCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJJbnZhbGlkIFVSTCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsIGZhbHNlIGJ5IGRlZmF1bHQsIGFuZCByZWFkaW5nIG5vbi1leGlzdGVudCBidW5kbGUgcHJvcGVydGllcyBnaXZlcyBmYWxzZSB0b28uCisgICAgICAgIGZpbmFsIFNlbnNpdGl2ZUZlYXR1cmVzIHNlbnNpdGl2ZUZlYXR1cmVzID0gbmV3IFNlbnNpdGl2ZUZlYXR1cmVzKCk7CisgICAgICAgIHNlbnNpdGl2ZUZlYXR1cmVzLnNldEdlb2xvY2F0aW9uKG1ldGFEYXRhLmdldEJvb2xlYW4oImFuZHJvaWQud2VicnVudGltZS5TZW5zaXRpdmVGZWF0dXJlc0dlb2xvY2F0aW9uIikpOworCisgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQud2ViX3J1bnRpbWUpOworICAgICAgICBtV2ViVmlldyA9IChXZWJWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbiA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNwbGFzaHNjcmVlbik7CisgICAgICAgIG1TcGxhc2hTY3JlZW4uc2V0SW1hZ2VSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRJZGVudGlmaWVyKCJzcGxhc2hfc2NyZWVuIiwgImRyYXdhYmxlIiwgZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRPdmVycmlkZVVybExvYWRpbmcoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVVJMIG5ld09yaWdpbiA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG5ld09yaWdpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNpbXBsZSBzYW1lIG9yaWdpbiB0ZXN0IHBhc3NlcywgbG9hZCBpbiB0aGUgd2Vidmlldy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgbG9hZCBhbnl0aGluZyBpZiB0aGlzIHdhc24ndCBhIHByb3BlciBVUkwuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGlzIGlzIGEgVVJMIHRoYXQgaXMgbm90IHNhbWUgb3JpZ2luIHNvIHBhc3MgaXQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gQnJvd3NlciB0byBsb2FkLgorICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcsIFVyaS5wYXJzZSh1cmwpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TcGxhc2hTY3JlZW4gIT0gbnVsbCAmJiBtU3BsYXNoU2NyZWVuLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1TcGxhc2hTY3JlZW4gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVXNlIGEgY3VzdG9tIFdlYkNocm9tZUNsaWVudCB3aXRoIGdlb2xvY2F0aW9uIHBlcm1pc3Npb25zIGhhbmRsaW5nLgorICAgICAgICBtV2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobmV3IFdlYkNocm9tZUNsaWVudCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luLCBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhpcyBvcmlnaW4gaWYgaXQgaGFzIEdlb2xvY2F0aW9uIHBlcm1pc3Npb25zLCBvdGhlcndpc2UgZGVueS4KKyAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vuc2l0aXZlRmVhdHVyZXMuZ2V0R2VvbG9jYXRpb24oKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVVJMIG9yaWdpblVybCA9IG5ldyBVUkwob3JpZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgPSBhcmVTYW1lT3JpZ2luKG1CYXNlVXJsLCBvcmlnaW5VcmwpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgYWxsb3dlZCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBTZXQgdGhlIERCIGxvY2F0aW9uLiBPcHRpb25hbC4gR2VvbG9jYXRpb24gd29ya3Mgd2l0aG91dCBEQnMuCisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0R2VvbG9jYXRpb25EYXRhYmFzZVBhdGgoCisgICAgICAgICAgICAgICAgZ2V0RGlyKCJnZW9sb2NhdGlvbiIsIE1PREVfUFJJVkFURSkuZ2V0UGF0aCgpKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS50aXRsZSIpOworICAgICAgICAvLyBXZSB0dXJuZWQgb2ZmIHRoZSB0aXRsZSBiYXIgdG8gZ28gZnVsbCBzY3JlZW4gc28gZGlzcGxheSB0aGUKKyAgICAgICAgLy8gd2ViYXBwJ3MgdGl0bGUgYXMgYSB0b2FzdC4KKyAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIHRpdGxlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvYWQgdGhlIHdlYmFwcCdzIGJhc2UgVVJMLgorICAgICAgICBtV2ViVmlldy5sb2FkVXJsKHVybCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0sgJiYgbVdlYlZpZXcuY2FuR29CYWNrKCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LmdvQmFjaygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgbWVudS5hZGQoMCwgMCwgMCwgIk1lbnUgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKDAsIDEsIDAsICJNZW51IGl0ZW0gMiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZVNhbWVPcmlnaW4oVVJMIGEsIFVSTCBiKSB7CisgICAgICAgIGludCBhUG9ydCA9IGEuZ2V0UG9ydCgpID09IC0xID8gYS5nZXREZWZhdWx0UG9ydCgpIDogYS5nZXRQb3J0KCk7CisgICAgICAgIGludCBiUG9ydCA9IGIuZ2V0UG9ydCgpID09IC0xID8gYi5nZXREZWZhdWx0UG9ydCgpIDogYi5nZXRQb3J0KCk7CisgICAgICAgIHJldHVybiBhLmdldFByb3RvY29sKCkuZXF1YWxzKGIuZ2V0UHJvdG9jb2woKSkgJiYgYVBvcnQgPT0gYlBvcnQgJiYgYS5nZXRIb3N0KCkuZXF1YWxzKGIuZ2V0SG9zdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IGM5NzBhZTYuLmU1NzJkM2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKQEAgLTcxLDcgKzcyLDggQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic0xpc3RWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXc8TGlzdEFkYXB0ZXI+IGltcGxlbWVudHMgVGV4dFdhdGNoZXIsCiAgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciwgRmlsdGVyLkZpbHRlckxpc3RlbmVyLAotICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIsCisgICAgICAgIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIHRoZSB0cmFuc2NyaXB0IG1vZGUuCkBAIC0xODAsNiArMTgyLDExIEBACiAgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVtb3RlIGFkYXB0ZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyB2aWV3IHRvIGJlIHNldAorICAgICAqLworICAgIHByaXZhdGUgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVBZGFwdGVyOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3Qgc2VsZWN0b3Igc2hvdWxkIGJlIGRyYXduIG9uIHRvcCBvZiB0aGUgY2hpbGRyZW4gb3IgYmVoaW5kCiAgICAgICovCiAgICAgYm9vbGVhbiBtRHJhd1NlbGVjdG9yT25Ub3AgPSBmYWxzZTsKQEAgLTU1OSw2ICs1NjYsMTYgQEAKIAogICAgICAgICBib29sZWFuIHNtb290aFNjcm9sbGJhciA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5BYnNMaXN0Vmlld19zbW9vdGhTY3JvbGxiYXIsIHRydWUpOwogICAgICAgICBzZXRTbW9vdGhTY3JvbGxiYXJFbmFibGVkKHNtb290aFNjcm9sbGJhcik7CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgYWRhcHRlcklkID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X2FkYXB0ZXIsIDApOworICAgICAgICBpZiAoYWRhcHRlcklkICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgYyA9IGNvbnRleHQ7CisgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEFkYXB0ZXIoQWRhcHRlcnMubG9hZEFkYXB0ZXIoYywgYWRhcHRlcklkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KIAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CkBAIC0xNTc1LDYgKzE1OTIsMTEgQEAKICAgICAgICAgICAgICAgICB0cmVlT2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbmV3IEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTk1LDYgKzE2MTcsMTEgQEAKICAgICAgICAgICAgICAgICBtR2xvYmFsTGF5b3V0TGlzdGVuZXJBZGRlZEZpbHRlciA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTc0NSw3ICsxNzcyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtTG9uZ1ByZXNzKGZpbmFsIFZpZXcgY2hpbGQsCisgICAgYm9vbGVhbiBwZXJmb3JtTG9uZ1ByZXNzKGZpbmFsIFZpZXcgY2hpbGQsCiAgICAgICAgICAgICBmaW5hbCBpbnQgbG9uZ1ByZXNzUG9zaXRpb24sIGZpbmFsIGxvbmcgbG9uZ1ByZXNzSWQpIHsKICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CiAKQEAgLTI1MjEsNiArMjU0OCw3IEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX1BPUyA9IDI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX0RPV05fQk9VTkQgPSAzOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9VUF9CT1VORCA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX09GRlNFVCA9IDU7CiAgICAgICAgIAogICAgICAgICBwcml2YXRlIGludCBtTW9kZTsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVRhcmdldFBvczsKQEAgLTI1MjgsNiArMjU1Niw4IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1MYXN0U2VlblBvczsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVNjcm9sbER1cmF0aW9uOwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRXh0cmFTY3JvbGw7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU9mZnNldEZyb21Ub3A7CiAgICAgICAgIAogICAgICAgICBQb3NpdGlvblNjcm9sbGVyKCkgewogICAgICAgICAgICAgbUV4dHJhU2Nyb2xsID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KG1Db250ZXh0KS5nZXRTY2FsZWRGYWRpbmdFZGdlTGVuZ3RoKCk7CkBAIC0yNjE5LDEyICsyNjQ5LDQ2IEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIHBvc3QodGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKKyAgICAgICAgdm9pZCBzdGFydFdpdGhPZmZzZXQoaW50IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBtVGFyZ2V0UG9zID0gcG9zaXRpb247CisgICAgICAgICAgICBtT2Zmc2V0RnJvbVRvcCA9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3VuZFBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBJTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgbU1vZGUgPSBNT1ZFX09GRlNFVDsKKworICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0UG9zID0gbUZpcnN0UG9zaXRpb247CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsYXN0UG9zID0gZmlyc3RQb3MgKyBjaGlsZENvdW50IC0gMTsKKworICAgICAgICAgICAgaW50IHZpZXdUcmF2ZWxDb3VudCA9IDA7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgIHZpZXdUcmF2ZWxDb3VudCA9IGZpcnN0UG9zIC0gcG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gbGFzdFBvcykgeworICAgICAgICAgICAgICAgIHZpZXdUcmF2ZWxDb3VudCA9IHBvc2l0aW9uIC0gbGFzdFBvczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0VG9wID0gZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGZpcnN0UG9zKS5nZXRUb3AoKTsKKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSh0YXJnZXRUb3AgLSBvZmZzZXQsIFNDUk9MTF9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFc3RpbWF0ZSBob3cgbWFueSBzY3JlZW5zIHdlIHNob3VsZCB0cmF2ZWwKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjcmVlblRyYXZlbENvdW50ID0gdmlld1RyYXZlbENvdW50IC8gY2hpbGRDb3VudDsKKyAgICAgICAgICAgIG1TY3JvbGxEdXJhdGlvbiA9IChpbnQpIChTQ1JPTExfRFVSQVRJT04gLyBzY3JlZW5UcmF2ZWxDb3VudCk7CisgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBJTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgcG9zdCh0aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgc3RvcCgpIHsKICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyh0aGlzKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HICYmIG1MYXN0U2VlblBvcyAhPSBJTlZBTElEX1BPU0lUSU9OKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmaW5hbCBpbnQgbGlzdEhlaWdodCA9IGdldEhlaWdodCgpOwogICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0UG9zID0gbUZpcnN0UG9zaXRpb247CiAgICAgICAgICAgICAKQEAgLTI3NDksNiArMjgxMywyNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlIE1PVkVfT0ZGU0VUOiB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBmaXJzdFBvczsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb24gPSBtVGFyZ2V0UG9zOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXN0UG9zID0gZmlyc3RQb3MgKyBjaGlsZENvdW50IC0gMTsKKworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KC1nZXRIZWlnaHQoKSwgbVNjcm9sbER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gbGFzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeShnZXRIZWlnaHQoKSwgbVNjcm9sbER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0VG9wID0gZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGZpcnN0UG9zKS5nZXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkodGFyZ2V0VG9wIC0gbU9mZnNldEZyb21Ub3AsIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjc2OCw2ICsyODUzLDI0IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwgc2Nyb2xsCisgICAgICogc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkIDxjb2RlPm9mZnNldDwvY29kZT4gcGl4ZWxzIGZyb20KKyAgICAgKiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHZpZXcuIElmIHRoaXMgaXMgaW1wb3NzaWJsZSwgKGUuZy4gdGhlIG9mZnNldCB3b3VsZCBzY3JvbGwKKyAgICAgKiB0aGUgZmlyc3Qgb3IgbGFzdCBpdGVtIGJleW9uZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgbGlzdCkgaXQgd2lsbCBnZXQgYXMgY2xvc2UKKyAgICAgKiBhcyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzY3JvbGwgdG8KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IERlc2lyZWQgZGlzdGFuY2UgaW4gcGl4ZWxzIG9mIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBmcm9tIHRoZSB0b3AKKyAgICAgKiAgICAgICAgICAgICAgIG9mIHRoZSB2aWV3IHdoZW4gc2Nyb2xsaW5nIGlzIGZpbmlzaGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AoaW50IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGlmIChtUG9zaXRpb25TY3JvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtUG9zaXRpb25TY3JvbGxlciA9IG5ldyBQb3NpdGlvblNjcm9sbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIuc3RhcnRXaXRoT2Zmc2V0KHBvc2l0aW9uLCBvZmZzZXQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKICAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLCBidXQgaXQgd2lsbAogICAgICAqIHN0b3AgZWFybHkgaWYgc2Nyb2xsaW5nIGZ1cnRoZXIgd291bGQgc2Nyb2xsIGJvdW5kUG9zaXRpb24gb3V0IG9mCkBAIC0yNzk3LDYgKzI5MDAsNDIgQEAKICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTY3JvbGwoZGlzdGFuY2UsIGR1cmF0aW9uKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgUmVtb3RlVmlld3MgdG8gc2Nyb2xsIHJlbGF0aXZlbHkgdG8gYSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBwb3NpdGlvbikgeworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRMYXN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXggLSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldEdsb2JhbFZpc2libGVSZWN0KHZpc2libGVSZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hpbGQgaXMgcGFydGlhbGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkUmVjdEFyZWEgPSBjaGlsZC5nZXRXaWR0aCgpICogY2hpbGQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2aXNpYmxlUmVjdEFyZWEgPSB2aXNpYmxlUmVjdC53aWR0aCgpICogdmlzaWJsZVJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZpc2libGVBcmVhID0gKHZpc2libGVSZWN0QXJlYSAvIChmbG9hdCkgY2hpbGRSZWN0QXJlYSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHZpc2libGVUaHJlc2hvbGQgPSAwLjc1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdG9wIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IHRvcCBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwb3NpdGlvbiA+IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm90dG9tIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IGJvdHRvbSBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbFRvUG9zaXRpb24oTWF0aC5tYXgoMCwgTWF0aC5taW4oZ2V0Q291bnQoKSwgaW5kZXggKyBwb3NpdGlvbikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxpbmdDYWNoZUVuYWJsZWQgJiYgIW1DYWNoaW5nU3RhcnRlZCkgewogICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3bldpdGhDYWNoZUVuYWJsZWQodHJ1ZSk7CkBAIC0zMTU1LDYgKzMyOTQsNyBAQAogCiAgICAgICAgIG1SZXN1cnJlY3RUb1Bvc2l0aW9uID0gSU5WQUxJRF9QT1NJVElPTjsKICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1GbGluZ1J1bm5hYmxlKTsKKyAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1Qb3NpdGlvblNjcm9sbGVyKTsKICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfUkVTVDsKICAgICAgICAgY2xlYXJTY3JvbGxpbmdDYWNoZSgpOwogICAgICAgICBtU3BlY2lmaWNUb3AgPSBzZWxlY3RlZFRvcDsKQEAgLTM4MDgsNiArMzk0OCwzNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgY29ubmVjdHMgdG8gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciA9PSBtQWRhcHRlcikgeworICAgICAgICAgICAgbVJlbW90ZUFkYXB0ZXIgPSBudWxsOworICAgICAgICAgICAgc2V0QWRhcHRlcihudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJlY3ljbGVyIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGEgVmlldyBpcyBzZXQgYXNpZGUgaW4KICAgICAgKiB0aGUgcmVjeWNsZXIgZm9yIGxhdGVyIHJldXNlLiBUaGlzIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIGZyZWUgcmVzb3VyY2VzCiAgICAgICogYXNzb2NpYXRlZCB0byB0aGUgVmlldy4KQEAgLTQxOTAsNyArNDM1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBzY3JhcCA9IG1TY3JhcFZpZXdzW2ldOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2NyYXBDb3VudCA9IHNjcmFwLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY3JhcENvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmFwLmdldChpKS5zZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXAuZ2V0KGopLnNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvcihjb2xvcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcyM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDcyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB7QGxpbmsgQWRhcHRlclZpZXd9IHRoYXQgd2lsbCBwZXJmb3JtIGFuaW1hdGlvbnMKKyAqIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaXRzIHZpZXdzLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgZXh0ZW5kcyBBZGFwdGVyVmlldzxBZGFwdGVyPgorICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlVmlld0FuaW1hdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGlsZCwgd2hpY2ggYXBwZWFycyBhbnl3aGVyZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwgYXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjbUFjdGl2ZU9mZnNldH0KKyAgICAgKi8KKyAgICBpbnQgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGZpcnN0IHZpZXcocykgc2hvdWxkIGJlIGFuaW1hdGVkIGluCisgICAgICovCisgICAgYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiAgUmVwcmVzZW50cyB3aGVyZSB0aGUgaW4gdGhlIGN1cnJlbnQgd2luZG93IG9mCisgICAgICogIHZpZXdzIHRoZSBjdXJyZW50IDxjb2RlPm1EaXNwbGF5ZWRDaGlsZDwvY29kZT4gc2l0cworICAgICAqLworICAgIGludCBtQWN0aXZlT2Zmc2V0ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhhdCB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9IGtlZXBzIGFzIGNoaWxkcmVuIGF0IGFueQorICAgICAqIGdpdmVuIHRpbWUgKG5vdCBjb3VudGluZyB2aWV3cyB0aGF0IGFyZSBwZW5kaW5nIHJlbW92YWwsIHNlZSB7QGxpbmsgI21QcmV2aW91c1ZpZXdzfSkuCisgICAgICovCisgICAgaW50IG1OdW1BY3RpdmVWaWV3cyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfS4gVGhpcyBhcnJheQorICAgICAqIGlzIGFjY2Vzc2VkIGluIGEgY2lyY3VsYXIgZmFzaGlvbgorICAgICAqLworICAgIFZpZXdbXSBtQWN0aXZlVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZpZXdzIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8Vmlldz4gbVByZXZpb3VzVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgZW5kIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0sIGV4Y2VwdCB3aGVuIHRoZSB3ZSBoYXZlIGJvdW5kZWQKKyAgICAgKiB7QGxpbmsgI21DdXJyZW50V2luZG93U3RhcnR9IHRvIGJlIG5vbi1uZWdhdGl2ZQorICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRyZWF0IHRoZSBhZGFwdGVyIHRvIGJlIGEgY2lyY3VsYXIgc3RydWN0dXJlLCBpZS4KKyAgICAgKiB0aGUgdmlldyBiZWZvcmUgMCBpcyBjb25zaWRlcmVkIHRvIGJlIDxjb2RlPm1BZGFwdGVyLmdldENvdW50KCkgLSAxPC9jb2RlPgorICAgICAqCisgICAgICogVE9ETzogdGhpcyBkb2Vzbid0IGRvIGFueXRoaW5nIHlldAorICAgICAqCisgICAgICovCisgICAgYm9vbGVhbiBtQ3ljbGVWaWV3cyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSGFuZGxlciB0byBwb3N0IGV2ZW50cyB0byB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKi8KKyAgICBIYW5kbGVyIG1NYWluUXVldWU7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBkYXRhIGNoYW5nZXMgZnJvbSB0aGUgYWRhcHRlcgorICAgICAqLworICAgIEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgQWRhcHRlciBtQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgUmVtb3RlVmlld3NBZGFwdGVyfSBmb3IgdGhpcyB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBSZW1vdGVWaWV3c0FkYXB0ZXIgbVJlbW90ZVZpZXdzQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGFuaW1hdG9yIGlzIHNob3dpbmcgdmlld3MKKyAgICAgKi8KKyAgICBib29sZWFuIG1GaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVE9ETzogQW5pbWF0aW9uIHN0dWZmIGlzIHN0aWxsIGluIGZsdXgsIHdhaXRpbmcgb24gdGhlIG5ldyBmcmFtZXdvcmsgdG8gc2V0dGxlIGEgYml0LgorICAgICAqLworICAgIEFuaW1hdGlvbiBtSW5BbmltYXRpb247CisgICAgQW5pbWF0aW9uIG1PdXRBbmltYXRpb247CisgICAgcHJpdmF0ZSAgQXJyYXlMaXN0PFZpZXc+IG1WaWV3c1RvQnJpbmdUb0Zyb250OworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yKTsKKyAgICAgICAgaW50IHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldEluQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24sIDApOworICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CisgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgbU1haW5RdWV1ZSA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKKyAgICAgICAgbUFjdGl2ZVZpZXdzID0gbmV3IFZpZXdbbU51bUFjdGl2ZVZpZXdzXTsKKyAgICAgICAgbVByZXZpb3VzVmlld3MgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KCk7CisgICAgICAgIG1WaWV3c1RvQnJpbmdUb0Zyb250ID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBjb25maWd1cmUgdGhlIGFuaW1hdG9yIHRvIGRpc3BsYXkgdGhlCisgICAgICogZGVzaXJlZCBudW1iZXIgb2Ygdmlld3MsIGFuZCBzcGVjaWZ5IHRoZSBvZmZzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1WaXNpYmxlVmlld3MgVGhlIG51bWJlciBvZiB2aWV3cyB0aGUgYW5pbWF0b3Iga2VlcHMgaW4gdGhlIHtAbGluayBWaWV3R3JvdXB9CisgICAgICogQHBhcmFtIGFjdGl2ZU9mZnNldCBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdGhlIGN1cnJlbnQgaW5kZXggKHtAbGluayBtV2hpY2hDaGlsZH0pCisgICAgICogICAgICAgIHNpdHMgd2l0aGluIHRoZSB3aW5kb3cuIEZvciBleGFtcGxlIGlmIGFjdGl2ZU9mZnNldCBpcyAxLCBhbmQgbnVtVmlzaWJsZVZpZXdzIGlzIDMsCisgICAgICogICAgICAgIGFuZCB7QGxpbmsgc2V0RGlzcGxheWVkQ2hpbGR9IGlzIGNhbGxlZCB3aXRoIDEwLCB0aGVuIHRoZSBlZmZlY3RpdmUgd2luZG93IHdpbGwgYmUKKyAgICAgKiAgICAgICAgdGhlIGluZGV4ZXMgOSwgMTAsIGFuZCAxMS4gSW4gdGhlIHNhbWUgZXhhbXBsZSwgaWYgYWN0aXZlT2Zmc2V0IHdlcmUgMCwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgd2luZG93IHdvdWxkIGluc3RlYWQgY29udGFpbiBpbmRleGVzIDEwLCAxMSBhbmQgMTIuCisgICAgICovCisgICAgIHZvaWQgY29uZmlndXJlVmlld0FuaW1hdG9yKGludCBudW1WaXNpYmxlVmlld3MsIGludCBhY3RpdmVPZmZzZXQpIHsKKyAgICAgICAgaWYgKGFjdGl2ZU9mZnNldCA+IG51bVZpc2libGVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBoZXJlLgorICAgICAgICB9CisgICAgICAgIG1OdW1BY3RpdmVWaWV3cyA9IG51bVZpc2libGVWaWV3czsKKyAgICAgICAgbUFjdGl2ZU9mZnNldCA9IGFjdGl2ZU9mZnNldDsKKyAgICAgICAgbUFjdGl2ZVZpZXdzID0gbmV3IFZpZXdbbU51bUFjdGl2ZVZpZXdzXTsKKyAgICAgICAgbVByZXZpb3VzVmlld3MuY2xlYXIoKTsKKyAgICAgICAgcmVtb3ZlQWxsVmlld3NJbkxheW91dCgpOworICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gMDsKKyAgICAgICAgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY3VzdG9taXplIHZpZXcgdHJhbnNpdGlvbnMgd2l0aGluCisgICAgICogdGhlIHNldCBvZiB2aXNpYmxlIHZpZXdzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSByZWxhdGl2ZSBpbmRleCB3aXRoaW4gdGhlIHdpbmRvdyB0aGF0IHRoZSB2aWV3IHdhcyBpbiwgLTEgaWYgaXQgd2Fzbid0CisgICAgICogICAgICAgIGluIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gdG9JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyBpcyBnb2luZyB0bywgLTEgaWYgaXQgaXMKKyAgICAgKiAgICAgICAgYmVpbmcgcmVtb3ZlZAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgaXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgcGE7CisgICAgICAgIGlmIChmcm9tSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHBhID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoNDAwLCB2aWV3LCAiYWxwaGEiLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAodG9JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgcGEgPSBuZXcgUHJvcGVydHlBbmltYXRvcig0MDAsIHZpZXcsICJhbHBoYSIsIDEuMGYsIDAuMGYpOworICAgICAgICAgICAgcGEuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hpY2ggY2hpbGQgdmlldyB3aWxsIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGljaENoaWxkIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdmlldyB0byBkaXNwbGF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheWVkQ2hpbGQoaW50IHdoaWNoQ2hpbGQpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaGljaENoaWxkID0gd2hpY2hDaGlsZDsKKyAgICAgICAgICAgIGlmICh3aGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoQ2hpbGQgPCAwKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2N1cyA9IGdldEZvY3VzZWRDaGlsZCgpICE9IG51bGw7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2xlYXIgb2xkIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJldGFrZSBmb2N1cyBpZiB3ZSBoYWQgaXQKKyAgICAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVmYXVsdCBpbkFuaW1hdGlvbi4gVG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlZmF1bHQgb3V0QW5pbWF0aW9uLiBUbyBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gVGhpcyBtZXRob2QgYXBwbGllcyBhIHZpZXcgLyBpbmRleCBzcGVjaWZpYworICAgICAqIHRyYW5zZm9ybSB0byB0aGUgY2hpbGQgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZAorICAgICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4CisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBwcmV2aW91cyBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1vZHVsbyhpbnQgcG9zLCBpbnQgc2l6ZSkgeworICAgICAgICByZXR1cm4gKHNpemUgKyAocG9zICUgc2l6ZSkpICUgc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZpZXcgYXQgdGhpcyBpbmRleCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXggUG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2luZG93J3Mgc3RhcnQKKyAgICAgKiBAcmV0dXJuIFZpZXcgYXQgdGhpcyBpbmRleCwgbnVsbCBpZiB0aGUgaW5kZXggaXMgb3V0c2lkZSB0aGUgYm91bmRzCisgICAgICovCisgICAgVmlldyBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ID49IDAgJiYgcmVsYXRpdmVJbmRleCA8PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgcmVsYXRpdmVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVmlld3NbbW9kdWxvKGluZGV4LCBtTnVtQWN0aXZlVmlld3MpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIExheW91dFBhcmFtcyBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKFZpZXcgdikgeworICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgY3VycmVudExwID0gKExheW91dFBhcmFtcykgdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMcCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRMcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyh2KTsKKyAgICB9CisKKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUsIGJvb2xlYW4gb25MYXlvdXQpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QcmV2aW91c1ZpZXdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBWaWV3IHZpZXdUb1JlbW92ZSA9IG1QcmV2aW91c1ZpZXdzLmdldChpKTsKKyAgICAgICAgICAgIHZpZXdUb1JlbW92ZS5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgLy8gYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXggaGVyZSBqdXN0IGFsbG93cyBmb3IgYW55IGNsZWFudXAKKyAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpZXcgdGhhdCBtYXkgbmVlZCB0byBiZSBkb25lIGJ5IGEgc3ViY2xhc3MKKyAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KHZpZXdUb1JlbW92ZSwgLTEpOworICAgICAgICAgICAgcmVtb3ZlVmlld0luTGF5b3V0KHZpZXdUb1JlbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzVmlld3MuY2xlYXIoKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkID0gY2hpbGRJbmRleCAtIG1BY3RpdmVPZmZzZXQ7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCArIG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydCA9IE1hdGgubWF4KDAsIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd0VuZCA9IE1hdGgubWluKG1BZGFwdGVyLmdldENvdW50KCksIG5ld1dpbmRvd0VuZFVuYm91bmRlZCk7CisKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGNsZWFycyBvdXQgYW55IGl0ZW1zIHRoYXQgYXJlIGluIG91ciBtQWN0aXZlVmlld3MgbGlzdAorICAgICAgICAvLyBidXQgYXJlIG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBib3VuZHMgb2Ygb3VyIHdpbmRvdyAodGhpcyBpcyBiZWNvbWVzIGFuIGlzc3VlCisgICAgICAgIC8vIGF0IHRoZSBleHRyZW1pdGllcyBvZiB0aGUgbGlzdCwgZWcuIHdoZXJlIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkIDwgMCBvcgorICAgICAgICAvLyBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMQorICAgICAgICBmb3IgKGludCBpID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7IGkgPCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPCBuZXdXaW5kb3dTdGFydCB8fCBpID4gbmV3V2luZG93RW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIG1OdW1BY3RpdmVWaWV3cyk7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVWaWV3c1tpbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCA9IG1vZHVsbyhpbmRleCAtIG1DdXJyZW50V2luZG93U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaGFzIGNoYW5nZWQKKyAgICAgICAgaWYgKCEgKG5ld1dpbmRvd1N0YXJ0ID09IG1DdXJyZW50V2luZG93U3RhcnQgJiYgbmV3V2luZG93RW5kID09IG1DdXJyZW50V2luZG93RW5kKSkgeworICAgICAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIGluZGljZXMgaW4gdGhlIG5ldyByYW5nZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5ld1dpbmRvd1N0YXJ0OyBpIDw9IG5ld1dpbmRvd0VuZDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBpbnQgb2xkUmVsYXRpdmVJbmRleCA9IGkgLSBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICAgICAgICAgIGludCBuZXdSZWxhdGl2ZUluZGV4ID0gaSAtIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBtTnVtQWN0aXZlVmlld3MpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpdGVtIGlzIGluIHRoZSBjdXJyZW50IHdpbmRvdywgZ3JlYXQsIHdlIGp1c3QgbmVlZCB0byBhcHBseQorICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFuc2Zvcm0gZm9yIGl0J3MgbmV3IHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSB3aW5kb3csIGFuZCBhbmltYXRlCisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBpdCdzIGN1cnJlbnQgYW5kIG5ldyByZWxhdGl2ZSBwb3NpdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBtQ3VycmVudFdpbmRvd1N0YXJ0ICYmIGkgPD0gbUN1cnJlbnRXaW5kb3dFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgodmlldywgbmV3UmVsYXRpdmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihvbGRSZWxhdGl2ZUluZGV4LCBuZXdSZWxhdGl2ZUluZGV4LCB2aWV3KTsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGlzIHZpZXcgaXMgbmV3LCBzbyBmaXJzdCB3ZSBoYXZlIHRvIGRpc3BsYWNlIHRoZSB2aWV3IHRoYXQncworICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgbmV3IHZpZXcncyBwbGFjZSB3aXRoaW4gb3VyIGNhY2hlIChhIGNpcmN1bGFyIGFycmF5KQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVmlld3NbaW5kZXhdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgcHJldmlvdXNWaWV3ID0gbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXggPSBtb2R1bG8oaW5kZXggLSBtQ3VycmVudFdpbmRvd1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQWN0aXZlVmlld3MpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRXaW5kb3dTdGFydCA+IG5ld1dpbmRvd1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQuYWRkKHByZXZpb3VzVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBjbGVhcmVkIGEgc3BvdCBmb3IgdGhlIG5ldyB2aWV3LiBHZXQgaXQgZnJvbSB0aGUgYWRhcHRlciwgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhcHBseSBhbnkgdHJhbnNmb3JtIC8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgbmV3VmlldyA9IG1BZGFwdGVyLmdldFZpZXcoaSwgbnVsbCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVWaWV3c1tpbmRleF0gPSBuZXdWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmlld0luTGF5b3V0KG5ld1ZpZXcsIC0xLCBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKG5ld1ZpZXcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KG5ld1ZpZXcsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKC0xLCBuZXdSZWxhdGl2ZUluZGV4LCBuZXdWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdLmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3c1RvQnJpbmdUb0Zyb250LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gbVZpZXdzVG9CcmluZ1RvRnJvbnQuZ2V0KGkpOworICAgICAgICAgICAgICAgIHYuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udC5jbGVhcigpOworCisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gbmV3V2luZG93U3RhcnQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IG5ld1dpbmRvd0VuZDsKKyAgICAgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFvbkxheW91dCkgeworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIEFkYXB0ZXIgdHJpZXMgdG8gbGF5b3V0IHRoZSBjdXJyZW50IHZpZXcgd2hlbiB3ZSBnZXQgaXQgdXNpbmcgZ2V0VmlldworICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxheW91dCB3aWxsIGVuZCB1cCBiZWluZyBpZ25vcmVkIHNpbmNlIHdlIGFyZSBjdXJyZW50bHkgbGF5aW5nIG91dCwgc28KKyAgICAgICAgICAgIC8vIHdlIHBvc3QgYSBkZWxheWVkIHJlcXVlc3RMYXlvdXQgYW5kIGludmFsaWRhdGUKKyAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKQorICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgaW50IGNoaWxkUmlnaHQgPSBtUGFkZGluZ0xlZnQgKyBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgY2hpbGQubGF5b3V0KG1QYWRkaW5nTGVmdCArIGxwLmhvcml6b250YWxPZmZzZXQsIG1QYWRkaW5nVG9wICsgbHAudmVydGljYWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkUmlnaHQgKyBscC5ob3Jpem9udGFsT2Zmc2V0LCBjaGlsZEJvdHRvbSArIGxwLnZlcnRpY2FsT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YUNoYW5nZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgbHAud2lkdGggPSB3aWR0aFNwZWNTaXplIC0gbVBhZGRpbmdMZWZ0IC0gbVBhZGRpbmdSaWdodDsKKyAgICAgICAgICAgIGxwLmhlaWdodCA9IGhlaWdodFNwZWNTaXplIC0gbVBhZGRpbmdUb3AgLSBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICAgICAgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhscC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisgICAgICAgICAgICBpbnQgY2hpbGRoZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhscC5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworCisgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKGNoaWxkV2lkdGhNZWFzdXJlU3BlYywgY2hpbGRoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGhTcGVjU2l6ZSwgaGVpZ2h0U3BlY1NpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbgorICAgICAqIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kIHRoZSBzcGVjaWZpZWQgY2hpbGQKKyAgICAgKiBlbnRlcnMgdGhlIHNjcmVlbiB3aXRoIHRoZSB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCkgeworICAgICAgICBmaW5hbCBib29sZWFuIGFuaW1hdGUgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBWaWV3IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGN1cnJlbnRseSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREaXNwbGF5ZWRDaGlsZCgpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0Q3VycmVudFZpZXcoKSB7CisgICAgICAgIHJldHVybiBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1BY3RpdmVPZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRpb24gZ2V0SW5BbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtSW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGluQW5pbWF0aW9uIFRoZSBhbmltYXRpb24gc3RhcnRlZCB3aGVuIGEgVmlldyBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEluQW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKEFuaW1hdGlvbiBpbkFuaW1hdGlvbikgeworICAgICAgICBtSW5BbmltYXRpb24gPSBpbkFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdHMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIEFuaW1hdGlvbiBnZXRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtT3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0QW5pbWF0aW9uIFRoZSBhbmltYXRpb24gc3RhcnRlZCB3aGVuIGEgVmlldyBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRPdXRBbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dEFuaW1hdGlvbihBbmltYXRpb24gb3V0QW5pbWF0aW9uKSB7CisgICAgICAgIG1PdXRBbmltYXRpb24gPSBvdXRBbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlSUQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5BbmltYXRpb24oQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBzZXRJbkFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlSUQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlSUQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRPdXRBbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBzZXRPdXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgVmlldyBzaG91bGQgYmUgYW5pbWF0ZWQgdGhlIGZpcnN0IHRpbWUKKyAgICAgKiB0aGUgVmlld0FuaW1hdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBUcnVlIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB0aGUgZmlyc3QgdGltZSBpdCBpcyBkaXNwbGF5ZWQsCisgICAgICogICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuaW1hdGVGaXJzdFZpZXcoYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIG1BbmltYXRlRmlyc3RUaW1lID0gYW5pbWF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEJhc2VsaW5lKCkgeworICAgICAgICByZXR1cm4gKGdldEN1cnJlbnRWaWV3KCkgIT0gbnVsbCkgPyBnZXRDdXJyZW50VmlldygpLmdldEJhc2VsaW5lKCkgOiBzdXBlci5nZXRCYXNlbGluZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBZGFwdGVyIGdldEFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtQWRhcHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBZGFwdGVyVmlld0FuaW1hdG9yIHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEKKyAgICAgKiBSZW1vdGVWaWV3c1NlcnZpY2UgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvCisgICAgICogICAgICAgIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZpZXdBdFJlbGF0aXZlSW5kZXgobUFjdGl2ZU9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CisgICAgICAgIGludCBob3Jpem9udGFsT2Zmc2V0OworICAgICAgICBpbnQgdmVydGljYWxPZmZzZXQ7CisgICAgICAgIFZpZXcgbVZpZXc7CisKKyAgICAgICAgTGF5b3V0UGFyYW1zKFZpZXcgdmlldykgeworICAgICAgICAgICAgc3VwZXIoMCwgMCk7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKKyAgICAgICAgfQorCisgICAgICAgIExheW91dFBhcmFtcyhDb250ZXh0IGMsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoYywgYXR0cnMpOworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG5ld0hvcml6b250YWxPZmZzZXQpIHsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSBuZXdIb3Jpem9udGFsT2Zmc2V0OworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgbVZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IHBhcmVudFJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICB2b2lkIGludmFsaWRhdGVHbG9iYWxSZWdpb24oVmlldyB2LCBSZWN0IHIpIHsKKyAgICAgICAgICAgIFZpZXcgcCA9IHY7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0UGFzcyA9IHRydWU7CisgICAgICAgICAgICBwYXJlbnRSZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIHdoaWxlIChwLmdldFBhcmVudCgpICE9IG51bGwgJiYgcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmVudFJlY3QuY29udGFpbnMocikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgci5vZmZzZXQocC5nZXRMZWZ0KCkgLSBwLmdldFNjcm9sbFgoKSwgcC5nZXRUb3AoKSAtIHAuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwID0gKFZpZXcpIHAuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgcGFyZW50UmVjdC5zZXQocC5nZXRMZWZ0KCkgLSBwLmdldFNjcm9sbFgoKSwgcC5nZXRUb3AoKSAtIHAuZ2V0U2Nyb2xsWSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRSaWdodCgpIC0gcC5nZXRTY3JvbGxYKCksIHAuZ2V0Qm90dG9tKCkgLSBwLmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLmludmFsaWRhdGUoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IGludmFsaWRhdGVSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gdGhhdCBQcm9wZXJ0eUFuaW1hdG9yIGNhbiBhY2Nlc3MgaXQKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG5ld1ZlcnRpY2FsT2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0RGVsdGEgPSBuZXdWZXJ0aWNhbE9mZnNldCAtIHZlcnRpY2FsT2Zmc2V0OworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSBuZXdWZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCB0b3AgPSBNYXRoLm1pbihtVmlldy5nZXRUb3AoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRUb3AoKSk7CisgICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1hdGgubWF4KG1WaWV3LmdldEJvdHRvbSgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldEJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQobVZpZXcuZ2V0TGVmdCgpLCB0b3AsIG1WaWV3LmdldFJpZ2h0KCksIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWM3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCisvKioKKyAqIFNpbXBsZSB7QGxpbmsgVmlld0FuaW1hdG9yfSB0aGF0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHR3byBvciBtb3JlIHZpZXdzCisgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBpdC4gIE9ubHkgb25lIGNoaWxkIGlzIHNob3duIGF0IGEgdGltZS4gIElmCisgKiByZXF1ZXN0ZWQsIGNhbiBhdXRvbWF0aWNhbGx5IGZsaXAgYmV0d2VlbiBlYWNoIGNoaWxkIGF0IGEgcmVndWxhciBpbnRlcnZhbC4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfZmxpcEludGVydmFsCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfYXV0b1N0YXJ0CisgKi8KK0BSZW1vdGVWaWV3CitwdWJsaWMgY2xhc3MgQWRhcHRlclZpZXdGbGlwcGVyIGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3RmxpcHBlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlRFUlZBTCA9IDEwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDIwMDsKKworICAgIHByaXZhdGUgaW50IG1GbGlwSW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworICAgIHByaXZhdGUgaW50IG1BbmltYXRpb25EdXJhdGlvbiA9IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b1N0YXJ0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2libGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0RGVmYXVsdEFuaW1hdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWRhcHRlclZpZXdGbGlwcGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXIpOworICAgICAgICBtRmxpcEludGVydmFsID0gYS5nZXRJbnQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXJfZmxpcEludGVydmFsLCBERUZBVUxUX0lOVEVSVkFMKTsKKyAgICAgICAgbUF1dG9TdGFydCA9IGEuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcl9hdXRvU3RhcnQsIGZhbHNlKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIGluaXREZWZhdWx0QW5pbWF0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdEFuaW1hdGlvbnMoKSB7CisgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBhbmltYXRpb25zIHRvIGJlIGZhZGUgaW4vb3V0CisgICAgICAgIGlmIChtSW5BbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUluQW5pbWF0aW9uID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDEuMGYpOworICAgICAgICAgICAgbUluQW5pbWF0aW9uLnNldER1cmF0aW9uKG1BbmltYXRpb25EdXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRBbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbU91dEFuaW1hdGlvbiA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1PdXRBbmltYXRpb24uc2V0RHVyYXRpb24obUFuaW1hdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5ULmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIC8vIExpc3RlbiBmb3IgYnJvYWRjYXN0cyByZWxhdGVkIHRvIHVzZXItcHJlc2VuY2UKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5UKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworCisgICAgICAgIGlmIChtQXV0b1N0YXJ0KSB7CisgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHN0YXJ0IHdoZW4gcmVxdWVzdGVkCisgICAgICAgICAgICBzdGFydEZsaXBwaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgbVZpc2libGUgPSBmYWxzZTsKKworICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CisgICAgICAgIG1WaXNpYmxlID0gKHZpc2liaWxpdHkgPT0gVklTSUJMRSk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBmbGlwcGluZyB0byB0aGUgbmV4dCB2aWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsaXBJbnRlcnZhbChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBtaWxsaXNlY29uZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSB0aW1lciB0byBjeWNsZSB0aHJvdWdoIGNoaWxkIHZpZXdzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbW9yZSBmbGlwcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkgeworICAgICAgICAvLyBieSBkZWZhdWx0IHdoZW4gd2UgdXBkYXRlIHJ1bm5pbmcsIHdlIHdhbnQgdGhlCisgICAgICAgIC8vIGN1cnJlbnQgdmlldyB0byBhbmltYXRlIGluCisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudCAmJiBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBpZiAocnVubmluZyAhPSBtUnVubmluZykgeworICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgZmxpcE5vdyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJ1bm5pbmcgPSBydW5uaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChMT0dEKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVSdW5uaW5nKCkgbVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgbVN0YXJ0ZWQ9IiArIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVVzZXJQcmVzZW50PSIgKyBtVXNlclByZXNlbnQgKyAiLCBtUnVubmluZz0iICsgbVJ1bm5pbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZCB2aWV3cyBhcmUgZmxpcHBpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGbGlwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0gd2hlbiBpdAorICAgICAqIGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b1N0YXJ0KGJvb2xlYW4gYXV0b1N0YXJ0KSB7CisgICAgICAgIG1BdXRvU3RhcnQgPSBhdXRvU3RhcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlldyBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayAjc3RhcnRGbGlwcGluZygpfQorICAgICAqIHdoZW4gaXQgYmVjb21lcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9TdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdXRvU3RhcnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgRkxJUF9NU0cgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gRkxJUF9NU0cpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gb2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDdmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YQpAQCAtMCwwICsxLDEyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiA8cD5UaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGxvYWQge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIgYWRhcHRlcnN9IGRlZmluZWQgaW4KKyAqIFhNTCByZXNvdXJjZXMuIFhNTC1kZWZpbmVkIGFkYXB0ZXJzIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBjcmVhdGUgYWRhcHRlcnMgaW4geW91cgorICogb3duIGFwcGxpY2F0aW9uIG9yIHRvIHBhc3MgYWRhcHRlcnMgdG8gb3RoZXIgcHJvY2Vzc2VzLjwvcD4KKyAqIAorICogPGgyPlR5cGVzIG9mIGFkYXB0ZXJzPC9oMj4KKyAqIDxwPkFkYXB0ZXJzIGRlZmluZWQgdXNpbmcgWE1MIHJlc291cmNlcyBjYW4gb25seSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQKKyAqIHR5cGVzLiBBcmJpdHJhcnkgYWRhcHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgdG8gZ3VhcmFudGVlIHRoZSBzYWZldHkgb2YgdGhlIGxvYWRlZAorICogY29kZSB3aGVuIGFkYXB0ZXJzIGFyZSBsb2FkZWQgYWNyb3NzIHBhY2thZ2VzLjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlciI+Q3Vyc29yIGFkYXB0ZXI8L2E+OiBhIGN1cnNvciBhZGFwdGVyIGNhbiBiZSB1c2VkCisgKiAgdG8gZGlzcGxheSB0aGUgY29udGVudCBvZiBhIGN1cnNvciwgbW9zdCBvZnRlbiBjb21pbmcgZnJvbSBhIGNvbnRlbnQgcHJvdmlkZXI8L2xpPgorICogPC91bD4KKyAqIDxwPlRoZSBjb21wbGV0ZSBYTUwgZm9ybWF0IGRlZmluaXRpb24gb2YgZWFjaCBhZGFwdGVyIHR5cGUgaXMgYXZhaWxhYmxlIGJlbG93LjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyIiAvPgorICogPGgyPkN1cnNvciBhZGFwdGVyPC9oMj4KKyAqIDxwPkEgY3Vyc29yIGFkYXB0ZXIgWE1MIGRlZmluaXRpb24gc3RhcnRzIHdpdGggdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXRhZyI+PGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPjwvYT4KKyAqIHRhZyBhbmQgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIHRoZSBmb2xsb3dpbmcgdGFnczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyI+PGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+PC9hPjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIiAvPgorICogPGgzPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPiBlbGVtZW50IGRlZmluZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGRvY3VtZW50IGFuZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmxheW91dDwvY29kZT46IFJlZmVyZW5jZSB0byB0aGUgWE1MIGxheW91dCB0byBiZSBpbmZsYXRlZCBmb3IKKyAqICBlYWNoIGl0ZW0gb2YgdGhlIGFkYXB0ZXIuIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnNlbGVjdGlvbjwvY29kZT46IFNlbGVjdGlvbiBleHByZXNzaW9uLCB1c2VkIHdoZW4gdGhlCisgKiAgPGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+IGF0dHJpYnV0ZSBpcyBkZWZpbmVkIG9yIHdoZW4gdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIFRoaXMgYXR0cmlidXRlIGlzIG9wdGlvbmFsLjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c29ydE9yZGVyPC9jb2RlPjogU29ydCBleHByZXNzaW9uLCB1c2VkIHdoZW4gdGhlCisgKiAgPGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+IGF0dHJpYnV0ZSBpcyBkZWZpbmVkIG9yIHdoZW4gdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIFRoaXMgYXR0cmlidXRlIGlzIG9wdGlvbmFsLjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPjogVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5IHRvIHJldHJpZXZlIGEgY3Vyc29yLgorICogIFNwZWNpZnlpbmcgdGhpcyBhdHRyaWJ1dGUgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG9mIHRoZSBYTUwgYXR0cmlidXRlIGlzIGlnbm9yZWQuIFRoaXMgYXR0cmlidXRlIGlzCisgKiAgb3B0aW9uYWwuPC9saT4KKyAqIDwvdWw+CisgKiA8cD5JbiBhZGRpdGlvbiwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT4gYW5kCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+IHRhZ3MgYXMgY2hpbGRyZW4KKyAqIG9mIDxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT4uPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyIgLz4KKyAqIDxoMz4mbHQ7c2VsZWN0IC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBzZWxlY3QgY29sdW1ucyBmcm9tIHRoZSBjdXJzb3IKKyAqIHdoZW4gZG9pbmcgdGhlIHF1ZXJ5LiBUaGlzIGNhbiBiZSB2ZXJ5IHVzZWZ1bCB3aGVuIHVzaW5nIHRyYW5zZm9ybWF0aW9ucyBpbiB0aGUKKyAqIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSXQgY2FuIGFsc28gYmUgdmVyeSB1c2VmdWwgaWYgeW91IGFyZSBwcm92aWRpbmcKKyAqIHlvdXIgb3duIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj5iaW5kZXI8L2E+IG9yCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+dHJhbnNmb3JtYXRpb248L2E+IGNsYXNzZXMuCisgKiA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgaWdub3JlZCBpZiB5b3Ugc3VwcGx5IHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6Y29sdW1uPC9jb2RlPjogTmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdCBpbiB0aGUgY3Vyc29yIGR1cmluZyB0aGUKKyAqICBxdWVyeSBvcGVyYXRpb248L2xpPgorICogPC91bD4KKyAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNvbHVtbiBuYW1lZCA8Y29kZT5faWQ8L2NvZGU+IGlzIGFsd2F5cyBpbXBsaWNpdGx5CisgKiBzZWxlY3RlZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyIgLz4KKyAqIDxoMz4mbHQ7YmluZCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIGJpbmQgYSBjb2x1bW4gZnJvbSB0aGUgY3Vyc29yIHRvCisgKiBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30uIEEgY29sdW1uIGJvdW5kIHVzaW5nIHRoaXMgdGFnIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQKKyAqIGR1cmluZyB0aGUgcXVlcnkgYW5kIGEgbWF0Y2hpbmcKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHRoZXJlZm9yZQorICogbm90IHJlcXVpcmVkLjwvcD4KKyAqIAorICogPHA+RWFjaCBiaW5kaW5nIGlzIGRlY2xhcmVkIGFzIGEgb25lIHRvIG9uZSBtYXRjaGluZyBidXQKKyAqIGN1c3RvbSBiaW5kZXIgY2xhc3NlcyBvciBzcGVjaWFsCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10cmFuc2Zvcm1hdGlvbiI+ZGF0YSB0cmFuc2Zvcm1hdGlvbnM8L2E+IGNhbgorICogYWxsb3cgeW91IHRvIGJpbmQgc2V2ZXJhbCBjb2x1bW5zIHRvIGEgc2luZ2xlIHZpZXcuIEluIHRoaXMgY2FzZSB5b3UgbXVzdCB1c2UgdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyB0byBtYWtlCisgKiBzdXJlIGFueSByZXF1aXJlZCBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcXVlcnkuPC9wPgorICogCisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb208L2NvZGU+OiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuIE5vdGUgdGhhdCA8Y29kZT5APC9jb2RlPiB3aGljaCBhcmUgbm90IHVzZWQgdG8gcmVmZXJlbmNlIHJlc291cmNlcworICogIHNob3VsZCBiZSBiYWNrc2xhc2ggcHJvdGVjdGVkIGFzIGluIDxjb2RlPlxAPC9jb2RlPi48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvPC9jb2RlPjogVGhlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmFzPC9jb2RlPjogVGhlIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj5kYXRhIHR5cGU8L2E+CisgKiAgb2YgdGhlIGJpbmRpbmcuIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogPC91bD4KKyAqIAorICogPHA+SW4gYWRkaXRpb24sIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBpbnN0YW5jZXMgb2YKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2hpbGRyZW4KKyAqIHRhZ3MuPC9wPgorICoKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiIC8+CisgKiA8aDQ+QmluZGluZyBkYXRhIHR5cGVzPC9oND4KKyAqIDxwPkZvciBhIGJpbmRpbmcgdG8gb2NjdXIgdGhlIGRhdGEgdHlwZSBvZiB0aGUgYm91bmQgY29sdW1uL3ZpZXcgcGFpciBtdXN0IGJlIHNwZWNpZmllZC4KKyAqIFRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPnN0cmluZzwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgYW5kIG11c3QgYmUKKyAqICBib3VuZCB0byBhIHtAbGluayBhbmRyb2lkLndpZGdldC5UZXh0Vmlld308L2xpPgorICogIDxsaT48Y29kZT5pbWFnZTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBibG9iIGRlc2NyaWJpbmcgYW4KKyAqICBpbWFnZSBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlLXVyaTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBVUkkgdG8gYW4gaW1hZ2UKKyAqICBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmRyYXdhYmxlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEKKyAqICBkcmF3YWJsZSBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPnRhZzwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgYW5kIHdpbGwgYmUgc2V0IGFzCisgKiAgdGhlIHRhZyAodXNpbmcge0BsaW5rIFZpZXcjc2V0VGFnKE9iamVjdCl9IG9mIHRoZSBhc3NvY2lhdGVkIFZpZXcuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqICBhc3NvY2lhdGUgbWV0YS1kYXRhIHRvIHlvdXIgdmlldywgdGhhdCBjYW4gYmUgdXNlZCBmb3IgaW5zdGFuY2UgYnkgYSBsaXN0ZW5lci48L2xpPgorICogIDxsaT5BIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lOiBUaGUgbmFtZSBvZiBhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyfS4gQ3Vyc29yIGJpbmRlcnMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQorICogIGJpbmRpbmdzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gQ3VzdG9tIGJpbmRlcnMgY2Fubm90IGJlIHVzZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNpc1Jlc3RyaWN0ZWQoKSByZXN0cmljdGVkIGNvbnRleHRzfSwgZm9yIGluc3RhbmNlIGluIGFuCisgKiAgYXBwbGljYXRpb24gd2lkZ2V0PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uIiAvPgorICogPGg0PkJpbmRpbmcgdHJhbnNmb3JtYXRpb25zPC9oND4KKyAqIDxwPldoZW4gZGVmaW5pbmcgYSBkYXRhIGJpbmRpbmcgeW91IGNhbiBzcGVjaWZ5IGFuIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGJ5IHVzaW5nIG9uZQorICogb2YgdGhlIGZvbGxvd2luZyB0YWdzIGFzIGEgY2hpbGQgb2YgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gZWxlbWVudHM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPjogTWFwcyBhIGNvbnN0YW50IHN0cmluZyB0byBhIHN0cmluZyBvciBhIHJlc291cmNlLiBVc2UKKyAqICBvbmUgaW5zdGFuY2Ugb2YgdGhpcyB0YWcgcGVyIHZhbHVlIHlvdSB3YW50IHRvIG1hcDwvbGk+CisgKiAgPGxpPjxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+OiBUcmFuc2Zvcm1zIGEgY29sdW1uJ3MgdmFsdWUgdXNpbmcgYW4gZXhwcmVzc2lvbgorICogIG9yIGFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn08L2xpPgorICogPC91bD4KKyAqIDxwPldoaWxlIHNldmVyYWwgPGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT4gdGFncyBjYW4gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLCB5b3UgY2Fubm90CisgKiBtaXggPGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+IHRhZ3MuIElmIHNldmVyYWwKKyAqIDxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+IHRhZ3MgYXJlIHNwZWNpZmllZCwgb25seSB0aGUgbGFzdCBvbmUgaXMgcmV0YWluZWQuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbi1tYXAiIC8+CisgKiA8cD48c3Ryb25nPiZsdDttYXAgLyZndDs8L3N0cm9uZz48L3A+CisgKiA8cD5BIG1hcCBlbGVtZW50IHNpbXBseSBzcGVjaWZpZXMgYSB2YWx1ZSB0byBtYXRjaCBmcm9tIGFuZCBhIHZhbHVlIHRvIG1hdGNoIHRvLiBXaGVuCisgKiBhIGNvbHVtbidzIHZhbHVlIGVxdWFscyB0aGUgdmFsdWUgdG8gbWF0Y2ggZnJvbSwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgdG8gbWF0Y2gKKyAqIHRvLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbVZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIGZyb20uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeTwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG9WYWx1ZTwvY29kZT46IFRoZSB2YWx1ZSB0byBtYXRjaCB0by4gVGhpcyB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nCisgKiAgb3IgYSByZXNvdXJjZSBpZGVudGlmaWVyLiBUaGlzIHZhbHVlIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWRlbnRpZmllciB3aGVuIHRoZQorICogIGRhdGEgYmluZGluZyBpcyBvZiB0eXBlIDxjb2RlPmRyYXdhYmxlPC9jb2RlPi4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLXRyYW5zZm9ybSIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O3RyYW5zZm9ybSAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgc2ltcGxlIHRyYW5zZm9ybSB0aGF0IG9jY3VycyBlaXRoZXIgYnkgY2FsbGluZyBhIHNwZWNpZmllZCBjbGFzcyBvciBieSBwZXJmb3JtaW5nCisgKiBzaW1wbGUgdGV4dCBzdWJzdGl0dXRpb24uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp3aXRoRXhwcmVzc2lvbjwvY29kZT46IFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiBpcworICogIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgd2l0aCBjdXJseSBicmFjZXMgeyBhbmQgfS4gRHVyaW5nIHRoZQorICogIHRyYW5zZm9ybWF0aW9uIGVhY2ggY29sdW1uIG5hbWUgaXMgcmVwbGFjZWQgYnkgaXRzIHZhbHVlLiBBbGwgY29sdW1ucyBtdXN0IGhhdmUgYmVlbgorICogIHNlbGVjdGVkIGluIHRoZSBxdWVyeS4gQW4gZXhhbXBsZSBvZiBleHByZXNzaW9uIGlzIDxjb2RlPiJGaXJzdCBuYW1lOiB7Zmlyc3RfbmFtZX0sCisgKiAgbGFzdCBuYW1lOiB7bGFzdF9uYW1lfSI8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkKKyAqICBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4gaXMgbm90IHNwZWNpZmllZCBhbmQgaWdub3JlZCBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4KKyAqICBpcyBzcGVjaWZpZWQ8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT46IEEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29ycmVzcG9uZGluZyB0byBhbgorICogIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn0uIEN1c3RvbQorICogIHRyYW5zZm9ybWF0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4KKyAqICBhbiBhcHAgd2lkZ2V0IFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeSBpZiA8Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPiBpcworICogIG5vdCBzcGVjaWZpZWQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGgzPkV4YW1wbGU8L2gzPgorICogPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjdXJzb3IgYWRhcHRlciB0aGF0IHF1ZXJpZXMgYWxsIHRoZSBjb250YWN0cyB3aXRoCisgKiBhIHBob25lIG51bWJlciB1c2luZyB0aGUgY29udGFjdHMgY29udGVudCBwcm92aWRlci4gRWFjaCBjb250YWN0IGlzIGRpc3BsYXllZCB3aXRoCisgKiBpdHMgZGlzcGxheSBuYW1lLCBpdHMgZmF2b3JpdGUgc3RhdHVzIGFuZCBpdHMgcGhvdG8uIFRvIGRpc3BsYXkgcGhvdG9zLCBhIGN1c3RvbSBkYXRhCisgKiBiaW5kZXIgaXMgZGVjbGFyZWQ6PC9wPgorICogCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6dXJpPSJjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvY29udGFjdHMiCisgKiAgICAgYW5kcm9pZDpzZWxlY3Rpb249Imhhc19waG9uZV9udW1iZXI9MSIKKyAqICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9jb250YWN0X2l0ZW0iJmd0OworICoKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209ImRpc3BsYXlfbmFtZSIgYW5kcm9pZDp0bz0iQGlkL25hbWUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLyZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209InN0YXJyZWQiIGFuZHJvaWQ6dG89IkBpZC9zdGFyIiBhbmRyb2lkOmFzPSJkcmF3YWJsZSImZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjAiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb2ZmIiAvJmd0OworICogICAgICAgICAmbHQ7bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIxIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvJmd0OworICogICAgICZsdDsvYmluZCZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209Il9pZCIgYW5kcm9pZDp0bz0iQGlkL25hbWUiCisgKiAgICAgICAgICAgICAgYW5kcm9pZDphcz0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuYWRhcHRlcnMuQ29udGFjdFBob3RvQmluZGVyIiAvJmd0OworICoKKyAqICZsdDsvY3Vyc29yLWFkYXB0ZXImZ3Q7CisgKiA8L3ByZT4KKyAqIAorICogPGgzPlJlbGF0ZWQgQVBJczwvaDM+CisgKiA8dWw+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfTwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKKyAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX2xheW91dCAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc2VsZWN0aW9uIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zb3J0T3JkZXIgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3VyaSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fYXMgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2Zyb20gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fZnJvbVZhbHVlIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJKYXZhZG9jUmVmZXJlbmNlIn0pCitwdWJsaWMgY2xhc3MgQWRhcHRlcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUiA9ICJjdXJzb3ItYWRhcHRlciI7CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnRlcmZhY2UgdXNlZCB0byBiaW5kIGEge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfSBjb2x1bW4gdG8gYSBWaWV3LiBUaGlzCisgICAgICogaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYmluZGluZ3MgZm9yIGRhdGEgdHlwZXMgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnN9LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5BIGJpbmRlciBpcyBwcm92aWRlZCB3aXRoIGEgY3Vyc29yIHRyYW5zZm9ybWF0aW9uIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHVzZWQKKyAgICAgKiB0byB0cmFuc2Zvcm0gdGhlIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBjdXJzb3IuIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBndWFyYW50ZWVkCisgICAgICogdG8gbmV2ZXIgYmUgbnVsbCBzbyBpdCdzIGFsd2F5cyBzYWZlIHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGJpbmRlciBpcyBhc3NvY2lhdGVkIHdpdGggYSBDb250ZXh0IGJ1dCBjYW4gYmUgcmUtdXNlZCB3aXRoIG11bHRpcGxlIGN1cnNvcnMuCisgICAgICogQXMgc3VjaCwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIG5vIGFzc3VtcHRpb24gYWJvdXQgdGhlIEN1cnNvciBpbiB1c2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVmlldyAKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci48L3A+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIHRyYW5zZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBuZXZlcgorICAgICAgICAgKiBudWxsIGFuZCBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBDdXJzb3IgZGF0YSBkdXJpbmcgdGhlCisgICAgICAgICAqIHtAbGluayAjYmluZChhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIGludCl9IG9wZXJhdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KSAKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBtVHJhbnNmb3JtYXRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIGJpbmRlci48L3A+IAorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24gVGhlIHRyYW5zZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4gVGhpcworICAgICAgICAgKiAgICAgICAgdHJhbnNmb3JtYXRpb24gbWF5IG9yIG1heSBub3QgYmUgYXBwbGllZCBieSB0aGUgYmluZGVyIGFuZCBpcyBndWFyYW50ZWVkCisgICAgICAgICAqICAgICAgICB0byBub3QgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXJzb3JCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+QmluZHMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIHRvIHRoZSBzdXBwbGllZCBWaWV3LiBUaGUgYmluZGluZyBvcGVyYXRpb24KKyAgICAgICAgICogY2FuIHF1ZXJ5IG90aGVyIEN1cnNvciBjb2x1bW5zIGFzIG5lZWRlZC4gRHVyaW5nIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiwgdmFsdWVzCisgICAgICAgICAqIHJldHJpZXZlZCBmcm9tIHRoZSBDdXJzb3IgbWF5IG9yIG1heSBub3QgYmUgdHJhbnNmb3JtZWQgdXNpbmcgdGhpcyBiaW5kZXIncworICAgICAgICAgKiBjdXJzb3IgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdG8gYmluZCBkYXRhIHRvLgorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdG8gYmluZCBkYXRhIGZyb20uCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgY29sdW1uIGluZGV4IGluIHRoZSBjdXJzb3Igd2hlcmUgdGhlIGRhdGEgdG8gYmluZCByZXNpZGVzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSAjbVRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbHVtbiB3YXMgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIHRoZSBWaWV3LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnRlcmZhY2UgdXNlZCB0byB0cmFuc2Zvcm0gZGF0YSBjb21pbmcgb3V0IG9mIGEge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfQorICAgICAqIGJlZm9yZSBpdCBpcyBib3VuZCB0byBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30uPC9wPgorICAgICAqIAorICAgICAqIDxwPlRyYW5zZm9ybWF0aW9ucyBhcmUgdXNlZCB0byB0cmFuc2Zvcm0gdGV4dC1iYXNlZCBkYXRhIChpbiB0aGUgZm9ybSBvZiBhIFN0cmluZyksCisgICAgICogb3IgdG8gdHJhbnNmb3JtIGRhdGEgaW50byBhIHJlc291cmNlIGlkZW50aWZpZXIuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZAorICAgICAqIHRvIGdlbmVyYXRlIHJlc291cmNlIGlkZW50aWZpZXJzLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IEN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXJzb3JUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UcmFuc2Zvcm1zIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiBpbnRvIGEgU3RyaW5nLiBUaGUgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogY2FuIHNpbXBseSByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBhcyBhIFN0cmluZyAodGhpcyBpcyBrbm93bgorICAgICAgICAgKiBhcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24pIG9yIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQuIEZvciBpbnN0YW5jZSwKKyAgICAgICAgICogYSB0cmFuc2Zvcm1hdGlvbiBjYW4gcGVyZm9ybSB0ZXh0IHN1YnN0aXR1dGlvbnMgb3IgY29uY2F0ZW5hdGUgb3RoZXIKKyAgICAgICAgICogY29sdW1ucyB3aXRoIHRoZSBzcGVjaWZpZWQgY29sdW1uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIHRyYW5zZm9ybS4gCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB0cmFuc2Zvcm0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWVkIHZhbHVlIG9mIHRoZSBjb2x1bW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UcmFuc2Zvcm1zIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGludGVycHJldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbgorICAgICAgICAgKiBhcyBhbiBpbnRlZ2VyLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIHRyYW5zZm9ybS4gCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB0cmFuc2Zvcm0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEEgcmVzb3VyY2UgaWRlbnRpZmllci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNmb3JtVG9SZXNvdXJjZShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0SW50KGNvbHVtbkluZGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfSBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBYTUwgcmVzb3VyY2UuIFRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCBmcm9tIHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogaWRlbnRpZmllZCBieSB0aGUgc3VwcGxpZWQgVVJJLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzCisgICAgICogYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwgdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIHdpbGwgYmUgYXV0b21hdGljYWxseSBtYW5hZ2VkLiBPdGhlcndpc2UsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorICAgICAqIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSAjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yQWRhcHRlciBsb2FkQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgU3RyaW5nIHVyaSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlciBhZGFwdGVyID0gKFhtbEN1cnNvckFkYXB0ZXIpIGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBBREFQVEVSX0NVUlNPUiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuc2V0VXJpKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgYWRhcHRlci5sb2FkKCk7CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfSBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBYTUwgcmVzb3VyY2UuIFRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgorICAgICAqIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBzdXBwbGllZCBjdXJzb3IuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBmb3JtYXQgb2YgdGhlIFhNTCBkZWZpbml0aW9uIG9mIHRoZSBjdXJzb3IgYWRhcHRlciBpcyBkb2N1bWVudGVkIGF0CisgICAgICogdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBDdXJzb3JBZGFwdGVyLCB1c2VkCisgICAgICogICAgICAgIHRvIHN1YnN0aXR1dGUgdmFsdWVzIGluIHRoZSBzZWxlY3Rpb24gZXhwcmVzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIFhNTCByZXNvdXJjZSBkb2VzIG5vdCBjb250YWluCisgICAgICogICAgICAgICBhIHZhbGlkICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OyBkZWZpbml0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcgorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBYTUwgZGVmaW5pdGlvbiBvZgorICAgICAqIHRoZSBhZGFwdGVyIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIHN1cHBvcnRlZCBhZGFwdGVyCisgICAgICogdHlwZXMgZGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBsb2FkZWQgYWRhcHRlciBpcyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIGFuZCB0aGUgc3VwcGxpZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBpcyBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LAorICAgICAqIHRoZSBjdXJzb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwKKyAgICAgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyLgorICAgICAqICAKKyAgICAgKiBAcmV0dXJuIEFuIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNlZSAjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKSAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBPYmplY3QuLi4gcGFyYW1ldGVycykgeworICAgICAgICBmaW5hbCBCYXNlQWRhcHRlciBhZGFwdGVyID0gbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIG51bGwsIHBhcmFtZXRlcnMpOworICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE1hbmFnZWRBZGFwdGVyKSB7CisgICAgICAgICAgICAoKE1hbmFnZWRBZGFwdGVyKSBhZGFwdGVyKS5sb2FkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYW4gYWRhcHRlciBmcm9tIHRoZSBzcGVjaWZpZWQgWE1MIHJlc291cmNlLiBUaGUgb3B0aW9uYWwgYXNzZXJ0TmFtZSBjYW4KKyAgICAgKiBiZSB1c2VkIHRvIGV4aXQgZWFybHkgaWYgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgWE1MIHJlc291cmNlIGlzIG5vdCBvZiB0aGUKKyAgICAgKiBleHBlY3RlZCB0eXBlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCBkZWZpbmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gYXNzZXJ0TmFtZSBUaGUgbWFuZGF0b3J5IG5hbWUgb2YgdGhlIGFkYXB0ZXIgaW4gdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiAgICAgICAgSWdub3JlZCBpZiBudWxsLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBhZGFwdGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCYXNlQWRhcHRlciBsb2FkQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgU3RyaW5nIGFzc2VydE5hbWUsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFhtbChpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckZyb21YbWwoY29udGV4dCwgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgICAgaWQsIHBhcmFtZXRlcnMsIGFzc2VydE5hbWUpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0gbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IGxvYWQgYWRhcHRlciByZXNvdXJjZSBJRCAiICsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0gbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IGxvYWQgYWRhcHRlciByZXNvdXJjZSBJRCAiICsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGFuIGFkYXB0ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBYTUwgcGFyc2VyLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZQorICAgICAqIGZvciBjaG9vc2luZyB0aGUgdHlwZSBvZiB0aGUgYWRhcHRlciB0byBjcmVhdGUgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogWE1MIHBhcnNlci4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGdlbmVyYXRlIGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmCisgICAgICogPGNvZGU+YXNzZXJ0TmFtZTwvY29kZT4gaXMgbm90IG51bGwgYW5kIGRvZXMgbm90IG1hdGNoIHRoZSByb290IHRhZyBvZiB0aGUgWE1MCisgICAgICogZG9jdW1lbnQuIAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKENvbnRleHQgYywKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCwgT2JqZWN0W10gcGFyYW1ldGVycywKKyAgICAgICAgICAgIFN0cmluZyBhc3NlcnROYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoYXNzZXJ0TmFtZSAhPSBudWxsICYmICFhc3NlcnROYW1lLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhZGFwdGVyIGRlZmluZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSArICIgbXVzdCBiZSBhIDwiICsgbmFtZSArICIgLz4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIGFkYXB0ZXIgPSBjcmVhdGVDdXJzb3JBZGFwdGVyKGMsIHBhcnNlciwgYXR0cnMsIGlkLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZGFwdGVyIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiAiICsgYy5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbEN1cnNvckFkYXB0ZXIgdXNpbmcgYW4gWG1sQ3Vyc29yQWRhcHRlclBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBYbWxDdXJzb3JBZGFwdGVyIGNyZWF0ZUN1cnNvckFkYXB0ZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gbmV3IFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoYywgcGFyc2VyLCBhdHRycywgaWQpLnBhcnNlKHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlciB0aGF0IGNhbiBnZW5lcmF0ZSBYbWxDdXJzb3JBZGFwdGVyIGluc3RhbmNlcy4gVGhpcyBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaGFuZGxpbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZCBub2RlcyBmb3IgYSAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlclBhcnNlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9CSU5EID0gImJpbmQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfU0VMRUNUID0gInNlbGVjdCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19TVFJJTkcgPSAic3RyaW5nIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFID0gImltYWdlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1RBRyA9ICJ0YWciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0VfVVJJID0gImltYWdlLXVyaSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19EUkFXQUJMRSA9ICJkcmF3YWJsZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9NQVAgPSAibWFwIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX1RSQU5TRk9STSA9ICJ0cmFuc2Zvcm0iOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYbWxQdWxsUGFyc2VyIG1QYXJzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXR0cmlidXRlU2V0IG1BdHRyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbUZyb207CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1UbzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBtSWRlbnRpdHk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gYzsKKyAgICAgICAgICAgIG1QYXJzZXIgPSBwYXJzZXI7CisgICAgICAgICAgICBtQXR0cnMgPSBhdHRyczsKKyAgICAgICAgICAgIG1JZCA9IGlkOworCisgICAgICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPigpOworICAgICAgICAgICAgbUZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1UbyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIG1JZGVudGl0eSA9IG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKG1Db250ZXh0KTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYbWxDdXJzb3JBZGFwdGVyIHBhcnNlKE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyKTsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl91cmkpOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24pOworICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlciA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zb3J0T3JkZXIpOworICAgICAgICAgICAgaW50IGxheW91dCA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfbGF5b3V0LCAwKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBsYXlvdXQgc3BlY2lmaWVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1QYXJzZXI7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9CSU5ELmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUJpbmRUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX1NFTEVDVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTZWxlY3RUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0YWcgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gZnJvbUFycmF5ID0gbUZyb20udG9BcnJheShuZXcgU3RyaW5nW21Gcm9tLnNpemUoKV0pOworICAgICAgICAgICAgaW50W10gdG9BcnJheSA9IG5ldyBpbnRbbVRvLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b0FycmF5W2ldID0gbVRvLmdldChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVycy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzW2ldID0gKFN0cmluZykgcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlcihtQ29udGV4dCwgbGF5b3V0LCB1cmksIGZyb21BcnJheSwgdG9BcnJheSwgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIsIG1CaW5kZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdFRhZygpIHsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IG1SZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uKTsKKyAgICAgICAgICAgIGlmIChmcm9tTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBzZWxlY3QgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnY29sdW1uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKFZpZXcuTk9fSUQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQmluZFRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2Zyb20pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb20nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgdG9OYW1lID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV90bywgMCk7CisgICAgICAgICAgICBpZiAodG9OYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFzVHlwZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyk7CisgICAgICAgICAgICBpZiAoYXNUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGFuICdhcycgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKHRvTmFtZSk7CisgICAgICAgICAgICBtQmluZGVycy5wdXQoZnJvbU5hbWUsIGZpbmRCaW5kZXIoYXNUeXBlKSk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JCaW5kZXIgZmluZEJpbmRlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBtSWRlbnRpdHk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEcmF3YWJsZSA9IEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFLmVxdWFscyh0eXBlKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgd2hpbGUgKCgodGFnVHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGFnVHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGZpbmRUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfTUFQLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0cmFuc2Zvcm1hdGlvbiBpbnN0YW5jZW9mIE1hcFRyYW5zZm9ybWF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBuZXcgTWFwVHJhbnNmb3JtYXRpb24oY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluZE1hcCgoKE1hcFRyYW5zZm9ybWF0aW9uKSB0cmFuc2Zvcm1hdGlvbiksIGlzRHJhd2FibGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1NUUklORy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1RBRy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZVVyaUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYXdhYmxlQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRlcih0eXBlLCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBjcmVhdGVCaW5kZXIoU3RyaW5nIHR5cGUsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZSh0eXBlLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yQmluZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDdXJzb3JCaW5kZXIpIGMubmV3SW5zdGFuY2UobUNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaW5kTWFwKE1hcFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uLCBib29sZWFuIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fZnJvbVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb21WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG8gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFN0cmluZ01hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgdG8gPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBtYXAgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvVmFsdWUnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5hZGRSZXNvdXJjZU1hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yVHJhbnNmb3JtYXRpb24gZmluZFRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG51bGw7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGEuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aEV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gY3JlYXRlRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gKEN1cnNvclRyYW5zZm9ybWF0aW9uKSBjLm5ld0luc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSB0cmFuc2Zvcm0gaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIG11c3QgaGF2ZSBhICd3aXRoQ2xhc3MnIG9yICIgKworICAgICAgICAgICAgICAgICAgICAiJ3dpdGhFeHByZXNzaW9uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKG1Db250ZXh0LCBleHByZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGFkYXB0ZXJzIHRoYXQgcmVxdWlyZSB0byBiZSBsb2FkZWQgYWZ0ZXIgY3JlYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWRzIHRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyLCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgbG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGEgQ3Vyc29yIGFkYXB0ZXIgZGVmaW5lZCBpbiBYTUwuIFRoaXMgY2xhc3MgaXMgYSB0aGluIHdyYXBwZXIKKyAgICAgKiBvZiBhIFNpbXBsZUN1cnNvckFkYXB0ZXIuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIGFiaWxpdHkgdG8gaGFuZGxlIEN1cnNvckJpbmRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlciBleHRlbmRzIFNpbXBsZUN1cnNvckFkYXB0ZXIgaW1wbGVtZW50cyBNYW5hZ2VkQWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Vcmk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3J0T3JkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yQmluZGVyW10gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgQXN5bmNUYXNrPFZvaWQsVm9pZCxDdXJzb3I+IG1Mb2FkVGFzazsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgU3RyaW5nIHVyaSwgU3RyaW5nW10gZnJvbSwgaW50W10gdG8sCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlciwKKyAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBiaW5kZXJzKSB7CisKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGxheW91dCwgbnVsbCwgZnJvbSwgdG8pOworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgICAgICAgICAgbUNvbHVtbnMgPSBuZXcgU3RyaW5nW2Zyb20ubGVuZ3RoICsgMV07CisgICAgICAgICAgICAvLyBUaGlzIGlzIG1hbmRhdG9yeSBpbiBDdXJzb3JBZGFwdGVyCisgICAgICAgICAgICBtQ29sdW1uc1swXSA9ICJfaWQiOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmcm9tLCAwLCBtQ29sdW1ucywgMSwgZnJvbS5sZW5ndGgpOworCisgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmFzaWMgPSBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKGNvbnRleHQpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGZyb20ubGVuZ3RoOworICAgICAgICAgICAgbUJpbmRlcnMgPSBuZXcgQ3Vyc29yQmluZGVyW2NvdW50XTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ3Vyc29yQmluZGVyIGJpbmRlciA9IGJpbmRlcnMuZ2V0KGZyb21baV0pOworICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgYmluZGVyID0gYmFzaWM7CisgICAgICAgICAgICAgICAgbUJpbmRlcnNbaV0gPSBiaW5kZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Uby5sZW5ndGg7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBmcm9tID0gbUZyb207CisgICAgICAgICAgICBmaW5hbCBpbnRbXSB0byA9IG1UbzsKKyAgICAgICAgICAgIGZpbmFsIEN1cnNvckJpbmRlcltdIGJpbmRlcnMgPSBtQmluZGVyczsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2ID0gdmlldy5maW5kVmlld0J5SWQodG9baV0pOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyc1tpXS5iaW5kKHYsIGN1cnNvciwgZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKyAgICAgICAgICAgIGlmIChtVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBuZXcgUXVlcnlUYXNrKCkuZXhlY3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VDdXJzb3IoQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIGlmIChtTG9hZFRhc2sgIT0gbnVsbCAmJiBtTG9hZFRhc2suZ2V0U3RhdHVzKCkgIT0gUXVlcnlUYXNrLlN0YXR1cy5GSU5JU0hFRCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmNoYW5nZUN1cnNvcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFF1ZXJ5VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBDdXJzb3I+IHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEN1cnNvciBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEFjdGl2aXR5KSBtQ29udGV4dCkubWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZShtVXJpKSwgbUNvbHVtbnMsIG1TZWxlY3Rpb24sIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yQWRhcHRlci5zdXBlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgcmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhcyBhIFN0cmluZywKKyAgICAgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG1hbmlwdWxhdGlvbi4gVGhpcyBpcyB1c2VkIHdoZW4gbm8gdHJhbnNmb3JtYXRpb24gaXMgc3BlY2lmaWVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElkZW50aXR5VHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHB1YmxpYyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleHByZXNzaW9uIHRyYW5zZm9ybWF0aW9uIGlzIGEgc2ltcGxlIHRlbXBsYXRlIGJhc2VkIHJlcGxhY2VtZW50IHV0aWxpdHkuCisgICAgICogSW4gYW4gZXhwcmVzc2lvbiwgZWFjaCBzZWdtZW50IG9mIHRoZSBmb3JtIDxjb2RlPnsoW159XSspfTwvY29kZT4gaXMgcmVwbGFjZWQKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIG9mIG5hbWUgJDEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Ob2RlIG1GaXJzdE5vZGUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZSgiIik7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKworICAgICAgICAgICAgcGFyc2UoZXhwcmVzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgaW50IHNlZ21lbnRTdGFydDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpOworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGEgY29sdW1uIG5hbWUgc2VnbWVudAorICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgKGMgPSBleHByZXNzaW9uLmNoYXJBdChpKSkgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kLCBidXQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGNsb3NlCisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHRyYW5zZm9ybSBleHByZXNzaW9uIGNvbnRhaW5zIGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tY2xvc2VkIGNvbHVtbiBuYW1lOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0ICsgMSwgaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb2x1bW5FeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIGlmIHdlJ3ZlIHJlYWNoZWQgYSBjb2x1bW4gZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG1CdWlsZGVyOworICAgICAgICAgICAgYnVpbGRlci5kZWxldGUoMCwgYnVpbGRlci5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3Qgbm9kZQorICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS5uZXh0KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobm9kZS5hc1N0cmluZyhjdXJzb3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbk5vZGUgbmV4dDsKKworICAgICAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb25Ob2RlIGV4dGVuZHMgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvbnN0YW50OworCisgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb25Ob2RlKFN0cmluZyBjb25zdGFudCkgeworICAgICAgICAgICAgICAgIG1Db25zdGFudCA9IGNvbnN0YW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgQ29sdW1uRXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29sdW1uTmFtZTsKKyAgICAgICAgICAgIHByaXZhdGUgQ3Vyc29yIG1TaWduYXR1cmU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQ29sdW1uSW5kZXggPSAtMTsKKworICAgICAgICAgICAgQ29sdW1uRXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKyAgICAgICAgICAgICAgICBtQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBtU2lnbmF0dXJlIHx8IG1Db2x1bW5JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtQ29sdW1uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgobUNvbHVtbk5hbWUpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmF0dXJlID0gY3Vyc29yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKG1Db2x1bW5JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1hcCB0cmFuc2Zvcm1hdGlvbiBvZmZlcnMgYSBzaW1wbGUgbWFwcGluZyBiZXR3ZWVuIHNwZWNpZmllZCBTdHJpbmcgdmFsdWVzCisgICAgICogdG8gU3RyaW5ncyBvciBpbnRlZ2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXBUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtU3RyaW5nTWFwcGluZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1SZXNvdXJjZU1hcHBpbmdzOworCisgICAgICAgIHB1YmxpYyBNYXBUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVN0cmluZ01hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICBtUmVzb3VyY2VNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkU3RyaW5nTWFwcGluZyhTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkUmVzb3VyY2VNYXBwaW5nKFN0cmluZyBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzLnB1dChmcm9tLCB0byk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2Zvcm1lZCA9IG1TdHJpbmdNYXBwaW5ncy5nZXQodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyB2YWx1ZSA6IHRyYW5zZm9ybWVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNmb3JtVG9SZXNvdXJjZShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0cmFuc2Zvcm1lZCA9IG1SZXNvdXJjZU1hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZCA9PSBudWxsID8gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgOiB0cmFuc2Zvcm1lZDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIFN0cmluZyB0byBhIFRleHRWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIGJsb2IgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZUJpdG1hcChCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBUYWdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGFnKHRleHQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBpbWFnZSBVUkkgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlVXJpQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlVXJpQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVVSSShVcmkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGRyYXdhYmxlIHJlc291cmNlIGlkZW50aWZpZXIgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyYXdhYmxlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIERyYXdhYmxlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXNvdXJjZSA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm1Ub1Jlc291cmNlKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKaW5kZXggMDNhZGE5NC4uYjRlY2UyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQpAQCAtMzAsMTcgKzMwLDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiAvKioKLSAqIEEgTGlzdEFkYXB0ZXIgdGhhdCBtYW5hZ2VzIGEgTGlzdFZpZXcgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQorICogQSBjb25jcmV0ZSBCYXNlQWRhcHRlciB0aGF0IGlzIGJhY2tlZCBieSBhbiBhcnJheSBvZiBhcmJpdHJhcnkKICAqIG9iamVjdHMuICBCeSBkZWZhdWx0IHRoaXMgY2xhc3MgZXhwZWN0cyB0aGF0IHRoZSBwcm92aWRlZCByZXNvdXJjZSBpZCByZWZlcmVuY2VzCiAgKiBhIHNpbmdsZSBUZXh0Vmlldy4gIElmIHlvdSB3YW50IHRvIHVzZSBhIG1vcmUgY29tcGxleCBsYXlvdXQsIHVzZSB0aGUgY29uc3RydWN0b3JzIHRoYXQKICAqIGFsc28gdGFrZXMgYSBmaWVsZCBpZC4gIFRoYXQgZmllbGQgaWQgc2hvdWxkIHJlZmVyZW5jZSBhIFRleHRWaWV3IGluIHRoZSBsYXJnZXIgbGF5b3V0CiAgKiByZXNvdXJjZS4KICAqCi0gKiBIb3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCisgKiA8cD5Ib3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCiAgKiB0aGUgYXJyYXkuIFlvdSBjYW4gYWRkIGxpc3RzIG9yIGFycmF5cyBvZiBjdXN0b20gb2JqZWN0cy4gT3ZlcnJpZGUgdGhlIHRvU3RyaW5nKCkgbWV0aG9kCiAgKiBvZiB5b3VyIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCB3aWxsIGJlIGRpc3BsYXllZCBmb3IgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuCiAgKgotICogVG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKKyAqIDxwPlRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBUZXh0Vmlld3MgZm9yIHRoZSBhcnJheSBkaXNwbGF5LCBmb3IgaW5zdGFuY2UsIEltYWdlVmlld3MsCiAgKiBvciB0byBoYXZlIHNvbWUgb2YgZGF0YSBiZXNpZGVzIHRvU3RyaW5nKCkgcmVzdWx0cyBmaWxsIHRoZSB2aWV3cywKICAqIG92ZXJyaWRlIHtAbGluayAjZ2V0VmlldyhpbnQsIFZpZXcsIFZpZXdHcm91cCl9IHRvIHJldHVybiB0aGUgdHlwZSBvZiB2aWV3IHlvdSB3YW50LgogICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCmluZGV4IGUxNWE1MjAuLjM0YWVmOTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCkBAIC0yOSwxMyArMjksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkNvbXBsZXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKQEAgLTkwLDQ1ICs4OSwyMSBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0b0NvbXBsZXRlVGV4dFZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJTlRfVklFV19JRCA9IDB4MTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHZhbHVlIGNvbnRyb2xzIHRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSB1c2VyCi0gICAgICogbXVzdCBsZWF2ZSBhIHBvaW50ZXIgZG93biB3aXRob3V0IHNjcm9sbGluZyB0byBleHBhbmQKLSAgICAgKiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duIGxpc3QgdG8gY292ZXIgdGhlIElNRS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0xJU1RfVElNRU9VVCA9IDI1MDsKLQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOwogCiAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKICAgICBwcml2YXRlIEZpbHRlciBtRmlsdGVyOwogICAgIHByaXZhdGUgaW50IG1UaHJlc2hvbGQ7CiAKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1Qb3B1cDsKLSAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKICAgICBwcml2YXRlIGludCBtRHJvcERvd25BbmNob3JJZDsKLSAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsgIC8vIHZpZXcgaXMgcmV0cmlldmVkIGxhemlseSBmcm9tIGlkIG9uY2UgbmVlZGVkCi0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSGVpZ2h0OwotICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OwogCiAgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiA9IHRydWU7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RLZXlDb2RlID0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT3BlbkJlZm9yZTsKQEAgLTEzNywxMCArMTEyLDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tDb21wbGV0aW9uOwogCi0gICAgcHJpdmF0ZSBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yOwotICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dEcm9wRG93blJ1bm5hYmxlOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlc2l6ZVBvcHVwUnVubmFibGUgPSBuZXcgUmVzaXplUG9wdXBSdW5uYWJsZSgpOwotCiAgICAgcHJpdmF0ZSBQYXNzVGhyb3VnaENsaWNrTGlzdGVuZXIgbVBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIFBvcHVwRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKIApAQCAtMTU1LDkgKzEyNiwxMCBAQAogICAgIHB1YmxpYyBBdXRvQ29tcGxldGVUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAKLSAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hdXRvQ29tcGxldGVUZXh0Vmlld1N0eWxlKTsKICAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUkVTSVpFKTsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFBvc2l0aW9uKExpc3RQb3B1cFdpbmRvdy5QT1NJVElPTl9QUk9NUFRfQkVMT1cpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9CiAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCkBAIC0xNjYsMTQgKzEzOCwxMSBAQAogICAgICAgICBtVGhyZXNob2xkID0gYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvblRocmVzaG9sZCwgMik7CiAKLSAgICAgICAgbUhpbnRUZXh0ID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KTsKLQotICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gYS5nZXREcmF3YWJsZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKTsKLSAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpOwotICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gKGludCkKLSAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpOworICAgICAgICBtUG9wdXAuc2V0TGlzdFNlbGVjdG9yKGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25TZWxlY3RvcikpOworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwLjBmKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KChpbnQpCisgICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwLjBmKSk7CiAgICAgICAgIAogICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcidzIGlkIG5vdywgYnV0IHRoZSB2aWV3IHdvbid0IGJlIHJlYWR5LCBzbyB3YWl0IHRvIGFjdHVhbGx5IGdldCB0aGUKICAgICAgICAgLy8gdmlldyBhbmQgc3RvcmUgaXQgaW4gbURyb3BEb3duQW5jaG9yVmlldyBsYXppbHkgaW4gZ2V0RHJvcERvd25BbmNob3JWaWV3IGxhdGVyLgpAQCAtMTg0LDEzICsxNTMsMTggQEAKICAgICAgICAgCiAgICAgICAgIC8vIEZvciBkcm9wZG93biB3aWR0aCwgdGhlIGRldmVsb3BlciBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHdpZHRoLCBvciBNQVRDSF9QQVJFTlQKICAgICAgICAgLy8gKGZvciBmdWxsIHNjcmVlbiB3aWR0aCkgb3IgV1JBUF9DT05URU5UICh0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvcmVkIHZpZXcpLgotICAgICAgICBtRHJvcERvd25XaWR0aCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoLAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoYS5nZXRMYXlvdXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKIAogICAgICAgICBtSGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50VmlldywKICAgICAgICAgICAgICAgICBSLmxheW91dC5zaW1wbGVfZHJvcGRvd25faGludCk7CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcigpKTsKKyAgICAgICAgc2V0Q29tcGxldGlvbkhpbnQoYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KSk7CiAKICAgICAgICAgLy8gQWx3YXlzIHR1cm4gb24gdGhlIGF1dG8gY29tcGxldGUgaW5wdXQgdHlwZSBmbGFnLCBzaW5jZSBpdAogICAgICAgICAvLyBtYWtlcyBubyBzZW5zZSB0byB1c2UgdGhpcyB3aWRnZXQgd2l0aG91dCBpdC4KQEAgLTIzOCw2ICsyMTIsMjAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wbGV0aW9uSGludChDaGFyU2VxdWVuY2UgaGludCkgewogICAgICAgICBtSGludFRleHQgPSBoaW50OworICAgICAgICBpZiAoaGludCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgaGludFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IGhpbnRWaWV3OworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VmlldyhudWxsKTsKKyAgICAgICAgICAgIG1IaW50VmlldyA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNTAsNyArMjM4LDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bldpZHRoKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0V2lkdGgoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNjMsNyArMjUxLDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25XaWR0aChpbnQgd2lkdGgpIHsKLSAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKHdpZHRoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3Nyw3ICsyNjUsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bkhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIZWlnaHQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI5MSw3ICsyNzksNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25IZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zMTYsNyArMzA0LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFuY2hvcihpbnQgaWQpIHsKICAgICAgICAgbURyb3BEb3duQW5jaG9ySWQgPSBpZDsKLSAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IG51bGw7CisgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG51bGwpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM1OCw3ICszNDYsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHZlcnRpY2FsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duVmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzY3LDcgKzM1NSw3IEBACiAgICAgICogQHJldHVybiB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0VmVydGljYWxPZmZzZXQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzYsNyArMzY0LDcgQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg1LDcgKzM3Myw3IEBACiAgICAgICogQHJldHVybiB0aGUgaG9yaXpvbnRhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SG9yaXpvbnRhbE9mZnNldCgpOwogICAgIH0KIAogICAgICAvKioKQEAgLTQyMiw3ICs0MTAsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgICAgIHJldHVybiBtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzOSw3ICs0MjcsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFsd2F5c1Zpc2libGUoYm9vbGVhbiBkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGRyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgbVBvcHVwLnNldERyb3BEb3duQWx3YXlzVmlzaWJsZShkcm9wRG93bkFsd2F5c1Zpc2libGUpOwogICAgIH0KICAgIAogICAgIC8qKgpAQCAtNjA2LDE1ICs1OTQsMTMgQEAKICAgICAgICAgICAgIG1GaWx0ZXIgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtQWRhcHRlcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1BvcHVwU2hvd2luZygpCi0gICAgICAgICAgICAgICAgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGJhY2sga2V5LCB3ZSBkbyBub3QgZXZlbiB0cnkgdG8gc2VuZCBpdAogICAgICAgICAgICAgLy8gdG8gdGhlIGRyb3AgZG93biBsaXN0IGJ1dCBpbnN0ZWFkLCBjb25zdW1lIGl0IGltbWVkaWF0ZWx5CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CkBAIC02MzMsMTggKzYxOSwxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbVBvcHVwLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoY29uc3VtZWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAorICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CkBAIC02NTIsODcgKzYzNiwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5Ci0gICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAvLyB0aGUga2V5IGV2ZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBsaXN0IGluIHRoZSBkcm9wIGRvd24gdmlldwotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IExpc3RWaWV3IGhhbmRsZXMgc3BhY2UgYnV0IHdlIGRvbid0IHdhbnQgdGhhdCB0byBoYXBwZW4KLSAgICAgICAgICAgIC8vIGFsc28gaWYgc2VsZWN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIGRyb3AgZG93biwgdGhlbiBkb24ndAotICAgICAgICAgICAgLy8gbGV0IGNlbnRlciBvciBlbnRlciBwcmVzc2VzIGdvIHRoZXJlIHNpbmNlIHRoYXQgd291bGQgY2F1c2UgaXQKLSAgICAgICAgICAgIC8vIHRvIHNlbGVjdCBvbmUgb2YgaXRzIGl0ZW1zCi0gICAgICAgICAgICBpZiAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX1NQQUNFCi0gICAgICAgICAgICAgICAgICAgICYmIChtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRU5URVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUikpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGN1ckluZGV4ID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQ7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJlbG93ID0gIW1Qb3B1cC5pc0Fib3ZlQW5jaG9yKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxFbmFibGVkOwotICAgICAgICAgICAgICAgIGludCBmaXJzdEl0ZW0gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdEl0ZW0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsRW5hYmxlZCA9IGFkYXB0ZXIuYXJlQWxsSXRlbXNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbSA9IGFsbEVuYWJsZWQgPyAwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RJdGVtID0gYWxsRW5hYmxlZCA/IGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbihhZGFwdGVyLmdldENvdW50KCkgLSAxLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJiBjdXJJbmRleCA8PSBmaXJzdEl0ZW0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04gJiYgY3VySW5kZXggPj0gbGFzdEl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgdG9wLCB3ZSBibG9jayB0aGUga2V5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIHByZXZlbnQgZm9jdXMgZnJvbSBtb3ZpbmcuCi0gICAgICAgICAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtUG9wdXAub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgc3dpdGNoKGtleUNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CiAgICAgICAgICAgICAgICAgcGVyZm9ybVZhbGlkYXRpb24oKTsKQEAgLTc0Myw3ICs2NTEsNyBAQAogICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwogICAgICAgICBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAKLSAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgICAgIH0KIApAQCAtODA0LDExICs3MTIsMTIgQEAKICAgICAgICAgaWYgKGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwZXJmb3JtRmlsdGVyaW5nKGdldFRleHQoKSwgbUxhc3RLZXlDb2RlKTsKKyAgICAgICAgICAgICAgICBidWlsZEltZUNvbXBsZXRpb25zKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkcm9wIGRvd24gaXMgYXV0b21hdGljYWxseSBkaXNtaXNzZWQgd2hlbiBlbm91Z2ggY2hhcmFjdGVycwogICAgICAgICAgICAgLy8gYXJlIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dCB2aWV3Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIGRpc21pc3NEcm9wRG93bigpOworICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUZpbHRlci5maWx0ZXIobnVsbCk7CiAgICAgICAgICAgICB9CkBAIC04NDEsMTMgKzc1MCw3IEBACiAgICAgICogaXQgYmFjay4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtODU2LDExICs3NTksNyBAQAogICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgc2VsZWN0b3IgdG8uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGlzdFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgLy8gTGlzdFZpZXcuc2V0U2VsZWN0aW9uKCkgd2lsbCBjYWxsIHJlcXVlc3RMYXlvdXQoKQotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc0LDEwICs3NzMsNyBAQAogICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTExLDEzICs4MDcsNyBAQAogICAgICAgICAgICAgcmVwbGFjZVRleHQoY29tcGxldGlvbi5nZXRUZXh0KCkpOwogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OwotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIGEgVmlldyBoZXJlLCBzbyB3ZSB3aWxsIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBzdXBwbHkgbnVsbC4gIEhvcGVmdWxseSBubyBleGlzdGluZyBhcHBzIGNyYXNoLi4uCi0gICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIG51bGwsIGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAucGVyZm9ybUl0ZW1DbGljayhjb21wbGV0aW9uLmdldFBvc2l0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MjUsNyArODE1LDcgQEAKICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZEl0ZW07CiAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW0oKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtUG9wdXAuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1BZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwogICAgICAgICAgICAgfQpAQCAtOTM5LDE4ICs4MjksMTggQEAKICAgICAgICAgICAgIG1CbG9ja0NvbXBsZXRpb24gPSBmYWxzZTsgICAgICAgICAgICAKIAogICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0UG9wdXBXaW5kb3cgbGlzdCA9IG1Qb3B1cDsKIAogICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFZpZXcgPT0gbnVsbCB8fCBwb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID0gbGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBsaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGlkID0gbGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LmdldExpc3RWaWV3KCksIHNlbGVjdGVkVmlldywgcG9zaXRpb24sIGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRHJvcERvd25EaXNtaXNzZWRPbkNvbXBsZXRpb24gJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAwMCw3ICs4OTAsNiBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25GaWx0ZXJDb21wbGV0ZShpbnQgY291bnQpIHsKICAgICAgICAgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoY291bnQpOwotCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyb3BEb3duRm9yRmlsdGVyKGludCBjb3VudCkgewpAQCAtMTAxNCwxMSArOTAzLDEyIEBACiAgICAgICAgICAqIHRvIGZpbHRlci4KICAgICAgICAgICovCiAKLSAgICAgICAgaWYgKChjb3VudCA+IDAgfHwgbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSA9IG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOworICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBkcm9wRG93bkFsd2F5c1Zpc2libGUpICYmIGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChoYXNGb2N1cygpICYmIGhhc1dpbmRvd0ZvY3VzKCkpIHsKICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyNiw3ICs5MTYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzV2luZG93Rm9jdXMpIHsKICAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzV2luZG93Rm9jdXMpOwotICAgICAgICBpZiAoIWhhc1dpbmRvd0ZvY3VzICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMzYsNyArOTI2LDcgQEAKICAgICAgICAgc3VwZXIub25EaXNwbGF5SGludChoaW50KTsKICAgICAgICAgc3dpdGNoIChoaW50KSB7CiAgICAgICAgICAgICBjYXNlIElOVklTSUJMRToKLSAgICAgICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNTAsNyArOTQwLDcgQEAKICAgICAgICAgaWYgKCFmb2N1c2VkKSB7CiAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZm9jdXNlZCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAoIWZvY3VzZWQgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNzUsOCArOTY1LDYgQEAKICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KG51bGwpOwotICAgICAgICBtRHJvcERvd25MaXN0ID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwODksMTggKzk3Nyw2IEBACiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VXNlZCBmb3IgbGF6eSBpbnN0YW50aWF0aW9uIG9mIHRoZSBhbmNob3IgdmlldyBmcm9tIHRoZSBpZCB3ZSBoYXZlLiBJZiB0aGUgdmFsdWUgb2YKLSAgICAgKiB0aGUgaWQgaXMgTk9fSUQgb3Igd2UgY2FuJ3QgZmluZCBhIHZpZXcgZm9yIHRoZSBnaXZlbiBpZCwgd2UgcmV0dXJuIHRoaXMgVGV4dFZpZXcgYXMKLSAgICAgKiB0aGUgZGVmYXVsdCBhbmNob3JpbmcgcG9pbnQuPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXREcm9wRG93bkFuY2hvclZpZXcoKSB7Ci0gICAgICAgIGlmIChtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgJiYgbURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgewotICAgICAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldyA9PSBudWxsID8gdGhpcyA6IG1Ecm9wRG93bkFuY2hvclZpZXc7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogSXNzdWVzIGEgcnVubmFibGUgdG8gc2hvdyB0aGUgZHJvcGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZS4KQEAgLTExMDgsNyArOTg0LDcgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgYnkgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2hvd0Ryb3BEb3duQWZ0ZXJMYXlvdXQoKSB7Ci0gICAgICAgIHBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICAgICAgbVBvcHVwLnBvc3RTaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTExOSw3ICs5OTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuc3VyZUltZVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUodmlzaWJsZQotICAgICAgICAgICAgICAgID8gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCA6IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICA/IExpc3RQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKICAgICAgICAgc2hvd0Ryb3BEb3duKCk7CiAgICAgfQogCkBAIC0xMTI3LDg5ICsxMDAzLDIxIEBACiAgICAgICogQGhpZGUgaW50ZXJuYWwgdXNlZCBvbmx5IGhlcmUgYW5kIFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkRpc3BsYXlzIHRoZSBkcm9wIGRvd24gb24gc2NyZWVuLjwvcD4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd24oKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7Ci0KLSAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7Ci0gICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKLQotICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7Ci0KLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKTsKKyAgICAgICAgaWYgKG1Qb3B1cC5nZXRBbmNob3JWaWV3KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvcklkICE9IFZpZXcuTk9fSUQpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhnZXRSb290VmlldygpLmZpbmRWaWV3QnlJZChtRHJvcERvd25BbmNob3JJZCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyh0aGlzKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7Ci0KLSAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKG1Ecm9wRG93bldpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQobURyb3BEb3duSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB1c2Ugb3V0c2lkZSB0b3VjaGFibGUgdG8gZGlzbWlzcyBkcm9wIGRvd24gd2hlbiB0b3VjaGluZyBvdXRzaWRlIG9mIGl0LCBzbwotICAgICAgICAgICAgLy8gb25seSBzZXQgdGhpcyBpZiB0aGUgZHJvcGRvd24gaXMgbm90IGFsd2F5cyB2aXNpYmxlCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRUb3VjaEludGVyY2VwdG9yKG5ldyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0RHJvcERvd25BbmNob3JWaWV3KCksCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0aW9uKExpc3RWaWV3LklOVkFMSURfUE9TSVRJT04pOwotICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBwb3N0KG1IaWRlU2VsZWN0b3IpOwogICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTIyMCwxOSArMTAyOCwxMCBAQAogICAgICAqIEBoaWRlIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7Ci0gICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgICAgICBtUG9wdXAuc2V0Rm9yY2VJZ25vcmVPdXRzaWRlVG91Y2goZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAotICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKLSAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKLSAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7Ci0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJbWVDb21wbGV0aW9ucygpIHsKICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwogICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwpAQCAtMTI2MCwxMzUgKzEwNTksNiBAQAogICAgICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgY29tcGxldGlvbnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgICAgICBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKLSAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdwotICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKLSAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgotICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBtRHJvcERvd25MaXN0ID0gbmV3IERyb3BEb3duTGlzdFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRHJvcERvd25MaXN0VmlldyBkcm9wRG93bkxpc3QgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcERvd25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wRG93bkxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPblNjcm9sbExpc3RlbmVyKG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCkpOwotCi0gICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKLQotICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IGdldEhpbnRWaWV3KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLQotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGdldFdpZHRoKCksIE1lYXN1cmVTcGVjLkFUX01PU1QpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgaGludFZpZXcubWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotCi0gICAgICAgICAgICAgICAgaGludFBhcmFtcyA9IChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSBoaW50Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSBoaW50Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47Ci0KLSAgICAgICAgICAgICAgICBkcm9wRG93blZpZXcgPSBoaW50Q29udGFpbmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcoZHJvcERvd25WaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IChWaWV3R3JvdXApIG1Qb3B1cC5nZXRDb250ZW50VmlldygpOwotICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZHJvcERvd25WaWV3LmZpbmRWaWV3QnlJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCi0gICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQotICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKLSAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCi0gICAgICAgICAgICAgICAgZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyk7Ci0KLSAgICAgICAgLy8gZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KCkgc3VidHJhY3RzIHRoZSBwYWRkaW5nLCBzbyB3ZSBwdXQgaXQgYmFjaywKLSAgICAgICAgLy8gdG8gZ2V0IHRoZSBhdmFpbGFibGUgaGVpZ2h0IGZvciB0aGUgd2hvbGUgd2luZG93Ci0gICAgICAgIGludCBwYWRkaW5nID0gMDsKLSAgICAgICAgRHJhd2FibGUgYmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJhY2tncm91bmQuZ2V0UGFkZGluZyhtVGVtcFJlY3QpOwotICAgICAgICAgICAgcGFkZGluZyA9IG1UZW1wUmVjdC50b3AgKyBtVGVtcFJlY3QuYm90dG9tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgfHwgbURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWF4SGVpZ2h0ICsgcGFkZGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBsaXN0Q29udGVudCA9IG1Ecm9wRG93bkxpc3QubWVhc3VyZUhlaWdodE9mQ2hpbGRyZW4oTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgMCwgTGlzdFZpZXcuTk9fUE9TSVRJT04sIG1heEhlaWdodCAtIG90aGVySGVpZ2h0cywgMik7Ci0gICAgICAgIC8vIGFkZCBwYWRkaW5nIG9ubHkgaWYgdGhlIGxpc3QgaGFzIGl0ZW1zIGluIGl0LCB0aGF0IHdheSB3ZSBkb24ndCBzaG93Ci0gICAgICAgIC8vIHRoZSBwb3B1cCBpZiBpdCBpcyBub3QgbmVlZGVkCi0gICAgICAgIGlmIChsaXN0Q29udGVudCA+IDApIG90aGVySGVpZ2h0cyArPSBwYWRkaW5nOwotCi0gICAgICAgIHJldHVybiBsaXN0Q29udGVudCArIG90aGVySGVpZ2h0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcgZ2V0SGludFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChtSGludFRleHQgIT0gbnVsbCAmJiBtSGludFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgcmV0dXJuIGhpbnRWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE0NDAsNDcgKzExMTAsNiBAQAogICAgICAgICByZXR1cm4gbUZpbHRlcjsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFNjcm9sbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdFZpZXcuT25TY3JvbGxMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsKEFic0xpc3RWaWV3IHZpZXcsIGludCBmaXJzdFZpc2libGVJdGVtLCBpbnQgdmlzaWJsZUl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICBpbnQgdG90YWxJdGVtQ291bnQpIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGxTdGF0ZUNoYW5nZWQoQWJzTGlzdFZpZXcgdmlldywgaW50IHNjcm9sbFN0YXRlKSB7Ci0gICAgICAgICAgICBpZiAoc2Nyb2xsU3RhdGUgPT0gU0NST0xMX1NUQVRFX1RPVUNIX1NDUk9MTCAmJgotICAgICAgICAgICAgICAgICAgICAhaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpICYmIG1Qb3B1cC5nZXRDb250ZW50VmlldygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlc2l6ZVBvcHVwUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1SZXNpemVQb3B1cFJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKHYsIHBvc2l0aW9uLCBpZCk7CkBAIC0xNDg4LDEyMyArMTExNyw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGhpamFja3MgdGhlIGZvY3VzIHRvCi0gICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KLSAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5Ci0gICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd247IHRoZSBsaXN0IG9ubHkgbG9va3MgZm9jdXNlZC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJvcERvd25MaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICAgICAgLyoKLSAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgotICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cwotICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAotICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCi0gICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKLSAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCi0gICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAotICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQotICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQotICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAotICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgotICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRlbHkgaGlkZSB0aGUgbGlzdCdzCi0gICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbnZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQotICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IGxpc3QgdmlldyB3cmFwcGVyLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhpcyB2aWV3J3MgY29udGV4dAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIERyb3BEb3duTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuZHJvcERvd25MaXN0Vmlld1N0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cwotICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKLQotICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgewotICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICByZXR1cm4gbUxpc3RTZWxlY3Rpb25IaWRkZW4gfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZShpbnQgZXh0cmFTcGFjZSkgewotICAgICAgICAgICAgaW50W10gcmVzID0gc3VwZXIub25DcmVhdGVEcmF3YWJsZVN0YXRlKGV4dHJhU3BhY2UpOwotICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRJZlN0YXRlbWVudAotICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDcmVhdGVkIGRyYXdhYmxlIHN0YXRlOiBbIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIweCIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZXNbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJdIik7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBUZXh0VmlldyBjb21wbGllcyB0bwogICAgICAqIGEgY2VydGFpbiBmb3JtYXQuICBTaW5jZSB0aGVyZSBpcyBubyBmb29scHJvb2Ygd2F5IHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBsZWF2aW5nCiAgICAgICogdGhpcyBWaWV3IHdpdGggYW4gaW5jb3JyZWN0IHZhbHVlIGluIGl0LCBhbGwgd2UgY2FuIGRvIGlzIHRyeSB0byBmaXggaXQgb3Vyc2VsdmVzCkBAIC0xNjUyLDEwICsxMTY0LDcgQEAKICAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IHRoZSBuZXcgYWRhcHRlcidzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcgYWxyZWFkeSwgc2hvd2luZyBpdCB3aWxsIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3Qgb2YgZGF0YSBzZXQgb2JzZXJ2ZXJzIGF0dGFjaGVkIHRvIHRoZSBhZGFwdGVyIHRvCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlLiBXZSBjYW4ndCBkbyBpdCBmcm9tIGhlcmUsIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBtaWRkbGUKQEAgLTE2NzAsMTQgKzExNzksNSBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGRhdGEgdG8gZGlzcGxheSBzbyBtYWtlIHN1cmUgd2UncmUgbm90IHNob3dpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBkb3duIGFuZCBpdHMgbGlzdAotICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKaW5kZXggYmFhNjgzMy4uNGNmODc4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC04MCw2ICs4MCwxOCBAQAogICAgIHByb3RlY3RlZCBGaWx0ZXJRdWVyeVByb3ZpZGVyIG1GaWx0ZXJRdWVyeVByb3ZpZGVyOwogCiAgICAgLyoqCisgICAgICogSWYgc2V0IHRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlciBhIGNvbnRlbnQgY2hhbmdlCisgICAgICogbm90aWZpY2F0aW9uIGlzIGRlbGl2ZXJlZC4gSW1wbGllcyB7QGxpbmsgI0ZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FVVE9fUkVRVUVSWSA9IDB4MDE7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCByZWdpc3RlciBhIGNvbnRlbnQgb2JzZXJ2ZXIgb24gdGhlIGN1cnNvciBhbmQgd2lsbCBjYWxsCisgICAgICoge0BsaW5rICNvbkNvbnRlbnRDaGFuZ2VkKCl9IHdoZW4gYSBub3RpZmljYXRpb24gY29tZXMgaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSID0gMHgwMjsKKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLiBUaGUgYWRhcHRlciB3aWxsIGNhbGwgcmVxdWVyeSgpIG9uIHRoZSBjdXJzb3Igd2hlbmV2ZXIKICAgICAgKiBpdCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG1vc3QgcmVjZW50IGRhdGEgaXMgYWx3YXlzIGRpc3BsYXllZC4KICAgICAgKgpAQCAtODcsNyArOTksNyBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYykgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIHRydWUpOworICAgICAgICBpbml0KGNvbnRleHQsIGMsIEZMQUdfQVVUT19SRVFVRVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk5LDE5ICsxMTEsNDMgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqLwogICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKLSAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgYXV0b1JlcXVlcnkgPyBGTEFHX0FVVE9fUkVRVUVSWSA6IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGZsYWdzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgYWRhcHRlcgorICAgICAqLworICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGZsYWdzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BVVRPX1JFUVVFUlkpID09IEZMQUdfQVVUT19SRVFVRVJZKSB7CisgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVI7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1dG9SZXF1ZXJ5ID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBjdXJzb3JQcmVzZW50ID0gYyAhPSBudWxsOwotICAgICAgICBtQXV0b1JlcXVlcnkgPSBhdXRvUmVxdWVyeTsKICAgICAgICAgbUN1cnNvciA9IGM7CiAgICAgICAgIG1EYXRhVmFsaWQgPSBjdXJzb3JQcmVzZW50OwogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Sb3dJRENvbHVtbiA9IGN1cnNvclByZXNlbnQgPyBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIikgOiAtMTsKLSAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpID09IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgeworICAgICAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CisKICAgICAgICAgaWYgKGN1cnNvclByZXNlbnQpIHsKLSAgICAgICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgYy5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0NiwxMyArMjgyLDEzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIG1DdXJzb3IudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIik7CiAgICAgICAgICAgICBtRGF0YVZhbGlkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCmluZGV4IDFlZDZiMTYuLmM0NzI5MmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQpAQCAtMTIwNyw3ICsxMjA3LDcgQEAKIAogICAgICAgICAvLyBXZSB1bmZvY3VzIHRoZSBvbGQgY2hpbGQgZG93biBoZXJlIHNvIHRoZSBhYm92ZSBoYXNGb2N1cyBjaGVjawogICAgICAgICAvLyByZXR1cm5zIHRydWUKLSAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsICYmIG9sZFNlbGVjdGVkQ2hpbGQgIT0gY2hpbGQpIHsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0cyBkcmF3YWJsZSBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gJ3NlbGVjdGVkJwogICAgICAgICAgICAgb2xkU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZChmYWxzZSk7CkBAIC0xMjYzLDYgKzEyNjMsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKGdhaW5Gb2N1cyAmJiBtU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKHRydWUpOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCmluZGV4IGQyODI5ZGIuLmE1YjNlZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCkBAIC0xNywyMSArMTcsMjUgQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogCiAvKioKICAqIEEgdmlldyB0aGF0IHNob3dzIGl0ZW1zIGluIHR3by1kaW1lbnNpb25hbCBzY3JvbGxpbmcgZ3JpZC4gVGhlIGl0ZW1zIGluIHRoZQogICogZ3JpZCBjb21lIGZyb20gdGhlIHtAbGluayBMaXN0QWRhcHRlcn0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldy4KICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBHcmlkVmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TVFJFVENIID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFVENIX1NQQUNJTkcgPSAxOwpAQCAtMTA2LDEzICsxMTAsMjMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBHcmlkVmlldy4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIHByb3ZpZGluZyB0aGUgZ3JpZCdzIGRhdGEKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTczOSw2ICs3NTMsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGdyaWQgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZAogICAgICAqIHNlbGVjdGlvbi4gVGhlIG5ldyBzZWxlY3Rpb24gd2lsbCBiZSBwbGFjZWQgYXQsIGFib3ZlLCBvciBiZWxvdyB0aGUKICAgICAgKiBsb2NhdGlvbiBvZiB0aGUgbmV3IHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gaG93IHRoZSBzZWxlY3Rpb24gaXMgbW92aW5nLgpAQCAtMTc3NCw2ICsxODA4LDE5IEBACiAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0SWZOZWNlc3NhcnkoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkLiAKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjQVVUT19GSVR9IGlmIHRoZSBHcmlkIGhhcyBuZXZlciBiZWVuIGxhaWQgb3V0LgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjR3JpZFZpZXdfbnVtQ29sdW1ucworICAgICAqIAorICAgICAqIEBzZWUgI3NldE51bUNvbHVtbnMoaW50KQorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ29sdW1ucygpIHsgIAorICAgICAgICByZXR1cm4gbU51bUNvbHVtbnM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHZpZXdzIGFyZSB0b3VjaGluZyB0aGUgdG9wIG9yIGJvdHRvbSBlZGdlLCBhcyBhcHByb3ByaWF0ZSBmb3IKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQppbmRleCAwNTI1ODkxLi41MzE4N2JmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCkBAIC00MCw2ICs0MCwxMyBAQAogICogPHA+CiAgKiBBbHNvIHNlZSB7QGxpbmsgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zfQogICogZm9yIGxheW91dCBhdHRyaWJ1dGVzIDwvcD4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2dyYXZpdHkKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9tZWFzdXJlV2l0aExhcmdlc3RDaGlsZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X29yaWVudGF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfd2VpZ2h0U3VtCiAgKi8KIEBSZW1vdGVWaWV3CiBwdWJsaWMgY2xhc3MgTGluZWFyTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKQEAgLTExNCw3ICsxMjEsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMaW5lYXJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IAogICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXQpOwpAQCAtMTM5LDggKzE1MCw3IEBACiAgICAgICAgIG1CYXNlbGluZUFsaWduZWRDaGlsZEluZGV4ID0KICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCwgLTEpOwogCi0gICAgICAgIC8vIFRPRE86IEJldHRlciBuYW1lLCBhZGQgSmF2YSBBUElzLCBtYWtlIGl0IHB1YmxpYwotICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpbmVhckxheW91dF91c2VMYXJnZXN0Q2hpbGQsIGZhbHNlKTsKKyAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQsIGZhbHNlKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CkBAIC0xNjksNiArMTc5LDMzIEBACiAgICAgICAgIG1CYXNlbGluZUFsaWduZWQgPSBiYXNlbGluZUFsaWduZWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogV2hlbiB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZSBtaW5pbXVtCisgICAgICogICAgICAgICBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtVXNlTGFyZ2VzdENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gc2V0IHRvIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKKyAgICAgKiB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQorICAgICAqIG1lYXN1cmVkIG5vcm1hbGx5LgorICAgICAqIAorICAgICAqIERpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSB0byBtZWFzdXJlIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgdXNpbmcgdGhlCisgICAgICogICAgICAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGVuYWJsZWQ7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKICAgICAgICAgaWYgKG1CYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IDwgMCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzRjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKQEAgLTAsMCArMSwxMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKKworLyoqCisgKiBBIExpc3RQb3B1cFdpbmRvdyBhbmNob3JzIGl0c2VsZiB0byBhIGhvc3QgdmlldyBhbmQgZGlzcGxheXMgYQorICogbGlzdCBvZiBjaG9pY2VzLiBXaGVuIG9uZSBpcyBzZWxlY3RlZCwgdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGVBdHRyIERlZmF1bHQgc3R5bGUgYXR0cmlidXRlIHRvIHVzZSBmb3IgcG9wdXAgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgU3R5bGUgYXR0cmlidXRlIHRvIHJlYWQgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZVJlcyBTdHlsZSByZXNvdXJjZSBJRCB0byB1c2UgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHRoZSBkYXRhIGFuZCB0aGUgdmlld3MgdG8gcmVwcmVzZW50IHRoZSBkYXRhCisgICAgICogaW4gdGhpcyBwb3B1cCB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byB1c2UgdG8gY3JlYXRlIHRoaXMgd2luZG93J3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLiBUaGUgZGVmYXVsdCBpcworICAgICAqIHtAbGluayAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gQSBwb3NpdGlvbiBjb25zdGFudCBkZWNsYXJpbmcgd2hlcmUgdGhlIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtUHJvbXB0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJvbXB0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvbXB0UG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogPHA+SWYgYSBwb3B1cCB3aW5kb3cgaXMgbW9kYWwsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgdG91Y2ggYW5kIGtleSBpbnB1dC4KKyAgICAgKiBJZiB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYXJlYSB0aGUgcG9wdXAgd2luZG93CisgICAgICogd2lsbCBiZSBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGFsIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHNob3VsZCBiZSBtb2RhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kYWwoYm9vbGVhbiBtb2RhbCkgeworICAgICAgICBtTW9kYWwgPSB0cnVlOworICAgICAgICBtUG9wdXAuc2V0Rm9jdXNhYmxlKG1vZGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGFsKCkgeworICAgICAgICByZXR1cm4gbU1vZGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBvdXRzaWRlIHRvdWNoZXMgdG8gYmUgaWdub3JlZC4gTm9ybWFsbHkgaWYge0BsaW5rICNpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpfSBpcworICAgICAqIGZhbHNlLCB3ZSBhbGxvdyBvdXRzaWRlIHRvdWNoIHRvIGRpc21pc3MgdGhlIGRyb3Bkb3duLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlCisgICAgICogaWdub3JlIG91dHNpZGUgdG91Y2ggZXZlbiB3aGVuIHRoZSBkcm9wIGRvd24gaXMgbm90IHNldCB0byBhbHdheXMgdmlzaWJsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBVc2VkIG9ubHkgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdG8gaGFuZGxlIHNvbWUgaW50ZXJuYWwgc3BlY2lhbCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7CisgICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZHJvcC1kb3duIHNob3VsZCByZW1haW4gdmlzaWJsZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZHJvcC1kb3duIHdpbGwgb2NjdXB5IHRoZSBlbnRpcmUgc2NyZWVuIGJlbG93IHtAbGluayAjZ2V0QW5jaG9yVmlld30gcmVnYXJkbGVzcworICAgICAqIG9mIHRoZSBzaXplIG9yIGNvbnRlbnQgb2YgdGhlIGxpc3QuICB7QGxpbmsgI2dldEJhY2tncm91bmQoKX0gd2lsbCBmaWxsIGFueSBzcGFjZQorICAgICAqIHRoYXQgaXMgbm90IHVzZWQgYnkgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJvcERvd25BbHdheXNWaXNpYmxlIFdoZXRoZXIgdG8ga2VlcCB0aGUgZHJvcC1kb3duIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZHJvcC1kb3duIGlzIHZpc2libGUgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IEF1dG9Db21wbGV0ZVRleHRWaWV3IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzb2Z0IGlucHV0IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBtb2RlLCBzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlfQorICAgICAqICAgICAgICBmb3IgdGhlIGZ1bGwgbGlzdAorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZQorICAgICAqIEBzZWUgI2dldFNvZnRJbnB1dE1vZGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvZnRJbnB1dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldFNvZnRJbnB1dE1vZGUoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb2Z0SW5wdXRNb2RlKGludCkKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0SW5wdXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNvZnRJbnB1dE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSBsaXN0IGl0ZW0gc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIExpc3Qgc2VsZWN0b3IgZHJhd2FibGUgdG8gdXNlIGluIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0b3IoRHJhd2FibGUgc2VsZWN0b3IpIHsKKyAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IHNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byBiZSB0aGUgYmFja2dyb3VuZCBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBBIGRyYXdhYmxlIHRvIHNldCBhcyB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtUG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbmltYXRpb24gc3R5bGUgdG8gdXNlIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyBzaG93biBvciBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFuaW1hdGlvblN0eWxlIEFuaW1hdGlvbiBzdHlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoaW50IGFuaW1hdGlvblN0eWxlKSB7CisgICAgICAgIG1Qb3B1cC5zZXRBbmltYXRpb25TdHlsZShhbmltYXRpb25TdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcworICAgICAqIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuaW1hdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEFuaW1hdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmlldyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmNob3IgdGhpcyBwb3B1cC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3B1cCdzIGFuY2hvciB2aWV3CisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0QW5jaG9yVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9wdXAncyBhbmNob3Igdmlldy4gVGhpcyBwb3B1cCB3aWxsIGFsd2F5cyBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGFuY2hvciB2aWV3IHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGFuY2hvciBUaGUgdmlldyB0byB1c2UgYXMgYW4gYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvclZpZXcoVmlldyBhbmNob3IpIHsKKyAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGFuY2hvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvciBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJ0aWNhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoaXMgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIHZpZXcgaW4gcGl4ZWxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLiBDYW4gYWxzbyBiZSB7QGxpbmsgI01BVENIX1BBUkVOVH0KKyAgICAgKiBvciB7QGxpbmsgI1dSQVBfQ09OVEVOVH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBieSB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC4gVGhlIGZpbmFsIHdpZHRoIG1heSBiZQorICAgICAqIGxhcmdlciB0byBhY2NvbW1vZGF0ZSBzdHlsZWQgd2luZG93IGRyZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoIERlc2lyZWQgd2lkdGggb2YgY29udGVudCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFdpZHRoKGludCB3aWR0aCkgeworICAgICAgICBEcmF3YWJsZSBwb3B1cEJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAocG9wdXBCYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID0gcG9wdXBCYWNrZ3JvdW5kLmdldEludHJpbnNpY1dpZHRoKCkgKyB3aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGlja0xpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIGNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyID0gY2xpY2tMaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBzZWxlY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWRMaXN0ZW5lciBMaXN0ZW5lciB0byByZWdpc3Rlci4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgc2VsZWN0ZWRMaXN0ZW5lcikgeworICAgICAgICBtSXRlbVNlbGVjdGVkTGlzdGVuZXIgPSBzZWxlY3RlZExpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHZpZXcgdG8gYWN0IGFzIGEgdXNlciBwcm9tcHQgZm9yIHRoaXMgcG9wdXAgd2luZG93LiBXaGVyZSB0aGUgcHJvbXB0IHZpZXcgd2lsbCBhcHBlYXIKKyAgICAgKiBpcyBjb250cm9sbGVkIGJ5IHtAbGluayAjc2V0UHJvbXB0UG9zaXRpb24oaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIHByb21wdCBWaWV3IHRvIHVzZSBhcyBhbiBpbmZvcm1hdGlvbmFsIHByb21wdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRWaWV3KFZpZXcgcHJvbXB0KSB7CisgICAgICAgIGJvb2xlYW4gc2hvd2luZyA9IGlzU2hvd2luZygpOworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICB9CisgICAgICAgIG1Qcm9tcHRWaWV3ID0gcHJvbXB0OworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9zdCBhIHtAbGluayAjc2hvdygpfSBjYWxsIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9zdFNob3coKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBwb3B1cCBsaXN0LiBJZiB0aGUgbGlzdCBpcyBhbHJlYWR5IHNob3dpbmcsIHRoaXMgbWV0aG9kCisgICAgICogd2lsbCByZWNhbGN1bGF0ZSB0aGUgcG9wdXAncyBzaXplIGFuZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpbnQgaGVpZ2h0ID0gYnVpbGREcm9wRG93bigpOworCisgICAgICAgIGludCB3aWR0aFNwZWMgPSAwOworICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IDA7CisKKyAgICAgICAgYm9vbGVhbiBub0lucHV0TWV0aG9kID0gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpOworCisgICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisKKyAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgd2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCisgICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOworICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobVRvdWNoSW50ZXJjZXB0b3IpOworICAgICAgICAgICAgbVBvcHVwLnNob3dBc0Ryb3BEb3duKGdldEFuY2hvclZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghbU1vZGFsIHx8IG1Ecm9wRG93bkxpc3QuaXNJblRvdWNoTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Nb2RhbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUhpZGVTZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7CisgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcm9tcHRWaWV3KCkgeworICAgICAgICBpZiAobVByb21wdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwYXJlbnQgPSBtUHJvbXB0Vmlldy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgZ3JvdXAucmVtb3ZlVmlldyhtUHJvbXB0Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIGhvdyB0aGUgcG9wdXAgb3BlcmF0ZXMgd2l0aCBhbiBpbnB1dCBtZXRob2Q6IG9uZSBvZgorICAgICAqIHtAbGluayAjSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFfSwge0BsaW5rICNJTlBVVF9NRVRIT0RfTkVFREVEfSwKKyAgICAgKiBvciB7QGxpbmsgI0lOUFVUX01FVEhPRF9OT1RfTkVFREVEfS4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHRha2UgZWZmZWN0IG9ubHkKKyAgICAgKiB0aGUgbmV4dCB0aW1lIHRoZSBwb3B1cCBpcyBzaG93biBvciB0aHJvdWdoIGEgbWFudWFsIGNhbGwgdG8gdGhlIHtAbGluayAjc2hvdygpfQorICAgICAqIG1ldGhvZC48L3A+CisgICAgICogCisgICAgICogQHNlZSAjZ2V0SW5wdXRNZXRob2RNb2RlKCkKKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dE1ldGhvZE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgaW4ge0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX0uCisgICAgICogCisgICAgICogQHNlZSAjc2V0SW5wdXRNZXRob2RNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0TWV0aG9kTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIHBvc2l0aW9uIG9mIHRoZSBsaXN0LgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIExpc3QgcG9zaXRpb24gdG8gc2V0IGFzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgbGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGxpc3QuZ2V0Q2hvaWNlTW9kZSgpICE9IExpc3RWaWV3LkNIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnNldEl0ZW1DaGVja2VkKHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjdXJyZW50IGxpc3Qgc2VsZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJMaXN0U2VsZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBsaXN0LmhpZGVTZWxlY3RvcigpOworICAgICAgICAgICAgbGlzdC5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc1Nob3dpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHBvcHVwIGlzIGNvbmZpZ3VyZWQgdG8gYXNzdW1lIHRoZSB1c2VyIGRvZXMgbm90IG5lZWQKKyAgICAgKiB0byBpbnRlcmFjdCB3aXRoIHRoZSBJTUUgd2hpbGUgaXQgaXMgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBJTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGl0ZW0gY2xpY2sgb3BlcmF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIGZvciBwZXJmb3JtaW5nIHRoZSBjbGljaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpY2sgYWN0aW9uIGNvdWxkIGJlIHBlcmZvcm1lZCwgZmFsc2UgaWYgbm90LgorICAgICAqICAgICAgICAgKGUuZy4gaWYgdGhlIHBvcHVwIHdhcyBub3Qgc2hvd2luZywgdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIGZhbHNlLikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGxpc3QuZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGxpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIGNoaWxkLCBwb3NpdGlvbiwgY2hpbGQuZ2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciB7QGxpbmsgTGlzdFZpZXcjSU5WQUxJRF9QT1NJVElPTn0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1JPV19JRH0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtSWQoKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9ST1dfSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZgorICAgICAqIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZFZpZXcoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIExpc3RWaWV3fSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCBmYWxzZSBpZiBpdCB3YXMgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRNb2RhbChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gd2hlbiB0aGUgZHJvcCBkb3duIGlzIHNob3duLCB3ZSBkcml2ZSBpdCBkaXJlY3RseQorICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3CisgICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgorICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0CisgICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAorICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKKyAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKKworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKKworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgcGFzc2luZyB0aGUgZm9jdXMgZnJvbSB0aGUgdGV4dCB2aWV3IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSwgd2UgYmxvY2sgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBhdm9pZCBnb2luZyB0byB0aGUgbmV4dCBmb2N1c2FibGUgd2lkZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VySW5kZXggPT0gbGFzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbmRleCA9PSBmaXJzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlVcAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwKSB7CisgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBhIGNsaWNrLCB0aGUgdGV4dCB2aWV3IGdldHMgdGhlIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgcHJlLUlNRSBrZXkgZXZlbnRzLiBCeSBmb3J3YXJkaW5nIHtAbGluayBWaWV3I29uS2V5UHJlSW1lKGludCwgS2V5RXZlbnQpfQorICAgICAqIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLCB2aWV3cyB1c2luZyBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgZGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgKiB3aGVuIHRoZSBiYWNrIGtleSBpcyBwcmVzc2VkLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBrZXlDb2RlIHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlQcmVJbWUKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CisgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgYW5jaG9yVmlldyA9IG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5zdGFydFRyYWNraW5nKGV2ZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5oYW5kbGVVcEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNUcmFja2luZygpICYmICFldmVudC5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAorICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKKyAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKKyAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7CisKKyAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKKyAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdworICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKKyAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgorICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXRBbmNob3JWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwgJiYgdmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0LCAhbU1vZGFsKTsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25MaXN0SGlnaGxpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtSXRlbUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobVNjcm9sbExpc3RlbmVyKTsKKworICAgICAgICAgICAgaWYgKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgIFZpZXcgaGludFZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmIChoaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgYW4gaGludCBoYXMgYmVlbiBzcGVjaWZpZWQsIHdlIGFjY29tb2RhdGUgbW9yZSBzcGFjZSBmb3IgaXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRkIGEgdGV4dCB2aWV3IGluIHRoZSBkcm9wIGRvd24gbWVudSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdAorICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBoaW50Q29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCAwLCAxLjBmCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Qcm9tcHRQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0JFTE9XOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0FCT1ZFOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgaGludCBwb3NpdGlvbiAiICsgbVByb21wdFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgaGludCdzIGhlaWdodCB0byBmaW5kIGhvdyBtdWNoIG1vcmUgdmVydGljYWwgc3BhY2UKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0byB0aGUgZHJvcCBkb3duJ3MgaGVpZ2h0CisgICAgICAgICAgICAgICAgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtRHJvcERvd25XaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7CisKKyAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKworICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gdmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXggaGVpZ2h0IGF2YWlsYWJsZSBvbiB0aGUgc2NyZWVuIGZvciBhIHBvcHVwLgorICAgICAgICBib29sZWFuIGlnbm9yZUJvdHRvbURlY29yYXRpb25zID0KKyAgICAgICAgICAgICAgICBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIGZpbmFsIGludCBtYXhIZWlnaHQgPSBtUG9wdXAuZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KAorICAgICAgICAgICAgICAgIGdldEFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKKworICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAorICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKKyAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7CisgICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207CisgICAgICAgIH0KKworICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKKyAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKKyAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKKyAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7CisKKyAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIGEgTGlzdFZpZXcuIFRoaXMgd3JhcHBlciBjYW4gaGlqYWNrIHRoZSBmb2N1cyB0bworICAgICAqIG1ha2Ugc3VyZSB0aGUgbGlzdCB1c2VzIHRoZSBhcHByb3ByaWF0ZSBkcmF3YWJsZXMgYW5kIHN0YXRlcyB3aGVuCisgICAgICogZGlzcGxheWVkIG9uIHNjcmVlbiB3aXRoaW4gYSBkcm9wIGRvd24uIFRoZSBmb2N1cyBpcyBuZXZlciBhY3R1YWxseQorICAgICAqIHBhc3NlZCB0byB0aGUgZHJvcCBkb3duIGluIHRoaXMgbW9kZTsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTGlzdFBvcHVwV2luZG93LlRBRyArICIuRHJvcERvd25MaXN0VmlldyI7CisgICAgICAgIC8qCisgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHRvdWNoIG1vZGUgaXNzdWUuCisgICAgICAgICAqCisgICAgICAgICAqIFRvdWNoIG1vZGUgaXMgcHJvcGFnYXRlZCBsYXppbHkgdG8gd2luZG93cy4gVGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4KKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKKyAgICAgICAgICogLSBUeXBlIHNvbWV0aGluZyBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgYW5kIGdldCBzb21lIHJlc3VsdHMKKyAgICAgICAgICogLSBNb3ZlIGRvd24gd2l0aCB0aGUgZC1wYWQgdG8gc2VsZWN0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKKyAgICAgICAgICogLSBNb3ZlIHVwIHdpdGggdGhlIGQtcGFkIHVudGlsIHRoZSBzZWxlY3Rpb24gZGlzYXBwZWFycworICAgICAgICAgKiAtIFR5cGUgbW9yZSB0ZXh0IGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyAqdXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQqCisgICAgICAgICAqICAgYW5kIGdldCBuZXcgcmVzdWx0czsgeW91IGFyZSBub3cgaW4gdG91Y2ggbW9kZQorICAgICAgICAgKiAtIFRoZSBzZWxlY3Rpb24gY29tZXMgYmFjayBvbiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCwgZXZlbiB0aG91Z2gKKyAgICAgICAgICogICB0aGUgbGlzdCBpcyBzdXBwb3NlZCB0byBiZSBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqCisgICAgICAgICAqIFVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkIHRyaWdnZXJzIHRoZSB0b3VjaCBtb2RlIGNoYW5nZSBidXQgdGhhdCBjaGFuZ2UKKyAgICAgICAgICogaXMgcHJvcGFnYXRlZCB0byBvdXIgd2luZG93IG9ubHkgYWZ0ZXIgdGhlIGZpcnN0IGxpc3QgbGF5b3V0LCB0aGVyZWZvcmUKKyAgICAgICAgICogYWZ0ZXIgdGhlIGxpc3QgYXR0ZW1wdHMgdG8gcmVzdXJyZWN0IHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSB0cmljayB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGlzIHRvIHByZXRlbmQgdGhlIGxpc3QgaXMgaW4gdG91Y2gKKyAgICAgICAgICogbW9kZSB3aGVuIHdlIGtub3cgdGhhdCB0aGUgc2VsZWN0aW9uIHNob3VsZCBub3QgYXBwZWFyLCB0aGF0IGlzIHdoZW4KKyAgICAgICAgICogd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUgc2VsZWN0aW9uIGF3YXkgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBib29sZWFuIGlzIHNldCB0byB0cnVlIHdoZW5ldmVyIHdlIGV4cGxpY2l0bHkgaGlkZSB0aGUgbGlzdCdzCisgICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbmV2ZXIgd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUKKyAgICAgICAgICogc2VsZWN0aW9uIGJhY2sgdG8gdGhlIGxpc3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gdGhpcyBib29sZWFuIGlzIHRydWUsIGlzSW5Ub3VjaE1vZGUoKSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAorICAgICAgICAgKiByZXR1cm5zIHN1cGVyLmlzSW5Ub3VjaE1vZGUoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdFNlbGVjdGlvbkhpZGRlbjsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoaXMgd3JhcHBlciBzaG91bGQgZmFrZSBmb2N1cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGlqYWNrRm9jdXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGlqYWNrRm9jdXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOworICAgICAgICAgICAgbUhpamFja0ZvY3VzID0gaGlqYWNrRm9jdXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+QXZvaWRzIGphcnJpbmcgc2Nyb2xsaW5nIGVmZmVjdCBieSBlbnN1cmluZyB0aGF0IGxpc3QgZWxlbWVudHMKKyAgICAgICAgICogbWFkZSBvZiBhIHRleHQgdmlldyBmaXQgb24gYSBzaW5nbGUgbGluZS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgaXRlbSBpbmRleCBpbiB0aGUgbGlzdCB0byBnZXQgYSB2aWV3IGZvcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2aWV3IGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBWaWV3IG9idGFpblZpZXcoaW50IHBvc2l0aW9uLCBib29sZWFuW10gaXNTY3JhcCkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gc3VwZXIub2J0YWluVmlldyhwb3NpdGlvbiwgaXNTY3JhcCk7CisKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRIb3Jpem9udGFsbHlTY3JvbGxpbmcodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgcmV0dXJuIChtSGlqYWNrRm9jdXMgJiYgbUxpc3RTZWxlY3Rpb25IaWRkZW4pIHx8IHN1cGVyLmlzSW5Ub3VjaE1vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaGFzV2luZG93Rm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmlzRm9jdXNlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cERhdGFTZXRPYnNlcnZlciBleHRlbmRzIERhdGFTZXRPYnNlcnZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoKSB7CisgICAgICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXNpemUgdGhlIHBvcHVwIHRvIGZpdCBuZXcgY29udGVudAorICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwVG91Y2hJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE9uVG91Y2hMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiAmJgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHggPj0gMCAmJiB4IDwgZ2V0V2lkdGgoKSAmJiB5ID49IDAgJiYgeSA8IGdldEhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAorICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCisgICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCmluZGV4IGVjNmRiYjcuLjBkMGExYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwpAQCAtMzIsOCArMzMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTQxLDYgKzQ2LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtNjUsNiArNzEsNyBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfaGVhZGVyRGl2aWRlcnNFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19mb290ZXJEaXZpZGVyc0VuYWJsZWQKICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBMaXN0VmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGluZGljYXRlIGEgbm8gcHJlZmVyZW5jZSBmb3IgYSBwb3NpdGlvbiB0eXBlLgpAQCAtODcsNiArOTQsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7CiAKICAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcyBpbiBhIG1vZGFsIHNlbGVjdGlvbiBtb2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgPSAzOworCisgICAgLyoqCiAgICAgICogV2hlbiBhcnJvdyBzY3JvbGxpbmcsIExpc3RWaWV3IHdpbGwgbmV2ZXIgc2Nyb2xsIG1vcmUgdGhhbiB0aGlzIGZhY3RvcgogICAgICAqIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIGxpc3QuCiAgICAgICovCkBAIC0xNDQsNyArMTU2LDEyIEBACiAKICAgICAvLyBLZWVwcyBmb2N1c2VkIGNoaWxkcmVuIHZpc2libGUgdGhyb3VnaCByZXNpemVzCiAgICAgcHJpdmF0ZSBGb2N1c1NlbGVjdG9yIG1Gb2N1c1NlbGVjdG9yOwotICAgIAorCisgICAgLy8gQ29udHJvbHMgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwuIG51bGwgd2hlbiBpbmFjdGl2ZS4KKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUNob2ljZUFjdGlvbk1vZGU7CisgICAgcHJpdmF0ZSBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjazsKKyAgICBwcml2YXRlIGludCBtQ2hlY2tlZEl0ZW1Db3VudDsKKwogICAgIHB1YmxpYyBMaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKICAgICB9CkBAIC00MDEsNiArNDE4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLnNldFJlbW90ZVZpZXdzQWRhcHRlcihpbnRlbnQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgYmVoaW5kIHRoaXMgTGlzdFZpZXcuCiAgICAgICoKICAgICAgKiBUaGUgYWRhcHRlciBwYXNzZWQgdG8gdGhpcyBtZXRob2QgbWF5IGJlIHdyYXBwZWQgYnkgYSB7QGxpbmsgV3JhcHBlckxpc3RBZGFwdGVyfSwKQEAgLTQxNSw3ICs0NDIsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpZiAobnVsbCAhPSBtQWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgIH0KIApAQCAtODYzLDYgKzg5MCwyNSBAQAogICAgICAgICByZXR1cm4gdG9wU2VsZWN0aW9uUGl4ZWw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU21vb3RobHkgc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBwb3NpdGlvbi4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU21vb3RobHkgc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBwb3NpdGlvbiBvZmZzZXQuIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFtb3VudCB0byBvZmZzZXQgZnJvbSB0aGUgYWRhcHRlciBwb3NpdGlvbiB0byBzY3JvbGwgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsQnlPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxCeU9mZnNldChvZmZzZXQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZpbGxzIHRoZSBsaXN0IGJhc2VkIG9uIHBvc2l0aW9uaW5nIHRoZSBuZXcgc2VsZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBvbGQKQEAgLTI5NjgsNyArMzAxNCw3IEBACiAgICAgICAgICAgICAvLyBmaWxsIGEgcmVjdCB3aGVyZSB0aGUgZGl2aWRlcnMgd291bGQgYmUgZm9yIG5vbi1zZWxlY3RhYmxlIGl0ZW1zCiAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBvcGFxdWUgYW5kIHRoZSBiYWNrZ3JvdW5kIGlzIGFsc28gb3BhcXVlLCB3ZSBkb24ndAogICAgICAgICAgICAgLy8gbmVlZCB0byBkcmF3IGFueXRoaW5nIHNpbmNlIHRoZSBiYWNrZ3JvdW5kIHdpbGwgZG8gaXQgZm9yIHVzCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBkcmF3RGl2aWRlcnMgJiYgaXNPcGFxdWUoKSAmJiAhc3VwZXIuaXNPcGFxdWUoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZmlsbEZvck1pc3NpbmdEaXZpZGVycyA9IGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CiAKICAgICAgICAgICAgIGlmIChmaWxsRm9yTWlzc2luZ0RpdmlkZXJzICYmIG1EaXZpZGVyUGFpbnQgPT0gbnVsbCAmJiBtSXNDYWNoZUNvbG9yT3BhcXVlKSB7CiAgICAgICAgICAgICAgICAgbURpdmlkZXJQYWludCA9IG5ldyBQYWludCgpOwpAQCAtMjk3OCw3ICszMDI0LDcgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTI5ODcsMTggKzMwMzMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFyZUFsbEl0ZW1zU2VsZWN0YWJsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxsRm9yTWlzc2luZ0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoYm91bmRzLCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGJvdHRvbSArIGRpdmlkZXJIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzAxNCw3ICszMDU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gY2hpbGQuZ2V0VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYgdG9wID4gbGlzdFRvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcCA+IGxpc3RUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFyZUFsbEl0ZW1zU2VsZWN0YWJsZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CkBAIC0zMDM0LDcgKzMwNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA+IDAgJiYgZHJhd0RpdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBzY3JvbGxZID4gMCkgewogICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGxpc3RCb3R0b20gKyBkaXZpZGVySGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwpAQCAtMzMzNSw2ICszMzc5LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgewogICAgICAgICBtQ2hvaWNlTW9kZSA9IGNob2ljZU1vZGU7CisgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQogICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewogICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwpAQCAtMzM0Miw5ICszMzkwLDQ3IEBACiAgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsICYmIG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTW9kYWwgbXVsdGktY2hvaWNlIG1vZGUgb25seSBoYXMgY2hvaWNlcyB3aGVuIHRoZSBtb2RlIGlzIGFjdGl2ZS4gQ2xlYXIgdGhlbS4KKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCkgeworICAgICAgICAgICAgICAgIGNsZWFyQ2hvaWNlcygpOworICAgICAgICAgICAgICAgIHNldExvbmdDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgYSB7QGxpbmsgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRoYXQgd2lsbCBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiB0aGUKKyAgICAgKiBzZWxlY3Rpb24ge0BsaW5rIEFjdGlvbk1vZGV9LiBPbmx5IHVzZWQgd2hlbiB0aGUgY2hvaWNlIG1vZGUgaXMgc2V0IHRvCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCB3aWxsIG1hbmFnZSB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrID0gbmV3IE11bHRpQ2hvaWNlTW9kZVdyYXBwZXIoKTsKKyAgICAgICAgfQorICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2suc2V0V3JhcHBlZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBwZXJmb3JtTG9uZ1ByZXNzKGZpbmFsIFZpZXcgY2hpbGQsCisgICAgICAgICAgICBmaW5hbCBpbnQgbG9uZ1ByZXNzUG9zaXRpb24sIGZpbmFsIGxvbmcgbG9uZ1ByZXNzSWQpIHsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCkgeworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgc2V0SXRlbUNoZWNrZWQobG9uZ1ByZXNzUG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgd2Ugc2VsZWN0IHRoZSBsb25nIHByZXNzZWQgaXRlbSBpZiB3ZSB3ZXJlIGFscmVhZHkgaW4KKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBtb2RlPyAoaS5lLiB0cmVhdCBpdCBsaWtlIGFuIGl0ZW0gY2xpY2s/KQorICAgICAgICAgICAgcGVyZm9ybUhhcHRpY0ZlZWRiYWNrKEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkxPTkdfUFJFU1MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYW5kbGVkIHwgc3VwZXIucGVyZm9ybUxvbmdQcmVzcyhjaGlsZCwgbG9uZ1ByZXNzUG9zaXRpb24sIGxvbmdQcmVzc0lkKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwpAQCAtMzM1Miw3ICszNDM4LDggQEAKICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSB8fAorICAgICAgICAgICAgICAgICAgICAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgJiYgbUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewpAQCAtMzM2Miw3ICszNDQ5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DaG9pY2VBY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobUNob2ljZUFjdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CkBAIC0zMzcxLDcgKzM0NjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDAgfHwgIW1DaGVja1N0YXRlcy52YWx1ZUF0KDApKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CkBAIC0zMzk3LDcgKzM0OTYsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSkgeworICAgICAgICAvLyBTdGFydCBzZWxlY3Rpb24gbW9kZSBpZiBuZWVkZWQuIFdlIGRvbid0IG5lZWQgdG8gaWYgd2UncmUgdW5jaGVja2luZyBzb21ldGhpbmcuCisgICAgICAgIGlmICh2YWx1ZSAmJiBtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IHN0YXJ0QWN0aW9uTW9kZShtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8IG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CiAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB2YWx1ZSk7CiAgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CkBAIC0zNDA2LDYgKzM1MTEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5kZWxldGUobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCB2YWx1ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKICAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKQEAgLTM0MjMsNiArMzU0MCw5IEBACiAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewogICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMCB8fCAhbUNoZWNrU3RhdGVzLnZhbHVlQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzQzNSw2ICszNTU1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZC4gVGhpcyB3aWxsIG9ubHkgYmUgdmFsaWQKKyAgICAgKiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgbm90IHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gKGRlZmF1bHQpLgorICAgICAqIAorICAgICAqIDxwPlRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgaXRlbXMgdGhhdCBhcmUgY3VycmVudGx5IHNlbGVjdGVkLCB1c2Ugb25lIG9mCisgICAgICogdGhlIDxjb2RlPmdldENoZWNrZWQqPC9jb2RlPiBtZXRob2RzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbigpCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKQorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtSWRzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ2hlY2tlZEl0ZW1Db3VudDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQogICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9CiAgICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCkBAIC0zNDk1LDYgKzM2MzIsNyBAQAogICAgICAqICAgICAgICAgCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0Q2hlY2tlZEl0ZW1JZHMoKX0gaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBsb25nW10gZ2V0Q2hlY2tJdGVtSWRzKCkgewogICAgICAgICAvLyBVc2UgbmV3IGJlaGF2aW9yIHRoYXQgY29ycmVjdGx5IGhhbmRsZXMgc3RhYmxlIElEIG1hcHBpbmcuCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CkBAIC0zNTY0LDYgKzM3MDIsNzYgQEAKICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwogICAgICAgICB9CisgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHJlY2VpdmVzIGV2ZW50cyBmb3Ige0BsaW5rIExpc3RWaWV3I0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKiBJdCBhY3RzIGFzIHRoZSB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gZm9yIHRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgYWxzbyByZWNlaXZlcworICAgICAqIHtAbGluayAjb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlLCBpbnQsIGxvbmcsIGJvb2xlYW4pfSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqIHNlbGVjdHMgYW5kIGRlc2VsZWN0cyBsaXN0IGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBvciB1bmNoZWNrZWQgZHVyaW5nIHNlbGVjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUge0BsaW5rIEFjdGlvbk1vZGV9IHByb3ZpZGluZyB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGlkIEFkYXB0ZXIgSUQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGNoZWNrZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbm93IGNoZWNrZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaXRlbSBpcyBub3cgdW5jaGVja2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTXVsdGlDaG9pY2VNb2RlV3JhcHBlciBpbXBsZW1lbnRzIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciBtV3JhcHBlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVkKE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHdyYXBwZWQpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1XcmFwcGVkLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtZW51KSkgeworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY2hlY2tlZCBncmFwaGljIHN0YXRlPworICAgICAgICAgICAgICAgIHNldExvbmdDbGlja2FibGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uUHJlcGFyZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQWN0aW9uSXRlbUNsaWNrZWQobW9kZSwgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICAgICAgbVdyYXBwZWQub25EZXN0cm95QWN0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gbnVsbDsKKworICAgICAgICAgICAgLy8gRW5kaW5nIHNlbGVjdGlvbiBtb2RlIG1lYW5zIGRlc2VsZWN0aW5nIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICBjbGVhckNob2ljZXMoKTsKKworICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisKKyAgICAgICAgICAgIHNldExvbmdDbGlja2FibGUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQsIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgbVdyYXBwZWQub25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChtb2RlLCBwb3NpdGlvbiwgaWQsIGNoZWNrZWQpOworCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgc2VsZWN0ZWQgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHNlbGVjdGlvbiBtb2RlLgorICAgICAgICAgICAgaWYgKGdldENoZWNrZWRJdGVtQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwTWVudS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzcwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQSBQb3B1cE1lbnUgZGlzcGxheXMgYSB7QGxpbmsgTWVudX0gaW4gYSBtb2RhbCBwb3B1cCB3aW5kb3cgYW5jaG9yZWQgdG8gYSB7QGxpbmsgVmlld30uCisgKiBUaGUgcG9wdXAgd2lsbCBhcHBlYXIgYmVsb3cgdGhlIGFuY2hvciB2aWV3IGlmIHRoZXJlIGlzIHJvb20sIG9yIGFib3ZlIGl0IGlmIHRoZXJlIGlzIG5vdC4KKyAqIElmIHRoZSBJTUUgaXMgdmlzaWJsZSB0aGUgcG9wdXAgd2lsbCBub3Qgb3ZlcmxhcCBpdCB1bnRpbCBpdCBpcyB0b3VjaGVkLiBUb3VjaGluZyBvdXRzaWRlCisgKiBvZiB0aGUgcG9wdXAgd2lsbCBkaXNtaXNzIGl0LgorICovCitwdWJsaWMgY2xhc3MgUG9wdXBNZW51IGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgIHByaXZhdGUgVmlldyBtQW5jaG9yOworICAgIHByaXZhdGUgTWVudVBvcHVwSGVscGVyIG1Qb3B1cDsKKyAgICBwcml2YXRlIE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1NZW51SXRlbUNsaWNrTGlzdGVuZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUG9wdXBNZW51LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3IgdGhlIFBvcHVwTWVudS4KKyAgICAgKiBAcGFyYW0gYW5jaG9yIEFuY2hvciB2aWV3IGZvciB0aGlzIHBvcHVwLiBUaGUgcG9wdXAgd2lsbCBhcHBlYXIgYmVsb3cgdGhlIGFuY2hvciBpZiB0aGVyZQorICAgICAqICAgICAgICAgICAgICAgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cE1lbnUoQ29udGV4dCBjb250ZXh0LCBWaWV3IGFuY2hvcikgeworICAgICAgICAvLyBUT0RPIFRoZW1lPworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKGNvbnRleHQpOworICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKKyAgICAgICAgbVBvcHVwID0gbmV3IE1lbnVQb3B1cEhlbHBlcihjb250ZXh0LCBtTWVudSwgYW5jaG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWVudX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcG9wdXAuIFBvcHVsYXRlIHRoZSByZXR1cm5lZCBNZW51IHdpdGgKKyAgICAgKiBpdGVtcyBiZWZvcmUgY2FsbGluZyB7QGxpbmsgI3Nob3coKX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKiBAc2VlICNnZXRNZW51SW5mbGF0ZXIoKQorICAgICAqLworICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgIHJldHVybiBtTWVudTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIE1lbnVJbmZsYXRlcn0gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmZsYXRlIG1lbnUgaXRlbXMgZnJvbSBYTUwgaW50byB0aGUKKyAgICAgKiBtZW51IHJldHVybmVkIGJ5IHtAbGluayAjZ2V0TWVudSgpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldE1lbnUoKQorICAgICAqLworICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdyB0aGUgbWVudSBwb3B1cCBhbmNob3JlZCB0byB0aGUgdmlldyBzcGVjaWZpZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4KKyAgICAgKiBAc2VlICNkaXNtaXNzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBtUG9wdXAuc2hvdygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIG1lbnUgcG9wdXAuCisgICAgICogQHNlZSAjc2hvdygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTWVudUl0ZW1DbGlja0xpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtU2VsZWN0ZWQoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobU1lbnVJdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lci5vbk1lbnVJdGVtQ2xpY2soaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZU1lbnUoTWVudUJ1aWxkZXIgbWVudSwgYm9vbGVhbiBhbGxNZW51c0FyZUNsb3NpbmcpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEN1cnJlbnQgbWVudSB3aWxsIGJlIGRpc21pc3NlZCBieSB0aGUgbm9ybWFsIGhlbHBlciwgc3VibWVudSB3aWxsIGJlIHNob3duIGluIGl0cyBwbGFjZS4KKyAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihtQ29udGV4dCwgc3ViTWVudSwgbUFuY2hvcikuc2hvdygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VTdWJNZW51KFN1Yk1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSByZXNwb25zaWJsZSBmb3IgcmVjZWl2aW5nIG1lbnUgaXRlbSBjbGljayBldmVudHMgaWYgdGhlIGl0ZW1zIHRoZW1zZWx2ZXMKKyAgICAgKiBkbyBub3QgaGF2ZSBpbmRpdmlkdWFsIGl0ZW0gY2xpY2sgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gYSBtZW51IGl0ZW0gaXMgY2xpY2tlZCBpZiB0aGUgaXRlbSBpdHNlbGYgZGlkCisgICAgICAgICAqIG5vdCBhbHJlYWR5IGhhbmRsZSB0aGUgZXZlbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpdGVtIHtAbGluayBNZW51SXRlbX0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhCmluZGV4IDAzNzgzMjguLmI1NjI5NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhCkBAIC0xNiwyNyArMTYsMjggQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlci5PblNjcm9sbENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlci5PblNjcm9sbENoYW5nZWRMaXN0ZW5lcjsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiAvKioKICAqIDxwPkEgcG9wdXAgd2luZG93IHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhbiBhcmJpdHJhcnkgdmlldy4gVGhlIHBvcHVwCkBAIC0xMjEsNyArMTIyLDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1NywxMiArMTU4LDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMzE1LDYgKzEzMjUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBjMGE1NDZkLi4wZjUyZmM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE1LDggKzcxNSw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MjksNiArNzI5LDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCAwN2MzZTRiLi41MGZiYjZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uNTA3NDVkYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhCkBAIC02MCwxMiArNjAsMTIgQEAKICAgICAgKiBUaGUgcGFja2FnZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGxheW91dCAKICAgICAgKiByZXNvdXJjZS4gKEFkZGVkIHRvIHRoZSBwYXJjZWwpCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2U7CiAgICAgCiAgICAgLyoqCiAgICAgICogVGhlIHJlc291cmNlIElEIG9mIHRoZSBsYXlvdXQgZmlsZS4gKEFkZGVkIHRvIHRoZSBwYXJjZWwpCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxheW91dElkOworICAgIHByaXZhdGUgZmluYWwgaW50IG1MYXlvdXRJZDsKIAogICAgIC8qKgogICAgICAqIEFuIGFycmF5IG9mIGFjdGlvbnMgdG8gcGVyZm9ybSBvbiB0aGUgdmlldyB0cmVlIG9uY2UgaXQgaGFzIGJlZW4KQEAgLTI4NSw2ICsyODUsNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzM0OCw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzQwNiw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzQ0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC01NjksNiArNTc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKQEAgLTc2OSw2ICs3NzksMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICs5NTYsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVudChpbnQgdmlld0lkLCBTdHJpbmcgbWV0aG9kTmFtZSwgSW50ZW50IHZhbHVlKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbih2aWV3SWQsIG1ldGhvZE5hbWUsIFJlZmxlY3Rpb25BY3Rpb24uSU5URU5ULCB2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHRoZSB2aWV3IGhpZXJhcmNoeSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCBhbmQgYXBwbGllcwogICAgICAqIGFsbCBvZiB0aGUgYWN0aW9ucy4KICAgICAgKiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmY1ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBBbiBhZGFwdGVyIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlIHdoaWNoIGZldGNoZXMgYW5kIGNhY2hlcyBSZW1vdGVWaWV3cworICogdG8gYmUgbGF0ZXIgaW5mbGF0ZWQgYXMgY2hpbGQgdmlld3MuCisgKi8KKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlJlbW90ZVZpZXdzQWRhcHRlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQ2FjaGUgbVZpZXdDYWNoZTsKKworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIC8vIGl0ZW1zIG1heSBiZSBpbnRlcnJ1cHRlZCB3aXRoaW4gdGhlIG5vcm1hbGx5IHByb2Nlc3NlZCBxdWV1ZXMKKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblF1ZXVlOworICAgIC8vIGl0ZW1zIGFyZSBuZXZlciBkZXF1ZXVlZCBmcm9tIHRoZSBwcmlvcml0eSBxdWV1ZSBhbmQgbXVzdCBydW4KKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclByaW9yaXR5UXVldWU7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1NYWluUHJpb3JpdHlRdWV1ZTsKKworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSBmb3IgdGhlIFJlbW90ZUFkYXB0ZXIgdG8gbm90aWZ5IG90aGVyIGNsYXNzZXMgd2hlbiBhZGFwdGVycworICAgICAqIGFyZSBhY3R1YWxseSBjb25uZWN0ZWQgdG8vZGlzY29ubmVjdGVkIGZyb20gdGhlaXIgYWN0dWFsIHNlcnZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gdGhhdCBnZXRzIHBvcHVsYXRlZCB3aGVuIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgaXMKKyAgICAgKiBib3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uKFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NGYWN0b3J5ID0gSVJlbW90ZVZpZXdzRmFjdG9yeS5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeURhdGFTZXRDaGFuZ2VkIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAgICAgLy8gdmlld3MgYXJlIG5vdCB1cGRhdGVkIHR3aWNlCisgICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGRhdGEsIHRoZW4gY2FsbGJhY2sKKyAgICAgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIHZpZXdUeXBlQ291bnQgc3BlY2lmaWNhbGx5LCBzbyBqdXN0IGdldCBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGUucmVxdWVzdE1ldGFEYXRhKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zdCBhIHJ1bm5hYmxlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIG9uIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBtTWFpblByaW9yaXR5UXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdGFydEJhY2tncm91bmRMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBjbGVhciB0aGUgbWFpbi93b3JrZXIgcXVldWVzCisgICAgICAgICAgICBtTWFpblF1ZXVlLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzdG9wIHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdG9wQmFja2dyb3VuZExvYWRlcigpOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElSZW1vdGVWaWV3c0ZhY3RvcnkgZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgY2FjaGUgb2YgcmVtb3RlIHZpZXdzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NDYWNoZSB7CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NJbmZvIG1WaWV3Q2FjaGVJbmZvOworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzSW5kZXhJbmZvW10gbVZpZXdDYWNoZTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVG1wVmlld0NhY2hlTG9hZEluZGljZXM7CisgICAgICAgIHByaXZhdGUgTGlua2VkTGlzdDxJbnRlZ2VyPiBtVmlld0NhY2hlTG9hZEluZGljZXM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQ7CisKKyAgICAgICAgLy8gaWYgYSB1c2VyIGxvYWRpbmcgdmlldyBpcyBub3QgcHJvdmlkZWQsIHRoZW4gd2UgY3JlYXRlIGEgdGVtcG9yYXJ5IG9uZQorICAgICAgICAvLyBmb3IgdGhlIHVzZXIgdXNpbmcgdGhlIGhlaWdodCBvZiB0aGUgZmlyc3QgdmlldworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG1Vc2VyTG9hZGluZ1ZpZXc7CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3MgbUZpcnN0VmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpcnN0Vmlld0hlaWdodDsKKworICAgICAgICAvLyBkZXRlcm1pbmVzIHdoZW4gdGhlIGN1cnJlbnQgY2FjaGUgd2luZG93IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCBuZXcKKyAgICAgICAgLy8gaXRlbXMgKGllLiB3aGVuIHRoZXJlIGlzIG5vdCBlbm91Z2ggc2xhY2spCisgICAgICAgIHByaXZhdGUgaW50IG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uOworICAgICAgICBwcml2YXRlIGludCBtVmlld0NhY2hlRW5kUG9zaXRpb247CisgICAgICAgIHByaXZhdGUgaW50IG1IYWxmQ2FjaGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtQ2FjaGVTbGFjazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtQ2FjaGVTbGFja1BlcmNlbnRhZ2UgPSAwLjc1ZjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGEgc3RydWN0dXJlIHN0b3JlZCBhdCBlYWNoIGluZGV4IG9mIHRoZSBjYWNoZS4gQW55IG1lbWJlciAKKyAgICAgICAgICogdGhhdCBpcyBub3QgaW52YWxpZGF0ZWQgcGVyc2lzdHMgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGNhY2hlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0luZGV4SW5mbyB7CisgICAgICAgICAgICBGcmFtZUxheW91dCBmbGlwcGVyOworICAgICAgICAgICAgUmVtb3RlVmlld3MgdmlldzsKKyAgICAgICAgICAgIGxvbmcgaXRlbUlkOworICAgICAgICAgICAgaW50IHR5cGVJZDsKKworICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8oKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHNldChSZW1vdGVWaWV3cyB2LCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IHY7CisgICAgICAgICAgICAgICAgaXRlbUlkID0gaWQ7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHlwZUlkID0gdi5nZXRMYXlvdXRJZCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZUlkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIGl0ZW1JZCA9IDA7CisgICAgICAgICAgICAgICAgdHlwZUlkID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAodmlldyAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdGUgYWRhcHRlciBtZXRhZGF0YS4gVXNlZnVsIGZvciB3aGVuIHdlIGhhdmUgdG8gbG9jayBvbiBzb21ldGhpbmcKKyAgICAgICAgICogYmVmb3JlIHVwZGF0aW5nIHRoZSBtZXRhZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NJbmZvIHsKKyAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgIGludCB2aWV3VHlwZUNvdW50OworICAgICAgICAgICAgYm9vbGVhbiBoYXNTdGFibGVJZHM7CisgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbVR5cGVJZEluZGV4TWFwOworCisgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8oKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGR1bW15IHZpZXcgdHlwZQorICAgICAgICAgICAgICAgIHZpZXdUeXBlQ291bnQgPSAxOworICAgICAgICAgICAgICAgIGhhc1N0YWJsZUlkcyA9IHRydWU7CisgICAgICAgICAgICAgICAgbVR5cGVJZEluZGV4TWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0NhY2hlKGludCBoYWxmQ2FjaGVTaXplKSB7CisgICAgICAgICAgICBtSGFsZkNhY2hlU2l6ZSA9IGhhbGZDYWNoZVNpemU7CisgICAgICAgICAgICBtQ2FjaGVTbGFjayA9IE1hdGgucm91bmQobUNhY2hlU2xhY2tQZXJjZW50YWdlICogbUhhbGZDYWNoZVNpemUpOworICAgICAgICAgICAgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPSAwOworICAgICAgICAgICAgbVZpZXdDYWNoZUVuZFBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUKKyAgICAgICAgICAgIGludCBjYWNoZVNpemUgPSAyICogbUhhbGZDYWNoZVNpemUgKyAxOworICAgICAgICAgICAgbVZpZXdDYWNoZUluZm8gPSBuZXcgUmVtb3RlVmlld3NJbmZvKCk7CisgICAgICAgICAgICBtVmlld0NhY2hlID0gbmV3IFJlbW90ZVZpZXdzSW5kZXhJbmZvW2NhY2hlU2l6ZV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3Q2FjaGUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldID0gbmV3IFJlbW90ZVZpZXdzSW5kZXhJbmZvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVG1wVmlld0NhY2hlTG9hZEluZGljZXMgPSBuZXcgaW50W2NhY2hlU2l6ZV07CisgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRhaW5zKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIChtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA8PSBwb3NpdGlvbikgJiYgKHBvc2l0aW9uIDw9IG1WaWV3Q2FjaGVFbmRQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29udGFpbnNBbmRJc1ZhbGlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvIGluZGV4SW5mbyA9IG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChwb3NpdGlvbildOworICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGdldENhY2hlSW5kZXgoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyB0YWtlIHRoZSBtb2R1bG8gb2YgdGhlIHBvc2l0aW9uCisgICAgICAgICAgICByZXR1cm4gKG1WaWV3Q2FjaGUubGVuZ3RoICsgKHBvc2l0aW9uICUgbVZpZXdDYWNoZS5sZW5ndGgpKSAlIG1WaWV3Q2FjaGUubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdE1ldGFEYXRhKCkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgSVJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbVNlcnZpY2VDb25uZWN0aW9uLmdldFJlbW90ZVZpZXdzRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvcGVydGllcy9maXJzdCB2aWV3IChzbyB0aGF0IHdlIGNhbiB1c2UgaXQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSBvdXIgZHVtbXkgdmlld3MpCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzID0gZmFjdG9yeS5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZpZXdUeXBlQ291bnQgPSBmYWN0b3J5LmdldFZpZXdUeXBlQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZmFjdG9yeS5nZXRDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3cyBsb2FkaW5nVmlldyA9IGZhY3RvcnkuZ2V0TG9hZGluZ1ZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgZmlyc3RWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjb3VudCA+IDApICYmIChsb2FkaW5nVmlldyA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3ID0gZmFjdG9yeS5nZXRWaWV3QXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmZvIGluZm8gPSBtVmlld0NhY2hlSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uaGFzU3RhYmxlSWRzID0gaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52aWV3VHlwZUNvdW50ID0gdmlld1R5cGVDb3VudCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtVXNlckxvYWRpbmdWaWV3ID0gbG9hZGluZ1ZpZXc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3ID0gZmlyc3RWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFZpZXdIZWlnaHQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVtb3RlVmlld3NJbmZvKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgSVJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbVNlcnZpY2VDb25uZWN0aW9uLmdldFJlbW90ZVZpZXdzRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgaXRlbSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIGxvbmcgaXRlbUlkID0gMDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZW1vdGVWaWV3ID0gZmFjdG9yeS5nZXRWaWV3QXQocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBpdGVtSWQgPSBmYWN0b3J5LmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB0aGUgd2luZG93IGhhcyBtb3ZlZAorICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiB8fCBwb3NpdGlvbiA+IG1WaWV3Q2FjaGVFbmRQb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb25JbmRleCA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2FjaGVJbmRleCA9IGdldENhY2hlSW5kZXgocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2NhY2hlSW5kZXhdLnNldChyZW1vdGVWaWV3LCBpdGVtSWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgd2hlbiBkb25lIGxvYWRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gZmx1c2ggcGVuZGluZyB1cGRhdGVzCisgICAgICAgICAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FwIHRoZSBsb2FkZXIgdmlldyBmb3IgdGhpcyB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb25JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvIGluZGV4SW5mbyA9IG1WaWV3Q2FjaGVbY2FjaGVJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbGlwcGVyID0gaW5kZXhJbmZvLmZsaXBwZXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmxpcHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KDApLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkTmV3VmlldyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxpcHBlci5nZXRDaGlsZENvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB2ID0gZmxpcHBlci5nZXRDaGlsZEF0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlSWQgPSAoKEludGVnZXIpIHYuZ2V0VGFnKCkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVJZCA9PSBpbmRleEluZm8udHlwZUlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiByZWFwcGx5IHNpbmNlIGl0IGlzIHRoZSBzYW1lIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJbmZvLnZpZXcucmVhcHBseShtQ29udGV4dCwgdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5nZXRBbmltYXRpb24oKSAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuYnVpbGREcmF3aW5nQ2FjaGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmV3VmlldyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIucmVtb3ZlVmlld0F0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGROZXdWaWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB2ID0gaW5kZXhJbmZvLnZpZXcuYXBwbHkobUNvbnRleHQsIGZsaXBwZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuc2V0VGFnKG5ldyBJbnRlZ2VyKGluZGV4SW5mby50eXBlSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmFkZFZpZXcodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NJbmRleEluZm8gcmVxdWVzdENhY2hlZEluZGV4SW5mbyhmaW5hbCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGludCBpbmRpY2VzVG9Mb2FkQ291bnQgPSAwOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGluZm8gaWYgaXQgZXhpc3RzIGluIHRoZSB3aW5kb3cgYW5kIGlzIGxvYWRlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5IHVwZGF0ZSB0aGUgd2luZG93IGFuZCBsb2FkIHRoZSBuZXcgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBpbnQgY2VudGVyUG9zaXRpb24gPSAobVZpZXdDYWNoZUVuZFBvc2l0aW9uICsgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24pIC8gMjsKKyAgICAgICAgICAgICAgICBpZiAoKG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA8PSBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbikgfHwgKE1hdGguYWJzKHBvc2l0aW9uIC0gY2VudGVyUG9zaXRpb24pID4gbUNhY2hlU2xhY2spKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdTdGFydFBvc2l0aW9uID0gcG9zaXRpb24gLSBtSGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0VuZFBvc2l0aW9uID0gcG9zaXRpb24gKyBtSGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IG1IYWxmQ2FjaGVTaXplIC8gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgPSAoaW50KSBNYXRoLmNlaWwobVZpZXdDYWNoZS5sZW5ndGggLyAoZmxvYXQpIGZyYW1lU2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJ1bmUvYWRkIGJlZm9yZSB0aGUgY3VycmVudCBzdGFydCBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICBpbnQgZWZmZWN0aXZlU3RhcnQgPSBNYXRoLm1heChuZXdTdGFydFBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZUVuZCA9IE1hdGgubWluKG5ld0VuZFBvc2l0aW9uLCBnZXRDb3VudCgpIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBpdGVtcyBpbiB0aGUgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJsYXBTdGFydCA9IE1hdGgubWF4KG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uLCBlZmZlY3RpdmVTdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGludCBvdmVybGFwRW5kID0gTWF0aC5taW4oTWF0aC5tYXgobVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24sIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiksIGVmZmVjdGl2ZUVuZCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGZyYW1lU2l6ZSAqIGZyYW1lQ291bnQpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG5ld1N0YXJ0UG9zaXRpb24gKyAoKGkgJSBmcmFtZVNpemUpICogZnJhbWVDb3VudCArIChpIC8gZnJhbWVTaXplKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8PSBuZXdFbmRQb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob3ZlcmxhcFN0YXJ0IDw9IGluZGV4KSAmJiAoaW5kZXggPD0gb3ZlcmxhcEVuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgc3R1ZmYgaW4gdGhlIG1pZGRsZSB0aGF0IGhhcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGxvYWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChpbmRleCldLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzW2luZGljZXNUb0xvYWRDb3VudCsrXSA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0aXZlU3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSBlZmZlY3RpdmVFbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgYW5kIGxvYWQgYWxsIG5ldyBlZmZlY3RpdmUgaXRlbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KGluZGV4KV0uaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG1wVmlld0NhY2hlTG9hZEluZGljZXNbaW5kaWNlc1RvTG9hZENvdW50KytdID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBhbGwgb3RoZXIgY2FjaGUgaW5kaWNlcyAob3V0c2lkZSB0aGUgZWZmZWN0aXZlIHN0YXJ0L2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGRvbid0IGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KGluZGV4KV0uaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uID0gbmV3U3RhcnRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUVuZFBvc2l0aW9uID0gbmV3RW5kUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwb3N0IGl0ZW1zIHRvIGJlIGxvYWRlZAorICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gbVZpZXdDYWNoZUluZm8uY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kaWNlc1RvTG9hZENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGljZXNUb0xvYWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtVG1wVmlld0NhY2hlTG9hZEluZGljZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5hZGRMYXN0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmV0dXJuIG51bGwgc28gdGhhdCBhIGR1bW15IHZpZXcgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBmbGlwcGVyIHZpZXdzIGlmIG5lY2Vzc2FyeSAod2UgaGF2ZSB0byBkbyB0aGlzIG5vdworICAgICAgICAgICAgICAgIC8vIGZvciBhbGwgdGhlIGZsaXBwZXJzIHdoaWxlIHdlIGhhdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50KQorICAgICAgICAgICAgICAgIGluaXRpYWxpemVMb2FkaW5nVmlld3MocGFyZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlIGl0ZW0gZnJvbSB0aGUgY2FjaGUgKHF1ZXVlaW5nIGl0IHRvIGxvYWQgaWYgbm90CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhY2hlIGFscmVhZHkpCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8gaW5kZXhJbmZvID0gcmVxdWVzdENhY2hlZEluZGV4SW5mbyhwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZsaXBwZXIgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVJbmRleCA9IGdldENhY2hlSW5kZXgocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbGlwcGVyID0gbVZpZXdDYWNoZVtjYWNoZUluZGV4XS5mbGlwcGVyOworICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5zZXRBbHBoYSgxLjBmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgdGhlIGl0ZW0gdmlldyBhbmQgc2hvdyB0aGUgbG9hZGluZyB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoMCkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmbGlwcGVyLmdldENoaWxkQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KGkpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgdGhlIGxvYWRpbmcgdmlldyBhbmQgc2hvdyB0aGUgaXRlbSB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KGkpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdChmbGlwcGVyLmdldENoaWxkQ291bnQoKSAtIDEpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxpcHBlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMb2FkaW5nVmlld3MoVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGNhY2hlIGhhcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCBmbGlwcGVyCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVZpZXdDYWNoZVswXS5mbGlwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld0NhY2hlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbGlwcGVyID0gbmV3IEZyYW1lTGF5b3V0KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVXNlckxvYWRpbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHVzZXItc3BlY2lmaWVkIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuYWRkVmlldyhtVXNlckxvYWRpbmdWaWV3LmFwcGx5KG1Db250ZXh0LCBwYXJlbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBmaXJzdCByb3cgZm9yIHRoZSBsb2FkZXIgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFZpZXdIZWlnaHQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IGZpcnN0VmlldyA9IG1GaXJzdFZpZXcuYXBwbHkobUNvbnRleHQsIHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXcubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFZpZXdIZWlnaHQgPSBmaXJzdFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhIG5ldyBsb2FkZXIgYW5kIGFkZCBpdCB0byB0aGUgZmxpcHBlciBhcyB0aGUgZmFsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0VmlldyhtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgiTG9hZGluZy4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEhlaWdodChtRmlyc3RWaWV3SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwgfCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dFNpemUoMTguMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHRDb2xvcihDb2xvci5hcmdiKDk2LCAyNTUsIDI1NSwgMjU1KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0U2hhZG93TGF5ZXIoMi4wZiwgMC4wZiwgMS4wZiwgQ29sb3IuQkxBQ0spOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5hZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbaV0uZmxpcHBlciA9IGZsaXBwZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEJhY2tncm91bmRMb2FkZXIoKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSB3b3JrZXIgcnVubmFibGUKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBtV29ya2VyUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobUJhY2tncm91bmRMb2FkZXJFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVmlld0NhY2hlTG9hZEluZGljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbVZpZXdDYWNoZUxvYWRJbmRpY2VzLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgbm8gaXRlbXMgdG8gbG9hZCwgc28gc2xlZXAgZm9yIGEgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyeSBhbmQgbG9hZCB0aGUgaXRlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlbW90ZVZpZXdzSW5mbyhpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQgdG8gYWxsb3cgdGhpbmdzIHRvIGNhdGNoIHVwIGFmdGVyIHRoZSBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wQmFja2dyb3VuZExvYWRlcigpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS5pdGVtSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHRvIGVuc3VyZSB0aGF0IHRoZSB0eXBlIGlkL2luZGV4IG1hcCBpcyB1cGRhdGVkIHN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2aWV3SWQgPSBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS50eXBlSWQ7CisgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0eXBlTWFwID0gbVZpZXdDYWNoZUluZm8ubVR5cGVJZEluZGV4TWFwOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSArMSBiZWNhdXNlIHRoZSBkZWZhdWx0IGR1bW15IHZpZXcgZ2V0IHZpZXcgdHlwZSAwCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KHZpZXdJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTWFwLmdldCh2aWV3SWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0luZGV4ID0gdHlwZU1hcC5zaXplKCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcC5wdXQodmlld0lkLCBuZXdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgaXRlbQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlSW5mby5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8udmlld1R5cGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8uaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2hDYWNoZSgpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBpbnRlcm5hbCBjYWNoZSBhbmQgaW52YWxpZGF0ZSB0aGUgYWRhcHRlciBmb3IgZnV0dXJlIGxvYWRzCisgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUVuZFBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NBZGFwdGVyKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlJlbW90ZVZpZXdzQ2FjaGUtbG9hZGVyIik7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVdvcmtlclF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1NYWluUHJpb3JpdHlRdWV1ZSA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZSBhbmQgdGhlIHNlcnZpY2UgY29ubmVjdGlvbiBvbiBzdGFydHVwCisgICAgICAgIG1WaWV3Q2FjaGUgPSBuZXcgUmVtb3RlVmlld3NDYWNoZSgyNSk7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihjYWxsYmFjayk7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHRvIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlIHdoZW4gZmluYWxpemluZworICAgICAgICB1bmJpbmRTZXJ2aWNlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAvLyBkaXNhbGxvdyBhcmJpdHJhcnkgb2JqZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtIGZvciB0aGUgdGltZSBiZWluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKGludCBwb3NpdGlvbikgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0SXRlbVZpZXdUeXBlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudCgpIDw9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIC8vIGZsdXNoIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiByZWxvYWQgbmV3IGl0ZW1zIGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgbVZpZXdDYWNoZS5mbHVzaENhY2hlKCk7CisgICAgICAgIHN1cGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVlc3RCaW5kU2VydmljZSgpIHsKKyAgICAgICAgLy8gdHJ5IGJpbmRpbmcgdGhlIHNlcnZpY2UgKHdoaWNoIHdpbGwgc3RhcnQgaXQgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nKQorICAgICAgICBpZiAoIW1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC5iaW5kU2VydmljZShtSW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuYmluZFNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBUaGUgc2VydmljZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIGEgcmVtb3RlIGFkYXB0ZXIgdG8gcmVxdWVzdCBSZW1vdGVWaWV3cy4gIFVzZXJzIHNob3VsZAorICogZXh0ZW5kIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgUmVtb3RlVmlld3NGYWN0b3J5J3MgdXNlZCB0bworICogcG9wdWxhdGUgdGhlIHJlbW90ZSBjb2xsZWN0aW9uIHZpZXcgKExpc3RWaWV3LCBHcmlkVmlldywgZXRjKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbW90ZVZpZXdzU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiUmVtb3RlVmlld3NTZXJ2aWNlIjsKKworICAgIC8vIG11bHRpbWFwIGltcGxlbWVudGF0aW9uIGZvciByZWZlcmVuY2UgY291bnRpbmcKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZW50LCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+IG1SZW1vdGVWaWV3RmFjdG9yaWVzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBhbiBhZGFwdGVyIGJldHdlZW4gYSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykgYW5kCisgICAgICogdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhhdCB2aWV3LiAgVGhlIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBSZW1vdGVWaWV3CisgICAgICogZm9yIGVhY2ggaXRlbSBpbiB0aGUgZGF0YSBzZXQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpOworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKTsKKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCk7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCk7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwcml2YXRlIHByb3h5IGNsYXNzIGZvciB0aGUgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZSB0aHJvdWdoIHRoZQorICAgICAqIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnkgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlciBleHRlbmRzIElSZW1vdGVWaWV3c0ZhY3RvcnkuU3R1YiB7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldFZpZXdBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3QXQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0ZhY3RvcnkgbUZhY3Rvcnk7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVZpZXdzU2VydmljZSgpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMgPSBuZXcgSGFzaE1hcDxJbnRlbnQsIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGUgcGFydGljdWxhciBmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVudAorICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IGZhY3RvcnlSZWYgPSBudWxsOworICAgICAgICAgICAgUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgaWYgKCFtUmVtb3RlVmlld0ZhY3Rvcmllcy5jb250YWluc0tleShpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9uR2V0Vmlld0ZhY3RvcnkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVmID0gbmV3IFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPihmYWN0b3J5LCAxKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5Lm9uQ3JlYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBvbGRGYWN0b3J5UmVmID0gbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9sZEZhY3RvcnlSZWYuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlZkNvdW50ID0gb2xkRmFjdG9yeVJlZi5zZWNvbmQuaW50VmFsdWUoKSArIDE7CisgICAgICAgICAgICAgICAgZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgIG1SZW1vdGVWaWV3RmFjdG9yaWVzLnB1dChpbnRlbnQsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKGZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoaW50ZW50KSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsZXZpYXRlcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG9mIGhhdmluZyB0byBjbGVhciBhbGwgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPSBtUmVtb3RlVmlld0ZhY3Rvcmllcy5nZXQoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVmQ291bnQgPSBvbGRGYWN0b3J5UmVmLnNlY29uZC5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRGYWN0b3J5UmVmLmZpcnN0Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5yZW1vdmUoaW50ZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4gZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgc2VydmljZSB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWN0b3JpZXMgZm9yCisgICAgICogdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGM5YzIxN2EuLmFlZTQxMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTM2LDkgKzM2LDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNTEsOSArNTAsOCBAQAogICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgU2ltcGxlTGlzdEl0ZW1GYWN0b3J5IGlzIHJ1bm5pbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKICAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCiAgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAogICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCkBAIC02OSw2ICs2NywyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZworICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCisgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjLCBmbGFncyk7CisgICAgICAgIG1MYXlvdXQgPSBtRHJvcERvd25MYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHZpZXcocykgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLgogICAgICAqIAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciNuZXdWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKaW5kZXggN2QzNDU5ZS4uZDFjMjI3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC02Miw3ICs2Miw4IEBACiAgICAgcHJpdmF0ZSBpbnQgbVN0cmluZ0NvbnZlcnNpb25Db2x1bW4gPSAtMTsKICAgICBwcml2YXRlIEN1cnNvclRvU3RyaW5nQ29udmVydGVyIG1DdXJzb3JUb1N0cmluZ0NvbnZlcnRlcjsKICAgICBwcml2YXRlIFZpZXdCaW5kZXIgbVZpZXdCaW5kZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtT3JpZ2luYWxGcm9tOworCisgICAgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKaW5kZXggMmY2ZGQxZS4uNjBlODU2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiAKQEAgLTM3LDEwICszOCwyMSBAQAogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgU3Bpbm5lciBleHRlbmRzIEFic1NwaW5uZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3Bpbm5lciI7CiAgICAgCi0gICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVByb21wdDsKLSAgICBwcml2YXRlIEFsZXJ0RGlhbG9nIG1Qb3B1cDsKLQorICAgIC8qKgorICAgICAqIFVzZSBhIGRpYWxvZyB3aW5kb3cgZm9yIHNlbGVjdGluZyBzcGlubmVyIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ESUFMT0cgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSBhIGRyb3Bkb3duIGFuY2hvcmVkIHRvIHRoZSBTcGlubmVyIGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRFJPUERPV04gPSAxOworICAgIAorICAgIHByaXZhdGUgU3Bpbm5lclBvcHVwIG1Qb3B1cDsKKyAgICBwcml2YXRlIERyb3BEb3duQWRhcHRlciBtVGVtcEFkYXB0ZXI7CisgICAgCiAgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQpAQCAtNTUsOSArNjcsNTQgQEAKICAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXIsIGRlZlN0eWxlLCAwKTsKICAgICAgICAgCi0gICAgICAgIG1Qcm9tcHQgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3Byb21wdCk7CisgICAgICAgIGZpbmFsIGludCBtb2RlID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9zcGlubmVyTW9kZSwKKyAgICAgICAgICAgICAgICBNT0RFX0RJQUxPRyk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX0RJQUxPRzogeworICAgICAgICAgICAgbVBvcHVwID0gbmV3IERpYWxvZ1BvcHVwKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FzZSBNT0RFX0RST1BET1dOOiB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwUHJvbXB0VmlldywgMCk7CisKKyAgICAgICAgICAgIERyb3Bkb3duUG9wdXAgcG9wdXAgPSBuZXcgRHJvcGRvd25Qb3B1cChjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGhpbnRSZXNvdXJjZSk7CisKKyAgICAgICAgICAgIHBvcHVwLnNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwQmFja2dyb3VuZCkpOworICAgICAgICAgICAgcG9wdXAuc2V0VmVydGljYWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwKSk7CisKKyAgICAgICAgICAgIG1Qb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQoYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBCYXNlIGNvbnN0cnVjdG9yIGNhbiBjYWxsIHNldEFkYXB0ZXIgYmVmb3JlIHdlIGluaXRpYWxpemUgbVBvcHVwLgorICAgICAgICAvLyBGaW5pc2ggc2V0dGluZyB0aGluZ3MgdXAgaWYgdGhpcyBoYXBwZW5lZC4KKyAgICAgICAgaWYgKG1UZW1wQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtVGVtcEFkYXB0ZXIpOworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICBpZiAobVBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTk0LDggKzI1MSw2IEBACiAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICB9CiAKLQotCiAgICAgLyoqCiAgICAgICogSGVscGVyIGZvciBtYWtlQW5kQWRkVmlldyB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIGEgdmlldwogICAgICAqIGFuZCBmaWxsIG91dCBpdHMgbGF5b3V0IHBhcmFtdGVycy4KQEAgLTI0NiwxNSArMzAxLDEwIEBACiAgICAgICAgIAogICAgICAgICBpZiAoIWhhbmRsZWQpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBEcm9wRG93bkFkYXB0ZXIgYWRhcHRlciA9IG5ldyBEcm9wRG93bkFkYXB0ZXIoZ2V0QWRhcHRlcigpKTsKIAotICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAobVByb21wdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShtUHJvbXB0KTsKKyAgICAgICAgICAgIGlmICghbVBvcHVwLmlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qb3B1cCA9IGJ1aWxkZXIuc2V0U2luZ2xlQ2hvaWNlSXRlbXMoYWRhcHRlciwgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSwgdGhpcykuc2hvdygpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CkBAIC0yNzEsNyArMzIxLDcgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0IHRoZSBwcm9tcHQgdG8gc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0KENoYXJTZXF1ZW5jZSBwcm9tcHQpIHsKLSAgICAgICAgbVByb21wdCA9IHByb21wdDsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQocHJvbXB0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3OSwxNCArMzI5LDE0IEBACiAgICAgICogQHBhcmFtIHByb21wdElkIHRoZSByZXNvdXJjZSBJRCBvZiB0aGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0SWQoaW50IHByb21wdElkKSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCk7CisgICAgICAgIHNldFByb21wdChnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UHJvbXB0KCkgewotICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIaW50VGV4dCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM4NCw0ICs0MzQsMTIzIEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnQoKSA9PSAwOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgc29tZSBzb3J0IG9mIHBvcHVwIHNlbGVjdGlvbiBpbnRlcmZhY2UgZm9yIHNlbGVjdGluZyBhIHNwaW5uZXIgb3B0aW9uLgorICAgICAqIEFsbG93cyBmb3IgZGlmZmVyZW50IHNwaW5uZXIgbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG93IHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3MgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgaGludCB0ZXh0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4gVGhpcyBzaG91bGQgcHJvdmlkZQorICAgICAgICAgKiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaG9pY2UgYmVpbmcgbWFkZS4KKyAgICAgICAgICogQHBhcmFtIGhpbnRUZXh0IEhpbnQgdGV4dCB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCk7CisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEaWFsb2dQb3B1cCBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCwgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1MaXN0QWRhcHRlcjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVByb21wdDsKKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvcHVwICE9IG51bGwgPyBtUG9wdXAuaXNTaG93aW5nKCkgOiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgbUxpc3RBZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtUHJvbXB0ID0gaGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKG1MaXN0QWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSwgdGhpcykuc2hvdygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERyb3Bkb3duUG9wdXAgZXh0ZW5kcyBMaXN0UG9wdXBXaW5kb3cgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAgeworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtSGludFRleHQ7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OworICAgICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOworICAgICAgICAKKyAgICAgICAgcHVibGljIERyb3Bkb3duUG9wdXAoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsCisgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzLCBpbnQgaGludFJlc291cmNlKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgMCwgZGVmU3R5bGVSZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtSGludFJlc291cmNlID0gaGludFJlc291cmNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRBbmNob3JWaWV3KFNwaW5uZXIudGhpcyk7CisgICAgICAgICAgICBzZXRNb2RhbCh0cnVlKTsKKyAgICAgICAgICAgIHNldFByb21wdFBvc2l0aW9uKFBPU0lUSU9OX1BST01QVF9CRUxPVyk7CisgICAgICAgICAgICBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBPbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3Bpbm5lci50aGlzLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtSGludFRleHQgPSBoaW50VGV4dDsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IaW50Vmlldy5zZXRUZXh0KGhpbnRUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgc2V0UHJvbXB0Vmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gdGV4dFZpZXc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5zaG93KCk7CisgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKKyAgICAgICAgICAgIHNldFNlbGVjdGlvbihTcGlubmVyLnRoaXMuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkNDRkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuamF2YQpAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworQFJlbW90ZVZpZXcKKy8qKgorICogQSB2aWV3IHRoYXQgZGlzcGxheXMgaXRzIGNoaWxkcmVuIGluIGEgc3RhY2sgYW5kIGFsbG93cyB1c2VycyB0byBkaXNjcmV0ZWx5IHN3aXBlCisgKiB0aHJvdWdoIHRoZSBjaGlsZHJlbi4KKyAqLworcHVibGljIGNsYXNzIFN0YWNrVmlldyBleHRlbmRzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGFja1ZpZXciOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBhbmltYXRpb24gcGFyYW1ldGVycworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OID0gNDAwOworICAgIHByaXZhdGUgZmluYWwgaW50IE1JTklNVU1fQU5JTUFUSU9OX0RVUkFUSU9OID0gNTA7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgZ2VzdHVyZSBzdGF0ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBHRVNUVVJFX05PTkUgPSAwOworICAgIHByaXZhdGUgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfVVAgPSAxOworICAgIHByaXZhdGUgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfRE9XTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaG93IGZhciB5b3UgbmVlZCB0byBzd2lwZSAodXAgb3IgZG93bikgYmVmb3JlIGl0CisgICAgICogd2lsbCBiZSBjb25zaWRlciBhIGNvbXBsZXRlZCBnZXN0dXJlIHdoZW4geW91IGxpZnQgeW91ciBmaW5nZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IFNXSVBFX1RIUkVTSE9MRF9SQVRJTyA9IDAuMzVmOworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgU0xJREVfVVBfUkFUSU8gPSAwLjdmOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4gbVJvdGF0aW9ucyA9IG5ldyBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFZpZXcsIEludGVnZXI+CisgICAgICAgICAgICBtQ2hpbGRyZW5Ub0FwcGx5VHJhbnNmb3Jtc1RvID0gbmV3IFdlYWtIYXNoTWFwPFZpZXcsIEludGVnZXI+KCk7CisKKyAgICAvKioKKyAgICAgKiBTZW50aW5lbCB2YWx1ZSBmb3Igbm8gY3VycmVudCBhY3RpdmUgcG9pbnRlci4KKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjbUFjdGl2ZVBvaW50ZXJJZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGFyZSBhbGwgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0b3VjaCBpbnRlcmFjdGlvbgorICAgICAqIHdpdGggdGhlIHN0YWNrCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1HZXN0dXJlQ29tcGxldGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZsb2F0IG1Jbml0aWFsWTsKKyAgICBwcml2YXRlIGZsb2F0IG1Jbml0aWFsWDsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkOworICAgIHByaXZhdGUgaW50IG1ZT2Zmc2V0ID0gMDsKKyAgICBwcml2YXRlIGludCBtWVZlbG9jaXR5ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICBwcml2YXRlIGludCBtVmlld0hlaWdodDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoU2xvcDsKKyAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OworICAgIHByaXZhdGUgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUZpcnN0TGF5b3V0SGFwcGVuZWQgPSBmYWxzZTsKKworICAgIC8vIFRPRE86IHRlbXAgaGFjayB0byBnZXQgdGhpcyB0aGluZyBzdGFydGVkCisgICAgaW50IG1JbmRleCA9IDU7CisKKyAgICBwdWJsaWMgU3RhY2tWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdFN0YWNrVmlldygpOworICAgIH0KKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRTdGFja1ZpZXcoKSB7CisgICAgICAgIGNvbmZpZ3VyZVZpZXdBbmltYXRvcig0LCAyKTsKKyAgICAgICAgc2V0U3RhdGljVHJhbnNmb3JtYXRpb25zRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IFZpZXdDb25maWd1cmF0aW9uLmdldChnZXRDb250ZXh0KCkpOworICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsvLyArIDU7CisgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5pbWF0ZSB0aGUgdmlld3MgYmV0d2VlbiBkaWZmZXJlbnQgcmVsYXRpdmUgaW5kZXhlcyB3aXRoaW4gdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIHZvaWQgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IDApIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBpbgorICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QWxwaGEoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgZmFkZUluID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgIHZpZXcsICJhbHBoYSIsIHZpZXcuZ2V0QWxwaGEoKSwgMS4wZik7CisgICAgICAgICAgICBmYWRlSW4uc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSAmJiB0b0luZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDIpIHsKKyAgICAgICAgICAgIC8vIFNsaWRlIGl0ZW0gaW4KKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBsYXJnZXN0RHVyYXRpb24gPSAoaW50KSBNYXRoLnJvdW5kKAorICAgICAgICAgICAgICAgICAgICAobHAudmVydGljYWxPZmZzZXQqMS4wZi8tbVZpZXdIZWlnaHQpKkRFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKDAgLSBscC52ZXJ0aWNhbE9mZnNldCkvTWF0aC5hYnMobVlWZWxvY2l0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR1cmF0aW9uID0gTWF0aC5taW4oZHVyYXRpb24sIGxhcmdlc3REdXJhdGlvbik7CisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KGR1cmF0aW9uLCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVEb3duID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGxwLAorICAgICAgICAgICAgICAgICAgICAidmVydGljYWxPZmZzZXQiLCBscC52ZXJ0aWNhbE9mZnNldCwgMCk7CisgICAgICAgICAgICBzbGlkZURvd24uc3RhcnQoKTsKKworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBmYWRlSW4gPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgdmlldywKKyAgICAgICAgICAgICAgICAgICAgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBsYXJnZXN0RHVyYXRpb24gPSAoaW50KSBNYXRoLnJvdW5kKAorICAgICAgICAgICAgICAgICAgICAoMSAtIChscC52ZXJ0aWNhbE9mZnNldCoxLjBmLy1tVmlld0hlaWdodCkpKkRFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKGxwLnZlcnRpY2FsT2Zmc2V0ICsgbVZpZXdIZWlnaHQpL01hdGguYWJzKG1ZVmVsb2NpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWluKGR1cmF0aW9uLCBsYXJnZXN0RHVyYXRpb24pOworICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04pOworCisgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHNsaWRlVXAgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgbHAsCisgICAgICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbE9mZnNldCIsIGxwLnZlcnRpY2FsT2Zmc2V0LCAtbVZpZXdIZWlnaHQpOworICAgICAgICAgICAgc2xpZGVVcC5zdGFydCgpOworCisgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIGZhZGVPdXQgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgdmlldywKKyAgICAgICAgICAgICAgICAgICAgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAwLjBmKTsKKyAgICAgICAgICAgIGZhZGVPdXQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXggPT0gLTEgJiYgdG9JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB2aWV3IHRoYXQgaXMgIndhaXRpbmcgaW4gdGhlIHdpbmdzIiBpcyBpbnZpc2libGUKKyAgICAgICAgICAgIHZpZXcuc2V0QWxwaGEoMC4wZik7CisgICAgICAgIH0gZWxzZSBpZiAodG9JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgLy8gRmFkZSBpdGVtIG91dAorICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBmYWRlT3V0ID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgIHZpZXcsICJhbHBoYSIsIHZpZXcuZ2V0QWxwaGEoKSwgMCk7CisgICAgICAgICAgICBmYWRlT3V0LnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSBhbnkgbmVjZXNzYXJ5IHRyYW5mb3JtcyBmb3IgdGhlIGNoaWxkIHRoYXQgaXMgYmVpbmcgYWRkZWQuCisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgICAgICBmbG9hdCByb3RhdGlvbjsKKworICAgICAgICBpZiAoIW1Sb3RhdGlvbnMuY29udGFpbnNLZXkoY2hpbGQpKSB7CisgICAgICAgICAgICByb3RhdGlvbiA9IChmbG9hdCkgKE1hdGgucmFuZG9tKCkqMjYgLSAxMyk7CisgICAgICAgICAgICBtUm90YXRpb25zLnB1dChjaGlsZCwgcm90YXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcm90YXRpb24gPSBtUm90YXRpb25zLmdldChjaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGlsZCBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBpZiAobVJvdGF0aW9ucy5jb250YWluc0tleShjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICBtUm90YXRpb25zLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNoaWxkcmVuVG9BcHBseVRyYW5zZm9ybXNUby5jb250YWluc0tleShjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hpbGRyZW5Ub0FwcGx5VHJhbnNmb3Jtc1RvLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGlzIHZpZXcgaXMgYWxyZWFkeSBpbiB0aGUgbGF5b3V0LCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIHdhaXQgdW50aWwgbGF5b3V0IGhhcyBmaW5pc2hlZCBpbiBvcmRlciB0byBzZXQgdGhlCisgICAgICAgIC8vIHBpdm90IHBvaW50IG9mIHRoZSByb3RhdGlvbiAocmVxdWlyaW5nIGdldE1lYXN1cmVkV2lkdGgvSGVpZ2h0KCkpCisgICAgICAgIG1DaGlsZHJlblRvQXBwbHlUcmFuc2Zvcm1zVG8ucHV0KGNoaWxkLCByZWxhdGl2ZUluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgICAgICBpZiAoIW1DaGlsZHJlblRvQXBwbHlUcmFuc2Zvcm1zVG8uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKFZpZXcgY2hpbGQ6IG1DaGlsZHJlblRvQXBwbHlUcmFuc2Zvcm1zVG8ua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJvdGF0aW9ucy5jb250YWluc0tleShjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0UGl2b3RYKGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKS8yKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0UGl2b3RZKGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkvMik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFJvdGF0aW9uKG1Sb3RhdGlvbnMuZ2V0KGNoaWxkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkcmVuVG9BcHBseVRyYW5zZm9ybXNUby5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRmlyc3RMYXlvdXRIYXBwZW5lZCkgeworICAgICAgICAgICAgbVZpZXdIZWlnaHQgPSAoaW50KSBNYXRoLnJvdW5kKFNMSURFX1VQX1JBVElPKmdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgbVN3aXBlVGhyZXNob2xkID0gKGludCkgTWF0aC5yb3VuZChTV0lQRV9USFJFU0hPTERfUkFUSU8qbVZpZXdIZWlnaHQpOworCisgICAgICAgICAgICAvLyBUT0RPOiBSaWdodCBub3cgdGhpcyB3YWxrcyBhbGwgdGhlIHdheSB1cCB0aGUgdmlldyBoaWVyYXJjaHkgYW5kIGRpc2FibGVzCisgICAgICAgICAgICAvLyBDbGlwQ2hpbGRyZW4gYW5kIENsaXBUb1BhZGRpbmcuIFdlJ3JlIHByb2JhYmx5IGdvaW5nICB0byB3YW50IHRvIHJlc2V0CisgICAgICAgICAgICAvLyB0aGVzZSBmbGFncyBhcyB3ZWxsLgorICAgICAgICAgICAgc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXdHcm91cCB2aWV3ID0gdGhpczsKKyAgICAgICAgICAgIHdoaWxlICh2aWV3LmdldFBhcmVudCgpICE9IG51bGwgJiYgdmlldy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSAoVmlld0dyb3VwKSB2aWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldENsaXBUb1BhZGRpbmcoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBzd2l0Y2goYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlUG9pbnRlcklkID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFggPSBldi5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSA9IGV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CisgICAgICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJJbmRleCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlciwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBsb2cgaXQKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6IE5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IG5ld1kgLSBtSW5pdGlhbFk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGludCkgTWF0aC5hYnMoZGVsdGFZKSA+IG1Ub3VjaFNsb3AgJiYgbVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gZGVsdGFZIDwgMCA/IEdFU1RVUkVfU0xJREVfVVAgOiBHRVNUVVJFX1NMSURFX0RPV047CisgICAgICAgICAgICAgICAgICAgIG1HZXN0dXJlQ29tcGxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDogeworICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICBtR2VzdHVyZUNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3dpcGVHZXN0dXJlVHlwZSAhPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAvLyBubyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGxvZyBpdAorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6IE5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBmbG9hdCBkZWx0YVkgPSBuZXdZIC0gbUluaXRpYWxZOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgIH0KKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldik7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgICAgIGlmICgoaW50KSBNYXRoLmFicyhkZWx0YVkpID4gbVRvdWNoU2xvcCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBkZWx0YVkgPCAwID8gR0VTVFVSRV9TTElERV9VUCA6IEdFU1RVUkVfU0xJREVfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgbUdlc3R1cmVDb21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW1HZXN0dXJlQ29tcGxldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtTnVtQWN0aXZlVmlld3MgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHZpZXcgaXMgcHJlc2VudCBidXQgaGlkZGVuLCBtYWtlIHN1cmUgaXQncyB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwdWxsIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gKGRlbHRhWS1tVG91Y2hTbG9wKSoxLjBmIC8gKG1Td2lwZVRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVlPZmZzZXQgPSBNYXRoLm1pbigtbVZpZXdIZWlnaHQgKyAoaW50KSAgTWF0aC5yb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIqbVN3aXBlVGhyZXNob2xkKSAtIG1Ub3VjaFNsb3AsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuc2V0VmVydGljYWxPZmZzZXQobVlPZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBNYXRoLm1heCgwLjBmLCAxLjBmIC0gKDEuMGYqbVlPZmZzZXQvLW1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1pbigxLjBmLCBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1OdW1BY3RpdmVWaWV3cyAtIDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IC0oZGVsdGFZKjEuMGYgKyBtVG91Y2hTbG9wKSAvIChtU3dpcGVUaHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ZT2Zmc2V0ID0gTWF0aC5taW4oKGludCkgTWF0aC5yb3VuZChyKi1tU3dpcGVUaHJlc2hvbGQpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KG1ZT2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gTWF0aC5tYXgoMC4wZiwgMS4wZiAtICgxLjBmKm1ZT2Zmc2V0Ly1tVmlld0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gTWF0aC5taW4oMS4wZiwgYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICBtR2VzdHVyZUNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICBtWU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IHRvdWNoUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSB2b2lkIG9uU2Vjb25kYXJ5UG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIGludCBhY3RpdmVQb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgIGlmIChwb2ludGVySWQgPT0gbUFjdGl2ZVBvaW50ZXJJZCkgeworCisgICAgICAgICAgICBpbnQgYWN0aXZlVmlld0luZGV4ID0gKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPyBtTnVtQWN0aXZlVmlld3MgLSAxCisgICAgICAgICAgICAgICAgICAgIDogbU51bUFjdGl2ZVZpZXdzIC0gMjsKKworICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChhY3RpdmVWaWV3SW5kZXgpOworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAvLyBPdXIgcHJpbWFyeSBwb2ludGVyIGhhcyBnb25lIHVwIC0tIGxldCdzIHNlZSBpZiB3ZSBjYW4gZmluZAorICAgICAgICAgICAgLy8gYW5vdGhlciBwb2ludGVyIG9uIHRoZSB2aWV3LiBJZiBzbywgdGhlbiB3ZSBzaG91bGQgcmVwbGFjZQorICAgICAgICAgICAgLy8gb3VyIHByaW1hcnkgcG9pbnRlciB3aXRoIHRoaXMgbmV3IHBvaW50ZXIgYW5kIGFkanVzdCB0aGluZ3MKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIHZpZXcgZG9lc24ndCBqdW1wCisgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZXYuZ2V0UG9pbnRlckNvdW50KCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gYWN0aXZlUG9pbnRlckluZGV4KSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5ID0gZXYuZ2V0WShpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hSZWN0LnNldCh2LmdldExlZnQoKSwgdi5nZXRUb3AoKSwgdi5nZXRSaWdodCgpLCB2LmdldEJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdWNoUmVjdC5jb250YWlucygoaW50KSBNYXRoLnJvdW5kKHgpLCAoaW50KSBNYXRoLnJvdW5kKHkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb2xkWCA9IGV2LmdldFgoYWN0aXZlUG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFkgPSBldi5nZXRZKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCBvdXIgZnJhbWUgb2YgcmVmZXJlbmNlIHRvIGF2b2lkIGEganVtcAorICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxZICs9ICh5IC0gb2xkWSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFggKz0gKHggLSBvbGRYKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ssIHdlJ3JlIGdvb2QsIHdlIGZvdW5kIGEgbmV3IHBvaW50ZXIgd2hpY2ggaXMgdG91Y2hpbmcgdGhlIGFjdGl2ZSB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBpdCBtZWFucyB3ZSBkaWRuJ3QgZmluZCBhIHNhdGlzZmFjdG9yeSBuZXcgcG9pbnRlciA6KCwKKyAgICAgICAgICAgIC8vIHNvIGVuZCB0aGUKKyAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG5ld1kgLSBtSW5pdGlhbFkpOworCisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKKyAgICAgICAgbVlWZWxvY2l0eSA9IChpbnQpIG1WZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFZID4gbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTiAmJgorICAgICAgICAgICAgICAgICFtR2VzdHVyZUNvbXBsZXRlKSB7CisgICAgICAgICAgICAvLyBTd2lwZSB0aHJlc2hvbGQgZXhjZWVkZWQsIHN3aXBlIGRvd24KKyAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgLW1Td2lwZVRocmVzaG9sZCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQICYmCisgICAgICAgICAgICAgICAgIW1HZXN0dXJlQ29tcGxldGUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgdXAKKyAgICAgICAgICAgIHNob3dQcmV2aW91cygpOworICAgICAgICB9IGVsc2UgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVAgJiYgIW1HZXN0dXJlQ29tcGxldGUpIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSB1cCBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgZG93bgorICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtTnVtQWN0aXZlVmlld3MgLSAyKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBhbmltYXRpb24gZHVyYXRpb24gYmFzZWQgb24gaG93IGZhciB0aGV5IHB1bGxlZCBpdCB1cAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gKGludCkgTWF0aC5yb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLnZlcnRpY2FsT2Zmc2V0KjEuMGYvLW1WaWV3SGVpZ2h0KkRFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KE1JTklNVU1fQU5JTUFUSU9OX0RVUkFUSU9OLCBkdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICAvLyBBbmltYXRlIGJhY2sgZG93bgorICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVEb3duID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGxwLAorICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRpY2FsT2Zmc2V0IiwgbHAudmVydGljYWxPZmZzZXQsIDApOworICAgICAgICAgICAgICAgIHNsaWRlRG93bi5zdGFydCgpOworICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgZmFkZUluID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEiLHYuZ2V0QWxwaGEoKSwgMS4wZik7CisgICAgICAgICAgICAgICAgZmFkZUluLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOICYmICFtR2VzdHVyZUNvbXBsZXRlKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc3dpcGUgZG93biBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgdXAKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgobU51bUFjdGl2ZVZpZXdzIC0gMSk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGJhc2VkIG9uIGhvdyBmYXIgdGhleSBwdWxsZWQgaXQgZG93bgorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gKGludCkgTWF0aC5yb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICgxIC0gbHAudmVydGljYWxPZmZzZXQqMS4wZi8tbVZpZXdIZWlnaHQpKkRFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KE1JTklNVU1fQU5JTUFUSU9OX0RVUkFUSU9OLCBkdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICAvLyBBbmltYXRlIGJhY2sgdXAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHNsaWRlVXAgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAidmVydGljYWxPZmZzZXQiLCBscC52ZXJ0aWNhbE9mZnNldCwgLW1WaWV3SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzbGlkZVVwLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBmYWRlT3V0ID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEiLHYuZ2V0QWxwaGEoKSwgMC4wZik7CisgICAgICAgICAgICAgICAgZmFkZU91dC5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgbUdlc3R1cmVDb21wbGV0ZSA9IHRydWU7CisgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICBtWU9mZnNldCA9IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCkgeworICAgICAgICBzdXBlci5vblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobUluZGV4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCmluZGV4IGVkZDU1YmEuLmI0MTNhZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCkBAIC0yMSw4ICsyMSwxMCBAQAogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKQEAgLTM0LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTQyLDcgKzQ1LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdldENoYXJzOwpAQCAtNjEsNiArNjMsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5BcnJvd0tleU1vdmVtZW50TWV0aG9kOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZUtleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZVRpbWVLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpYWxlcktleUxpc3RlbmVyOwpAQCAtODIsMTcgKzg1LDIxIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkZsb2F0TWF0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Um9vdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKQEAgLTE4NSw3ICsxOTIsNyBAQAogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIFRleHRWaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZpZXdUcmVlT2JzZXJ2ZXIuT25QcmVEcmF3TGlzdGVuZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRleHRWaWV3IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dFZpZXciOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VYVFJBQ1QgPSBmYWxzZTsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJJT1JJVFkgPSAxMDA7CkBAIC0zMjEsNiArMzI4LDcgQEAKICAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnRleHRWaWV3U3R5bGUpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIFRleHRWaWV3KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGUpIHsKQEAgLTY5NSw5ICs3MDMsOSBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNldElucHV0RXh0cmFzKGEuZ2V0UmVzb3VyY2VJZChhdHRyLCAwKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KCJUZXh0VmlldyIsICJGYWlsdXJlIHJlYWRpbmcgaW5wdXQgZXh0cmFzIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJGYWlsdXJlIHJlYWRpbmcgaW5wdXQgZXh0cmFzIiwgZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudygiVGV4dFZpZXciLCAiRmFpbHVyZSByZWFkaW5nIGlucHV0IGV4dHJhcyIsIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRmFpbHVyZSByZWFkaW5nIGlucHV0IGV4dHJhcyIsIGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTcxNCw3ICs3MjIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlucHV0TWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIGM7CisgICAgICAgICAgICBDbGFzczw/PiBjOwogCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKGlucHV0TWV0aG9kLnRvU3RyaW5nKCkpOwpAQCAtOTIzLDYgKzkzMSw4IEBACiAgICAgICAgIHNldEZvY3VzYWJsZShmb2N1c2FibGUpOwogICAgICAgICBzZXRDbGlja2FibGUoY2xpY2thYmxlKTsKICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZShsb25nQ2xpY2thYmxlKTsKKworICAgICAgICBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcnMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0VHlwZWZhY2VCeUluZGV4KGludCB0eXBlZmFjZUluZGV4LCBpbnQgc3R5bGVJbmRleCkgewpAQCAtMTEyOCw2ICsxMTM4LDkgQEAKICAgICAgICAgICAgIHNldFRleHQobVRleHQpOwogCiAgICAgICAgIGZpeEZvY3VzYWJsZUFuZENsaWNrYWJsZVNldHRpbmdzKCk7CisKKyAgICAgICAgLy8gU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIGRlcGVuZHMgb24gY2FuU2VsZWN0VGV4dCwgd2hpY2ggZGVwZW5kcyBvbiBtTW92ZW1lbnQKKyAgICAgICAgcHJlcGFyZUN1cnNvckNvbnRyb2xsZXJzKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGZpeEZvY3VzYWJsZUFuZENsaWNrYWJsZVNldHRpbmdzKCkgewpAQCAtMjMzNSw2ICsyMzQ4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBzdHIgKyAifSI7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgogICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKICAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CkBAIC0yMzY5LDggKzIzODMsOCBAQAogICAgICAgICBpbnQgZW5kID0gMDsKIAogICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQobVRleHQpOwotICAgICAgICAgICAgZW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChtVGV4dCk7CisgICAgICAgICAgICBzdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICBlbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwIHx8IGVuZCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gT3Igc2F2ZSBzdGF0ZSBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgIHNhdmUgPSB0cnVlOwpAQCAtMjQ0Miw3ICsyNDU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkID0gIihyZXN0b3JlZCkgIjsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJUZXh0VmlldyIsICJTYXZlZCBjdXJzb3IgcG9zaXRpb24gIiArIHNzLnNlbFN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNhdmVkIGN1cnNvciBwb3NpdGlvbiAiICsgc3Muc2VsU3RhcnQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKyBzcy5zZWxFbmQgKyAiIG91dCBvZiByYW5nZSBmb3IgIiArIHJlc3RvcmVkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQgIiArIG1UZXh0KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjY5NCw2ICsyNzA4LDkgQEAKICAgICAgICAgaWYgKG5lZWRFZGl0YWJsZUZvck5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgc2VuZEFmdGVyVGV4dENoYW5nZWQoKEVkaXRhYmxlKSB0ZXh0KTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBkZXBlbmRzIG9uIGNhblNlbGVjdFRleHQsIHdoaWNoIGRlcGVuZHMgb24gdGV4dAorICAgICAgICBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcnMoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3NTYsNiArMjc3Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUNoYXJzW29mZiArIG1TdGFydF07CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG1DaGFycywgbVN0YXJ0LCBtTGVuZ3RoKTsKICAgICAgICAgfQpAQCAtMjc4MSw2ICsyNzk5LDE0IEBACiAgICAgICAgICAgICBjLmRyYXdUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsIGNvbnRleHRTdGFydCArIG1TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgZmxvYXQgbWVhc3VyZVRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5tZWFzdXJlVGV4dChtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCk7CiAgICAgICAgIH0KQEAgLTI3ODgsNiArMjgxNCwyMyBAQAogICAgICAgICBwdWJsaWMgaW50IGdldFRleHRXaWR0aHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocywgUGFpbnQgcCkgewogICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFdpZHRocyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LAorICAgICAgICAgICAgICAgIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCArIG1TdGFydCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQ3Vyc29yKG1DaGFycywgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIGZsYWdzLCBvZmZzZXQgKyBtU3RhcnQsIGN1cnNvck9wdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI5ODEsNyArMzAyNCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnB1dCA9IFRleHRLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFR5cGUgPSB0eXBlOworICAgICAgICBzZXRSYXdJbnB1dFR5cGUodHlwZSk7CiAgICAgICAgIGlmIChkaXJlY3QpIG1JbnB1dCA9IGlucHV0OwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHNldEtleUxpc3RlbmVyT25seShpbnB1dCk7CkBAIC0zMTk4LDcgKzMyNDEsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNyZWF0ZSBJZiB0cnVlLCB0aGUgZXh0cmFzIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGV5IGRvbid0IGFscmVhZHkKICAgICAgKiBleGlzdC4gIE90aGVyd2lzZSwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIG5vbmUgaGF2ZSBiZWVuIGNyZWF0ZWQuCi0gICAgICogQHNlZSAjc2V0SW5wdXRFeHRyYXMoaW50KVZpZXcKKyAgICAgKiBAc2VlICNzZXRJbnB1dEV4dHJhcyhpbnQpCiAgICAgICogQHNlZSBFZGl0b3JJbmZvI2V4dHJhcwogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2VkaXRvckV4dHJhcwogICAgICAqLwpAQCAtMzMxMiw3ICszMzU1LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVycm9yUG9wdXAgZXh0ZW5kcyBQb3B1cFdpbmRvdyB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWJvdmUgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVmlldzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXh0VmlldyBtVmlldzsKIAogICAgICAgICBFcnJvclBvcHVwKFRleHRWaWV3IHYsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICAgICAgc3VwZXIodiwgd2lkdGgsIGhlaWdodCk7CkBAIC0zNTg1LDcgKzM2MjgsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlQ3Vyc29yKCkgewotICAgICAgICBpbnQgd2hlcmUgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKyAgICAgICAgaW50IHdoZXJlID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKICAgICAgICAgaW52YWxpZGF0ZUN1cnNvcih3aGVyZSwgd2hlcmUsIHdoZXJlKTsKICAgICB9CkBAIC0zNjYxLDcgKzM3MDQsMTggQEAKICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAKICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgY3VycyA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgLyogVGhpcyBjb2RlIGFsc28gcHJvdmlkZXMgYXV0by1zY3JvbGxpbmcgd2hlbiBhIGN1cnNvciBpcyBtb3ZlZCB1c2luZyBhCisgICAgICAgICAgICAgKiBDdXJzb3JDb250cm9sbGVyIChpbnNlcnRpb24gcG9pbnQgb3Igc2VsZWN0aW9uIGxpbWl0cykuCisgICAgICAgICAgICAgKiBGb3Igc2VsZWN0aW9uLCBlbnN1cmUgc3RhcnQgb3IgZW5kIGlzIHZpc2libGUgZGVwZW5kaW5nIG9uIGNvbnRyb2xsZXIncyBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IGN1cnMgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uQ29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIuaXNTZWxlY3Rpb25TdGFydERyYWdnZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJzID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCByZWFsbHkgb25seSBrZWVwIHRoZSBlbmQgaW4gdmlldyBpZgpAQCAtMzY4MCw2ICszNzM0LDEwIEBACiAgICAgICAgICAgICBjaGFuZ2VkID0gYnJpbmdUZXh0SW50b1ZpZXcoKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKSB7CisgICAgICAgICAgICBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgIG1TaG91bGRTdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBtUHJlRHJhd1N0YXRlID0gUFJFRFJBV19ET05FOwogICAgICAgICByZXR1cm4gIWNoYW5nZWQ7CiAgICAgfQpAQCAtMzk1NCw4ICs0MDEyLDggQEAKICAgICAgICAgLy8gIFhYWCBUaGlzIGlzIG5vdCBzdHJpY3RseSB0cnVlIC0tIGEgcHJvZ3JhbSBjb3VsZCBzZXQgdGhlCiAgICAgICAgIC8vICBzZWxlY3Rpb24gbWFudWFsbHkgaWYgaXQgcmVhbGx5IHdhbnRlZCB0by4KICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsICYmIChpc0ZvY3VzZWQoKSB8fCBpc1ByZXNzZWQoKSkpIHsKLSAgICAgICAgICAgIHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KG1UZXh0KTsKLSAgICAgICAgICAgIHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKICAgICAgICAgICAgIGlmIChtQ3Vyc29yVmlzaWJsZSAmJiBzZWxTdGFydCA+PSAwICYmIGlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1IaWdobGlnaHRQYXRoID09IG51bGwpCkBAIC00MDYxLDYgKzQxMTksMTMgQEAKICAgICAgICAgKi8KIAogICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgIGlmIChtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZHJhdyhjYW52YXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NDc1LDggKzQ1NDAsOCBAQAogICAgICAgICAgICAgb3V0QXR0cnMuaGludFRleHQgPSBtSGludDsKICAgICAgICAgICAgIGlmIChtVGV4dCBpbnN0YW5jZW9mIEVkaXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgSW5wdXRDb25uZWN0aW9uIGljID0gbmV3IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxTZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICAgICAgb3V0QXR0cnMuaW5pdGlhbFNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgb3V0QXR0cnMuaW5pdGlhbFNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxDYXBzTW9kZSA9IGljLmdldEN1cnNvckNhcHNNb2RlKG1JbnB1dFR5cGUpOwogICAgICAgICAgICAgICAgIHJldHVybiBpYzsKICAgICAgICAgICAgIH0KQEAgLTQ1NjEsOCArNDYyNiw4IEBACiAgICAgICAgICAgICAgICAgb3V0VGV4dC5mbGFncyB8PSBFeHRyYWN0ZWRUZXh0LkZMQUdfU0lOR0xFX0xJTkU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRUZXh0LnN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIG91dFRleHQuc2VsZWN0aW9uU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoY29udGVudCk7Ci0gICAgICAgICAgICBvdXRUZXh0LnNlbGVjdGlvbkVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoY29udGVudCk7CisgICAgICAgICAgICBvdXRUZXh0LnNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIG91dFRleHQuc2VsZWN0aW9uRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00NTc5LDcgKzQ2NDQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChyZXEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJSZXRyaWV2aW5nIGV4dHJhY3RlZCBzdGFydD0iCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIlJldHJpZXZpbmcgZXh0cmFjdGVkIHN0YXJ0PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbXMubUNoYW5nZWRTdGFydCArICIgZW5kPSIgKyBpbXMubUNoYW5nZWRFbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlbHRhPSIgKyBpbXMubUNoYW5nZWREZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1zLm1DaGFuZ2VkU3RhcnQgPCAwICYmICFjb250ZW50Q2hhbmdlZCkgewpAQCAtNDU4Nyw3ICs0NjUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYWN0VGV4dEludGVybmFsKHJlcSwgaW1zLm1DaGFuZ2VkU3RhcnQsIGltcy5tQ2hhbmdlZEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkRGVsdGEsIGltcy5tVG1wRXh0cmFjdGVkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJSZXBvcnRpbmcgZXh0cmFjdGVkIHN0YXJ0PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIlJlcG9ydGluZyBleHRyYWN0ZWQgc3RhcnQ9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbXMubVRtcEV4dHJhY3RlZC5wYXJ0aWFsU3RhcnRPZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBlbmQ9IiArIGltcy5tVG1wRXh0cmFjdGVkLnBhcnRpYWxFbmRPZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIGltcy5tVG1wRXh0cmFjdGVkLnRleHQpOwpAQCAtNDc0MSw3ICs0ODA2LDcgQEAKICAgICAKICAgICB2b2lkIHVwZGF0ZUFmdGVyRWRpdCgpIHsKICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICBpbnQgY3VycyA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7CisgICAgICAgIGludCBjdXJzID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKIAogICAgICAgICBpZiAoY3VycyA+PSAwIHx8IChtR3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmF2aXR5LkJPVFRPTSkgewpAQCAtNDc1Niw3ICs0ODIxLDcgQEAKICAgICAgICAgICAgICAgICBtYWtlQmxpbmsoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBjaGVja0ZvclJlc2l6ZSgpOwogICAgIH0KICAgICAKQEAgLTQ4NDcsNiArNDkxMiw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKKyAgICAgICAgICAgICAgICAvLyBOb3RlLCBMYXlvdXQgcmVzb2x2ZXMgQUxJR05fT1BQT1NJVEUgdG8gbGVmdCBvcgorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgogICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fT1BQT1NJVEU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQ4ODMsNyArNDk1MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGFsaWdubWVudCwgbVNwYWNpbmdNdWx0LCBtU3BhY2luZ0FkZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yaW5nLCBtSW5jbHVkZVBhZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoImFhYSIsICJCb3Jpbmc6ICIgKyBtVHJhbnNmb3JtZWQpOwogCiAgICAgICAgICAgICAgICAgICAgIG1TYXZlZExheW91dCA9IChCb3JpbmdMYXlvdXQpIG1MYXlvdXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRFbGxpcHNpemUgJiYgYm9yaW5nLndpZHRoIDw9IHcpIHsKQEAgLTQ5MDksNyArNDk3NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1MYXlvdXQgPSBuZXcgU3RhdGljTGF5b3V0KG1UcmFuc2Zvcm1lZCwgbVRleHRQYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBhbGlnbm1lbnQsIG1TcGFjaW5nTXVsdCwgbVNwYWNpbmdBZGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluY2x1ZGVQYWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgiYWFhIiwgIkJvcmluZyBidXQgd2lkZTogIiArIG1UcmFuc2Zvcm1lZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRFbGxpcHNpemUpIHsKICAgICAgICAgICAgICAgICBtTGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dChtVHJhbnNmb3JtZWQsCkBAIC01MDA3LDYgKzUwNzIsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIEN1cnNvckNvbnRyb2xsZXJzIG5lZWQgYSBub24tbnVsbCBtTGF5b3V0CisgICAgICAgIHByZXBhcmVDdXJzb3JDb250cm9sbGVycygpOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjb21wcmVzc1RleHQoZmxvYXQgd2lkdGgpIHsKQEAgLTU0NzgsNyArNTU0Niw3IEBACiAgICAgICAgIC8vIEZJWE1FOiBJcyBpdCBva2F5IHRvIHRydW5jYXRlIHRoaXMsIG9yIHNob3VsZCB3ZSByb3VuZD8KICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KW1MYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKICAgICAgICAgZmluYWwgaW50IHRvcCA9IG1MYXlvdXQuZ2V0TGluZVRvcChsaW5lKTsKLSAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IG1MYXlvdXQuZ2V0TGluZVRvcChsaW5lKzEpOworICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUgKyAxKTsKIAogICAgICAgICBpbnQgbGVmdCA9IChpbnQpIEZsb2F0TWF0aC5mbG9vcihtTGF5b3V0LmdldExpbmVMZWZ0KGxpbmUpKTsKICAgICAgICAgaW50IHJpZ2h0ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobUxheW91dC5nZXRMaW5lUmlnaHQobGluZSkpOwpAQCAtNTYxNSw4ICs1NjgzLDggQEAKICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCBidXQgcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKCkKICAgICAgICAgICAgIC8vIGlzIGluIHRlcm1zIG9mIGNvbnRlbnQgY29vcmRpbmF0ZXMuCiAKLSAgICAgICAgICAgIFJlY3QgciA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICBnZXRJbnRlcmVzdGluZ1JlY3QociwgeCwgdG9wLCBib3R0b20sIGxpbmUpOworICAgICAgICAgICAgUmVjdCByID0gbmV3IFJlY3QoeCwgdG9wLCB4ICsgMSwgYm90dG9tKTsKKyAgICAgICAgICAgIGdldEludGVyZXN0aW5nUmVjdChyLCBsaW5lKTsKICAgICAgICAgICAgIHIub2Zmc2V0KG1TY3JvbGxYLCBtU2Nyb2xsWSk7CiAKICAgICAgICAgICAgIGlmIChyZXF1ZXN0UmVjdGFuZ2xlT25TY3JlZW4ocikpIHsKQEAgLTU2MzIsMTMgKzU3MDAsMTUgQEAKICAgICAgKiB0byB0aGUgdXNlci4gIFRoaXMgd2lsbCBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIGl0IHJlcHJlc2VudHMgbW9yZSB0aGFuCiAgICAgICogb25lIGNoYXJhY3RlciAoYSBzZWxlY3Rpb24gcmFuZ2UpLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUKICAgICAgKiBUZXh0VmlldyBjb250YWlucyBzcGFubmFibGUgdGV4dDsgb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBhY3R1YWxseSBtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG1vdmVDdXJzb3JUb1Zpc2libGVPZmZzZXQoKSB7CiAgICAgICAgIGlmICghKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgIGludCBlbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgaW50IGVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU2NDgsNyArNTcxOCw3IEBACiAgICAgICAgIGludCBsaW5lID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHN0YXJ0KTsKIAogICAgICAgICBmaW5hbCBpbnQgdG9wID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUpOwotICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUrMSk7CisgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtTGF5b3V0LmdldExpbmVUb3AobGluZSArIDEpOwogICAgICAgICBmaW5hbCBpbnQgdnNwYWNlID0gbUJvdHRvbSAtIG1Ub3AgLSBnZXRFeHRlbmRlZFBhZGRpbmdUb3AoKSAtIGdldEV4dGVuZGVkUGFkZGluZ0JvdHRvbSgpOwogICAgICAgICBpbnQgdnNsYWNrID0gKGJvdHRvbSAtIHRvcCkgLyAyOwogICAgICAgICBpZiAodnNsYWNrID4gdnNwYWNlIC8gNCkKQEAgLTU2NjgsMTEgKzU3MzgsMTUgQEAKICAgICAgICAgZmluYWwgaW50IGxlZnRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzKTsKICAgICAgICAgZmluYWwgaW50IHJpZ2h0Q2hhciA9IG1MYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCBoc3BhY2UraHMpOwogICAgICAgICAKKyAgICAgICAgLy8gbGluZSBtaWdodCBjb250YWluIGJpZGlyZWN0aW9uYWwgdGV4dAorICAgICAgICBmaW5hbCBpbnQgbG93Q2hhciA9IGxlZnRDaGFyIDwgcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisgICAgICAgIGZpbmFsIGludCBoaWdoQ2hhciA9IGxlZnRDaGFyID4gcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisKICAgICAgICAgaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGlmIChuZXdTdGFydCA8IGxlZnRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IGxlZnRDaGFyOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gcmlnaHRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IHJpZ2h0Q2hhcjsKKyAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbG93Q2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBsb3dDaGFyOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gaGlnaENoYXIpIHsKKyAgICAgICAgICAgIG5ld1N0YXJ0ID0gaGlnaENoYXI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChuZXdTdGFydCAhPSBzdGFydCkgewpAQCAtNTY5NCwyMiArNTc2OCwyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGdldEludGVyZXN0aW5nUmVjdChSZWN0IHIsIGludCBoLCBpbnQgdG9wLCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKKyAgICBwcml2YXRlIHZvaWQgZ2V0SW50ZXJlc3RpbmdSZWN0KFJlY3QgciwgaW50IGxpbmUpIHsKKyAgICAgICAgY29udmVydEZyb21WaWV3cG9ydFRvQ29udGVudENvb3JkaW5hdGVzKHIpOworCisgICAgICAgIC8vIFJlY3RhbmdsZSBjYW4gY2FuIGJlIGV4cGFuZGVkIG9uIGZpcnN0IGFuZCBsYXN0IGxpbmUgdG8gdGFrZQorICAgICAgICAvLyBwYWRkaW5nIGludG8gYWNjb3VudC4KKyAgICAgICAgLy8gVE9ETyBUYWtlIGxlZnQvcmlnaHQgcGFkZGluZyBpbnRvIGFjY291bnQgdG9vPworICAgICAgICBpZiAobGluZSA9PSAwKSByLnRvcCAtPSBnZXRFeHRlbmRlZFBhZGRpbmdUb3AoKTsKKyAgICAgICAgaWYgKGxpbmUgPT0gbUxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHIuYm90dG9tICs9IGdldEV4dGVuZGVkUGFkZGluZ0JvdHRvbSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb252ZXJ0RnJvbVZpZXdwb3J0VG9Db250ZW50Q29vcmRpbmF0ZXMoUmVjdCByKSB7CiAgICAgICAgIGludCBwYWRkaW5nVG9wID0gZ2V0RXh0ZW5kZWRQYWRkaW5nVG9wKCk7CiAgICAgICAgIGlmICgobUdyYXZpdHkgJiBHcmF2aXR5LlZFUlRJQ0FMX0dSQVZJVFlfTUFTSykgIT0gR3Jhdml0eS5UT1ApIHsKICAgICAgICAgICAgIHBhZGRpbmdUb3AgKz0gZ2V0VmVydGljYWxPZmZzZXQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIHRvcCArPSBwYWRkaW5nVG9wOwotICAgICAgICBib3R0b20gKz0gcGFkZGluZ1RvcDsKLSAgICAgICAgaCArPSBnZXRDb21wb3VuZFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIHIudG9wICs9IHBhZGRpbmdUb3A7CisgICAgICAgIHIuYm90dG9tICs9IHBhZGRpbmdUb3A7CiAKLSAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgIHRvcCAtPSBnZXRFeHRlbmRlZFBhZGRpbmdUb3AoKTsKLSAgICAgICAgaWYgKGxpbmUgPT0gbUxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBib3R0b20gKz0gZ2V0RXh0ZW5kZWRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGludCBwYWRkaW5nTGVmdCA9IGdldENvbXBvdW5kUGFkZGluZ0xlZnQoKTsKKyAgICAgICAgci5sZWZ0ICs9IHBhZGRpbmdMZWZ0OworICAgICAgICByLnJpZ2h0ICs9IHBhZGRpbmdMZWZ0OwogCi0gICAgICAgIHIuc2V0KGgsIHRvcCwgaCsxLCBib3R0b20pOwogICAgICAgICByLm9mZnNldCgtbVNjcm9sbFgsIC1tU2Nyb2xsWSk7CiAgICAgfQogCkBAIC01ODc3LDYgKzU5NTcsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKG1CbGluayAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQmxpbmsucmVtb3ZlQ2FsbGJhY2tzKG1CbGluayk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgZGVwZW5kcyBvbiBtQ3Vyc29yVmlzaWJsZQorICAgICAgICBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcnMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuTWFycXVlZSgpIHsKQEAgLTU5MzUsNyArNjAxOCw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxUZXh0Vmlldz4gbVZpZXc7CiAKICAgICAgICAgcHJpdmF0ZSBieXRlIG1TdGF0dXMgPSBNQVJRVUVFX1NUT1BQRUQ7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNjcm9sbFVuaXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVNjcm9sbFVuaXQ7CiAgICAgICAgIHByaXZhdGUgZmxvYXQgbU1heFNjcm9sbDsKICAgICAgICAgZmxvYXQgbU1heEZhZGVTY3JvbGw7CiAgICAgICAgIHByaXZhdGUgZmxvYXQgbUdob3N0U3RhcnQ7CkBAIC01OTQ3LDcgKzYwMzAsNyBAQAogCiAgICAgICAgIE1hcnF1ZWUoVGV4dFZpZXcgdikgewogICAgICAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IHYuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKLSAgICAgICAgICAgIG1TY3JvbGxVbml0ID0gKE1BUlFVRUVfUElYRUxTX1BFUl9TRUNPTkQgKiBkZW5zaXR5KSAvIChmbG9hdCkgTUFSUVVFRV9SRVNPTFVUSU9OOworICAgICAgICAgICAgbVNjcm9sbFVuaXQgPSAoTUFSUVVFRV9QSVhFTFNfUEVSX1NFQ09ORCAqIGRlbnNpdHkpIC8gTUFSUVVFRV9SRVNPTFVUSU9OOwogICAgICAgICAgICAgbVZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxUZXh0Vmlldz4odik7CiAgICAgICAgIH0KIApAQCAtNjI5MSw3ICs2Mzc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJTcGFuIGNoYW5nZSBvdXRzaWRlIG9mIGJhdGNoOiAiCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihMT0dfVEFHLCAiU3BhbiBjaGFuZ2Ugb3V0c2lkZSBvZiBiYXRjaDogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2xkU3RhcnQgKyAiLSIgKyBvbGRFbmQgKyAiLCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ld1N0YXJ0ICsgIi0iICsgbmV3RW5kICsgd2hhdCk7CiAgICAgICAgICAgICAgICAgICAgIGltcy5tQ29udGVudENoYW5nZWQgPSB0cnVlOwpAQCAtNjMwNyw3ICs2MzkwLDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgYnVmZmVyLCBpbnQgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUsIGludCBhZnRlcikgewotICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KFRBRywgImJlZm9yZVRleHRDaGFuZ2VkIHN0YXJ0PSIgKyBzdGFydAorICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KExPR19UQUcsICJiZWZvcmVUZXh0Q2hhbmdlZCBzdGFydD0iICsgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgKyAiIGJlZm9yZT0iICsgYmVmb3JlICsgIiBhZnRlcj0iICsgYWZ0ZXIgKyAiOiAiICsgYnVmZmVyKTsKIAogICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KS5pc0VuYWJsZWQoKQpAQCAtNjMyMCw3ICs2NDAzLDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBidWZmZXIsIGludCBzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlLCBpbnQgYWZ0ZXIpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJvblRleHRDaGFuZ2VkIHN0YXJ0PSIgKyBzdGFydAorICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KExPR19UQUcsICJvblRleHRDaGFuZ2VkIHN0YXJ0PSIgKyBzdGFydAogICAgICAgICAgICAgICAgICAgICArICIgYmVmb3JlPSIgKyBiZWZvcmUgKyAiIGFmdGVyPSIgKyBhZnRlciArICI6ICIgKyBidWZmZXIpOwogICAgICAgICAgICAgVGV4dFZpZXcudGhpcy5oYW5kbGVUZXh0Q2hhbmdlZChidWZmZXIsIHN0YXJ0LCBiZWZvcmUsIGFmdGVyKTsKIApAQCAtNjMzMCwxMCArNjQxMywxNSBAQAogICAgICAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRUeXBlVmlld1RleHRDaGFuZ2VkKG1CZWZvcmVUZXh0LCBzdGFydCwgYmVmb3JlLCBhZnRlcik7CiAgICAgICAgICAgICAgICAgbUJlZm9yZVRleHQgPSBudWxsOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPLiBUaGUgY3Vyc29yIGNvbnRyb2xsZXIgc2hvdWxkIGhpZGUgYXMgc29vbiBhcyB0ZXh0IGlzIHR5cGVkLgorICAgICAgICAgICAgLy8gQnV0IHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCBmb3IgY29zbWV0aWMgY2hhbmdlcyAodW5kZXJsaW5lIGN1cnJlbnQgd29yZCB3aGVuCisgICAgICAgICAgICAvLyBzcGVsbCBjb3JyZWN0aW9ucyBhcmUgZGlzcGxheWVkLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIG1ha2UgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgICAgIC8vIGJldHdlZW4gdGhlc2UgY29zbWV0aWMgY2hhbmdlcyBhbmQgYWN0dWFsIHRleHQgbW9kaWZpY2F0aW9ucy4KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoVEFHLCAiYWZ0ZXJUZXh0Q2hhbmdlZDogIiArIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgImFmdGVyVGV4dENoYW5nZWQ6ICIgKyBidWZmZXIpOwogICAgICAgICAgICAgVGV4dFZpZXcudGhpcy5zZW5kQWZ0ZXJUZXh0Q2hhbmdlZChidWZmZXIpOwogCiAgICAgICAgICAgICBpZiAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCkBAIC02MzQ0LDE5ICs2NDMyLDE5IEBACiAKICAgICAgICAgcHVibGljIHZvaWQgb25TcGFuQ2hhbmdlZChTcGFubmFibGUgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB3aGF0LCBpbnQgcywgaW50IGUsIGludCBzdCwgaW50IGVuKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoVEFHLCAib25TcGFuQ2hhbmdlZCBzPSIgKyBzICsgIiBlPSIgKyBlCisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIm9uU3BhbkNoYW5nZWQgcz0iICsgcyArICIgZT0iICsgZQogICAgICAgICAgICAgICAgICAgICArICIgc3Q9IiArIHN0ICsgIiBlbj0iICsgZW4gKyAiIHdoYXQ9IiArIHdoYXQgKyAiOiAiICsgYnVmKTsKICAgICAgICAgICAgIFRleHRWaWV3LnRoaXMuc3BhbkNoYW5nZShidWYsIHdoYXQsIHMsIHN0LCBlLCBlbik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBvblNwYW5BZGRlZChTcGFubmFibGUgYnVmLCBPYmplY3Qgd2hhdCwgaW50IHMsIGludCBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoVEFHLCAib25TcGFuQWRkZWQgcz0iICsgcyArICIgZT0iICsgZQorICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KExPR19UQUcsICJvblNwYW5BZGRlZCBzPSIgKyBzICsgIiBlPSIgKyBlCiAgICAgICAgICAgICAgICAgICAgICsgIiB3aGF0PSIgKyB3aGF0ICsgIjogIiArIGJ1Zik7CiAgICAgICAgICAgICBUZXh0Vmlldy50aGlzLnNwYW5DaGFuZ2UoYnVmLCB3aGF0LCAtMSwgcywgLTEsIGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25TcGFuUmVtb3ZlZChTcGFubmFibGUgYnVmLCBPYmplY3Qgd2hhdCwgaW50IHMsIGludCBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoVEFHLCAib25TcGFuUmVtb3ZlZCBzPSIgKyBzICsgIiBlPSIgKyBlCisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIm9uU3BhblJlbW92ZWQgcz0iICsgcyArICIgZT0iICsgZQogICAgICAgICAgICAgICAgICAgICArICIgd2hhdD0iICsgd2hhdCArICI6ICIgKyBidWYpOwogICAgICAgICAgICAgVGV4dFZpZXcudGhpcy5zcGFuQ2hhbmdlKGJ1Ziwgd2hhdCwgcywgLTEsIGUsIC0xKTsKICAgICAgICAgfQpAQCAtNjQ2MCwxMiArNjU0OCwyMiBAQAogICAgICAgICAgICAgaWYgKG1FcnJvciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2hvd0Vycm9yKCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBzdGFydCB0aGUgc2VsZWN0aW9uIG1vZGUgaW1tZWRpYXRlbHkuIFRoZSBsYXlvdXQgbWF5IGJlIG51bGwgaGVyZSBhbmQgaXMKKyAgICAgICAgICAgIC8vIG5lZWRlZCBieSB0aGUgY3Vyc29yIGNvbnRyb2xsZXIuIExheW91dCBjcmVhdGlvbiBpcyBkZWZlcnJlZCB1cCB0byBkcmF3aW5nLiBUaGUKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBhY3Rpb24gbW9kZSB3aWxsIGJlIHN0YXJ0ZWQgaW4gb25QcmVEcmF3KCkuCisgICAgICAgICAgICBpZiAoc2VsU3RhcnQgIT0gc2VsRW5kKSB7CisgICAgICAgICAgICAgICAgbVNob3VsZFN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobUVycm9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBoaWRlRXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIERvbid0IGxlYXZlIHVzIGluIHRoZSBtaWRkbGUgb2YgYSBiYXRjaCBlZGl0LgogICAgICAgICAgICAgb25FbmRCYXRjaEVkaXQoKTsKKworICAgICAgICAgICAgaGlkZUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlcigpOworICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXJ0U3RvcE1hcnF1ZWUoZm9jdXNlZCk7CkBAIC02NTMyLDI0ICs2NjMwLDUyIEBACiAgICAgfQogCiAgICAgY2xhc3MgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBSZXN1bHRSZWNlaXZlciB7Ci0gICAgICAgIGludCBtTmV3U3RhcnQ7Ci0gICAgICAgIGludCBtTmV3RW5kOwotICAgICAgICAKLSAgICAgICAgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoKSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QcmV2U3RhcnQsIG1QcmV2RW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTmV3U3RhcnQsIG1OZXdFbmQ7CisKKyAgICAgICAgcHVibGljIENvbW1pdFNlbGVjdGlvblJlY2VpdmVyKGludCBtUHJldlN0YXJ0LCBpbnQgbVByZXZFbmQsIGludCBtTmV3U3RhcnQsIGludCBtTmV3RW5kKSB7CiAgICAgICAgICAgICBzdXBlcihnZXRIYW5kbGVyKCkpOworICAgICAgICAgICAgdGhpcy5tUHJldlN0YXJ0ID0gbVByZXZTdGFydDsKKyAgICAgICAgICAgIHRoaXMubVByZXZFbmQgPSBtUHJldkVuZDsKKyAgICAgICAgICAgIHRoaXMubU5ld1N0YXJ0ID0gbU5ld1N0YXJ0OworICAgICAgICAgICAgdGhpcy5tTmV3RW5kID0gbU5ld0VuZDsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgewotICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gSW5wdXRNZXRob2RNYW5hZ2VyLlJFU1VMVF9TSE9XTikgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBtVGV4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBpZiAobU5ld1N0YXJ0ID4gbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXdTdGFydCA9IGxlbjsKKyAgICAgICAgICAgIGludCBzdGFydCA9IG1OZXdTdGFydDsKKyAgICAgICAgICAgIGludCBlbmQgPSBtTmV3RW5kOworCisgICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5ldyBwb3NpdGlvbiwgdW5sZXNzIHRoaXMgdGFwIHdhcyBhY3R1YWxseQorICAgICAgICAgICAgLy8gdXNlIHRvIHNob3cgdGhlIElNTS4gTGVhdmUgY3Vyc29yIHVuY2hhbmdlZCBpbiB0aGF0IGNhc2UuCisgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1NIT1dOKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBtUHJldlN0YXJ0OworICAgICAgICAgICAgICAgIGVuZCA9IG1QcmV2RW5kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1QcmV2U3RhcnQgIT0gbVByZXZFbmQpICYmIChzdGFydCA9PSBlbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPj0gbVByZXZTdGFydCkgJiYgKHN0YXJ0IDw9IG1QcmV2RW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1QcmV2U3RhcnQsIG1QcmV2RW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhcHBpbmcgb3V0c2lkZSBzdG9wcyBzZWxlY3Rpb24gbW9kZSwgaWYgYW55CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdFbmQgPiBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ld0VuZCA9IGxlbjsKKworICAgICAgICAgICAgICAgIGlmIChtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlci5zaG93KCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSltVGV4dCwgbU5ld1N0YXJ0LCBtTmV3RW5kKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gbGVuKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5kID4gbGVuKSB7CisgICAgICAgICAgICAgICAgZW5kID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTY1NjIsNyArNjY4OCw3IEBACiAgICAgICAgICAgICBtVG91Y2hGb2N1c1NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtU2Nyb2xsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmaW5hbCBib29sZWFuIHN1cGVyUmVzdWx0ID0gc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKIAogICAgICAgICAvKgpAQCAtNjU3NSw0NCArNjcwMSw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIHN1cGVyUmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChtTW92ZW1lbnQgIT0gbnVsbCB8fCBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlICYmIG1MYXlvdXQgIT0gbnVsbCkgeworICAgICAgICBpZiAoKG1Nb3ZlbWVudCAhPSBudWxsIHx8IG9uQ2hlY2tJc1RleHRFZGl0b3IoKSkgJiYKKyAgICAgICAgICAgICAgICBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiBtTGF5b3V0ICE9IG51bGwpIHsKICAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9sZFNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBvbGRTZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaWYgKG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLm9uVG91Y2hFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgb2xkU2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQobVRleHQpOwotICAgICAgICAgICAgaW50IG9sZFNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtTW92ZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbU1vdmVtZW50Lm9uVG91Y2hFdmVudCh0aGlzLCAoU3Bhbm5hYmxlKSBtVGV4dCwgZXZlbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBFZGl0YWJsZSAmJiBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1RleHRFZGl0YWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNGb2N1c2VkKCkgJiYgIW1TY3JvbGxlZCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZ29pbmcgdG8gYmUgZ3Jvc3MuLi4gIGlmIHRhcHBpbmcgb24gdGhlIHRleHQgdmlldwotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZXMgdGhlIElNRSB0byBiZSBkaXNwbGF5ZWQsIHdlIGRvbid0IHdhbnQgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGFuZ2UuICBCdXQgdGhlIHNlbGVjdGlvbiBoYXMgYWxyZWFkeSBjaGFuZ2VkLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd29uJ3Qga25vdyByaWdodCBhd2F5IHdoZXRoZXIgdGhlIElNRSBpcyBnZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXllZCwgc28uLi4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CisKICAgICAgICAgICAgICAgICAgICAgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgY3NyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlbFN0YXJ0ICE9IG9sZFNlbFN0YXJ0IHx8IG5ld1NlbEVuZCAhPSBvbGRTZWxFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzciA9IG5ldyBDb21taXRTZWxlY3Rpb25SZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdTdGFydCA9IG5ld1NlbFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdFbmQgPSBuZXdTZWxFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3IgPSBuZXcgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIob2xkU2VsU3RhcnQsIG9sZFNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsU3RhcnQsIG5ld1NlbEVuZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbW0uc2hvd1NvZnRJbnB1dCh0aGlzLCAwLCBjc3IpICYmIGNzciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgSU1FIG1pZ2h0IGdldCBzaG93biAtLSByZXZlcnQgdG8gdGhlIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uLCBhbmQgY2hhbmdlIHRvIHRoZSBuZXcgd2hlbiB3ZSBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCBvZiBpdCBpcyBva2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBvbGRTZWxTdGFydCwgb2xkU2VsRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBpbW0uc2hvd1NvZnRJbnB1dCh0aGlzLCAwLCBjc3IpICYmIChjc3IgIT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC02NjI0LDYgKzY3NDYsNDQgQEAKICAgICAgICAgcmV0dXJuIHN1cGVyUmVzdWx0OwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcnMoKSB7CisgICAgICAgIGJvb2xlYW4gYXRMZWFzdE9uZUNvbnRyb2xsZXIgPSBmYWxzZTsKKworICAgICAgICAvLyBUT0RPIEFkZCBhbiBleHRyYSBhbmRyb2lkOmN1cnNvckNvbnRyb2xsZXIgZmxhZyB0byBkaXNhYmxlIHRoZSBjb250cm9sbGVyPworICAgICAgICBpZiAobUN1cnNvclZpc2libGUgJiYgbUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBhdExlYXN0T25lQ29udHJvbGxlciA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciA9IG5ldyBJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiBtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0TGVhc3RPbmVDb250cm9sbGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0gbmV3IFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CisgICAgICAgICAgICAvLyBTdG9wIHNlbGVjdGlvbiBtb2RlIGlmIHRoZSBjb250cm9sbGVyIGJlY29tZXMgdW5hdmFpbGFibGUuCisgICAgICAgICAgICBmaW5pc2hTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXRMZWFzdE9uZUNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1DdXJzb3JDb250cm9sbGVyVmVydGljYWxPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uY3Vyc29yX2NvbnRyb2xsZXJfdmVydGljYWxfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhpcyBUZXh0VmlldyBjb250YWlucyBhIHRleHQgdGhhdCBjYW4gYmUgZWRpdGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RleHRFZGl0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0IGluc3RhbmNlb2YgRWRpdGFibGUgJiYgb25DaGVja0lzVGV4dEVkaXRvcigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSwgb25seSB3aGlsZSBwcm9jZXNzaW5nIGEgdG91Y2ggZ2VzdHVyZSwgaWYgdGhlIGluaXRpYWwKICAgICAgKiB0b3VjaCBkb3duIGV2ZW50IGNhdXNlZCBmb2N1cyB0byBtb3ZlIHRvIHRoZSB0ZXh0IHZpZXcgYW5kIGFzIGEgcmVzdWx0CkBAIC02NjU3LDcgKzY4MTcsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJsaW5rIGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFRleHRWaWV3PiBtVmlldzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFRleHRWaWV3PiBtVmlldzsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxsZWQ7CiAKICAgICAgICAgcHVibGljIEJsaW5rKFRleHRWaWV3IHYpIHsKQEAgLTY2NzQsOCArNjgzNCw4IEBACiAgICAgICAgICAgICBUZXh0VmlldyB0diA9IG1WaWV3LmdldCgpOwogCiAgICAgICAgICAgICBpZiAodHYgIT0gbnVsbCAmJiB0di5pc0ZvY3VzZWQoKSkgewotICAgICAgICAgICAgICAgIGludCBzdCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydCh0di5tVGV4dCk7Ci0gICAgICAgICAgICAgICAgaW50IGVuID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZCh0di5tVGV4dCk7CisgICAgICAgICAgICAgICAgaW50IHN0ID0gdHYuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgZW4gPSB0di5nZXRTZWxlY3Rpb25FbmQoKTsKIAogICAgICAgICAgICAgICAgIGlmIChzdCA9PSBlbiAmJiBzdCA+PSAwICYmIGVuID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHR2Lm1MYXlvdXQgIT0gbnVsbCkgewpAQCAtNjc1Miw4ICs2OTEyLDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbUxheW91dC5nZXRXaWR0aCgpOworICAgICAgICBpZiAobUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVNpbmdsZUxpbmUgJiYgKG1HcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gR3Jhdml0eS5MRUZUID8KKyAgICAgICAgICAgICAgICAgICAgKGludCkgbUxheW91dC5nZXRMaW5lV2lkdGgoMCkgOiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIuY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpOwogICAgIH0KQEAgLTY4NTYsMjEgKzcwMTgsMTcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2VsZWN0QWxsKCkgewotICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgbVRleHQubGVuZ3RoKCkgIT0gMCAmJgotICAgICAgICAgICAgbU1vdmVtZW50ICE9IG51bGwgJiYgbU1vdmVtZW50LmNhblNlbGVjdEFyYml0cmFyaWx5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gY2FuU2VsZWN0VGV4dCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWxlY3RUZXh0KCkgewotICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgbVRleHQubGVuZ3RoKCkgIT0gMCAmJgotICAgICAgICAgICAgbU1vdmVtZW50ICE9IG51bGwgJiYgbU1vdmVtZW50LmNhblNlbGVjdEFyYml0cmFyaWx5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcigpIHJlbGllcyBvbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvbmRpdGlvbiwgbWFrZSBzdXJlIHByZXBhcmVDdXJzb3JDb250cm9sbGVyIGlzIGNhbGxlZCBhbnl3aGVyZQorICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdGhpcyBjb25kaXRpb24gbWlnaHQgYmUgY2hhbmdlZC4KKyAgICAgICAgcmV0dXJuIChtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJgorICAgICAgICAgICAgICAgIG1UZXh0Lmxlbmd0aCgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICBtTW92ZW1lbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIG1Nb3ZlbWVudC5jYW5TZWxlY3RBcmJpdHJhcmlseSgpKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuQ3V0KCkgewpAQCAtNjkwMCwyMyArNzA1OCwyMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXN0ZSgpIHsKLSAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgRWRpdGFibGUgJiYgbUlucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAgIGdldFNlbGVjdGlvblN0YXJ0KCkgPj0gMCAmJiBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwKSB7Ci0gICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXAgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7Ci0gICAgICAgICAgICBpZiAoY2xpcC5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIChtVGV4dCBpbnN0YW5jZW9mIEVkaXRhYmxlICYmCisgICAgICAgICAgICAgICAgbUlucHV0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25TdGFydCgpID49IDAgJiYKKyAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwICYmCisgICAgICAgICAgICAgICAgKChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpKS4KKyAgICAgICAgICAgICAgICBoYXNQcmltYXJ5Q2xpcCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgd29yZCB0byBhZGQgdG8gdGhlIGRpY3Rpb25hcnkgZnJvbSB0aGUgY29udGV4dCBtZW51LAotICAgICAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gY3Vyc29yIG9yIG5vIHdvcmQgYXQgdGhlIGN1cnNvci4KKyAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXRzIGRlbGltaXRpbmcgdGhlICd3b3JkJyBsb2NhdGVkIGF0IHBvc2l0aW9uIG9mZnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IGluIHRoZSB0ZXh0LgorICAgICAqIEByZXR1cm4gVGhlIG9mZnNldHMgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSB3b3JkIGxvY2F0ZWQgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICAgKiBUaGUgdHdvIGludHMgb2Zmc2V0cyBhcmUgcGFja2VkIGluIGEgbG9uZywgd2l0aCB0aGUgc3RhcnRpbmcgb2Zmc2V0IHNoaWZ0ZWQgYnkgMzIgYml0cy4KKyAgICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgbm8gdmFsaWQgd29yZCB3YXMgZm91bmQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29yZEZvckRpY3Rpb25hcnkoKSB7CisgICAgcHJpdmF0ZSBsb25nIGdldFdvcmRMaW1pdHNBdChpbnQgb2Zmc2V0KSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFF1aWNrIHJldHVybiBpZiB0aGUgaW5wdXQgdHlwZSBpcyBvbmUgd2hlcmUgYWRkaW5nIHdvcmRzCiAgICAgICAgICAqIHRvIHRoZSBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UuCkBAIC02OTI1LDcgKzcwODMsNyBAQAogICAgICAgICBpZiAoa2xhc3MgPT0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfTlVNQkVSIHx8CiAgICAgICAgICAgICBrbGFzcyA9PSBJbnB1dFR5cGUuVFlQRV9DTEFTU19QSE9ORSB8fAogICAgICAgICAgICAga2xhc3MgPT0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfREFURVRJTUUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHZhcmlhdGlvbiA9IG1JbnB1dFR5cGUgJiBJbnB1dFR5cGUuVFlQRV9NQVNLX1ZBUklBVElPTjsKQEAgLTY5MzQsMTMgKzcwOTIsMTMgQEAKICAgICAgICAgICAgIHZhcmlhdGlvbiA9PSBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9WSVNJQkxFX1BBU1NXT1JEIHx8CiAgICAgICAgICAgICB2YXJpYXRpb24gPT0gSW5wdXRUeXBlLlRZUEVfVEVYVF9WQVJJQVRJT05fRU1BSUxfQUREUkVTUyB8fAogICAgICAgICAgICAgdmFyaWF0aW9uID09IElucHV0VHlwZS5UWVBFX1RFWFRfVkFSSUFUSU9OX0ZJTFRFUikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgZW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CisgICAgICAgIGludCBlbmQgPSBvZmZzZXQ7CiAKICAgICAgICAgaWYgKGVuZCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHN0YXJ0ID0gZW5kOwpAQCAtNjk3NCw2ICs3MTMyLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiA0OCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKICAgICAgICAgYm9vbGVhbiBoYXNMZXR0ZXIgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIobVRyYW5zZm9ybWVkLmNoYXJBdChpKSkpIHsKQEAgLTY5ODEsMTkgKzcxNDcsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIGlmICghaGFzTGV0dGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gNDgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFRleHRVdGlscy5zdWJzdHJpbmcobVRyYW5zZm9ybWVkLCBzdGFydCwgZW5kKTsKKyAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZworICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTcwMzcsODQgKzcxOTcsOCBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUpOwogICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKCFpc0ZvY3VzZWQoKSkgewotICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5hbWUgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5QWxsOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NPUFksIDAsIG5hbWUpLgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRUZXh0TWVudVRpdGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKIAotICAgICAgICBpZiAoY2FuU2VsZWN0QWxsKCkpIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7Ci0gICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvblN0YXJ0KCkgIT0gZ2V0U2VsZWN0aW9uRW5kKCk7Ci0KLSAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgaWYgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUobVRleHQsIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUT1BfU0VMRUNUSU5HX1RFWFQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zdG9wU2VsZWN0aW5nVGV4dCkuCi0gICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhbkN1dCgpKSB7Ci0gICAgICAgICAgICBpbnQgbmFtZTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0QWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIG5hbWUpLgotICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOwotICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgaW50IG5hbWU7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvcHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWUgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5QWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBuYW1lKS4KLSAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYW5QYXN0ZSgpKSB7Ci0gICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgotICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd2Jyk7Ci0gICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CiAgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOwogICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwpAQCAtNzEyOCwyNSArNzIxMiwyMSBAQAogICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NPUFlfVVJMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvcHlVcmwpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOworCiAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzSW5wdXRNZXRob2RUYXJnZXQoKSkgewotICAgICAgICAgICAgbWVudS5hZGQoMSwgSURfU1dJVENIX0lOUFVUX01FVEhPRCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuaW5wdXRNZXRob2QpLgotICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCB3aGljaCB3aWxsIHByZXZlbnQgdGhlIHNlbGVjdGlvbiBtb2RlIGZyb20gc3RhcnRpbmcuCisgICAgICAgIC8vIEFkZCBhIGVudHJ5IHRvIHN0YXJ0IGl0IGluIHRoZSBjb250ZXh0IG1lbnUuCisgICAgICAgIC8vIFRPRE8gRG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc3ViY2xhc3MgZG9lcyBub3QgY2FsbCBzdXBlci50aGlzTWV0aG9kIG9yCisgICAgICAgIC8vIHBvcHVsYXRlcyB0aGUgbWVudSBBRlRFUiB0aGlzIGNhbGwuCisgICAgICAgIGlmIChtZW51LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVElPTl9NT0RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0TW9kZSkuCisgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgaWYgKHdvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVudS5hZGQoMSwgSURfQUREX1RPX0RJQ1RJT05BUlksIDAsCi0gICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFkZFRvRGljdGlvbmFyeSwgd29yZCkpLgotICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLQotICAgICAgICB9Ci0KICAgICAgICAgaWYgKGFkZGVkKSB7CiAgICAgICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmVkaXRUZXh0TWVudVRpdGxlKTsKICAgICAgICAgfQpAQCAtNzE2MSwxNSArNzI0MSwxNCBAQAogICAgICAgICByZXR1cm4gaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpOwogICAgIH0KICAgICAKKyAgICAvLyBTZWxlY3Rpb24gY29udGV4dCBtb2RlCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVF9BTEwgPSBhbmRyb2lkLlIuaWQuc2VsZWN0QWxsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TVEFSVF9TRUxFQ1RJTkdfVEVYVCA9IGFuZHJvaWQuUi5pZC5zdGFydFNlbGVjdGluZ1RleHQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NUT1BfU0VMRUNUSU5HX1RFWFQgPSBhbmRyb2lkLlIuaWQuc3RvcFNlbGVjdGluZ1RleHQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NVVCA9IGFuZHJvaWQuUi5pZC5jdXQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSBhbmRyb2lkLlIuaWQuY29weTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFTVEUgPSBhbmRyb2lkLlIuaWQucGFzdGU7CisgICAgLy8gQ29udGV4dCBtZW51IGVudHJpZXMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWV9VUkwgPSBhbmRyb2lkLlIuaWQuY29weVVybDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1dJVENIX0lOUFVUX01FVEhPRCA9IGFuZHJvaWQuUi5pZC5zd2l0Y2hJbnB1dE1ldGhvZDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQUREX1RPX0RJQ1RJT05BUlkgPSBhbmRyb2lkLlIuaWQuYWRkVG9EaWN0aW9uYXJ5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1RJT05fTU9ERSA9IGFuZHJvaWQuUi5pZC5zZWxlY3RUZXh0TW9kZTsKIAogICAgIHByaXZhdGUgY2xhc3MgTWVudUhhbmRsZXIgaW1wbGVtZW50cyBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7CkBAIC03MTc5LDExICs3MjU4LDcgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IG9wdGlvbiBmb3IgdGhlIHRleHQgdmlldyBpcyBzZWxlY3RlZC4gIEN1cnJlbnRseQotICAgICAqIHRoaXMgd2lsbCBiZSBvbmUgb2Y6IHtAbGluayBhbmRyb2lkLlIuaWQjc2VsZWN0QWxsfSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3N0YXJ0U2VsZWN0aW5nVGV4dH0sIHtAbGluayBhbmRyb2lkLlIuaWQjc3RvcFNlbGVjdGluZ1RleHR9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjY3V0fSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3Bhc3RlfSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSwKLSAgICAgKiBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3N3aXRjaElucHV0TWV0aG9kfS4KKyAgICAgKiB0aGlzIHdpbGwgYmUge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdFRleHRNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7CiAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CkBAIC03MTk0LDExMiArNzI2OSw3OTkgQEAKICAgICAgICAgICAgIHNlbEVuZCA9IG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICBpbnQgbWF4ID0gTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCk7CisgICAgICAgIGludCBtaW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWxTdGFydCwgc2VsRW5kKSk7CisgICAgICAgIGludCBtYXggPSBNYXRoLm1heCgwLCBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKSk7CiAKLSAgICAgICAgaWYgKG1pbiA8IDApIHsKLSAgICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1heCA8IDApIHsKLSAgICAgICAgICAgIG1heCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXAgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKIAogICAgICAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgICAgICAgICBjYXNlIElEX1NFTEVDVF9BTEw6Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9TVEFSVF9TRUxFQ1RJTkdfVEVYVDoKLSAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuc3RhcnRTZWxlY3RpbmcodGhpcywgKFNwYW5uYWJsZSkgbVRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1NUT1BfU0VMRUNUSU5HX1RFWFQ6Ci0gICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3RpbmcodGhpcywgKFNwYW5uYWJsZSkgbVRleHQpOwotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvbkVuZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9DVVQ6Ci0gICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3RpbmcodGhpcywgKFNwYW5uYWJsZSkgbVRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1pbiA9PSBtYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbVRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NPUFk6Ci0gICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3RpbmcodGhpcywgKFNwYW5uYWJsZSkgbVRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1pbiA9PSBtYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbVRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1BBU1RFOgotICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5zdG9wU2VsZWN0aW5nKHRoaXMsIChTcGFubmFibGUpIG1UZXh0KTsKLQotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLnJlcGxhY2UobWluLCBtYXgsIHBhc3RlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgICAgICAgICAgY2FzZSBJRF9DT1BZX1VSTDoKICAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuc3RvcFNlbGVjdGluZyh0aGlzLCAoU3Bhbm5hYmxlKSBtVGV4dCk7CiAKLSAgICAgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dCh1cmxzWzBdLmdldFVSTCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9EOgotICAgICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltbS5zaG93SW5wdXRNZXRob2RQaWNrZXIoKTsKKyAgICAgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LCBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGlwcGVkRGF0YS5JdGVtIGl0ZW0gPSBuZXcgQ2xpcHBlZERhdGEuSXRlbSh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgPSBuZXcgQ2xpcHBlZERhdGEobnVsbCwgbnVsbCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuYWRkSXRlbShpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgICAgICBjYXNlIElEX0FERF9UT19ESUNUSU9OQVJZOgotICAgICAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLQotICAgICAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZW50IGkgPSBuZXcgSW50ZW50KCJjb20uYW5kcm9pZC5zZXR0aW5ncy5VU0VSX0RJQ1RJT05BUllfSU5TRVJUIik7Ci0gICAgICAgICAgICAgICAgICAgIGkucHV0RXh0cmEoIndvcmQiLCB3b3JkKTsKLSAgICAgICAgICAgICAgICAgICAgaS5zZXRGbGFncyhpLmdldEZsYWdzKCkgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGkpOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgY2FzZSBJRF9TRUxFQ1RJT05fTU9ERToKKyAgICAgICAgICAgICAgICBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUxvbmdDbGljaygpIHsKICAgICAgICAgaWYgKHN1cGVyLnBlcmZvcm1Mb25nQ2xpY2soKSkgewogICAgICAgICAgICAgbUVhdFRvdWNoUmVsZWFzZSA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpKSB7CisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiB0b3VjaFBvc2l0aW9uSXNJblNlbGVjdGlvbigpIHsKKyAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgaW50IHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PSBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHNlbGVjdGlvbkVuZCkgeworICAgICAgICAgICAgaW50IHRtcCA9IHNlbGVjdGlvblN0YXJ0OworICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25FbmQ7CisgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB0bXA7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQorICAgICAgICAgICAgKChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpOworICAgICAgICBpbnQgbWluT2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1pblRvdWNoT2Zmc2V0KCk7CisgICAgICAgIGludCBtYXhPZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWF4VG91Y2hPZmZzZXQoKTsKKworICAgICAgICByZXR1cm4gKChtaW5PZmZzZXQgPj0gc2VsZWN0aW9uU3RhcnQpICYmIChtYXhPZmZzZXQgPCBzZWxlY3Rpb25FbmQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgY2FsbGJhY2sgdXNlZCB0byBzdGFydCBhIHNlbGVjdGlvbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBjYWxsYmFjayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdGFydCBzZWxlY3Rpb24gbW9kZSwgb3IgbnVsbCBpZiBzZWxlY3Rpb24KKyAgICAgKiBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIGdldEFjdGlvbk1vZGVDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiAhdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlbGVjdGlvbiBhY3Rpb24gbW9kZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgYWN0aW9uTW9kZUNhbGxiYWNrID0gZ2V0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChhY3Rpb25Nb2RlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUoYWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNmaW5pc2hTZWxlY3Rpb25BY3Rpb25Nb2RlKCl9LCBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBjdXJzb3IgY29udHJvbGxlcgorICAgICAqIGZhZGUgb3V0IGFuaW1hdGlvbi4gTmVlZGVkIHNpbmNlIHRoZSBkcmF3YWJsZSBhbmQgdGhlaXIgYWxwaGEgdmFsdWVzIGFyZSBzaGFyZWQgYnkgYWxsCisgICAgICogVGV4dFZpZXdzLiBTd2l0Y2hpbmcgZnJvbSBvbmUgVGV4dFZpZXcgdG8gYW5vdGhlciB3b3VsZCBmYWRlIHRoZSBjdXJzb3IgY29udHJvbGxlcnMgaW4gdGhlCisgICAgICogbmV3IG9uZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCkgeworICAgICAgICBmaW5pc2hTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CisgICAgICAgICAgICBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuY2FuY2VsRmFkZU91dEFuaW1hdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKworICAgICAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NoYXRfZGFzaGJvYXJkKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY29tcG9zZSkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2F0dGFjaG1lbnQpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY2FtZXJhKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZSkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q3VycmVudFdvcmQoKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHNlbGVjdGlvbiBtb2RlIGlzIHN0YXJ0ZWQgYWZ0ZXIgYW4gb3JpZW50YXRpb24gY2hhbmdlLCB1c2UgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZQorICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZDsKKworICAgICAgICAgICAgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgKChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpOworICAgICAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOworICAgICAgICAgICAgaW50IG1heE9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNYXhUb3VjaE9mZnNldCgpOworCisgICAgICAgICAgICBsb25nIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobWluT2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgobWluT2Zmc2V0IC0gNSwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobWF4T2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSAoaW50KSAod29yZExpbWl0cyAmIDB4MDAwMDAwMDBGRkZGRkZGRkwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihtYXhPZmZzZXQgKyA1LCBtVGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaXRlbUlkID0gaXRlbS5nZXRJdGVtSWQoKTsKKworICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBJRF9TRUxFQ1RfQUxMKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgMCwgbVRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjb250cm9sbGVyIHBvc2l0aW9ucyBhZnRlciBzZWxlY3Rpb24gY2hhbmdlLgorICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKSBnZXRDb250ZXh0KCkuCisgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgICAgIGludCBtaW4gPSAwOworICAgICAgICAgICAgaW50IG1heCA9IG1UZXh0Lmxlbmd0aCgpOworCisgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpKTsKKyAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heCgwLCBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSURfUEFTVEU6CisgICAgICAgICAgICAgICAgICAgIENsaXBwZWREYXRhIGNsaXAgPSBjbGlwYm9hcmQuZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaWRmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsaXAuZ2V0SXRlbUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0SXRlbShpKS5jb2VyY2VUb1RleHQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBtYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLnJlcGxhY2UobWluLCBtYXgsIHBhc3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5pbnNlcnQoZ2V0U2VsZWN0aW9uRW5kKCksICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NVVDoKKyAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKG5ldyBDbGlwcGVkRGF0YShudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwcGVkRGF0YS5JdGVtKG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpKSk7CisgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2hTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAobmV3IENsaXBwZWREYXRhKG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBwZWREYXRhLkl0ZW0obVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25TdGFydCgpKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgQ3Vyc29yQ29udHJvbGxlciBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0byBjb250cm9sIGEgY3Vyc29yIGluIHRoZSB0ZXh0LgorICAgICAqCisgICAgICogSXQgY2FuIGJlIHBhc3NlZCB0byBhbiB7QGxpbmsgQXJyb3dLZXlNb3ZlbWVudE1ldGhvZH0gd2hpY2ggY2FuIGludGVyY2VwdHMgZXZlbnRzCisgICAgICogYW5kIHNlbmQgdGhlbSB0byB0aGlzIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJzb3IuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDdXJzb3JDb250cm9sbGVyIHsKKyAgICAgICAgLyogQ3Vyc29yIGZhZGUtb3V0IGFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzLiAqLworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEZBREVfT1VUX0RVUkFUSU9OID0gNDAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlcyB0aGUgY3Vyc29yIGNvbnRyb2xsZXIgdmlzaWJsZSBvbiBzY3JlZW4uIFdpbGwgYmUgZHJhd24gYnkge0BsaW5rICNkcmF3KENhbnZhcyl9LgorICAgICAgICAgKiBTZWUgYWxzbyB7QGxpbmsgI2hpZGUoKX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhpZGUgdGhlIGN1cnNvciBjb250cm9sbGVyIGZyb20gc2NyZWVuLgorICAgICAgICAgKiBTZWUgYWxzbyB7QGxpbmsgI3Nob3coKX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZSB0aGUgY29udHJvbGxlcidzIHBvc2l0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUG9zaXRpb24oaW50IG9mZnNldCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250cm9sbGVyIGFuZCB0aGUgY3Vyc29yJ3MgcG9zaXRpb25zIGNhbiBiZSBsaW5rIGJ5IGEgZml4ZWQgb2Zmc2V0LAorICAgICAgICAgKiBjb21wdXRlZCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIHRvdWNoZWQsIGFuZCB0aGVuIG1haW50YWluZWQgYXMgaXQgbW92ZXMKKyAgICAgICAgICogQHJldHVybiBIb3Jpem9udGFsIG9mZnNldCBiZXR3ZWVuIHRoZSBjb250cm9sbGVyIGFuZCB0aGUgY3Vyc29yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZsb2F0IGdldE9mZnNldFgoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBWZXJ0aWNhbCBvZmZzZXQgYmV0d2VlbiB0aGUgY29udHJvbGxlciBhbmQgdGhlIGN1cnNvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRPZmZzZXRZKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgI29uVG91Y2hFdmVudChNb3Rpb25FdmVudCl9IGFuZCBnaXZlcyB0aGUgY29udHJvbGxlcgorICAgICAgICAgKiBhIGNoYW5jZSB0byBiZWNvbWUgYWN0aXZlIGFuZC9vciB2aXNpYmxlLgorICAgICAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHRvdWNoIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmF3cyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udHJvbGxlciBvbiB0aGUgY2FudmFzLgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB7QGxpbmsgI2RyYXcoQ2FudmFzKX0sIGluIHRoZSBjb250ZW50IGNvb3JkaW5hdGVzIHN5c3RlbS4KKyAgICAgICAgICogQHBhcmFtIGNhbnZhcyBUaGUgQ2FudmFzIHVzZWQgYnkgdGhpcyBUZXh0Vmlldy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcyk7CisgICAgfQorCisgICAgY2xhc3MgSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyIGltcGxlbWVudHMgQ3Vyc29yQ29udHJvbGxlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxBWV9CRUZPUkVfRkFERV9PVVQgPSAyMTAwOworCisgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgY29udHJvbCBpcyBjdXJyZW50bHkgdmlzaWJsZQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAvLyBTdGFydGluZyB0aW1lIG9mIHRoZSBmYWRlIHRpbWVyCisgICAgICAgIHByaXZhdGUgbG9uZyBtRmFkZU91dFRpbWVyU3RhcnQ7CisgICAgICAgIC8vIFRoZSBjdXJzb3IgY29udHJvbGxlciBpbWFnZQorICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1EcmF3YWJsZTsKKyAgICAgICAgLy8gVXNlZCB0byBkZXRlY3QgYSB0YXAgKHZzIGRyYWcpIG9uIHRoZSBjb250cm9sbGVyCisgICAgICAgIHByaXZhdGUgbG9uZyBtT25Eb3duVGltZXJTdGFydDsKKyAgICAgICAgLy8gT2Zmc2V0IGJldHdlZW4gZmluZ2VyIGhvdCBwb2ludCBvbiBjdXJzb3IgY29udHJvbGxlciBhbmQgYWN0dWFsIGN1cnNvcgorICAgICAgICBwcml2YXRlIGZsb2F0IG1PZmZzZXRYLCBtT2Zmc2V0WTsKKworICAgICAgICBJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtRHJhd2FibGUgPSByZXMuZ2V0RHJhd2FibGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5jdXJzb3JfY29udHJvbGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgdXBkYXRlRHJhd2FibGVQb3NpdGlvbigpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGRvbmUgYWZ0ZXIgdXBkYXRlUG9zaXRpb24sIHNvIHRoYXQgcHJldmlvdXMgcG9zaXRpb24gaW52YWxpZGF0ZQorICAgICAgICAgICAgLy8gaW4gb25seSBkb25lIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIG1Jc1Zpc2libGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgZmFkaW5nIG91dCwgb25seSBpZiBub3QgYWxyZWFkeSBpbiBwcm9ncmVzcworICAgICAgICAgICAgICAgIGlmICh0aW1lIC0gbUZhZGVPdXRUaW1lclN0YXJ0IDwgREVMQVlfQkVGT1JFX0ZBREVfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIG1GYWRlT3V0VGltZXJTdGFydCA9IHRpbWUgLSBERUxBWV9CRUZPUkVfRkFERV9PVVQ7CisgICAgICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKG1EcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBpZiAobUlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGludCB0aW1lID0gKGludCkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbUZhZGVPdXRUaW1lclN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpZiAodGltZSA8PSBERUxBWV9CRUZPUkVfRkFERV9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKERFTEFZX0JFRk9SRV9GQURFX09VVCAtIHRpbWUsIG1EcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZSAtPSBERUxBWV9CRUZPUkVfRkFERV9PVVQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IEZBREVfT1VUX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWxwaGEgPSAyNTUgKiAoRkFERV9PVVRfRFVSQVRJT04gLSB0aW1lKSAvIEZBREVfT1VUX0RVUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZCgzMCwgbURyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRBbHBoYSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1Zpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUG9zaXRpb24oaW50IG9mZnNldCkgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBnZXRTZWxlY3Rpb25TdGFydCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBObyBjaGFuZ2UsIG5vIG5lZWQgdG8gcmVkcmF3CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBvZmZzZXQpOworICAgICAgICAgICAgdXBkYXRlRHJhd2FibGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyYXdhYmxlUG9zaXRpb24oKSB7CisgICAgICAgICAgICBpZiAobUlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGN1cnNvciBjb250cm9sbGVyIGJlZm9yZSBib3VuZHMgYXJlIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZShtRHJhd2FibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKworICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBzYWZldHkgY2hlY2suCisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVwZGF0ZSBjdXJzb3IgY29udHJvbGxlciBwb3NpdGlvbiBjYWxsZWQgd2l0aCBubyBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICBtSXNWaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb3NpdGlvbkRyYXdhYmxlVW5kZXJDdXJzb3Iob2Zmc2V0LCBtRHJhd2FibGUpOworCisgICAgICAgICAgICBtRmFkZU91dFRpbWVyU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRBbHBoYSgyNTUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKCkgJiYgaXNUZXh0RWRpdGFibGUoKSAmJiBtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOIDogeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5nZXJJc09uRHJhd2FibGUoeCwgeSwgbURyYXdhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTW92ZW1lbnQgaW5zdGFuY2VvZiBBcnJvd0tleU1vdmVtZW50TWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCltTW92ZW1lbnQpLnNldEN1cnNvckNvbnRyb2xsZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIHNjcm9sbFZpZXcgcGFyZW50IGZyb20gc2Nyb2xsaW5nLCBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgYXV0by1zY3JvbGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQucmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IG1EcmF3YWJsZS5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0WCA9IChib3VuZHMubGVmdCArIGJvdW5kcy5yaWdodCkgLyAyLjBmIC0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0WSA9IGJvdW5kcy50b3AgLSBtQ3Vyc29yQ29udHJvbGxlclZlcnRpY2FsT2Zmc2V0IC0geTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkRvd25UaW1lclN0YXJ0ID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQIDogeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWUgPSAoaW50KSAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgLSBtT25Eb3duVGltZXJTdGFydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGFwIG9uIHRoZSBjb250cm9sbGVyIChub3QgYSBkcmFnKSB3aWxsIG1vdmUgdGhlIGN1cnNvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXQoKGludCkgZXZlbnQuZ2V0WCgpLCAoaW50KSBldmVudC5nZXRZKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllZCBieSBjYW5jZWxMb25nUHJlc3MgYW5kIHByZXZlbnRzIHRoZSBjdXJzb3IgZnJvbSBjaGFuZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0T2Zmc2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT2Zmc2V0WDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRPZmZzZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIG1PZmZzZXRZOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIGltcGxlbWVudHMgQ3Vyc29yQ29udHJvbGxlciB7CisgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBzZWxlY3Rpb24gY29udHJvbHMgYXJlIGN1cnJlbnRseSB2aXNpYmxlCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlID0gZmFsc2U7CisgICAgICAgIC8vIFdoZXRoZXIgdGhhdCBzdGFydCBvciB0aGUgZW5kIG9mIHNlbGVjdGlvbiBjb250cm9sbGVyIGlzIGRyYWdnZWQKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydElzRHJhZ2dlZCA9IGZhbHNlOworICAgICAgICAvLyBTdGFydGluZyB0aW1lIG9mIHRoZSBmYWRlIHRpbWVyCisgICAgICAgIHByaXZhdGUgbG9uZyBtRmFkZU91dFRpbWVyU3RhcnQ7CisgICAgICAgIC8vIFRoZSBjdXJzb3IgY29udHJvbGxlciBpbWFnZXMKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3RhcnREcmF3YWJsZSwgbUVuZERyYXdhYmxlOworICAgICAgICAvLyBPZmZzZXQgYmV0d2VlbiBmaW5nZXIgaG90IHBvaW50IG9uIGFjdGl2ZSBjdXJzb3IgY29udHJvbGxlciBhbmQgYWN0dWFsIGN1cnNvcgorICAgICAgICBwcml2YXRlIGZsb2F0IG1PZmZzZXRYLCBtT2Zmc2V0WTsKKyAgICAgICAgLy8gVGhlIG9mZnNldHMgb2YgdGhhdCBsYXN0IHRvdWNoIGRvd24gZXZlbnQuIFJlbWVtYmVyZWQgdG8gc3RhcnQgc2VsZWN0aW9uIHRoZXJlLgorICAgICAgICBwcml2YXRlIGludCBtTWluVG91Y2hPZmZzZXQsIG1NYXhUb3VjaE9mZnNldDsKKworICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIoKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtU3RhcnREcmF3YWJsZSA9IHJlcy5nZXREcmF3YWJsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnNlbGVjdGlvbl9zdGFydF9oYW5kbGUpOworICAgICAgICAgICAgbUVuZERyYXdhYmxlID0gcmVzLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc2VsZWN0aW9uX2VuZF9oYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgICAgIHVwZGF0ZURyYXdhYmxlc1Bvc2l0aW9ucygpOworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGRvbmUgYWZ0ZXIgdXBkYXRlUG9zaXRpb24sIHNvIHRoYXQgcHJldmlvdXMgcG9zaXRpb24gaW52YWxpZGF0ZQorICAgICAgICAgICAgLy8gaW4gb25seSBkb25lIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIG1Jc1Zpc2libGUgPSB0cnVlOworICAgICAgICAgICAgbUZhZGVPdXRUaW1lclN0YXJ0ID0gLTE7CisgICAgICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGUgJiYgKG1GYWRlT3V0VGltZXJTdGFydCA8IDApKSB7CisgICAgICAgICAgICAgICAgbUZhZGVPdXRUaW1lclN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGUobVN0YXJ0RHJhd2FibGUpOworICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKG1FbmREcmF3YWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxGYWRlT3V0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgcG9zdEludmFsaWRhdGUobVN0YXJ0RHJhd2FibGUpOworICAgICAgICAgICAgcG9zdEludmFsaWRhdGUobUVuZERyYXdhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobUZhZGVPdXRUaW1lclN0YXJ0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRpbWUgPSAoaW50KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBtRmFkZU91dFRpbWVyU3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAodGltZSA8PSBGQURFX09VVF9EVVJBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFscGhhID0gMjU1ICogKEZBREVfT1VUX0RVUkFUSU9OIC0gdGltZSkgLyBGQURFX09VVF9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydERyYXdhYmxlLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FbmREcmF3YWJsZS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoMzAsIG1TdGFydERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZCgzMCwgbUVuZERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydERyYXdhYmxlLnNldEFscGhhKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbUVuZERyYXdhYmxlLnNldEFscGhhKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdGFydERyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICBtRW5kRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUG9zaXRpb24oaW50IG9mZnNldCkgeworICAgICAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBzZWxlY3Rpb25FbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN0YXJ0IGFuZCBlbmQgYXJlIHN3YXBwZWQsIG1ha2luZyBzdXJlIHN0YXJ0IDw9IGVuZAorICAgICAgICAgICAgaWYgKG1TdGFydElzRHJhZ2dlZCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPD0gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlLCBubyBuZWVkIHRvIHJlZHJhdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvbkVuZDsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtU3RhcnRJc0RyYWdnZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc2VsZWN0aW9uU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkVuZCA9PSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlLCBubyBuZWVkIHRvIHJlZHJhdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtU3RhcnRJc0RyYWdnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CisgICAgICAgICAgICB1cGRhdGVEcmF3YWJsZXNQb3NpdGlvbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEcmF3YWJsZXNQb3NpdGlvbnMoKSB7CisgICAgICAgICAgICBpZiAobUlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGN1cnNvciBjb250cm9sbGVyIGJlZm9yZSBib3VuZHMgYXJlIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZShtU3RhcnREcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGUobUVuZERyYXdhYmxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzZWxlY3Rpb25FbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaWYgKChzZWxlY3Rpb25TdGFydCA8IDApIHx8IChzZWxlY3Rpb25FbmQgPCAwKSkgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIHNhZmV0eSBjaGVjay4KKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVXBkYXRlIHNlbGVjdGlvbiBjb250cm9sbGVyIHBvc2l0aW9uIGNhbGxlZCB3aXRoIG5vIGN1cnNvciIpOworICAgICAgICAgICAgICAgIG1Jc1Zpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvc2l0aW9uRHJhd2FibGVVbmRlckN1cnNvcihzZWxlY3Rpb25TdGFydCwgbVN0YXJ0RHJhd2FibGUpOworICAgICAgICAgICAgcG9zaXRpb25EcmF3YWJsZVVuZGVyQ3Vyc29yKHNlbGVjdGlvbkVuZCwgbUVuZERyYXdhYmxlKTsKKworICAgICAgICAgICAgbVN0YXJ0RHJhd2FibGUuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIG1FbmREcmF3YWJsZS5zZXRBbHBoYSgyNTUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoaXNUZXh0RWRpdGFibGUoKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uTWFza2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXZlbnQuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldmVudC5nZXRZKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGZpbmdlciBkb3duIHBvc2l0aW9uLCB0byBiZSBhYmxlIHRvIHN0YXJ0IHNlbGVjdGlvbiBvbiB0aGF0IHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICBtTWluVG91Y2hPZmZzZXQgPSBtTWF4VG91Y2hPZmZzZXQgPSBnZXRPZmZzZXQoeCwgeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCBpbnN0YW5jZW9mIEFycm93S2V5TW92ZW1lbnRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09uU3RhcnQgPSBmaW5nZXJJc09uRHJhd2FibGUoeCwgeSwgbVN0YXJ0RHJhd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT25FbmQgPSBmaW5nZXJJc09uRHJhd2FibGUoeCwgeSwgbUVuZERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT25TdGFydCB8fCBpc09uRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBwb3NzaWJsZSBzY3JvbGxWaWV3IHBhcmVudCBmcm9tIHNjcm9sbGluZywgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgYXV0by1zY3JvbGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5yZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBoYW5kbGUgd2lsbCBiZSBkcmFnZ2VkIGluIGNhc2UgQk9USCBjb250cm9sbGVyIGFyZSB1bmRlciBmaW5nZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydElzRHJhZ2dlZCA9IGlzT25TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXJ0SXNEcmFnZ2VkID8gbVN0YXJ0RHJhd2FibGUgOiBtRW5kRHJhd2FibGUpLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldFggPSAoYm91bmRzLmxlZnQgKyBib3VuZHMucmlnaHQpIC8gMi4wZiAtIHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0WSA9IGJvdW5kcy50b3AgLSBtQ3Vyc29yQ29udHJvbGxlclZlcnRpY2FsT2Zmc2V0IC0geTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJvd0tleU1vdmVtZW50TWV0aG9kKW1Nb3ZlbWVudCkuc2V0Q3Vyc29yQ29udHJvbGxlcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aS1wb2ludCBnZXN0dXJlcy4gS2VlcCBtaW4gYW5kIG1heCBvZmZzZXQgcG9zaXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhY3RpdmF0ZWQgZm9yIGRldmljZXMgdGhhdCBjb3JyZWN0bHkgaGFuZGxlIG11bHRpLXRvdWNoLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIX0RJU1RJTkNUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1pbkFuZE1heE9mZnNldHMoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBldmVudAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1pbkFuZE1heE9mZnNldHMoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGludCBwb2ludGVyQ291bnQgPSBldmVudC5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwb2ludGVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoaW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WShpbmRleCk7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCh4LCB5KTsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgbU1pblRvdWNoT2Zmc2V0KSBtTWluVG91Y2hPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IG1NYXhUb3VjaE9mZnNldCkgbU1heFRvdWNoT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRNaW5Ub3VjaE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWluVG91Y2hPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE1heFRvdWNoT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhUb3VjaE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRPZmZzZXRYKCkgeworICAgICAgICAgICAgcmV0dXJuIG1PZmZzZXRYOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldE9mZnNldFkoKSB7CisgICAgICAgICAgICByZXR1cm4gbU9mZnNldFk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGlzIGNvbnRyb2xsZXIgaXMgY3VycmVudGx5IHVzZWQgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIHN0YXJ0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3Rpb25TdGFydERyYWdnZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzVmlzaWJsZSAmJiBtU3RhcnRJc0RyYWdnZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kcyB1c2VkIGJ5IEN1cnNvckNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb25zCisKKyAgICBwcml2YXRlIHZvaWQgcG9zaXRpb25EcmF3YWJsZVVuZGVyQ3Vyc29yKGZpbmFsIGludCBvZmZzZXQsIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZVdpZHRoID0gZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlSGVpZ2h0ID0gZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBsaW5lID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisKKyAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBzQ3Vyc29yQ29udHJvbGxlclRlbXBSZWN0OworICAgICAgICBib3VuZHMubGVmdCA9IChpbnQpIChtTGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCkgLSAwLjUgLSBkcmF3YWJsZVdpZHRoIC8gMi4wKTsKKyAgICAgICAgYm91bmRzLnRvcCA9IG1MYXlvdXQuZ2V0TGluZVRvcChsaW5lICsgMSk7CisKKyAgICAgICAgLy8gTW92ZSBjdXJzb3IgY29udHJvbGxlciBhIGxpdHRsZSBiaXQgdXAgd2hlbiBlZGl0aW5nIHRoZSBsYXN0IGxpbmUgb2YgdGV4dAorICAgICAgICAvLyAob3IgYSBzaW5nbGUgbGluZSkgc28gdGhhdCBpdCBpcyB2aXNpYmxlIGFuZCBlYXNpZXIgdG8gZ3JhYi4KKyAgICAgICAgaWYgKGxpbmUgPT0gbUxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKKyAgICAgICAgICAgIGJvdW5kcy50b3AgLT0gTWF0aC5tYXgoMCwgZHJhd2FibGVIZWlnaHQgLyAyIC0gZ2V0RXh0ZW5kZWRQYWRkaW5nQm90dG9tKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm91bmRzLnJpZ2h0ID0gYm91bmRzLmxlZnQgKyBkcmF3YWJsZVdpZHRoOworICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGRyYXdhYmxlSGVpZ2h0OworCisgICAgICAgIGNvbnZlcnRGcm9tVmlld3BvcnRUb0NvbnRlbnRDb29yZGluYXRlcyhib3VuZHMpOworICAgICAgICBkcmF3YWJsZS5zZXRCb3VuZHMoYm91bmRzKTsKKyAgICAgICAgcG9zdEludmFsaWRhdGUoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmdlcklzT25EcmF3YWJsZShmbG9hdCB4LCBmbG9hdCB5LCBEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAvLyBTaW11bGF0ZSBhICdmYXQgZmluZ2VyJyB0byBlYXNlIGdyYWJiaW5nIG9mIHRoZSBjb250cm9sbGVyLgorICAgICAgICAvLyBFeHBhbmRzIGFjY29yZGluZyB0byBjb250cm9sbGVyIGltYWdlIHNpemUgaW5zdGVhZCBvZiB1c2luZyBkZW5zaXR5LgorICAgICAgICAvLyBBc3N1bWVzIGNvbnRyb2xsZXIgaW1hZ2VyIGhhcyBhIHNlbnNpYmxlIHNpemUsIHByb3BvcnRpb25uYWwgdG8gZGVuc2l0eS4KKyAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlV2lkdGggPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgUmVjdCBmaW5nZXJSZWN0ID0gc0N1cnNvckNvbnRyb2xsZXJUZW1wUmVjdDsKKyAgICAgICAgZmluZ2VyUmVjdC5zZXQoKGludCkgKHggLSBkcmF3YWJsZVdpZHRoIC8gMi4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHkgLSBkcmF3YWJsZUhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh4ICsgZHJhd2FibGVXaWR0aCAvIDIuMCksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHkpOworICAgICAgICByZXR1cm4gUmVjdC5pbnRlcnNlY3RzKGRyYXdhYmxlLmdldEJvdW5kcygpLCBmaW5nZXJSZWN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdEludmFsaWRhdGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBkcmF3YWJsZS5nZXRCb3VuZHMoKTsKKyAgICAgICAgcG9zdEludmFsaWRhdGUoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvc3RJbnZhbGlkYXRlRGVsYXllZChsb25nIGRlbGF5LCBEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IGRyYXdhYmxlLmdldEJvdW5kcygpOworICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoZGVsYXksIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCkgeworICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2Zmc2V0IGNoYXJhY3RlciBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWQgYWJzb2x1dGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0geCBUaGUgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBhIHBvaW50IG9uIHNjcmVlbgorICAgICAqIEBwYXJhbSB5IFRoZSB2ZXJ0aWNhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBhIHBvaW50IG9uIHNjcmVlbgorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIHRoZSBjaGFyYWN0ZXIgd2hvc2UgcG9zaXRpb24gaXMgY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogIHBvc2l0aW9uLiBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIGxheW91dC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5KSB7CisgICAgICAgIHggLT0gZ2V0VG90YWxQYWRkaW5nTGVmdCgpOworICAgICAgICB5IC09IGdldFRvdGFsUGFkZGluZ1RvcCgpOworCisgICAgICAgIC8vIENsYW1wIHRoZSBwb3NpdGlvbiB0byBpbnNpZGUgb2YgdGhlIHZpZXcuCisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgeCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoeCA+PSAoZ2V0V2lkdGgoKSAtIGdldFRvdGFsUGFkZGluZ1JpZ2h0KCkpKSB7CisgICAgICAgICAgICB4ID0gZ2V0V2lkdGgoKS1nZXRUb3RhbFBhZGRpbmdSaWdodCgpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIHkgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHkgPj0gKGdldEhlaWdodCgpIC0gZ2V0VG90YWxQYWRkaW5nQm90dG9tKCkpKSB7CisgICAgICAgICAgICB5ID0gZ2V0SGVpZ2h0KCktZ2V0VG90YWxQYWRkaW5nQm90dG9tKCkgLSAxOworICAgICAgICB9CisKKyAgICAgICAgeCArPSBnZXRTY3JvbGxYKCk7CisgICAgICAgIHkgKz0gZ2V0U2Nyb2xsWSgpOworCisgICAgICAgIExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXQoKTsKKyAgICAgICAgaWYgKGxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yVmVydGljYWwoeSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgeCk7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisKICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAidGV4dCIpCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgICAgICAgICAgICBtVGV4dDsKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSAgICAgICAgICAgIG1UcmFuc2Zvcm1lZDsKQEAgLTczMTgsMTYgKzgwODAsMjcgQEAKICAgICBwcml2YXRlIEFycmF5TGlzdDxUZXh0V2F0Y2hlcj4gIG1MaXN0ZW5lcnMgPSBudWxsOwogCiAgICAgLy8gZGlzcGxheSBhdHRyaWJ1dGVzCi0gICAgcHJpdmF0ZSBUZXh0UGFpbnQgICAgICAgICAgICAgICBtVGV4dFBhaW50OworICAgIHByaXZhdGUgZmluYWwgVGV4dFBhaW50ICAgICAgICAgbVRleHRQYWludDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1Vc2VyU2V0VGV4dFNjYWxlWDsKLSAgICBwcml2YXRlIFBhaW50ICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRQYWludDsKLSAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRDb2xvciA9IDB4RkZCQkRERkY7CisgICAgcHJpdmF0ZSBmaW5hbCBQYWludCAgICAgICAgICAgICBtSGlnaGxpZ2h0UGFpbnQ7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0Q29sb3IgPSAweEQwNzdBMTRCOwogICAgIHByaXZhdGUgTGF5b3V0ICAgICAgICAgICAgICAgICAgbUxheW91dDsKIAogICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgICAgICAgICAgbVNob3dDdXJzb3I7CiAgICAgcHJpdmF0ZSBCbGluayAgICAgICAgICAgICAgICAgICBtQmxpbms7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtQ3Vyc29yVmlzaWJsZSA9IHRydWU7CiAKKyAgICAvLyBDdXJzb3IgQ29udHJvbGxlcnMuIE51bGwgd2hlbiBkaXNhYmxlZC4KKyAgICBwcml2YXRlIEN1cnNvckNvbnRyb2xsZXIgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXI7CisgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOworICAgIC8vIFN0b3JlZCBvbmNlIGFuZCBmb3IgYWxsLgorICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgbUN1cnNvckNvbnRyb2xsZXJWZXJ0aWNhbE9mZnNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1TaG91bGRTdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgICAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlOworICAgIC8vIENyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGRpZmZlcmVudCBDdXJzb3JDb250cm9sbGVyIGhlbHBlciBtZXRob2RzLgorICAgIC8vIE9ubHkgb25lIGN1cnNvciBjb250cm9sbGVyIGlzIGFjdGl2ZSBhdCBhbnkgdGltZSB3aGljaCBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucy4KKyAgICBwcml2YXRlIHN0YXRpYyBSZWN0ICAgICAgICAgICAgIHNDdXJzb3JDb250cm9sbGVyVGVtcFJlY3QgPSBuZXcgUmVjdCgpOworCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtU2VsZWN0QWxsT25Gb2N1cyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtR3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5MRUZUOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCmluZGV4IDkwN2NmYjMuLjdiNjY4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKICAqLwogcHVibGljIGNsYXNzIFZpZXdBbmltYXRvciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKIAogICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CiAgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKwogICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOwogCiAgICAgQW5pbWF0aW9uIG1JbkFuaW1hdGlvbjsKQEAgLTU5LDYgKzYxLDEwIEBACiAgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKICAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCiAgICAgICAgIGEucmVjeWNsZSgpOwogCiAgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoY29udGV4dCwgYXR0cnMpOwpAQCAtODQsMTAgKzkwLDEwIEBACiAgICAgICAgIHNldE1lYXN1cmVBbGxDaGlsZHJlbihtZWFzdXJlQWxsQ2hpbGRyZW4pOwogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CkBAIC0xMDUsMTQgKzExMSwxNCBAQAogICAgICAgICAgICAgcmVxdWVzdEZvY3VzKEZPQ1VTX0ZPUldBUkQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgewogICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCiAgICAgICovCkBAIC0xMjgsNiArMTM0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KICAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCiAgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCkBAIC0xMzUsMjQgKzE3MCw4IEBACiAgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KICAgICAgKi8KICAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JGaXJzdCA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQppbmRleCA4MDM0OTYxLi5jNmY2ZTgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1WaXNpYmxlID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwotICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDEwICsxNDQsMjIgQEAKICAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CiAgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudDsKICAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQppbmRleCAzZGY0MTlhLi40NTBjOTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCkBAIC02Niw4ICs2Niw5IEBACiAgKiB7QGxpbmsgI3NldFpvb21JbkVuYWJsZWQoYm9vbGVhbil9IGFuZCB7QGxpbmsgI3NldFpvb21PdXRFbmFibGVkKGJvb2xlYW4pfS4KICAqIDxwPgogICogSWYgeW91IGFyZSB1c2luZyB0aGlzIHdpdGggYSBjdXN0b20gVmlldywgcGxlYXNlIGNhbGwKLSAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbSB0aGUKLSAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fS4KKyAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbQorICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9IGFuZCBmcm9tIHtAbGluayBWaWV3I29uVmlzaWJpbGl0eUNoYW5nZWR9CisgKiB3aGVuIDxjb2RlPnZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFPC9jb2RlPi4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBab29tQnV0dG9uc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTI0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQWN0aW9uQmFySW1wbCBpcyB0aGUgQWN0aW9uQmFyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IGRldmljZXMgb2YgYWxsIHNjcmVlbiBzaXplcy4gSWYgaXQgZGV0ZWN0cyBhIGNvbXBhdGlibGUgZGVjb3IsCisgKiBpdCB3aWxsIHNwbGl0IGNvbnRleHR1YWwgbW9kZXMgYWNyb3NzIGJvdGggdGhlIEFjdGlvbkJhclZpZXcgYXQKKyAqIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBhbmQgYSBob3Jpem9udGFsIExpbmVhckxheW91dCBhdCB0aGUgYm90dG9tCisgKiB3aGljaCBpcyBub3JtYWxseSBoaWRkZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1ZJRVcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1ZJRVcgPSAxOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX1NIT1dfSElERSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSA9IDE7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgVmlld0FuaW1hdG9yIG1BbmltYXRvclZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25WaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbVVwcGVyQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxvd2VyQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxUYWJJbXBsPiBtVGFicyA9IG5ldyBBcnJheUxpc3Q8VGFiSW1wbD4oKTsKKworICAgIHByaXZhdGUgaW50IG1UYWJDb250YWluZXJWaWV3SWQgPSBhbmRyb2lkLlIuaWQuY29udGVudDsKKyAgICBwcml2YXRlIFRhYkltcGwgbVNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgaW50IG1UYWJTd2l0Y2hNb2RlID0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFOworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9TUExJVCA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUNvbnRleHREaXNwbGF5TW9kZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2luZ0NvbnRleHQ7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VDb250ZXh0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5jbG9zZU1vZGUoKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBpbml0KGFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIG1EaWFsb2cgPSBkaWFsb2c7CisgICAgICAgIGluaXQoZGlhbG9nLmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChWaWV3IGRlY29yKSB7CisgICAgICAgIG1Db250ZXh0ID0gZGVjb3IuZ2V0Q29udGV4dCgpOworICAgICAgICBtQWN0aW9uVmlldyA9IChBY3Rpb25CYXJWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3ID0gKExpbmVhckxheW91dCkgZGVjb3IuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyKTsKKyAgICAgICAgbUFuaW1hdG9yVmlldyA9IChWaWV3QW5pbWF0b3IpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXJfYW5pbWF0b3IpOworICAgICAgICAKKyAgICAgICAgaWYgKG1BY3Rpb25WaWV3ID09IG51bGwgfHwgbVVwcGVyQ29udGV4dFZpZXcgPT0gbnVsbCB8fCBtQW5pbWF0b3JWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGEgY29tcGF0aWJsZSB3aW5kb3cgZGVjb3IgbGF5b3V0Iik7CisgICAgICAgIH0KKworICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUxvd2VyQ29udGV4dFZpZXcgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA6IENPTlRFWFRfRElTUExBWV9TUExJVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCB0aXRsZVJlc0lkLCBpbnQgc3VidGl0bGVSZXNJZCkgeworICAgICAgICBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKG1Db250ZXh0LmdldFN0cmluZyh0aXRsZVJlc0lkKSwKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoc3VidGl0bGVSZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50IHRpdGxlUmVzSWQpIHsKKyAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShtQ29udGV4dC5nZXRTdHJpbmcodGl0bGVSZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICBzZXRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0U3VidGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyB2aWV3KSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEN1c3RvbU5hdmlnYXRpb25WaWV3KHZpZXcpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsIE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKGFkYXB0ZXIsIGNhbGxiYWNrLCAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICBpbnQgZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24pIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QpOworICAgICAgICBtQWN0aW9uVmlldy5zZXREcm9wZG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICBtQWN0aW9uVmlldy5zZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIG1BY3Rpb25WaWV3LnNldENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKHRpdGxlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICBzd2l0Y2ggKG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCkpIHsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIHNlbGVjdFRhYihtVGFicy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0gbm90IHZhbGlkIGZvciBjdXJyZW50IG5hdmlnYXRpb24gbW9kZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKCkgeworICAgICAgICBzd2l0Y2ggKG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCkpIHsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUYWIuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwVGFicygpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZWxlY3RUYWIobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtVGFicy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFiQ291bnQgPSBtVGFicy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLnJlbW92ZShtVGFicy5nZXQoaSkuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zLmNvbW1pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRhYnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucyhvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucywgaW50IG1hc2spIHsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnQgPSBtQWN0aW9uVmlldy5nZXREaXNwbGF5T3B0aW9ucygpOyAKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RGlzcGxheU9wdGlvbnMoKG9wdGlvbnMgJiBtYXNrKSB8IChjdXJyZW50ICYgfm1hc2spKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZCk7CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRTdWJ0aXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXREaXNwbGF5T3B0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvbid0IHdhaXQgZm9yIHRoZSBjbG9zZSBjb250ZXh0IG1vZGUgYW5pbWF0aW9uIHRvIGZpbmlzaC4KKyAgICAgICAgaWYgKG1DbG9zaW5nQ29udGV4dCkgeworICAgICAgICAgICAgbUFuaW1hdG9yVmlldy5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1DbG9zZUNvbnRleHQpOworICAgICAgICAgICAgbUNsb3NlQ29udGV4dC5ydW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUgbW9kZSA9IG5ldyBBY3Rpb25Nb2RlSW1wbChjYWxsYmFjayk7CisgICAgICAgIGlmIChjYWxsYmFjay5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbW9kZS5nZXRNZW51KCkpKSB7CisgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1VcHBlckNvbnRleHRWaWV3LmluaXRGb3JNb2RlKG1vZGUpOworICAgICAgICAgICAgbUFuaW1hdG9yVmlldy5zZXREaXNwbGF5ZWRDaGlsZChDT05URVhUX1ZJRVcpOworICAgICAgICAgICAgaWYgKG1Mb3dlckNvbnRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGFuaW1hdGUgdGhpcworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVUYWIoVGFiIHRhYiwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIFRhYkltcGwgdGFiaSA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaXJzdFRhYiA9IG1UYWJzLmlzRW1wdHkoKTsKKyAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5vcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICBmaW5hbCBGcmFnbWVudCBmcmFnID0gdGFiaS5nZXRGcmFnbWVudCgpOworCisgICAgICAgIHRhYmkuc2V0UG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICBtVGFicy5hZGQocG9zaXRpb24sIHRhYmkpOworCisgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgaWYgKCFmcmFnLmlzQWRkZWQoKSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmFkZChtVGFiQ29udGFpbmVyVmlld0lkLCBmcmFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0ZpcnN0VGFiKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5zaG93KGZyYWcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX0FERF9SRU1PVkUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5hZGQobVRhYkNvbnRhaW5lclZpZXdJZCwgZnJhZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VsZWN0ZWRUYWIgPSB0YWJpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuaGlkZShmcmFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRUYWIoVGFiIHRhYikgeworICAgICAgICBtQWN0aW9uVmlldy5hZGRUYWIodGFiKTsKKyAgICAgICAgY29uZmlndXJlVGFiKHRhYiwgbVRhYnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRUYWIoVGFiIHRhYiwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1BY3Rpb25WaWV3Lmluc2VydFRhYih0YWIsIHBvc2l0aW9uKTsKKyAgICAgICAgY29uZmlndXJlVGFiKHRhYiwgcG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWIgbmV3VGFiKCkgeworICAgICAgICByZXR1cm4gbmV3IFRhYkltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWIoVGFiIHRhYikgeworICAgICAgICByZW1vdmVUYWJBdCh0YWIuZ2V0UG9zaXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnJlbW92ZVRhYkF0KHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMucmVtb3ZlKHBvc2l0aW9uKTsKKworICAgICAgICBmaW5hbCBpbnQgbmV3VGFiQ291bnQgPSBtVGFicy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbjsgaSA8IG5ld1RhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1UYWJzLmdldChpKS5zZXRQb3NpdGlvbihpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGVjdFRhYihtVGFicy5pc0VtcHR5KCkgPyBudWxsIDogbVRhYnMuZ2V0KE1hdGgubWF4KDAsIHBvc2l0aW9uIC0gMSkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVGFiIG5hdmlnYXRpb24gbW9kZSBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGFuIEFjdGl2aXR5Iik7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1RBQlMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKGludCBjb250YWluZXJWaWV3SWQpIHsKKyAgICAgICAgbVRhYkNvbnRhaW5lclZpZXdJZCA9IGNvbnRhaW5lclZpZXdJZDsKKyAgICAgICAgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RUYWIoVGFiIHRhYikgeworICAgICAgICBpZiAobVNlbGVjdGVkVGFiID09IHRhYikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0VGFiU2VsZWN0ZWQodGFiICE9IG51bGwgPyB0YWIuZ2V0UG9zaXRpb24oKSA6IFRhYi5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5vcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICBpZiAobVNlbGVjdGVkVGFiICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmhpZGUobVNlbGVjdGVkVGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX0FERF9SRU1PVkUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5yZW1vdmUobVNlbGVjdGVkVGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0YWIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuc2hvdyh0YWIuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmFkZChtVGFiQ29udGFpbmVyVmlld0lkLCB0YWIuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNlbGVjdGVkVGFiID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgdHJhbnMuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEFjdGlvbk1vZGVJbXBsIGV4dGVuZHMgQWN0aW9uTW9kZSBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1DdXN0b21WaWV3OworICAgICAgICAKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGVJbXBsKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIobUFjdGlvblZpZXcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIobUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgdGhlIGFjdGl2ZSBhY3Rpb24gbW9kZSAtIG5vLW9wCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgICAgIG1BbmltYXRvclZpZXcuc2V0RGlzcGxheWVkQ2hpbGQoTk9STUFMX1ZJRVcpOworCisgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGNvbnRleHQgbW9kZSB2aWV3cyBhZnRlciB0aGUgYW5pbWF0aW9uIGZpbmlzaGVzCisgICAgICAgICAgICBtQ2xvc2luZ0NvbnRleHQgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobUNsb3NlQ29udGV4dCwgbUFuaW1hdG9yVmlldy5nZXRPdXRBbmltYXRpb24oKS5nZXREdXJhdGlvbigpKTsKKworICAgICAgICAgICAgaWYgKG1Mb3dlckNvbnRleHRWaWV3ICE9IG51bGwgJiYgbUxvd2VyQ29udGV4dFZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gQW5pbWF0ZSB0aGlzCisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrLm9uUHJlcGFyZUFjdGlvbk1vZGUodGhpcywgbU1lbnUpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVmcmVzaCBjb250ZW50IGluIGJvdGggY29udGV4dCB2aWV3cworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRDdXN0b21WaWV3KHZpZXcpOworICAgICAgICAgICAgbUN1c3RvbVZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Pih2aWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgICAgIG1VcHBlckNvbnRleHRWaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIG1VcHBlckNvbnRleHRWaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgICAgIHNldFRpdGxlKG1BY3Rpdml0eS5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgICAgIHNldFN1YnRpdGxlKG1BY3Rpdml0eS5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1VcHBlckNvbnRleHRWaWV3LmdldFRpdGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXBwZXJDb250ZXh0Vmlldy5nZXRTdWJ0aXRsZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tVmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VzdG9tVmlldyAhPSBudWxsID8gbUN1c3RvbVZpZXcuZ2V0KCkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbVNlbGVjdGVkKE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25BY3Rpb25JdGVtQ2xpY2tlZCh0aGlzLCBpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VNZW51KE1lbnVCdWlsZGVyIG1lbnUsIGJvb2xlYW4gYWxsTWVudXNBcmVDbG9zaW5nKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblN1Yk1lbnVTZWxlY3RlZChTdWJNZW51QnVpbGRlciBzdWJNZW51KSB7CisgICAgICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihtQ29udGV4dCwgc3ViTWVudSkuc2hvdygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlU3ViTWVudShTdWJNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbk1lbnVNb2RlQ2hhbmdlKE1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRhYkltcGwgZXh0ZW5kcyBBY3Rpb25CYXIuVGFiIHsKKyAgICAgICAgcHJpdmF0ZSBGcmFnbWVudCBtRnJhZ21lbnQ7CisgICAgICAgIHByaXZhdGUgRHJhd2FibGUgbUljb247CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgICAgICBwcml2YXRlIGludCBtUG9zaXRpb247CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGcmFnbWVudCBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICAgICAgbUZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKKyAgICAgICAgICAgIHNlbGVjdFRhYih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAppbmRleCAyZWQ0NzczLi5mMDkyMGQxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCkBAIC0yNCw1ICsyNCw2IEBACiBvbmV3YXkgaW50ZXJmYWNlIElBcHBXaWRnZXRIb3N0IHsKICAgICB2b2lkIHVwZGF0ZUFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQsIGluIFJlbW90ZVZpZXdzIHZpZXdzKTsKICAgICB2b2lkIHByb3ZpZGVyQ2hhbmdlZChpbnQgYXBwV2lkZ2V0SWQsIGluIEFwcFdpZGdldFByb3ZpZGVySW5mbyBpbmZvKTsKKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgYXBwV2lkZ2V0SWQsIGluIFJlbW90ZVZpZXdzIHZpZXdzLCBpbnQgdmlld0lkKTsKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCmluZGV4IDQ5NmFhMWEuLmFmNzVkNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MsIGludCB2aWV3SWQpOwogICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBnZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKICAgICBBcHBXaWRnZXRQcm92aWRlckluZm8gZ2V0QXBwV2lkZ2V0SW5mbyhpbnQgYXBwV2lkZ2V0SWQpOwogICAgIHZvaWQgYmluZEFwcFdpZGdldElkKGludCBhcHBXaWRnZXRJZCwgaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlcik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQppbmRleCA5OTQxMGJjLi4wMDI1NTEyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCkBAIC0xODIsMjQgKzE4Miw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBtQ3Vyc29ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DdXJzb3JzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yc1tpXS5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRTdHJpbmcoY29sdW1uKTsKQEAgLTIzNiw2ICsyMTgsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKaW5kZXggNTk2MDBkYy4uNTc2NzgzMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIApAQCAtMTQxLDYgKzE0MiwxMiBAQAogICAgICAgICAgICAgRGVidWcuZW5hYmxlRW11bGF0b3JUcmFjZU91dHB1dCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemUgdGhlIHRocmVhZCB1c2VkIHRvIHJlY2xhaW0gcmVzb3VyY2VzIHdpdGhvdXQKKyAgICAgICAgICogZ29pbmcgdGhyb3VnaCBmaW5hbGl6ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgRmluYWxpemVycy5pbml0KCk7CisKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgIH0KIApAQCAtMzMxLDkgKzMzOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogQ291bnRlciB1c2VkIHRvIHByZXZlbnQgcmVlbnRyYW5jeSBpbiB7QGxpbmsgI3JlcG9ydEV4Y2VwdGlvbn0uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzSW5SZXBvcnRFeGNlcHRpb24gPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhpcyBhcHBsaWNhdGlvbi9wcm9jZXNzLCBmb3IgcmVwb3J0aW5nIFZNCiAgICAgICogZXJyb3JzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCmluZGV4IDEyN2ZiMjMuLjM4MzYyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLm9zOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uU2FtcGxpbmdQcm9maWxlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKQEAgLTM1LDE1ICszNiwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKyAgICAKKyAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpck1hZGUgPSBmYWxzZTsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIGJlaW5nIHBlcnNpc3RlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIHBlbmRpbmcgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKICAgICBzdGF0aWMgewotICAgICAgICBlbmFibGVkID0gIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5zYW1wbGluZ19wcm9maWxlciIpKTsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgc2FtcGxpbmdQcm9maWxlckh6ID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3Quc3lzLnByb2ZpbGVyX2h6IiwgMCk7CisgICAgICAgIGlmIChzYW1wbGluZ1Byb2ZpbGVySHogPiAwKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4iKTsKKyAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4gU2FtcGxpbmcgUHJvZmlsZXIgSHo6ICIgKyBzYW1wbGluZ1Byb2ZpbGVySHopOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZGlzYWJsZWQuIik7CiAgICAgICAgIH0KICAgICB9CkBAIC02MCw0NiArNzMsNDUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuOwotICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoMTApOworICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICB9CiAKLSAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCi0gICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gcGVuZGluZzsKLQogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IHRvIHRoZSBTRCBjYXJkIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgorICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoZmluYWwgU3RyaW5nIHByb2Nlc3NOYW1lLCBmaW5hbCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjsKIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTExLDEzICsxMjMsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVaeWdvdGVTbmFwc2hvdCgpIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGRpciA9ICIvZGF0YS96eWdvdGUvc25hcHNob3RzIjsKLSAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKLSAgICAgICAgd3JpdGVTbmFwc2hvdChkaXIsICJ6eWdvdGUiKTsKKyAgICAgICAgd3JpdGVTbmFwc2hvdCgienlnb3RlIiwgbnVsbCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgLyoqCisgICAgICogcGFzcyBpbiBQYWNrYWdlSW5mbyB0byByZXRyaWV2ZSB2YXJpb3VzIHZhbHVlcyBmb3Igc25hcHNob3QgaGVhZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgYnl0ZVtdIHNuYXBzaG90ID0gU2FtcGxpbmdQcm9maWxlci5nZXRJbnN0YW5jZSgpLnNuYXBzaG90KCk7CiAgICAgICAgIGlmIChzbmFwc2hvdCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjksMzkgKzE0MSw1NCBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iICsKLSAgICAgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5zbmFwc2hvdCI7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVHJ5IHRvIG9wZW4gdGhlIGZpbGUgYSBmZXcgdGltZXMuIFRoZSBTRCBjYXJkIG1heSBub3QgYmUgbW91bnRlZC4KLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0OwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID4gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHNuYXBzaG90KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShzbmFwc2hvdCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHdyaXRpbmcgc25hcHNob3QuIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gbGV0IGl0IGdvLgorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIHNldCBmaWxlIHJlYWRhYmxlIHRvIHRoZSB3b3JsZCBzbyB0aGF0IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlCisgICAgICAgIC8vIGNhbiBwdXQgaXQgdG8gZHJvcGJveAorICAgICAgICBuZXcgRmlsZShwYXRoKS5zZXRSZWFkYWJsZSh0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0ZSBoZWFkZXIgZm9yIHNuYXBzaG90cywgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdCAobGlrZSBodHRwIGhlYWRlcik6CisgICAgICoKKyAgICAgKiBWZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgcHJvZmlsZXI+XG4KKyAgICAgKiBQcm9jZXNzOiA8cHJvY2VzcyBuYW1lPlxuCisgICAgICogUGFja2FnZTogPHBhY2thZ2UgbmFtZSwgaWYgZXhpc3RzPlxuCisgICAgICogUGFja2FnZS1WZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2UsIGlmIGV4aXN0cz5cbgorICAgICAqIEJ1aWxkOiA8ZmluZ2VycHJpbnQ+XG4KKyAgICAgKiBcbgorICAgICAqIDx0aGUgYWN0dWFsIHNuYXBzaG90IGNvbnRlbnQgYmVnaW5zIGhlcmUuLi4+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8sCisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHJvZmlsZXIgdmVyc2lvbgorICAgICAgICBvdXQud3JpdGUoIlZlcnNpb246IDFcbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dC53cml0ZSgoIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICBpZihwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoKCJQYWNrYWdlOiAiICsgcGFja2FnZUluZm8ucGFja2FnZU5hbWUgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgoIlBhY2thZ2UtVmVyc2lvbjogIiArIHBhY2thZ2VJbmZvLnZlcnNpb25Db2RlICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCgiQnVpbGQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LndyaXRlKCJcbiIuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKaW5kZXggOWZjZDNmNS4uOWM4NGUwZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Mb2NhbFNlcnZlclNvY2tldDsKIGltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CkBAIC01MDYsNiArNTA3LDkgQEAKIAogICAgICAgICBjbG9zZVNlcnZlclNvY2tldCgpOwogCisgICAgICAgIC8vIHNldCB1bWFzayB0byAwMDc3IHNvIG5ldyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2lsbCBkZWZhdWx0IHRvIG93bmVyLW9ubHkgcGVybWlzc2lvbnMuCisgICAgICAgIEZpbGVVdGlscy5zZXRVTWFzayhGaWxlVXRpbHMuU19JUldYRyB8IEZpbGVVdGlscy5TX0lSV1hPKTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBQYXNzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFN5c3RlbVNlcnZlci4KICAgICAgICAgICogIi0tbmljZS1uYW1lPXN5c3RlbV9zZXJ2ZXIgY29tLmFuZHJvaWQuc2VydmVyLlN5c3RlbVNlcnZlciIKQEAgLTUyMyw3ICs1MjcsNyBAQAogICAgICAgICBTdHJpbmcgYXJnc1tdID0gewogICAgICAgICAgICAgIi0tc2V0dWlkPTEwMDAiLAogICAgICAgICAgICAgIi0tc2V0Z2lkPTEwMDAiLAotICAgICAgICAgICAgIi0tc2V0Z3JvdXBzPTEwMDEsMTAwMiwxMDAzLDEwMDQsMTAwNSwxMDA2LDEwMDcsMTAwOCwxMDA5LDEwMTAsMzAwMSwzMDAyLDMwMDMiLAorICAgICAgICAgICAgIi0tc2V0Z3JvdXBzPTEwMDEsMTAwMiwxMDAzLDEwMDQsMTAwNSwxMDA2LDEwMDcsMTAwOCwxMDA5LDEwMTAsMTAxOCwzMDAxLDMwMDIsMzAwMyIsCiAgICAgICAgICAgICAiLS1jYXBhYmlsaXRpZXM9MTMwMTA0MzUyLDEzMDEwNDM1MiIsCiAgICAgICAgICAgICAiLS1ydW50aW1lLWluaXQiLAogICAgICAgICAgICAgIi0tbmljZS1uYW1lPXN5c3RlbV9zZXJ2ZXIiLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCmluZGV4IDg1MjYzMGQuLjIzMDc2NjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKQEAgLTQwLDQgKzQwLDUgQEAKICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgaW50IHVpZCwgaW50IGluaXRpYWxQaWQsIFN0cmluZyBtZXNzYWdlKTsKICAgICB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7CisgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCmluZGV4IGM1OTlkNjguLjcxMzhiNWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCkBAIC0xMTk3LDYgKzExOTcsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEgYW5kIGFyZzIKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEsIGFyZzIgYW5kIG9iagorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHBhcmFtIG9iaiBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLm9iagorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyLCBPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyLCBvYmopOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVucXVldWUgYSBtZXNzYWdlIHRvIHRoaXMgc3RhdGUgbWFjaGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKaW5kZXggOGQ4ZGYxNi4uZTAwYTg1MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTI4NCw2ICsyODUsMjYgQEAKIAogICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJsaXN0Iik7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB3cml0ZVNldFhtbChTZXQgdmFsLCBTdHJpbmcgbmFtZSwgWG1sU2VyaWFsaXplciBvdXQpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJudWxsIik7CisgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJudWxsIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAic2V0Iik7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm5hbWUiLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChPYmplY3QgdiA6IHZhbCkgeworICAgICAgICAgICAgd3JpdGVWYWx1ZVhtbCh2LCBudWxsLCBvdXQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJzZXQiKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBGbGF0dGVuIGEgYnl0ZVtdIGludG8gYW4gWG1sU2VyaWFsaXplci4gIFRoZSBsaXN0IGNhbiBsYXRlciBiZSByZWFkIGJhY2sKQEAgLTQyNiw2ICs0NDcsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBMaXN0KSB7CiAgICAgICAgICAgICB3cml0ZUxpc3RYbWwoKExpc3QpdiwgbmFtZSwgb3V0KTsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgU2V0KSB7CisgICAgICAgICAgICB3cml0ZVNldFhtbCgoU2V0KXYsIG5hbWUsIG91dCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewogICAgICAgICAgICAgLy8gWFhYIFRoaXMgaXMgdG8gYWxsb3cgdXMgdG8gYXQgbGVhc3Qgd3JpdGUgc29tZXRoaW5nIGlmCiAgICAgICAgICAgICAvLyB3ZSBlbmNvdW50ZXIgc3R5bGVkIHRleHQuLi4gIGJ1dCBpdCBtZWFucyB3ZSB3aWxsIGRyb3AgYWxsCkBAIC00NzYsNyArNTAwLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBpbiBUaGUgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgogICAgICAqCi0gICAgICogQHJldHVybiBIYXNoTWFwIFRoZSByZXN1bHRpbmcgbGlzdC4KKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBUaGUgcmVzdWx0aW5nIGxpc3QuCiAgICAgICoKICAgICAgKiBAc2VlICNyZWFkTWFwWG1sCiAgICAgICogQHNlZSAjcmVhZFZhbHVlWG1sCkBAIC00OTAsNiArNTE0LDI5IEBACiAgICAgICAgIHBhcnNlci5zZXRJbnB1dChpbiwgbnVsbCk7CiAgICAgICAgIHJldHVybiAoQXJyYXlMaXN0KXJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOwogICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgSGFzaFNldCBmcm9tIGFuIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgWE1MLiBUaGUgc3RyZWFtIGNhbgorICAgICAqIHByZXZpb3VzbHkgaGF2ZSBiZWVuIHdyaXR0ZW4gYnkgd3JpdGVTZXRYbWwoKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIHJlc3VsdGluZyBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFZhbHVlWG1sCisgICAgICogQHNlZSAjcmVhZFRoaXNTZXRYbWwKKyAgICAgKiBAc2VlICN3cml0ZVNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkU2V0WG1sKElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIHBhcnNlci5zZXRJbnB1dChpbiwgbnVsbCk7CisgICAgICAgIHJldHVybiAoSGFzaFNldCkgcmVhZFZhbHVlWG1sKHBhcnNlciwgbmV3IFN0cmluZ1sxXSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZCBhIEhhc2hNYXAgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gIFRoZSBYTUwgZGF0YSBjb3VsZApAQCAtNTczLDYgKzYyMCw0NyBAQAogICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICJEb2N1bWVudCBlbmRlZCBiZWZvcmUgIiArIGVuZFRhZyArICIgZW5kIHRhZyIpOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgSGFzaFNldCBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiBUaGUgWE1MIGRhdGEgY291bGQgcHJldmlvdXNseQorICAgICAqIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgd3JpdGVTZXRYbWwoKS4gVGhlIFhtbFB1bGxQYXJzZXIgbXVzdCBiZSBwb3NpdGlvbmVkCisgICAgICogPGVtPmFmdGVyPC9lbT4gdGhlIHRhZyB0aGF0IGJlZ2lucyB0aGUgc2V0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIFhtbFB1bGxQYXJzZXIgZnJvbSB3aGljaCB0byByZWFkIHRoZSBzZXQgZGF0YS4KKyAgICAgKiBAcGFyYW0gZW5kVGFnIE5hbWUgb2YgdGhlIHRhZyB0aGF0IHdpbGwgZW5kIHRoZSBzZXQsIHVzdWFsbHkgInNldCIuCisgICAgICogQHBhcmFtIG5hbWUgQW4gYXJyYXkgb2Ygb25lIHN0cmluZywgdXNlZCB0byByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlCisgICAgICogICAgICAgICAgICAgb2YgdGhlIHNldCdzIHRhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSGFzaFNldCBUaGUgbmV3bHkgZ2VuZXJhdGVkIHNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWFkU2V0WG1sCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIYXNoU2V0IHJlYWRUaGlzU2V0WG1sKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBTdHJpbmcgZW5kVGFnLCBTdHJpbmdbXSBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIAorICAgICAgICBpbnQgZXZlbnRUeXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IHBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gcmVhZFRoaXNWYWx1ZVhtbChwYXJzZXIsIG5hbWUpOworICAgICAgICAgICAgICAgIHNldC5hZGQodmFsKTsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHRvIHNldDogIiArIHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuRU5EX1RBRykgeworICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscyhlbmRUYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkICIgKyBlbmRUYWcgKyAiIGVuZCB0YWcgYXQ6ICIgKyBwYXJzZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50VHlwZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgIH0gd2hpbGUgKGV2ZW50VHlwZSAhPSBwYXJzZXIuRU5EX0RPQ1VNRU5UKTsKKyAgICAgICAgCisgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJEb2N1bWVudCBlbmRlZCBiZWZvcmUgIiArIGVuZFRhZyArICIgZW5kIHRhZyIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYW4gaW50W10gb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gIFRoZSBYTUwgZGF0YSBjb3VsZApAQCAtNzQwLDYgKzgyOCwxMiBAQAogICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoInNldCIpKSB7CisgICAgICAgICAgICBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgcmVzID0gcmVhZFRoaXNTZXRYbWwocGFyc2VyLCAic2V0IiwgbmFtZSk7CisgICAgICAgICAgICBuYW1lWzBdID0gdmFsdWVOYW1lOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZyB2YWx1ZSBmb3IgIiArIHZhbHVlTmFtZSArICI6ICIgKyByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJVbmtub3duIHRhZzogIiArIHRhZ05hbWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1N0YW5kYWxvbmVBY3Rpb25Nb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkNmJhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1N0YW5kYWxvbmVBY3Rpb25Nb2RlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworCitwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZUFjdGlvbk1vZGUgZXh0ZW5kcyBBY3Rpb25Nb2RlIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1Db250ZXh0VmlldzsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQ3VzdG9tVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOworCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKworICAgIHB1YmxpYyBTdGFuZGFsb25lQWN0aW9uTW9kZShDb250ZXh0IGNvbnRleHQsIEFjdGlvbkJhckNvbnRleHRWaWV3IHZpZXcsCisgICAgICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUNvbnRleHRWaWV3ID0gdmlldzsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICBzZXRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0U3VidGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldEN1c3RvbVZpZXcodmlldyk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gdmlldyAhPSBudWxsID8gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldykgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIGlmIChtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworCisgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgIHJldHVybiBtTWVudTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHRWaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRTdWJ0aXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tVmlldyAhPSBudWxsID8gbUN1c3RvbVZpZXcuZ2V0KCkgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbVNlbGVjdGVkKE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VNZW51KE1lbnVCdWlsZGVyIG1lbnUsIGJvb2xlYW4gYWxsTWVudXNBcmVDbG9zaW5nKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihtQ29udGV4dCwgc3ViTWVudSkuc2hvdygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlU3ViTWVudShTdWJNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudSBpbXBsZW1lbnRzIE1lbnUgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUXdlcnR5OworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBtSXRlbXM7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGVSZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlUmVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGdyb3VwSWQsIGl0ZW1JZCwgMCwgb3JkZXIsIHRpdGxlKTsKKyAgICAgICAgbUl0ZW1zLmFkZChvcmRlciwgaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkSW50ZW50T3B0aW9ucyhpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjYWxsZXIsIEludGVudFtdIHNwZWNpZmljcywgSW50ZW50IGludGVudCwgaW50IGZsYWdzLAorICAgICAgICAgICAgTWVudUl0ZW1bXSBvdXRTcGVjaWZpY0l0ZW1zKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gbHJpID0KKyAgICAgICAgICAgICAgICBwbS5xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucyhjYWxsZXIsIHNwZWNpZmljcywgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBscmkgIT0gbnVsbCA/IGxyaS5zaXplKCkgOiAwOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FQUEVORF9UT19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByaSA9IGxyaS5nZXQoaSk7CisgICAgICAgICAgICBJbnRlbnQgcmludGVudCA9IG5ldyBJbnRlbnQoCisgICAgICAgICAgICAgICAgcmkuc3BlY2lmaWNJbmRleCA8IDAgPyBpbnRlbnQgOiBzcGVjaWZpY3Nbcmkuc3BlY2lmaWNJbmRleF0pOworICAgICAgICAgICAgcmludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5uYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIHJpLmxvYWRMYWJlbChwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKHJpLmxvYWRJY29uKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChyaW50ZW50KTsKKyAgICAgICAgICAgIGlmIChvdXRTcGVjaWZpY0l0ZW1zICE9IG51bGwgJiYgcmkuc3BlY2lmaWNJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0U3BlY2lmaWNJdGVtc1tyaS5zcGVjaWZpY0luZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmaW5kSXRlbUluZGV4KGludCBpZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEl0ZW1JZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZmluZEl0ZW0oaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBUT0RPIE1ha2UgdGhpcyBzbWFydGVyLgorICAgICAgICBmaW5hbCBib29sZWFuIHF3ZXJ0eSA9IG1Jc1F3ZXJ0eTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBjaGFyIHNob3J0Y3V0ID0gcXdlcnR5ID8gaXRlbS5nZXRBbHBoYWJldGljU2hvcnRjdXQoKSA6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TnVtZXJpY1Nob3J0Y3V0KCk7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBzaG9ydGN1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSWRlbnRpZmllckFjdGlvbihpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmaW5kSXRlbUluZGV4KGlkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBmbGFncykgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpdGVtLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKGludCBncm91cElkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0R3JvdXBJZCgpID09IGdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgaXRlbUNvdW50LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oaW50IGlkKSB7CisgICAgICAgIG1JdGVtcy5yZW1vdmUoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwQ2hlY2thYmxlKGludCBncm91cCwgYm9vbGVhbiBjaGVja2FibGUsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2thYmxlKGNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFeGNsdXNpdmVDaGVja2FibGUoZXhjbHVzaXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwRW5hYmxlZChpbnQgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwVmlzaWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoYm9vbGVhbiBpc1F3ZXJ0eSkgeworICAgICAgICBtSXNRd2VydHkgPSBpc1F3ZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU4NzVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtIGltcGxlbWVudHMgTWVudUl0ZW0geworICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhdGVnb3J5T3JkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nOworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGVDb25kZW5zZWQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIAorICAgIHByaXZhdGUgRHJhd2FibGUgbUljb25EcmF3YWJsZTsKKyAgICBwcml2YXRlIGludCBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lcjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzID0gRU5BQkxFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFICAgICAgPSAweDAwMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VEICAgICAgICA9IDB4MDAwMDAwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKKyAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbkRyYXdhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbU9yZGVyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGdldFN1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZUNvbmRlbnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZUNvbmRlbnNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tBQkxFKSAhPSAwOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRU5BQkxFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgSElEREVOKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0FCTEUpIHwgKGNoZWNrYWJsZSA/IENIRUNLQUJMRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtIHNldEV4Y2x1c2l2ZUNoZWNrYWJsZShib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVYQ0xVU0lWRSkgfCAoZXhjbHVzaXZlID8gRVhDTFVTSVZFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLRUQpIHwgKGNoZWNrZWQgPyBDSEVDS0VEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVOQUJMRUQpIHwgKGVuYWJsZWQgPyBFTkFCTEVEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IGljb247CisgICAgICAgIG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihpbnQgaWNvblJlcykgeworICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlczsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGljb25SZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtZW51SXRlbUNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUNsaWNrTGlzdGVuZXIgPSBtZW51SXRlbUNsaWNrTGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyLCBjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKGludCB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZUNvbmRlbnNlZCA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIEhJRERFTikgfCAodmlzaWJsZSA/IDAgOiBISURERU4pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoKSB7CisgICAgICAgIGlmIChtQ2xpY2tMaXN0ZW5lciAhPSBudWxsICYmIG1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IHNob3cpIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4gQWN0aW9uTWVudUl0ZW1zIGFsd2F5cyBzaG93IGFzIGFjdGlvbiBidXR0b25zLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjFmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51SXRlbVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dAorICAgICAgICBpbXBsZW1lbnRzIE1lbnVWaWV3Lkl0ZW1WaWV3LCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51SXRlbVZpZXciOworCisgICAgcHJpdmF0ZSBNZW51SXRlbUltcGwgbUl0ZW1EYXRhOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyIG1JdGVtSW52b2tlcjsKKworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUltYWdlQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1UZXh0QnV0dG9uOworCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25CdXR0b25TdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBtSW1hZ2VCdXR0b24gPSAoSW1hZ2VCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmltYWdlQnV0dG9uKTsKKyAgICAgICAgbVRleHRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0QnV0dG9uKTsKKyAgICAgICAgbUltYWdlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVRleHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbURhdGEoKSB7CisgICAgICAgIHJldHVybiBtSXRlbURhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZW51SXRlbUltcGwgaXRlbURhdGEsIGludCBtZW51VHlwZSkgeworICAgICAgICBtSXRlbURhdGEgPSBpdGVtRGF0YTsKKworICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0SWNvbihpdGVtRGF0YS5nZXRJY29uKCkpOworICAgICAgICBzZXRUaXRsZShpdGVtRGF0YS5nZXRUaXRsZSgpKTsgLy8gVGl0bGUgb25seSB0YWtlcyBlZmZlY3QgaWYgdGhlcmUgaXMgbm8gaWNvbgorICAgICAgICBzZXRJZChpdGVtRGF0YS5nZXRJdGVtSWQoKSk7CisKKyAgICAgICAgc2V0VmlzaWJpbGl0eShpdGVtRGF0YS5pc1Zpc2libGUoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIHNldEVuYWJsZWQoaXRlbURhdGEuaXNFbmFibGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgIGlmIChtSXRlbUludm9rZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUl0ZW1JbnZva2VyLmludm9rZUl0ZW0obUl0ZW1EYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1JbnZva2VyKE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyIGludm9rZXIpIHsKKyAgICAgICAgbUl0ZW1JbnZva2VyID0gaW52b2tlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVmZXJzQ29uZGVuc2VkVGl0bGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgLy8gVE9ETyBTdXBwb3J0IGNoZWNrYWJsZSBhY3Rpb24gaXRlbXMKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEljb24oRHJhd2FibGUgaWNvbikgeworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbUltYWdlQnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBtVGV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUltYWdlQnV0dG9uLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydGN1dChib29sZWFuIHNob3dTaG9ydGN1dCwgY2hhciBzaG9ydGN1dEtleSkgeworICAgICAgICAvLyBBY3Rpb24gYnV0dG9ucyBkb24ndCBzaG93IHRleHQgZm9yIHNob3J0Y3V0IGtleXMuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworCisgICAgICAgIC8vIHBvcHVsYXRlIGFjY2Vzc2liaWxpdHkgZGVzY3JpcHRpb24gd2l0aCB0aXRsZQorICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24odGl0bGUpOworCisgICAgICAgIGlmIChtSW1hZ2VCdXR0b24uZ2V0RHJhd2FibGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtVGV4dEJ1dHRvbi5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgICAgICBtVGV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd3NJY29uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1NzI1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51VmlldyBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyLCBNZW51VmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51VmlldyI7CisgICAgCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKworICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtSXRlbU1hcmdpbjsKKyAgICBwcml2YXRlIGludCBtTWF4SXRlbXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgcHJpdmF0ZSBPdmVyZmxvd01lbnVCdXR0b24gbU92ZXJmbG93QnV0dG9uOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxNZW51UG9wdXBIZWxwZXI+IG1PdmVyZmxvd1BvcHVwOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmFjdGlvbl9pY29uX3NpemUpOworICAgICAgICBmaW5hbCBpbnQgc3BhY2VBdmFpbGFibGUgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAvIDI7CisgICAgICAgIGZpbmFsIGludCBpdGVtU3BhY2UgPSBzaXplICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgbU1heEl0ZW1zID0gc3BhY2VBdmFpbGFibGUgLyAoaXRlbVNwYWNlID4gMCA/IGl0ZW1TcGFjZSA6IDEpOworCisgICAgICAgIC8vIFRPRE8gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBoYXJkIG1lbnUga2V5LgorICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gcmVzLmdldENvbmZpZ3VyYXRpb24oKS5zY3JlZW5MYXlvdXQ7CisgICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSAoc2NyZWVuICYgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKSA9PQorICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dSZXNlcnZlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE92ZXJmbG93UmVzZXJ2ZWQoYm9vbGVhbiByZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IHJlc2VydmVPdmVyZmxvdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKKyAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBMYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHA7CisgICAgICAgICAgICByZXR1cm4gbHAubGVmdE1hcmdpbiA9PSBtSXRlbU1hcmdpbiAmJiBscC5yaWdodE1hcmdpbiA9PSBtSXRlbU1hcmdpbiAmJgorICAgICAgICAgICAgICAgICAgICBscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UICYmIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIHBhcmFtcy5sZWZ0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHBhcmFtcy5yaWdodE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SXRlbU1hcmdpbigpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtTWFyZ2luOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZUl0ZW0oTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2luZG93QW5pbWF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZW51QnVpbGRlciBtZW51LCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICBtTWVudSA9IG1lbnU7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkcmVuKGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICBmaW5hbCBib29sZWFuIHJlc2VydmVPdmVyZmxvdyA9IG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKHJlc2VydmVPdmVyZmxvdyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBhZGRJdGVtVmlldygoQWN0aW9uTWVudUl0ZW1WaWV3KSBpdGVtRGF0YS5nZXRJdGVtVmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sCisgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGlmIChtTWVudS5nZXROb25BY3Rpb25JdGVtcyh0cnVlKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgT3ZlcmZsb3dNZW51QnV0dG9uIGJ1dHRvbiA9IG5ldyBPdmVyZmxvd01lbnVCdXR0b24obUNvbnRleHQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBidXR0b247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9IG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBtTWVudSwgbU92ZXJmbG93QnV0dG9uLCB0cnVlKTsKKyAgICAgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVudVBvcHVwSGVscGVyPihwb3B1cCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXAgIT0gbnVsbCA/IG1PdmVyZmxvd1BvcHVwLmdldCgpIDogbnVsbDsKKyAgICAgICAgaWYgKHBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSXRlbVZpZXcoQWN0aW9uTWVudUl0ZW1WaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRJdGVtSW52b2tlcih0aGlzKTsKKyAgICAgICAgYWRkVmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUJ1dHRvbiBleHRlbmRzIEltYWdlQnV0dG9uIHsKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUJ1dHRvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25CdXR0b25TdHlsZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgLy8gVE9ETyBzZXRUaXRsZSgpIHRvIGEgbG9jYWxpemVkIHN0cmluZyBmb3IgYWNjZXNzaWJpbGl0eQorICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShyZXMuZ2V0RHJhd2FibGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X21vcmUpKTsKKyAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKKyAgICAgICAgICAgIGlmIChzdXBlci5wZXJmb3JtQ2xpY2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCmluZGV4IGJlYjU3YmEuLjE3OGRjZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQpAQCAtMzM3LDcgKzMzNyw5IEBACiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYSBjbGVhciByZWZyZXNoIG9mIGNoaWxkcmVuCiAgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldFZpc2libGVJdGVtcygpOworICAgICAgICAvLyBJY29uTWVudVZpZXcgbmV2ZXIgd2FudHMgY29udGVudCBzb3J0ZWQgZm9yIGFuIG92ZXJmbG93IGFjdGlvbiBidXR0b24sIHNpbmNlCisgICAgICAgIC8vIGl0IGlzIG5ldmVyIHVzZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIG92ZXJmbG93IGJ1dHRvbi4KKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXROb25BY3Rpb25JdGVtcyhmYWxzZSk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtcyA9IGl0ZW1zVG9TaG93LnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zVGhhdENhbkZpdCA9IG1NYXhJdGVtczsKICAgICAgICAgLy8gTWluaW11bSBvZiB0aGUgbnVtIHRoYXQgY2FuIGZpdCBhbmQgdGhlIG51bSB0aGF0IHdlIGhhdmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCAyMjhkNWQwLi4yMTVkODA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CkBAIC01NCw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJNZW51QnVpbGRlciI7CiAgICAgCiAgICAgLyoqIFRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbnUgdHlwZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDU7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIG1lbnUgdmlldyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUNPTiA9IDA7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBhbmRlZCBtZW51IHZpZXcgKi8KQEAgLTY1LDE0ICs2NiwyNCBAQAogICAgICAqIGhhdmUgYW4gSXRlbVZpZXcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESUFMT0cgPSAyOworICAgIC8qKgorICAgICAqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgYnV0dG9uIGluIHRoZSBhcHBsaWNhdGlvbidzIGFjdGlvbiBiYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BQ1RJT05fQlVUVE9OID0gMzsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIG1lbnUgcG9wdXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QT1BVUCA9IDQ7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV1NfVEFHID0gImFuZHJvaWQ6dmlld3MiOwotICAgIAorCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCiAgICAgc3RhdGljIGZpbmFsIGludCBUSEVNRV9SRVNfRk9SX1RZUEVbXSA9IG5ldyBpbnRbXSB7CiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSWNvbk1lbnUsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRXhwYW5kZWRNZW51LAogICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAogICAgIH07CiAgICAgCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04MCw2ICs5MSw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmV4cGFuZGVkX21lbnVfbGF5b3V0LAogICAgICAgICAwLAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hY3Rpb25fbWVudV9sYXlvdXQsCisgICAgICAgIDAsCiAgICAgfTsKIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODcsNiArMTAwLDggQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gIHNDYXRlZ29yeVRvT3JkZXIgPSBuZXcgaW50W10gewpAQCAtMTMwLDYgKzE0NSwzMCBAQAogICAgICAqIGZldGNoZWQgZnJvbSB7QGxpbmsgI2dldFZpc2libGVJdGVtcygpfQogICAgICAqLyAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZUl0ZW1zU3RhbGU7CisgICAgCisgICAgLyoqCisgICAgICogQ29udGFpbnMgb25seSB0aGUgaXRlbXMgdGhhdCBzaG91bGQgYXBwZWFyIGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbUFjdGlvbkl0ZW1zOworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGl0ZW1zIHRoYXQgc2hvdWxkIE5PVCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtTm9uQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2aXNpYmxlIGFjdGlvbiBidXR0b25zIHBlcm1pdHRlZCBpbiB0aGlzIG1lbnUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtTWF4QWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGl0ZW1zIChvciBhbnkgb25lIGl0ZW0ncyBhY3Rpb24gc3RhdGUpIGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcworICAgICAqIGxhc3QgZmV0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWN0aW9uSXRlbXNTdGFsZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHByb2Nlc3Mgb2YgZ3JhbnRpbmcgc3BhY2UgYXMgYWN0aW9uIGl0ZW1zIHNob3VsZCByZXNlcnZlIGEgc3BhY2UgZm9yCisgICAgICogYW4gb3ZlcmZsb3cgb3B0aW9uIGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlc2VydmVBY3Rpb25PdmVyZmxvdzsKIAogICAgIC8qKgogICAgICAqIEN1cnJlbnQgdXNlIGNhc2UgaXMgQ29udGV4dCBNZW51czogQXMgVmlld3MgcG9wdWxhdGUgdGhlIGNvbnRleHQgbWVudSwgZWFjaCBvbmUgaGFzCkBAIC0yODEsNiArMzIwLDEwIEBACiAgICAgICAgIG1WaXNpYmxlSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKICAgICAgICAgbUlzVmlzaWJsZUl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAKKyAgICAgICAgbUFjdGlvbkl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CisgICAgICAgIG1Ob25BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKKyAgICAgICAgCiAgICAgICAgIG1TaG9ydGN1dHNWaXNpYmxlID0KICAgICAgICAgICAgICAgICAobVJlc291cmNlcy5nZXRDb25maWd1cmF0aW9uKCkua2V5Ym9hcmQgIT0gQ29uZmlndXJhdGlvbi5LRVlCT0FSRF9OT0tFWVMpOwogICAgIH0KQEAgLTYzMyw2ICs2NzYsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTQ4LDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5NjksMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArOTkyLDgzIEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gZmFsc2U7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIG1WaXNpYmxlSXRlbXM7CiAgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBmbGFnQWN0aW9uSXRlbXMoYm9vbGVhbiByZXNlcnZlQWN0aW9uT3ZlcmZsb3cpIHsKKyAgICAgICAgaWYgKHJlc2VydmVBY3Rpb25PdmVyZmxvdyAhPSBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgICAgICBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93ID0gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworICAgICAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc0FjdGlvbkl0ZW1zU3RhbGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IHZpc2libGVJdGVtcyA9IGdldFZpc2libGVJdGVtcygpOworICAgICAgICBmaW5hbCBpbnQgaXRlbXNTaXplID0gdmlzaWJsZUl0ZW1zLnNpemUoKTsKKyAgICAgICAgaW50IG1heEFjdGlvbnMgPSBtTWF4QWN0aW9uSXRlbXM7CisKKyAgICAgICAgaW50IHJlcXVpcmVkSXRlbXMgPSAwOworICAgICAgICBpbnQgcmVxdWVzdGVkSXRlbXMgPSAwOworICAgICAgICBib29sZWFuIGhhc092ZXJmbG93ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXNTaXplOyBpKyspIHsKKyAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gdmlzaWJsZUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLnJlcXVpcmVzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlZEl0ZW1zKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RlZEl0ZW1zKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhc092ZXJmbG93ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2VydmUgYSBzcG90IGZvciB0aGUgb3ZlcmZsb3cgaXRlbSBpZiBuZWVkZWQuCisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgJiYKKyAgICAgICAgICAgICAgICAoaGFzT3ZlcmZsb3cgfHwgcmVxdWlyZWRJdGVtcyArIHJlcXVlc3RlZEl0ZW1zID4gbWF4QWN0aW9ucykpIHsKKyAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgfQorICAgICAgICBtYXhBY3Rpb25zIC09IHJlcXVpcmVkSXRlbXM7CisKKyAgICAgICAgLy8gRmxhZyBhcyBtYW55IG1vcmUgcmVxdWVzdGVkIGl0ZW1zIGFzIHdpbGwgZml0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1ZXN0c0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJc0FjdGlvbkJ1dHRvbihtYXhBY3Rpb25zID4gMCk7CisgICAgICAgICAgICAgICAgbWF4QWN0aW9ucy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvbkl0ZW1zLmNsZWFyKCk7CisgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5pc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU5vbkFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0QWN0aW9uSXRlbXMoYm9vbGVhbiByZXNlcnZlQWN0aW9uT3ZlcmZsb3cpIHsKKyAgICAgICAgZmxhZ0FjdGlvbkl0ZW1zKHJlc2VydmVBY3Rpb25PdmVyZmxvdyk7CisgICAgICAgIHJldHVybiBtQWN0aW9uSXRlbXM7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldE5vbkFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbU5vbkFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE1heEFjdGlvbkl0ZW1zKGludCBtYXhBY3Rpb25JdGVtcykgeworICAgICAgICBtTWF4QWN0aW9uSXRlbXMgPSBtYXhBY3Rpb25JdGVtczsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xlYXJIZWFkZXIoKSB7CiAgICAgICAgIG1IZWFkZXJJY29uID0gbnVsbDsKQEAgLTEwNzgsNiArMTIxMCwxNiBAQAogICAgICAgICByZXR1cm4gbmV3IE1lbnVBZGFwdGVyKG1lbnVUeXBlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGFkYXB0ZXIgZm9yIHByb3ZpZGluZyBvdmVyZmxvdyAobm9uLWFjdGlvbikgaXRlbXMgYW5kIHRoZWlyIHZpZXdzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lbnVUeXBlIFRoZSB0eXBlIG9mIG1lbnUgdG8gZ2V0IGFuIGFkYXB0ZXIgZm9yLgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgTWVudUFkYXB0ZXJ9IGZvciB0aGlzIG1lbnUgd2l0aCB0aGUgZ2l2ZW4gbWVudSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBNZW51QWRhcHRlciBnZXRPdmVyZmxvd01lbnVBZGFwdGVyKGludCBtZW51VHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IE92ZXJmbG93TWVudUFkYXB0ZXIobWVudVR5cGUpOworICAgIH0KKwogICAgIHZvaWQgc2V0T3B0aW9uYWxJY29uc1Zpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIG1PcHRpb25hbEljb25zVmlzaWJsZSA9IHZpc2libGU7CiAgICAgfQpAQCAtMTE1NSw4ICsxMjk3LDQyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKSkuZ2V0SXRlbVZpZXcobU1lbnVUeXBlLCBwYXJlbnQpOworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNZW51Vmlldy5JdGVtVmlldyBpdGVtVmlldyA9IChNZW51Vmlldy5JdGVtVmlldykgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuZ2V0SXRlbURhdGEoKS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworCisgICAgICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSAoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpdGVtVmlldy5pbml0aWFsaXplKGl0ZW0sIG1NZW51VHlwZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIGl0ZW1WaWV3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgYW4ge0BsaW5rIEFkYXB0ZXJWaWV3fSB0byB1c2UgdGhpcyB7QGxpbmsgTWVudUJ1aWxkZXJ9IGFzIGEgZGF0YQorICAgICAqIHNvdXJjZSBmb3Igb3ZlcmZsb3cgbWVudSBpdGVtcyB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIGxpc3Qgb2YgYWN0aW9uIGl0ZW1zLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgT3ZlcmZsb3dNZW51QWRhcHRlciBleHRlbmRzIE1lbnVBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtT3ZlcmZsb3dJdGVtczsKKworICAgICAgICBwdWJsaWMgT3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lbnVUeXBlKTsKKyAgICAgICAgICAgIG1PdmVyZmxvd0l0ZW1zID0gZ2V0Tm9uQWN0aW9uSXRlbXModHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnVJdGVtSW1wbCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1PdmVyZmxvd0l0ZW1zLmdldChwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5zaXplKCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQppbmRleCA5YjU4MjA1Li5mZWNiZDc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKQEAgLTc0LDYgKzc0LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhDTFVTSVZFICAgICAgPSAweDAwMDAwMDA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISURERU4gICAgICAgICA9IDB4MDAwMDAwMDg7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUQgICAgICAgID0gMHgwMDAwMDAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNfQUNUSU9OICAgICAgPSAweDAwMDAwMDIwOworCisgICAgcHJpdmF0ZSBpbnQgbVNob3dBc0FjdGlvbiA9IFNIT1dfQVNfQUNUSU9OX05FVkVSOwogCiAgICAgLyoqIFVzZWQgZm9yIHRoZSBpY29uIHJlc291cmNlIElEIGlmIHRoaXMgaXRlbSBkb2VzIG5vdCBoYXZlIGFuIGljb24gKi8KICAgICBzdGF0aWMgZmluYWwgaW50IE5PX0lDT04gPSAwOwpAQCAtNTgwLDYgKzU4MywxMCBAQAogICAgICAgICByZXR1cm4gKFZpZXcpIG1JdGVtVmlld3NbbWVudVR5cGVdLmdldCgpOwogICAgIH0KIAorICAgIHZvaWQgc2V0SXRlbVZpZXcoaW50IG1lbnVUeXBlLCBJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIG1JdGVtVmlld3NbbWVudVR5cGVdID0gbmV3IFdlYWtSZWZlcmVuY2U8SXRlbVZpZXc+KHZpZXcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZXMgYSBtZW51IGl0ZW0gdmlldyB0aGF0IGltcGxlbWVudHMge0BsaW5rIE1lbnVWaWV3Lkl0ZW1WaWV3fS4KICAgICAgKiBAcGFyYW0gbWVudVR5cGUgVGhlIHR5cGUgb2YgbWVudSB0byBnZXQgYSBWaWV3IGZvciAobXVzdCBiZSBvbmUgb2YKQEAgLTYyOCw2ICs2MzUsMzQgQEAKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGdpdmVuIG1lbnUgdHlwZSBzaG91bGQgc2hvdyBpY29ucyBmb3IgbWVudSBpdGVtcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgICAgICByZXR1cm4gbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9JQ09OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCB8fAorICAgICAgICAgICAgICAgIG1NZW51LmdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIElTX0FDVElPTikgPT0gSVNfQUNUSU9OIHx8IHJlcXVpcmVzQWN0aW9uQnV0dG9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbVNob3dBc0FjdGlvbiA9PSBTSE9XX0FTX0FDVElPTl9JRl9ST09NOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fQUxXQVlTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQWN0aW9uQnV0dG9uKGJvb2xlYW4gaXNBY3Rpb25CdXR0b24pIHsKKyAgICAgICAgaWYgKGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gSVNfQUNUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsYWdzICY9IH5JU19BQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgbVNob3dBc0FjdGlvbiA9IGFjdGlvbkVudW07CisgICAgICAgIG1NZW51Lm9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKHRoaXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGVjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIuTWVudUFkYXB0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE1lbnVQb3B1cEhlbHBlciBpbXBsZW1lbnRzIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIsIFZpZXcuT25LZXlMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZW51UG9wdXBIZWxwZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgIHByaXZhdGUgaW50IG1Qb3B1cE1heFdpZHRoOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQW5jaG9yVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJmbG93T25seTsKKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LCBWaWV3IGFuY2hvclZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBtZW51LCBhbmNob3JWaWV3LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUsCisgICAgICAgICAgICBWaWV3IGFuY2hvclZpZXcsIGJvb2xlYW4gb3ZlcmZsb3dPbmx5KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICBtT3ZlcmZsb3dPbmx5ID0gb3ZlcmZsb3dPbmx5OworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Qb3B1cE1heFdpZHRoID0gbWV0cmljcy53aWR0aFBpeGVscyAvIDI7CisKKyAgICAgICAgaWYgKGFuY2hvclZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFuY2hvclZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3PihhbmNob3JWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIC8vIFRPRE8gVXNlIGEgc3R5bGUgZnJvbSB0aGUgdGhlbWUgaGVyZQorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KG1Db250ZXh0LCBudWxsLCAwLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuV2lkZ2V0X1NwaW5uZXIpOworICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBmaW5hbCBNZW51QWRhcHRlciBhZGFwdGVyID0gbU92ZXJmbG93T25seSA/CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihNZW51QnVpbGRlci5UWVBFX1BPUFVQKSA6CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCk7CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUG9wdXAuc2V0TW9kYWwodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1BbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG1BbmNob3JWaWV3LmdldCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVudSBpbnN0YW5jZW9mIFN1Yk1lbnVCdWlsZGVyKSB7CisgICAgICAgICAgICBTdWJNZW51QnVpbGRlciBzdWJNZW51ID0gKFN1Yk1lbnVCdWlsZGVyKSBtTWVudTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtSW1wbCA9IChNZW51SXRlbUltcGwpIHN1Yk1lbnUuZ2V0SXRlbSgpOworICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcoaXRlbUltcGwuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZW51UG9wdXBIZWxwZXIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBhbmNob3IiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50V2lkdGgoTWF0aC5taW4obWVhc3VyZUNvbnRlbnRXaWR0aChhZGFwdGVyKSwgbVBvcHVwTWF4V2lkdGgpKTsKKyAgICAgICAgbVBvcHVwLnNob3coKTsKKyAgICAgICAgbVBvcHVwLmdldExpc3RWaWV3KCkuc2V0T25LZXlMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICBtUG9wdXAgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBudWxsOworICAgICAgICBpZiAobU92ZXJmbG93T25seSkgeworICAgICAgICAgICAgaXRlbSA9IG1NZW51LmdldE92ZXJmbG93SXRlbShwb3NpdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdGVtID0gbU1lbnUuZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgbU1lbnUucGVyZm9ybUl0ZW1BY3Rpb24oaXRlbSwgMCk7CisgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25LZXkoVmlldyB2LCBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9VUCAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfTUVOVSkgeworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVDb250ZW50V2lkdGgoTWVudUFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAvLyBNZW51cyBkb24ndCB0ZW5kIHRvIGJlIGxvbmcsIHNvIHRoaXMgaXMgbW9yZSBzYW5lIHRoYW4gaXQgbG9va3MuCisgICAgICAgIGludCB3aWR0aCA9IDA7CisgICAgICAgIFZpZXcgaXRlbVZpZXcgPSBudWxsOworICAgICAgICBmaW5hbCBpbnQgd2lkdGhNZWFzdXJlU3BlYyA9CisgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYWRhcHRlci5nZXRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGl0ZW1WaWV3ID0gYWRhcHRlci5nZXRWaWV3KGksIGl0ZW1WaWV3LCBudWxsKTsKKyAgICAgICAgICAgIGl0ZW1WaWV3Lm1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgaXRlbVZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MThiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyQ29udGV4dFZpZXcgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIC8vIFRPRE86IFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBkZWZhdWx0IHRoZW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfSEVJR0hUX0RJUCA9IDUwOworICAgIAorICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtSXRlbU1hcmdpbjsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQ29udGVudEhlaWdodDsKKyAgICAKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIAorICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tVmlldzsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtVGl0bGVMYXlvdXQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1DbG9zZURyYXdhYmxlOworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsLCAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lKTsKKyAgICAgICAgbUl0ZW1QYWRkaW5nID0gYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZV9hY3Rpb25CdXR0b25QYWRkaW5nLCAwKTsKKyAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGEuZ2V0RHJhd2FibGUoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uTW9kZUJhY2tncm91bmQpKTsKKyAgICAgICAgbUNsb3NlRHJhd2FibGUgPSBhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbk1vZGVDbG9zZURyYXdhYmxlKTsKKyAgICAgICAgbUl0ZW1NYXJnaW4gPSBtSXRlbVBhZGRpbmcgLyAyOworCisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAoaW50KSAoQ09OVEVOVF9IRUlHSFRfRElQICogZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICsgMC41Zik7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgIH0KKyAgICAgICAgbUN1c3RvbVZpZXcgPSB2aWV3OworICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkVmlldyh2aWV3KTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBpbml0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGluaXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBpZiAobVRpdGxlTGF5b3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICAgICAgbVRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfdGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfc3VidGl0bGUpOworICAgICAgICAgICAgaWYgKG1UaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KG1TdWJ0aXRsZSAhPSBudWxsID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dC5nZXRQYXJlbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdEZvck1vZGUoZmluYWwgQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtQ2xvc2VCdXR0b24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUNsb3NlQnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZShtQ2xvc2VEcmF3YWJsZSk7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24uc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGFkZFZpZXcobUNsb3NlQnV0dG9uKTsKKworICAgICAgICBmaW5hbCBNZW51QnVpbGRlciBtZW51ID0gKE1lbnVCdWlsZGVyKSBtb2RlLmdldE1lbnUoKTsKKyAgICAgICAgbU1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtZW51LmdldE1lbnVWaWV3KE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgdGhpcyk7CisgICAgICAgIG1NZW51Vmlldy5zZXRPdmVyZmxvd1Jlc2VydmVkKHRydWUpOworICAgICAgICBtTWVudVZpZXcudXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBhZGRWaWV3KG1NZW51Vmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VNb2RlKCkgeworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICBtQ3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIG1NZW51VmlldyA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJDb250ZXh0VmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpZiAod2lkdGhNb2RlICE9IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwibWF0Y2hfcGFyZW50XCIgKG9yIGZpbGxfcGFyZW50KSIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworCisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1Db250ZW50SGVpZ2h0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgIAorICAgICAgICBpZiAobUNsb3NlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtQ2xvc2VCdXR0b24sIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1DdXN0b21WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtQ2xvc2VCdXR0b24gfHwgY2hpbGQgPT0gbVRpdGxlTGF5b3V0IHx8IGNoaWxkID09IG1DdXN0b21WaWV3KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhjaGlsZCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHQgPSBscC5oZWlnaHQgPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbVdpZHRoLCBjdXN0b21XaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tSGVpZ2h0LCBjdXN0b21IZWlnaHRNb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsICYmIG1DbG9zZUJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DbG9zZUJ1dHRvbiwgeCwgeSwgY29udGVudEhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbVZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgaXRlbU1hcmdpbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDE0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMCwwICsxLDY4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW07CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbkJhclZpZXciOworICAgIAorICAgIC8vIFRPRE86IFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBkZWZhdWx0IHRoZW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfSEVJR0hUX0RJUCA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BBRERJTkdfRElQID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9TUEFDSU5HX0RJUCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQUNUSU9OX1NQQUNJTkdfRElQID0gMTI7CisgICAgCisgICAgLyoqCisgICAgICogRGlzcGxheSBvcHRpb25zIGFwcGxpZWQgYnkgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfREVGQVVMVCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlLWxheW91dCBhcyBvcHBvc2VkIHRvIGEgc2ltcGxlIGludmFsaWRhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9SRUxBWU9VVF9NQVNLID0KKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSB8CisgICAgICAgICAgICBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTzsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udGVudEhlaWdodDsKKworICAgIHByaXZhdGUgaW50IG1OYXZpZ2F0aW9uTW9kZTsKKyAgICBwcml2YXRlIGludCBtRGlzcGxheU9wdGlvbnM7CisgICAgcHJpdmF0ZSBpbnQgbVNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOworICAgIHByaXZhdGUgRHJhd2FibGUgbUxvZ287CisKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSWNvblZpZXc7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUxvZ29WaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtVGFiTGF5b3V0OworICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tTmF2VmlldzsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dNZW51OworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclRpdGxlOworCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtT3B0aW9uc01lbnU7CisgICAgcHJpdmF0ZSBBY3Rpb25NZW51VmlldyBtTWVudVZpZXc7CisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBtTG9nb05hdkl0ZW07CisgICAgCisgICAgcHJpdmF0ZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwdWJsaWMgQWN0aW9uQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSAoaW50KSAoQ09OVEVOVF9IRUlHSFRfRElQICogbWV0cmljcy5kZW5zaXR5ICsgMC41Zik7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5BY3Rpb25CYXIpOworCisgICAgICAgIGZpbmFsIGludCBjb2xvckZpbHRlciA9IGEuZ2V0Q29sb3IoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2NvbG9yRmlsdGVyLCAwKTsKKworICAgICAgICBpZiAoY29sb3JGaWx0ZXIgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZCA9IGdldEJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIGQuc2V0RGl0aGVyKHRydWUpOworICAgICAgICAgICAgZC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKGNvbG9yRmlsdGVyLCBQb3J0ZXJEdWZmLk1vZGUuT1ZFUkxBWSkpOworICAgICAgICB9CisKKyAgICAgICAgQXBwbGljYXRpb25JbmZvIGluZm8gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpOworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX25hdmlnYXRpb25Nb2RlLAorICAgICAgICAgICAgICAgIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtVGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3RpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9zdWJ0aXRsZSk7CisgICAgICAgIG1EaXNwbGF5T3B0aW9ucyA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9kaXNwbGF5T3B0aW9ucywgRElTUExBWV9ERUZBVUxUKTsKKyAgICAgICAgCisgICAgICAgIG1Mb2dvID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbG9nbyk7CisgICAgICAgIGlmIChtTG9nbyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTG9nbyA9IGluZm8ubG9hZExvZ28ocG0pOworICAgICAgICB9CisgICAgICAgIG1JY29uID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaWNvbik7CisgICAgICAgIGlmIChtSWNvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtSWNvbiA9IGluZm8ubG9hZEljb24ocG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfYmFja2dyb3VuZCk7CisgICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdklkID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9jdXN0b21OYXZpZ2F0aW9uTGF5b3V0LCAwKTsKKyAgICAgICAgaWYgKGN1c3RvbU5hdklkICE9IDApIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KTsKKyAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gKFZpZXcpIGluZmxhdGVyLmluZmxhdGUoY3VzdG9tTmF2SWQsIG51bGwpOworICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT007CisgICAgICAgIH0KKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgaW50IHBhZGRpbmcgPSAoaW50KSAoQ09OVEVOVF9QQURESU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBzZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworCisgICAgICAgIG1TcGFjaW5nID0gKGludCkgKENPTlRFTlRfU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgbUFjdGlvblNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtTG9nbyAhPSBudWxsIHx8IG1JY29uICE9IG51bGwgfHwgbVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvTmF2SXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShjb250ZXh0LCAwLCBhbmRyb2lkLlIuaWQuaG9tZSwgMCwgMCwgbVRpdGxlKTsKKyAgICAgICAgICAgIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgY29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChtTG9nb05hdkl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51QnVpbGRlciBidWlsZGVyID0gKE1lbnVCdWlsZGVyKSBtZW51OworICAgICAgICBtT3B0aW9uc01lbnUgPSBidWlsZGVyOworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobU1lbnVWaWV3KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBY3Rpb25NZW51VmlldyBtZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgYnVpbGRlci5nZXRNZW51VmlldygKKyAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIG51bGwpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IG1lbnVWaWV3LmdldEl0ZW1NYXJnaW4oKTsKKyAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgbWVudVZpZXcuc2V0TGF5b3V0UGFyYW1zKGxheW91dFBhcmFtcyk7CisgICAgICAgIGFkZFZpZXcobWVudVZpZXcpOworICAgICAgICBtTWVudVZpZXcgPSBtZW51VmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWVudVZpZXcgIT0gbnVsbCAmJiBtTWVudVZpZXcuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgdGl0bGUuIFRoaXMgd2lsbCBhbHdheXMgcmVwbGFjZSBvciBvdmVycmlkZSB3aW5kb3cgdGl0bGVzLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVVzZXJUaXRsZSA9IHRydWU7CisgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgdGl0bGUuIEEgd2luZG93IHRpdGxlIHdpbGwgYWx3YXlzIGJlIHJlcGxhY2VkIG9yIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHRpdGxlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgaWYgKCFtVXNlclRpdGxlKSB7CisgICAgICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRpdGxlSW1wbChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGlmIChtU3VidGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihtQ29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93blNwaW5uZXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGFiTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25BZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbU5hdlZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBtTmF2aWdhdGlvbk1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheU9wdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWJWaWV3IGNyZWF0ZVRhYlZpZXcoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gbmV3IFRhYlZpZXcoZ2V0Q29udGV4dCgpLCB0YWIpOworICAgICAgICB0YWJWaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgdGFiVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFRhYkNsaWNrTGlzdGVuZXIoKSk7CisgICAgICAgIHJldHVybiB0YWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYihBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3KTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRUYWIoQWN0aW9uQmFyLlRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3LCBwb3NpdGlvbik7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1UYWJMYXlvdXQucmVtb3ZlVmlld0F0KHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgLy8gVXNlZCBieSBjdXN0b20gbmF2IHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJWaWV3IHNob3VsZCBoYXZlIHRoZW0gYWxyZWFkeS4KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRJbWFnZURyYXdhYmxlKG1Mb2dvKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxvZ29WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtSWNvbik7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1JY29uVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIGRyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIHRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKyAgICAgICAgaWYgKG1UaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICB9CisgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJTZWxlY3RlZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGkgPT0gcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmICh3aWR0aE1vZGUgIT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfd2lkdGg9XCJtYXRjaF9wYXJlbnRcIiAob3IgZmlsbF9wYXJlbnQpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGVudFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgCisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1Db250ZW50SGVpZ2h0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1Mb2dvVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCAmJiBtSWNvblZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtSWNvblZpZXcsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobU1lbnVWaWV3LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCAwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbU5hdlZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoTW9kZSA9IGxwLndpZHRoICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC53aWR0aCwgYXZhaWxhYmxlV2lkdGgpIDogYXZhaWxhYmxlV2lkdGg7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdkhlaWdodE1vZGUgPSBscC5oZWlnaHQgIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2V2lkdGgsIGN1c3RvbU5hdldpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2SGVpZ2h0LCBjdXN0b21OYXZIZWlnaHRNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBpZiAobVRhYkxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRhYkxheW91dC5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1TcGlubmVyLCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWJWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25CYXIuVGFiIG1UYWI7CisKKyAgICAgICAgcHVibGljIFRhYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtVGFiID0gdGFiOworCisgICAgICAgICAgICAvLyBUT0RPIFN0eWxlIHRhYnMgYmFzZWQgb24gdGhlIHRoZW1lCisKKyAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGljb24gPSB0YWIuZ2V0SWNvbigpOworICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQgPSB0YWIuZ2V0VGV4dCgpOworCisgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gbmV3IEltYWdlVmlldyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgIGFkZFZpZXcoaWNvblZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaW5nbGVMaW5lKCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0RWxsaXBzaXplKFRydW5jYXRlQXQuRU5EKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWIgZ2V0VGFiKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgVGFiVmlldyB0YWJWaWV3ID0gKFRhYlZpZXcpIHZpZXc7CisgICAgICAgICAgICB0YWJWaWV3LmdldFRhYigpLnNlbGVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGNoaWxkID09IHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUmVjdFNoYXBlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkZvcmVncm91bmRDb2xvclNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkltYWdlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIHRoZSBmbG93IGFuZCBzdGF0dXMgdG8gZWRpdAotICogdGhlIHN0eWxlZCB0ZXh0LiBUaGlzIG1hbmFnZXMgdGhlIHN0YXRlcyBhbmQgZmxvd3Mgb2YgZWRpdGluZywgc3VwcG9ydHMKLSAqIGluc2VydGluZyBpbWFnZSwgaW1wb3J0L2V4cG9ydCBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFZGl0U3R5bGVkVGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlcyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgLyoqIFRoZSBtb2RlIHRoYXQgbm8gZWRpdGluZyBhY3Rpb24gaXMgZG9uZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PVEhJTkcgPSAwOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjb3B5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09QWSA9IDE7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHBhc3RlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFTVEUgPSAyOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBzaXplLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0laRSA9IDM7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGNvbG9yLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09MT1IgPSA0OwotICAgIC8qKiBUaGUgbW9kZSBvZiBzZWxlY3Rpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TRUxFQ1QgPSA1OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBhbGlnbm1lbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9BTElHTiA9IDY7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGN1dC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgb2Ygc2VsZWN0aW9uLgotICAgICAqLwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXNuJ3Qgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT0ZGID0gMDsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09OID0gMTsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNURUQgPSAyOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSBhbmQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9GSVggPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX05VTEwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX0NPUFlfQlVGX0JMQU5LID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfU1RBUlQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9FTkQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1BVU0hfQ09NUEVURSA9IDQ7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gMHgwMEZGRkZGRjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0SW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3Igbm90aWZ5aW5nIG1lc3NhZ2VzIHRvCi0gICAgICogY2FsbGluZyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlIaW50TXNnKGludCBtc2dJZCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgbUVTVEludGVyZmFjZTsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0RWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWFjaAotICAgICAqIGZ1bmN0aW9uIGZvciBlZGl0aW5nIHN0eWxlZCB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHRDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHREaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1EZWZhdWx0QmFja2dyb3VuZDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgZmxvdyBvZiBlYWNoIGVkaXRpbmcKLSAgICAgKiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IE5vdGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWVyKEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgZXN0SW50ZXJmYWNlKSB7Ci0gICAgICAgIG1FU1RJbnRlcmZhY2UgPSBlc3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJ1aWxkZXIgZm9yIEFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWlsZGVyCi0gICAgICogICAgICAgICAgICBCdWlsZGVyIGZvciBvcGVuaW5nIEFsZXJ0IERpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBtRGlhbG9nLnNldEJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIENvbG9yQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIGNvbG9ybmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3RpbmcgY29sb3IuCi0gICAgICogQHBhcmFtIGNvbG9yaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2YgY29sb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICBtRGlhbG9nLnNldENvbG9yQWxlcnRQYXJhbXMoY29sb3J0aXRsZSwgY29sb3JuYW1lcywgY29sb3JpbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgU2l6ZUFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXpldGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIHNpemVuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBzaXplLgotICAgICAqIEBwYXJhbSBzaXplZGlzcGxheWludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZGlzcGxheWVkIGluIFRleHRWaWV3LgotICAgICAqIEBwYXJhbSBzaXplc2VuZGludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZXhwb3J0ZWQgdG8gSFRNTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0U2l6ZUFsZXJ0UGFyYW1zKHNpemV0aXRsZSwgc2l6ZW5hbWVzLCBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgc2l6ZXNlbmRpbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICBtRGlhbG9nLnNldEFsaWduQWxlcnRQYXJhbXMoYWxpZ250aXRsZSwgYWxpZ25uYW1lcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkgJiYKLSAgICAgICAgICAgICAgICBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwZXJSZXN1bHQgPSBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblRvdWNoRXZlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZWRpdGluZy4gVGhpcyBmdW5jdGlvbiBoYXZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZWRpdGluZwotICAgICAqIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5kIGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vbkVuZEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ29weSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29weSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDdXQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlBhc3RlIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0UGFzdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiU2l6ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkJhY2tncm91bmRDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQWxpZ25tZW50IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QWxpZ24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3RBbGwiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRml4IFNlbGVjdGVkIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgVVJJCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVVJJIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZSh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIHJlc291cmNlIElECi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc0lkCi0gICAgICogICAgICAgICAgICBSZXNvdXJjZSBJRCBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSWQpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZShyZXNJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRIb3Jpem9udGFsTGluZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uQ2xlYXJTdHlsZXMoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0IFNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1TaXplKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBDb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEFsaWdubWVudCBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICBtTWFuYWdlci5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB2aWV3LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBodG1sIHRvIEVkaXRTdHlsZWRUZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBodG1sCi0gICAgICogICAgICAgICAgICBUaGUgaHRtbCB0byBiZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHRtbChTdHJpbmcgaHRtbCkgewotICAgICAgICBtQ29udmVydGVyLlNldEh0bWwoaHRtbCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNFZGl0dGluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTdHlsZWRUZXh0KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0RWRpdE1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0U2VsZWN0U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldElucHV0RXh0cmFzKGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRJbnB1dEV4dHJhcyIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBzdXBlci5nZXRJbnB1dEV4dHJhcyhjcmVhdGUpOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiYWxsb3dFbW9qaSIsIHRydWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpcwotICAgICAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIHVzZWQgdXJpcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbChBcnJheUxpc3Q8VXJpPiB1cmlzKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuZ2V0VXJpQXJyYXkodXJpcywgZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICByZXR1cm4gbUJhY2tncm91bmRDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRm9yZWdyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZvcmVHcm91bmRDb2xvcihpbnQgcG9zKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6ICIgKyBwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IGdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogSWxsaWdhbCBwb3NpdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPQotICAgICAgICAgICAgICAgIGdldFRleHQoKS5nZXRTcGFucyhwb3MsIHBvcywgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzcGFuc1swXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgbWVtYmVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbml0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIG1EZWZhdWx0QmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgbU1hbmFnZXIgPSBuZXcgRWRpdG9yTWFuYWdlcih0aGlzKTsKLSAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBTdHlsZWRUZXh0Q29udmVydGVyKHRoaXMpOwotICAgICAgICBtRGlhbG9nID0gbmV3IFN0eWxlZFRleHREaWFsb2codGhpcyk7Ci0gICAgICAgIHNldE1vdmVtZW50TWV0aG9kKG5ldyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QobU1hbmFnZXIpKTsKLSAgICAgICAgbU1hbmFnZXIuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgIG1NYW5hZ2VyLnVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBGb3JlZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBCYWNrZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBTaXplIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dTaXplQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEFsaWdubWVudCBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0FsaWduQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgaGludCBtZXNzYWdlcyB3aGF0IGFjdGlvbiBpcyBleHBlY3RlZCB0byBjYWxsaW5nIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dJZAotICAgICAqICAgICAgICAgICAgSWQgb2YgdGhlIGhpbnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SGludE1lc3NhZ2UoaW50IG1zZ0lkKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5SGludE1zZyhtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGV2ZW50IHRoYXQgdGhlIG1vZGUgYW5kIHN0YXRlIGFyZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBlZGl0aW5nIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlTdGF0ZUNoYW5nZWQobW9kZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRWRpdG9yTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Nb2RlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1clN0YXJ0ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1ckVuZCA9IDA7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBFZGl0b3JNYW5hZ2VyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25zdGFydGVkaXQ6Iik7Ci0gICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25FbmRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEN1dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0U2l6ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0QWxpZ25SaWdodCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfU0VMRUNUOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3Vyc29yTW92ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrVmlldyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04gfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb21wbGV0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgVVJJOiAiICsgdXJpLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyB1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgdXJpKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lEKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IHJlc0lEIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgcmVzSUQpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmU6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEhvcml6b250YWxMaW5lU3BhbigweEZGMDAwMDAwLCBtRVNUKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsZWFyU3R5bGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBzdHlsZXMgPSB0eHQuZ2V0U3BhbnMoMCwgbGVuLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgc3R5bGUgOiBzdHlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBQYXJhZ3JhcGhTdHlsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBRdW90ZVNwYW4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3R5bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgSW1hZ2VTcGFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0eHQuZ2V0U3BhblN0YXJ0KHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB0eHQuZ2V0U3BhbkVuZChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eHQucmVwbGFjZShzdGFydCwgZW5kLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHh0LnJlbW92ZVNwYW4oc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZERyYXdhYmxlKG1FU1QubURlZmF1bHRCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2l6ZUl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KHNpemUpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGNvbG9yKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQWxpZ24oYWxpZ24pOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdEZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGUgc3R5bGUgb2YgdGhlIHNwYW4gaXMgYWRkZWQsIGFkZCBjaGVjayBjYXNlIGZvciB0aGF0IHN0eWxlICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmICh0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBRdW90ZVNwYW4uY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yICE9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU29mdEtleUJsb2NrRmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1clN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25FbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1ckVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkb05leHRIYW5kbGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb05leHRIYW5kbGU6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09QWToKLSAgICAgICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ1VUOgotICAgICAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1BBU1RFOgotICAgICAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYW5jZWwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9OT1RISU5HOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWw6IiArIG1FU1QuZ2V0SW5wdXRUeXBlKCkpOwotICAgICAgICAgICAgdW5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHRWaWV3RnVuYyhpbnQgbW9kZSwgaW50IGlkKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVUZXh0VmlldzogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIiArIGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ09QWSwgYW5kcm9pZC5SLmlkLmNvcHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DVVQsIGFuZHJvaWQuUi5pZC5jdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlUGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oYW5kcm9pZC5SLmlkLnBhc3RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRTcGFuKGludCBtb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiIgKyBtRWRpdEZsYWcgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXRlICsgJywnICsgbU1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IEVkaXRpbmcgaXMgbm90IHN0YXJ0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX05VTEwpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dTaXplQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0FsaWduQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBpbnZhbGlkIG1vZGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2l6ZSgpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9TSVpFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb2xvcigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9DT0xPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWxpZ24oKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQUxJR04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdDoiICsgbUVkaXRGbGFnICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBvZmYsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX0VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04pIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIG5vdyBzdGFydCwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19QVVNIX0NPTVBFVEUpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNldEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlc2V0IEVkaXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9TVEFSVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TZWxlY3Q6IiArIG1DdXJTdGFydCArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA+PSAwICYmIG1DdXJTdGFydCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAmJiBtQ3VyRW5kID49IDAgJiYgbUN1ckVuZCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPCBtQ3VyRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1ckVuZCwgbUN1clN0YXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IGlzIG9uLCBidXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgaWxsaWdhbC46IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpICsgIiwiICsgbUN1clN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5zZXRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvZmZTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjdXJycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24oY3VycnBvcywgY3VycnBvcyk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdFN0YXJ0UG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0U3RhcnRQb3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJTdGFydCA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PTjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbUN1clN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25FbmQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcyhpbnQgcG9zKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RlZEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJFbmQgPSBwb3M7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1RleHRTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGlzVGV4dFNlbGVjdGVkOiIgKyBtQ3VyU3RhcnQgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKG1DdXJTdGFydCAhPSBtQ3VyRW5kKQotICAgICAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFN0eWxlZFRleHRTcGFuKE9iamVjdCBzcGFuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFN0eWxlZFRleHRTcGFuOiIgKyBtTW9kZSArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydCArICIsIiArIGVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBlbmQsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlU2l6ZToiICsgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWJzb2x1dGVTaXplU3BhbihzaXplKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQ29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBGb3JlZ3JvdW5kQ29sb3JTcGFuKGNvbG9yKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUFsaWduKExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUFsaWduOiIgKyBhbGlnbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWxpZ25tZW50U3Bhbi5TdGFuZGFyZChhbGlnbiksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lU3RhcnQobUVTVC5nZXRUZXh0KCksIG1DdXJTdGFydCksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lRW5kKG1FU1QuZ2V0VGV4dCgpLCBtQ3VyRW5kKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZVN0YXJ0KEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZVN0YXJ0OiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPiAwOyBwb3MtLSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0SW1hZ2VTcGFuKEltYWdlU3BhbiBzcGFuKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY0hlaWdodCgpICsgIiwiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCkpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5pbnNlcnQoY3VycG9zLCAiXHVGRkZDIik7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBjdXJwb3MsIGN1cnBvcyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW46IG51bGwgc3BhbiB3YXMgaW5zZXJ0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lRW5kKEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZUVuZDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zIDwgdGV4dC5sZW5ndGgoKTsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCAmJiB0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIG1FU1QuZ2V0Q29udGV4dCgpLgotICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtRVNULmdldFdpbmRvd1Rva2VuKCksIDApOwotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb250cmFja2JhbGxjbGljazoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5ibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1bmJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dENvbnZlcnRlciB7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dENvbnZlcnRlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaHRtbEJvZHkgPSBIdG1sLnRvSHRtbChtRVNULmdldFRleHQoKSk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRDb252ZXJ0ZWRCb2R5OiIgKyBodG1sQm9keSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaHRtbEJvZHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRVcmlBcnJheShBcnJheUxpc3Q8VXJpPiB1cmlzLCBFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgICAgICB1cmlzLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHRleHQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKGksIG5leHQsIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbWFnZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheTogZm91bmRBcnJheSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXJpcy5hZGQoVXJpLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0SHRtbCAoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNwYW5uZWQgc3Bhbm5lZCA9IEh0bWwuZnJvbUh0bWwoaHRtbCwgbmV3IEh0bWwuSW1hZ2VHZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIERyYXdhYmxlIGdldERyYXdhYmxlKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRodG1sOiBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoImNvbnRlbnQ6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1FU1QuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNldCBodG1sOiBGYWlsZWQgdG8gbG9hZGVkIGNvbnRlbnQgIiArIHVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiAgdW5rbm93biBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBudWxsKTsKLSAgICAgICAgICAgIG1FU1Quc2V0VGV4dChzcGFubmVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dERpYWxvZyB7Ci0gICAgICAgIEJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQ29sb3JUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1TaXplVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQWxpZ25UaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9yTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvckludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplRGlzcGxheUludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplU2VuZEludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1BbGlnbk5hbWVzOwotICAgICAgICBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0RGlhbG9nKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBtQnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICAgICAgbUNvbG9yVGl0bGUgPSBjb2xvcnRpdGxlOwotICAgICAgICAgICAgbUNvbG9yTmFtZXMgPSBjb2xvcm5hbWVzOwotICAgICAgICAgICAgbUNvbG9ySW50cyA9IGNvbG9yaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICAgICAgbVNpemVUaXRsZSA9IHNpemV0aXRsZTsKLSAgICAgICAgICAgIG1TaXplTmFtZXMgPSBzaXplbmFtZXM7Ci0gICAgICAgICAgICBtU2l6ZURpc3BsYXlJbnRzID0gc2l6ZWRpc3BsYXlpbnRzOwotICAgICAgICAgICAgbVNpemVTZW5kSW50cyA9IHNpemVzZW5kaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICAgICAgbUFsaWduVGl0bGUgPSBhbGlnbnRpdGxlOwotICAgICAgICAgICAgbUFsaWduTmFtZXMgPSBhbGlnbm5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29sb3JBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yVGl0bGUgPT0gbnVsbCB8fCBtQ29sb3JOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db2xvckludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gY29sb3IgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yTmFtZXMubGVuZ3RoICE9IG1Db2xvckludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZVRpdGxlID09IG51bGwgfHwgbVNpemVOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1TaXplRGlzcGxheUludHMgPT0gbnVsbCB8fCBtU2l6ZVNlbmRJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNpemUgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVOYW1lcy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNpemVTZW5kSW50cy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2Ygc2l6ZSBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FsaWduQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja0FsaWduQWxlcnRQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWxpZ25UaXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBhbGlnbiBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93U2l6ZUFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtU2l6ZVRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1TaXplTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgbVNpemVEaXNwbGF5SW50c1t3aGljaF0pOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1TaXplKHNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dBbGlnbkFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQWxpZ25BbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUFsaWduVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUFsaWduTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9DRU5URVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZCBleHRlbmRzIEFycm93S2V5TW92ZW1lbnRNZXRob2QgewotICAgICAgICBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgICAgICBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QoRWRpdG9yTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGVjdXRlRG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldEVuZFBvcyhUZXh0VmlldyB3aWRnZXQpIHsKLSAgICAgICAgICAgIGludCBlbmQ7Ci0gICAgICAgICAgICBpZiAod2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbU1hbmFnZXIuZ2V0U2VsZWN0aW9uU3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdXA6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG93bjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA8IGxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lICsgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxlZnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBsZWZ0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb0xlZnRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByaWdodChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJpZ2h0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb1JpZ2h0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBleGVjdXRlRG93bjogIiArIGtleUNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSB1cCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gZG93bih3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbGVmdCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHJpZ2h0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lU3BhbiBleHRlbmRzIEltYWdlU3BhbiB7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZVNwYW4oaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGNvbG9yLCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lRHJhd2FibGUgZXh0ZW5kcyBTaGFwZURyYXdhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OwotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IFJlY3RTaGFwZSgpKTsKLSAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKLSAgICAgICAgICAgIHJlbmV3Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHModmlldyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZHJhdzoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbmV3Q29sb3IoKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKG1WaWV3KTsKLSAgICAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0JvdW5kcyhWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkud2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIHdpZHRoICsgIiwiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyBtVmlldy5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAyMCkgewotICAgICAgICAgICAgICAgIHdpZHRoIC09IDIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCAyKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFBhaW50KCkuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW4gcGFyZW50ID0gZ2V0UGFyZW50U3BhbigpOwotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdGV4dC5nZXRTcGFuU3RhcnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPSB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBzdGFydCwgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZXdDb2xvcihzcGFuc1tzcGFucy5sZW5ndGggLSAxXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSW1hZ2VTcGFuIGdldFBhcmVudFNwYW4oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRQYXJlbnRTcGFuOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgRWRpdFN0eWxlZFRleHQpIHsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoMCwgdGV4dC5sZW5ndGgoKSwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJbWFnZVNwYW4gaW1hZ2U6IGltYWdlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLmdldERyYXdhYmxlKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1yZW5ld0JvdW5kczogQ291bGRuJ3QgZmluZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTEzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKKworLyoqIHtAaGlkZX0gKi8KK2ludGVyZmFjZSBJUmVtb3RlVmlld3NGYWN0b3J5IHsKKyAgICBpbnQgZ2V0Q291bnQoKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgIGludCBnZXRWaWV3VHlwZUNvdW50KCk7CisgICAgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICBib29sZWFuIGhhc1N0YWJsZUlkcygpOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGRiYmQyODYuLjBiNjJhNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Miw2ICs5Miw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTEzOCw2ICsxNDAsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjAyLDggKzIzMSwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBhbnkgZGF0YS4gUmV0dXJucyB0cnVlIGlmIGl0IGRvZXMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBmaWxlIGV4aXN0cyBhbmQgY29udGFpbnMgYW55IGRhdGEuIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIGl0IGRvZXMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlbmFtZQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgbm9uLWVtcHR5LgogICAgICAqLwpAQCAtMjc0LDYgKzMzMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CisgICAgICAgICAgICAgICAgaWYgKGlzTG9ja1Bhc3N3b3JkRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWN0aXZlUGFzc3dvcmRRdWFsaXR5OwogICAgIH0KQEAgLTI4Miw4ICszNDQsNiBAQAogICAgICAqIENsZWFyIGFueSBsb2NrIHBhdHRlcm4gb3IgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJMb2NrKCkgewotICAgICAgICBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOwogICAgICAgICBzYXZlTG9ja1Bhc3N3b3JkKG51bGwsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwogICAgICAgICBzZXRMb2NrUGF0dGVybkVuYWJsZWQoZmFsc2UpOwogICAgICAgICBzYXZlTG9ja1BhdHRlcm4obnVsbCk7CkBAIC0yOTYsNyArMzU2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzYXZlTG9ja1BhdHRlcm4oTGlzdDxMb2NrUGF0dGVyblZpZXcuQ2VsbD4gcGF0dGVybikgewogICAgICAgICAvLyBDb21wdXRlIHRoZSBoYXNoCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoICA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgaGFzaCB0byBmaWxlCiAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNMb2NrUGF0dGVybkZpbGVuYW1lLCAicnciKTsKQEAgLTMxMSwxNCArMzcxLDE1IEBACiAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2V0Qm9vbGVhbihQQVRURVJOX0VWRVJfQ0hPU0VOX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgorICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzCisgICAgICAgICAgICAvLyBwcm92aWRlcgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHNhdmUgbG9jayBwYXR0ZXJuIHRvICIgKyBzTG9ja1BhdHRlcm5GaWxlbmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoCkBAIC0zNzYsMTcgKzQzNyw1OSBAQAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBjb21wdXRlZFF1YWxpdHkgPSBjb21wdXRlUGFzc3dvcmRRdWFsaXR5KHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBjb21wdXRlZFF1YWxpdHkpOworICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKGNvbXB1dGVkUXVhbGl0eSwgcGFzc3dvcmQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBub25sZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSwgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCksIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLCBudW1iZXJzLCBzeW1ib2xzLCBub25sZXR0ZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBub3QgYW55dGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXNzd29yZCB0byB0aGUgcGFzc3dvcmQgaGlzdG9yeS4gV2UgYXNzdW1lIGFsbAorICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgLy8gaGFzaGVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGZvciBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZyhoYXNoKSArICIsIiArIHBhc3N3b3JkSGlzdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3V0IGl0IHRvIGNvbnRhaW4gcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIGhhc2hlcworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0xIGNvbW1hcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBNYXRoLm1pbihoYXNoLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmRIaXN0b3J5TGVuZ3RoICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMSwgcGFzc3dvcmRIaXN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSwgcGFzc3dvcmRIaXN0b3J5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgpAQCAtNTI2LDcgKzYyOSw4IEBACiAgICAgICAgIHJldHVybiBzYXZlZFBhc3N3b3JkRXhpc3RzKCkgJiYKICAgICAgICAgICAgICAgICAobW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwogICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTAsMTIgKzc1NCwyMSBAQAogICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRMb25nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKICAgICAgICAgbG9uZyBtb2RlID0gZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhdHRlcm4gPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXNzd29yZCA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCi0gICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlID0gaXNQYXR0ZXJuICYmIGlzTG9ja1BhdHRlcm5FbmFibGVkKCkgJiYgc2F2ZWRQYXR0ZXJuRXhpc3RzKCkKICAgICAgICAgICAgICAgICB8fCBpc1Bhc3N3b3JkICYmIHNhdmVkUGFzc3dvcmRFeGlzdHMoKTsKICAgICAgICAgcmV0dXJuIHNlY3VyZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKaW5kZXggOTE1MjcyOS4uMzIxOGJhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTM4LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgpAQCAtNjksMjEgKzY4LDIxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUdyYWJiZWRTdGF0ZSA9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyaWdnZXJlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwotICAgIHByaXZhdGUgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCiAKICAgICAvKioKICAgICAgKiBFaXRoZXIge0BsaW5rICNIT1JJWk9OVEFMfSBvciB7QGxpbmsgI1ZFUlRJQ0FMfS4KICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3JpZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yaWVudGF0aW9uOwogCi0gICAgcHJpdmF0ZSBTbGlkZXIgbUxlZnRTbGlkZXI7Ci0gICAgcHJpdmF0ZSBTbGlkZXIgbVJpZ2h0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1MZWZ0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1SaWdodFNsaWRlcjsKICAgICBwcml2YXRlIFNsaWRlciBtQ3VycmVudFNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIHByaXZhdGUgZmxvYXQgbVRocmVzaG9sZDsKICAgICBwcml2YXRlIFNsaWRlciBtT3RoZXJTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgcHJpdmF0ZSBSZWN0IG1UbXBSZWN0OworICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVG1wUmVjdDsKIAogICAgIC8qKgogICAgICAqIExpc3RlbmVyIHVzZWQgdG8gcmVzZXQgdGhlIHZpZXcgd2hlbiB0aGUgY3VycmVudCBhbmltYXRpb24gY29tcGxldGVzLgpAQCAtNjA4LDE0ICs2MDcsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgotICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYyMyw2ICs2MTUsMTcgQEAKICAgICAgICAgcmV0dXJuIG1UcmFja2luZyB8fCBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjYW5jZWxHcmFiKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOworICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKKyAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKKyAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgfQorCiAgICAgdm9pZCBzdGFydEFuaW1hdGluZyhmaW5hbCBib29sZWFuIGhvbGRBZnRlcikgewogICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIHRyYW5zMTsKQEAgLTgzMiw2ICs4MzUsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFdoZW4gdmlzaWJpbGl0eSBjaGFuZ2VzIGFuZCB0aGUgdXNlciBoYXMgYSB0YWIgc2VsZWN0ZWQsIHVuc2VsZWN0IGl0IGFuZAorICAgICAgICAvLyBtYWtlIHN1cmUgdGhlaXIgY2FsbGJhY2sgZ2V0cyBjYWxsZWQuCisgICAgICAgIGlmIChjaGFuZ2VkVmlldyA9PSB0aGlzICYmIHZpc2liaWxpdHkgIT0gVklTSUJMRQorICAgICAgICAgICAgICAgICYmIG1HcmFiYmVkU3RhdGUgIT0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKSB7CisgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGdyYWJiZWQgc3RhdGUsIGFuZCBkaXNwYXRjaGVzIGEgZ3JhYmJlZCBzdGF0ZSBjaGFuZ2UKICAgICAgKiBldmVudCB0byBvdXIgbGlzdGVuZXIuCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBlZmRjMzk5Li44NjBiNWI3IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTE5LDEyICsxOSwxNSBAQAogICBMT0NBTF9DRkxBR1MgKz0gLURDVVNUT01fUlVOVElNRV9IRUFQX01BWD0kKFVTRV9DVVNUT01fUlVOVElNRV9IRUFQX01BWCkKIGVuZGlmCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9DRkxBR1MgKz0gLURVU0VfT1BFTkdMX1JFTkRFUkVSCitlbmRpZgorCiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlBY3Rpdml0eU1hbmFnZXIuY3BwIFwKIAlBbmRyb2lkUnVudGltZS5jcHAgXAotCUN1cnNvcldpbmRvdy5jcHAgXAogCVRpbWUuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwLmFybSBcCkBAIC00OCw2ICs1MSw3IEBACiAJYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbC5jcHAgXAogCWFuZHJvaWRfdmlld19JbnB1dFF1ZXVlLmNwcCBcCiAJYW5kcm9pZF92aWV3X0tleUV2ZW50LmNwcCBcCisJYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgXAogCWFuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcCBcCiAJYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcCBcCkBAIC0xMDQsNiArMTA4LDcgQEAKIAlhbmRyb2lkL2dyYXBoaWNzL1Jhc3Rlcml6ZXIuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcCBcCisJYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1l1dlRvSnBlZ0VuY29kZXIuY3BwIFwKQEAgLTEyMiw3ICsxMjcsNiBAQAogCWFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheS5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldC5jcHAgXAotCWFuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZS5jcHAgXApAQCAtMTQxLDYgKzE0NSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAkkKExPQ0FMX1BBVEgpL2FuZHJvaWQvZ3JhcGhpY3MgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vbGlicy9od3VpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZWRyb2lkKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlKS9oYXJkd2FyZSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlX2xlZ2FjeSkvaGFyZHdhcmVfbGVnYWN5IFwKQEAgLTE5MSw2ICsxOTYsMTAgQEAKIAlsaWJ3cGFfY2xpZW50IFwKIAlsaWJqcGVnCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmh3dWkKK2VuZGlmCisKIGlmZXEgKCQoQk9BUkRfSEFWRV9CTFVFVE9PVEgpLHRydWUpCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAlleHRlcm5hbC9kYnVzIFwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcCBiL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAppbmRleCA2MmNhMmVmLi4yZGQxN2JiIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKKysrIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCkBAIC0xMTQsNiArMTE0LDcgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2ludGVybmFsX2dyYXBoaWNzX05hdGl2ZVV0aWxzKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0Rpc3BsYXkoSk5JRW52KiBlbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdyhKTklFbnYqIGVudik7CkBAIC0xNTAsNyArMTUxLDYgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfSGVhZHNldEJhc2UoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQoSk5JRW52ICplbnYpOwotZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoQTJkcFNlcnZpY2UoSk5JRW52KiBlbnYpOwpAQCAtNzAwLDE1ICs3MDAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogZW5hYmxlIHBvaXNvbmluZyBvZiBtZW1vcnkgb2YgZnJlZWQgb2JqZWN0cyAqLwotICAgIHByb3BlcnR5X2dldCgiZGFsdmlrLnZtLmdjLm92ZXJ3cml0ZWZyZWUiLCBwcm9wQnVmLCAiZmFsc2UiKTsKLSAgICBpZiAoc3RyY21wKHByb3BCdWYsICJ0cnVlIikgPT0gMCkgewotICAgICAgICBvcHQub3B0aW9uU3RyaW5nID0gIi1YZ2M6b3ZlcndyaXRlZnJlZSI7Ci0gICAgICAgIG1PcHRpb25zLmFkZChvcHQpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHByb3BCdWYsICJmYWxzZSIpICE9IDApIHsKLSAgICAgICAgTE9HVygiZGFsdmlrLnZtLmdjLm92ZXJ3cml0ZWZyZWUgc2hvdWxkIGJlICd0cnVlJyBvciAnZmFsc2UnIik7Ci0gICAgfQotCiAgICAgLyogZW5hYmxlIGRlYnVnZ2luZzsgc2V0IHN1c3BlbmQ9eSB0byBwYXVzZSBkdXJpbmcgVk0gaW5pdCAqLwogI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgIC8qIHVzZSBhbmRyb2lkIEFEQiB0cmFuc3BvcnQgKi8KQEAgLTEyNTIsNiArMTI0Myw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfR3JhcGhpY3MpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLApAQCAtMTMyMiw3ICsxMzE0LDYgQEAKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQpLAotICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAgYi9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc3OTIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3JXaW5kb3ciCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxKTklIZWxwLmg+Ci0KLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUN1cnNvcldpbmRvdzo6Q3Vyc29yV2luZG93KHNpemVfdCBtYXhTaXplKSA6Ci0gICAgbU1heFNpemUobWF4U2l6ZSkKLXsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OnNldE1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgbWVtb3J5KQotewotICAgIG1NZW1vcnkgPSBtZW1vcnk7Ci0gICAgbURhdGEgPSAodWludDhfdCAqKSBtZW1vcnktPnBvaW50ZXIoKTsKLSAgICBpZiAobURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOwotCi0gICAgLy8gTWFrZSB0aGUgd2luZG93IHJlYWQtb25seQotICAgIHNzaXplX3Qgc2l6ZSA9IG1lbW9yeS0+c2l6ZSgpOwotICAgIG1TaXplID0gc2l6ZTsKLSAgICBtTWF4U2l6ZSA9IHNpemU7Ci0gICAgbUZyZWVPZmZzZXQgPSBzaXplOwotTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgZnJvbSBleGlzdGluZyBJTWVtb3J5OiBtRnJlZU9mZnNldCA9ICVkLCBudW1Sb3dzID0gJWQsIG51bUNvbHVtbnMgPSAlZCwgbVNpemUgPSAlZCwgbU1heFNpemUgPSAlZCwgbURhdGEgPSAlcCIsIG1GcmVlT2Zmc2V0LCBtSGVhZGVyLT5udW1Sb3dzLCBtSGVhZGVyLT5udW1Db2x1bW5zLCBtU2l6ZSwgbU1heFNpemUsIG1EYXRhKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmluaXRCdWZmZXIoYm9vbCBsb2NhbE9ubHkpCi17Ci0gICAgLy9UT0RPIFVzZSBhIG5vbi1tZW1vcnkgZGVhbGVyIG1tYXAgcmVnaW9uIGZvciBsb2NhbE9ubHkKLQotICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwOwotICAgIGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UobU1heFNpemUsIDAsICJDdXJzb3JXaW5kb3ciKTsKLSAgICBpZiAoaGVhcCAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShoZWFwLCAwLCBtTWF4U2l6ZSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbU1lbW9yeS0+cG9pbnRlcigpOwotICAgICAgICAgICAgaWYgKG1EYXRhKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWRlciA9ICh3aW5kb3dfaGVhZGVyX3QgKikgbURhdGE7Ci0gICAgICAgICAgICAgICAgbVNpemUgPSBtTWF4U2l6ZTsKLQotICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgd2luZG93IGludG8gYSBjbGVhbiBzdGF0ZQotICAgICAgICAgICAgICAgIGNsZWFyKCk7Ci0gICAgICAgICAgICBMT0dfV0lORE9XKCJDcmVhdGVkIEN1cnNvcldpbmRvdyB3aXRoIG5ldyBNZW1vcnlEZWFsZXI6IG1GcmVlT2Zmc2V0ID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICBMT0dFKCJDdXJzb3JXaW5kb3cgaGVhcCBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSB0aGUgQ3Vyc29yV2luZG93IGhlYXAiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotQ3Vyc29yV2luZG93Ojp+Q3Vyc29yV2luZG93KCkKLXsKLSAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbWF0dGVycyBpcyBhIHNtYXJ0IHBvaW50ZXIKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNsZWFyKCkKLXsKLSAgICBtSGVhZGVyLT5udW1Sb3dzID0gMDsKLSAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gMDsKLSAgICBtRnJlZU9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRTsKLSAgICAvLyBNYXJrIHRoZSBmaXJzdCBjaHVuaydzIG5leHQgJ3BvaW50ZXInIGFzIG51bGwKLSAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIG1GcmVlT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKLX0KLQotaW50MzJfdCBDdXJzb3JXaW5kb3c6OmZyZWVTcGFjZSgpCi17Ci0gICAgaW50MzJfdCBmcmVlU3BhY2UgPSBtU2l6ZSAtIG1GcmVlT2Zmc2V0OwotICAgIGlmIChmcmVlU3BhY2UgPCAwKSB7Ci0gICAgICAgIGZyZWVTcGFjZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBmcmVlU3BhY2U7Ci19Ci0KLWZpZWxkX3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6YWxsb2NSb3coKQotewotICAgIC8vIEZpbGwgaW4gdGhlIHJvdyBzbG90Ci0gICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBhbGxvY1Jvd1Nsb3QoKTsKLSAgICBpZiAocm93U2xvdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIHRoZSBzbG90cyBmb3IgdGhlIGZpZWxkIGRpcmVjdG9yeQotICAgIHNpemVfdCBmaWVsZERpclNpemUgPSBtSGVhZGVyLT5udW1Db2x1bW5zICogc2l6ZW9mKGZpZWxkX3Nsb3RfdCk7Ci0gICAgdWludDMyX3QgZmllbGREaXJPZmZzZXQgPSBhbGxvYyhmaWVsZERpclNpemUpOwotICAgIGlmICghZmllbGREaXJPZmZzZXQpIHsKLSAgICAgICAgbUhlYWRlci0+bnVtUm93cy0tOwotICAgICAgICBMT0dFKCJUaGUgcm93IGZhaWxlZCwgc28gYmFjayBvdXQgdGhlIG5ldyByb3cgYWNjb3VudGluZyBmcm9tIGFsbG9jUm93U2xvdCAlZCIsIG1IZWFkZXItPm51bVJvd3MpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSAoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpOwotICAgIG1lbXNldChmaWVsZERpciwgMHgwLCBmaWVsZERpclNpemUpOwotCi1MT0dfV0lORE9XKCJBbGxvY2F0ZWQgcm93ICV1LCByb3dTbG90IGlzIGF0IG9mZnNldCAldSwgZmllbGREaXIgaXMgJWQgYnl0ZXMgYXQgb2Zmc2V0ICV1XG4iLCAobUhlYWRlci0+bnVtUm93cyAtIDEpLCAoKHVpbnQ4X3QgKilyb3dTbG90KSAtIG1EYXRhLCBmaWVsZERpclNpemUsIGZpZWxkRGlyT2Zmc2V0KTsKLSAgICByb3dTbG90LT5vZmZzZXQgPSBmaWVsZERpck9mZnNldDsKLQotICAgIHJldHVybiBmaWVsZERpcjsKLX0KLQotdWludDMyX3QgQ3Vyc29yV2luZG93OjphbGxvYyhzaXplX3QgcmVxdWVzdGVkU2l6ZSwgYm9vbCBhbGlnbmVkKQotewotICAgIGludDMyX3Qgc2l6ZTsKLSAgICB1aW50MzJfdCBwYWRkaW5nOwotICAgIGlmIChhbGlnbmVkKSB7Ci0gICAgICAgIC8vIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgcGFkZGluZyA9IDQgLSAobUZyZWVPZmZzZXQgJiAweDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhZGRpbmcgPSAwOwotICAgIH0KLQotICAgIHNpemUgPSByZXF1ZXN0ZWRTaXplICsgcGFkZGluZzsKLQotICAgIGlmIChzaXplID4gZnJlZVNwYWNlKCkpIHsKLSAgICAgICAgTE9HRSgibmVlZCB0byBncm93OiBtU2l6ZSA9ICVkLCBzaXplID0gJWQsIGZyZWVTcGFjZSgpID0gJWQsIG51bVJvd3MgPSAlZCIsIG1TaXplLCBzaXplLCBmcmVlU3BhY2UoKSwgbUhlYWRlci0+bnVtUm93cyk7Ci0gICAgICAgIC8vIE9ubHkgZ3JvdyB0aGUgd2luZG93IGlmIHRoZSBmaXJzdCByb3cgZG9lc24ndCBmaXQKLSAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAxKSB7Ci1MT0dFKCJub3QgZ3Jvd2luZyBzaW5jZSB0aGVyZSBhcmUgYWxyZWFkeSAlZCByb3cocyksIG1heCBzaXplICVkIiwgbUhlYWRlci0+bnVtUm93cywgbU1heFNpemUpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5kIGEgbmV3IHNpemUgdGhhdCB3aWxsIGZpdCB0aGUgYWxsb2NhdGlvbgotICAgICAgICBpbnQgYWxsb2NhdGVkID0gbVNpemUgLSBmcmVlU3BhY2UoKTsKLSAgICAgICAgaW50IG5ld1NpemUgPSBtU2l6ZSArIFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7Ci0gICAgICAgIHdoaWxlIChzaXplID4gKG5ld1NpemUgLSBhbGxvY2F0ZWQpKSB7Ci0gICAgICAgICAgICBuZXdTaXplICs9IFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7Ci0gICAgICAgICAgICBpZiAobmV3U2l6ZSA+IG1NYXhTaXplKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBncm93IHdpbmRvdyBiZXlvbmQgbWF4IHNpemUgKCVkKSIsIG1NYXhTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotTE9HX1dJTkRPVygiZm91bmQgc2l6ZSAlZCIsIG5ld1NpemUpOwotICAgICAgICBtU2l6ZSA9IG5ld1NpemU7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgb2Zmc2V0ID0gbUZyZWVPZmZzZXQgKyBwYWRkaW5nOwotICAgIG1GcmVlT2Zmc2V0ICs9IHNpemU7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotcm93X3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6Z2V0Um93U2xvdChpbnQgcm93KQotewotICAgIExPR19XSU5ET1coImVudGVyIGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7Ci0gICAgaW50IGNodW5rTnVtID0gcm93IC8gUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUG9zID0gcm93ICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgewotICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKCooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSk7Ci0gICAgICAgIGNodW5rUHRyT2Zmc2V0ID0gcm93Q2h1bmsgLSBtRGF0YSArIChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSk7Ci0gICAgfQotICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOwotICAgIExPR19XSU5ET1coImV4aXQgZ2V0Um93U2xvdCBjdXJyZW50IHJvdyBudW0gJWQsIHRoaXMgcm93ICVkIiwgbUhlYWRlci0+bnVtUm93cywgcm93KTsgICAgCi19Ci0KLXJvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93U2xvdCgpCi17Ci0gICAgaW50IGNodW5rTnVtID0gbUhlYWRlci0+bnVtUm93cyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1BvcyA9IG1IZWFkZXItPm51bVJvd3MgJSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKLSAgICBpbnQgY2h1bmtQdHJPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQ4X3QgKiByb3dDaHVuayA9IG1EYXRhICsgc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCk7Ci1MT0dfV0lORE9XKCJBbGxvY2F0aW5nIHJvdyBzbG90LCBtSGVhZGVyLT5udW1Sb3dzIGlzICVkLCBjaHVua051bSBpcyAlZCwgY2h1bmtQb3MgaXMgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCBjaHVua051bSwgY2h1bmtQb3MpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgewotICAgICAgICB1aW50MzJfdCBuZXh0Q2h1bmtPZmZzZXQgPSAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSk7Ci1MT0dfV0lORE9XKCJuZXh0Q2h1bmtPZmZzZXQgaXMgJWQiLCBuZXh0Q2h1bmtPZmZzZXQpOwotICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHJvdyBjaHVuawotICAgICAgICAgICAgbmV4dENodW5rT2Zmc2V0ID0gYWxsb2MoUk9XX1NMT1RfQ0hVTktfU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd0NodW5rID0gb2Zmc2V0VG9QdHIobmV4dENodW5rT2Zmc2V0KTsKLUxPR19XSU5ET1coImFsbG9jYXRlZCBuZXcgY2h1bmsgYXQgJWQsIHJvd0NodW5rID0gJXAiLCBuZXh0Q2h1bmtPZmZzZXQsIHJvd0NodW5rKTsKLSAgICAgICAgICAgICooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSA9IHJvd0NodW5rIC0gbURhdGE7Ci0gICAgICAgICAgICAvLyBNYXJrIHRoZSBuZXcgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCi0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKShyb3dDaHVuayArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpKSkgPSAwOwotICAgICAgICB9IGVsc2UgewotTE9HX1dJTkRPVygiZm9sbHdpbmcgJ3BvaW50ZXInIHRvIG5leHQgY2h1bmssIG9mZnNldCBvZiBuZXh0IHBvaW50ZXIgaXMgJWQiLCBjaHVua1B0ck9mZnNldCk7Ci0gICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7Ci0gICAgICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1IZWFkZXItPm51bVJvd3MrKzsKLQotICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOwotfQotCi1maWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKQotewotICBpZiAocm93IDwgMCB8fCByb3cgPj0gbUhlYWRlci0+bnVtUm93cyB8fCBjb2x1bW4gPCAwIHx8IGNvbHVtbiA+PSBtSGVhZGVyLT5udW1Db2x1bW5zKSB7Ci0gICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfSAgICAgICAgCi0gIHJvd19zbG90X3QgKiByb3dTbG90ID0gZ2V0Um93U2xvdChyb3cpOwotICBpZiAoIXJvd1Nsb3QpIHsKLSAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7Ci0gICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9ICAKLSAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gcm93U2xvdC0+b2Zmc2V0OwotICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOyAgCi19Ci0KLXVpbnQzMl90IEN1cnNvcldpbmRvdzo6cmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3RPdXQpCi17Ci0gICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgewotICAgICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9ICAgICAgICAKLSAgICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKLSAgICBpZiAoIXJvd1Nsb3QpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBmb3Igcm93ICVkIiwgcm93KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7Ci0gICAgICAgIExPR0UoIkludmFsaWQgcm93U2xvdCwgb2Zmc2V0ID0gJWQiLCByb3dTbG90LT5vZmZzZXQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotTE9HX1dJTkRPVygiRm91bmQgZmllbGQgZGlyZWN0b3J5IGZvciAlZCwlZCBhdCByb3dTbG90ICVkLCBvZmZzZXQgJWQiLCByb3csIGNvbHVtbiwgKHVpbnQ4X3QgKilyb3dTbG90IC0gbURhdGEsIHJvd1Nsb3QtPm9mZnNldCk7Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSAoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIocm93U2xvdC0+b2Zmc2V0KTsKLUxPR19XSU5ET1coIlJlYWQgZmllbGRfc2xvdF90ICVkLCVkOiBvZmZzZXQgPSAlZCwgc2l6ZSA9ICVkLCB0eXBlID0gJWQiLCByb3csIGNvbHVtbiwgZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5vZmZzZXQsIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIuc2l6ZSwgZmllbGREaXJbY29sdW1uXS50eXBlKTsKLQotICAgIC8vIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dCBwYXJhbQotICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLm9mZnNldCA9IGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0OwotICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLnNpemUgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemU7Ci0gICAgc2xvdE91dC0+dHlwZSA9IGZpZWxkRGlyW2NvbHVtbl0udHlwZTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgY29uc3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSBtU2l6ZSk7ICAgIAotICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBpbnQ2NF90IGRhdGEpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoaW50NjRfdCkpOwotfQotCi12b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgZG91YmxlIGRhdGEpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsICh1aW50OF90ICopJmRhdGEsIHNpemVvZihkb3VibGUpKTsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOwotICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLWludDY0X3QgQ3Vyc29yV2luZG93Ojpjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgaW50NjRfdCB2YWx1ZTsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGludDY0X3QpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGludDY0X3QpKTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLWRvdWJsZSBDdXJzb3JXaW5kb3c6OmNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KQotewotICAgIGRvdWJsZSB2YWx1ZTsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGRvdWJsZSkgPD0gbVNpemUpOwotICAgIG1lbWNweSgmdmFsdWUsIG1EYXRhICsgb2Zmc2V0LCBzaXplb2YoZG91YmxlKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgIGZpZWxkU2xvdC0+ZGF0YS5sID0gdmFsdWU7Ci0jZWxzZQotICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOwotICAgIGlmICghb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7Ci0KLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoaW50NjRfdCk7Ci0jZW5kaWYKLSAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpwdXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlIHZhbHVlKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgIGZpZWxkU2xvdC0+ZGF0YS5kID0gdmFsdWU7Ci0jZWxzZQotICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOwotICAgIGlmICghb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7Ci0KLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoZG91YmxlKTsKLSNlbmRpZgotICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfRkxPQVQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9OVUxMOwotICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gMDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSAwOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCB8fCBmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9JTlRFR0VSKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0jaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCi0gICAgKnZhbHVlT3V0ID0gZmllbGRTbG90LT5kYXRhLmw7Ci0jZWxzZQotICAgICp2YWx1ZU91dCA9IGNvcHlPdXRMb25nKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKLSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfRkxPQVQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5kOwotI2Vsc2UKLSAgICAqdmFsdWVPdXQgPSBjb3B5T3V0RG91YmxlKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKLSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9OVUxMKSB7Ci0gICAgICAgICp2YWx1ZU91dCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp2YWx1ZU91dCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmggYi9jb3JlL2puaS9DdXJzb3JXaW5kb3cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjYjU2MC4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAotI2RlZmluZSBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8am5pLmg+Ci0KLSNkZWZpbmUgREVGQVVMVF9XSU5ET1dfU0laRSA0MDk2Ci0jZGVmaW5lIE1BWF9XSU5ET1dfU0laRSAoMTAyNCAqIDEwMjQpCi0jZGVmaW5lIFdJTkRPV19BTExPQ0FUSU9OX1NJWkUgNDA5NgotCi0jZGVmaW5lIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTIDE2Ci0KLS8vIFJvdyBzbG90cyBhcmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiBST1dfU0xPVF9DSFVOS19OVU1fUk9XUywKLS8vIHdpdGggYW4gb2Zmc2V0IGFmdGVyIHRoZSByb3dzIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IGNodW5rCi0jZGVmaW5lIFJPV19TTE9UX0NIVU5LX1NJWkUgKChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSkgKyBzaXplb2YodWludDMyX3QpKQotCi0KLSNpZiBMT0dfTkRFQlVHCi0KLSNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIGlmIChmYWxzZSkKLSNkZWZpbmUgTE9HX1dJTkRPVyguLi4pCi0KLSNlbHNlCi0KLSNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIElGX0xPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciKQotI2RlZmluZSBMT0dfV0lORE9XKC4uLikgTE9HKExPR19ERUJVRywgIkN1cnNvcldpbmRvdyIsIF9fVkFfQVJHU19fKQotCi0jZW5kaWYKLQotCi0vLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBzdHJpbmdzIGFyZSBzdG9yZWQgYXMgVVRGOCwgb3RoZXJ3aXNlIHRoZXkncmUgVVRGMTYKLSNkZWZpbmUgV0lORE9XX1NUT1JBR0VfVVRGOCAxCi0KLS8vIFdoZW4gZGVmaW5lZCB0byB0cnVlIG51bWJlcmljIHZhbHVlcyBhcmUgc3RvcmVkIGlubGluZSBpbiB0aGUgZmllbGRfc2xvdF90LCBvdGhlcndpc2UgdGhleSdyZSBhbGxvY2F0ZWQgaW4gdGhlIHdpbmRvdwotI2RlZmluZSBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MgMQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdWludDMyX3QgbnVtUm93czsKLSAgICB1aW50MzJfdCBudW1Db2x1bW5zOwotfSB3aW5kb3dfaGVhZGVyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdWludDMyX3Qgb2Zmc2V0OwotfSByb3dfc2xvdF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQ4X3QgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGRvdWJsZSBkOwotICAgICAgICBpbnQ2NF90IGw7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQ7Ci0gICAgICAgICAgICB1aW50MzJfdCBzaXplOwotICAgICAgICB9IGJ1ZmZlcjsKLSAgICB9IGRhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZpZWxkX3Nsb3RfdDsKLQotI2RlZmluZSBGSUVMRF9UWVBFX0lOVEVHRVIgMQotI2RlZmluZSBGSUVMRF9UWVBFX0ZMT0FUIDIKLSNkZWZpbmUgRklFTERfVFlQRV9TVFJJTkcgMwotI2RlZmluZSBGSUVMRF9UWVBFX0JMT0IgNAotI2RlZmluZSBGSUVMRF9UWVBFX05VTEwgNQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGEgc2V0IG9mIHJvd3MgZnJvbSBhIGRhdGFiYXNlIGluIGEgYnVmZmVyLiBUaGUgYmVnaW5pbmcgb2YgdGhlCi0gKiB3aW5kb3cgaGFzIGZpcnN0IGNodW5rIG9mIHJvd19zbG90X3RzLCB3aGljaCBhcmUgb2Zmc2V0cyB0byB0aGUgcm93IGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkKLSAqIGFuIG9mZnNldCB0byB0aGUgbmV4dCBjaHVuayBpbiBhIGxpbmtlZC1saXN0IG9mIGFkZGl0aW9uYWwgY2h1bmsgb2Ygcm93X3Nsb3RfdHMgaW4gY2FzZQotICogdGhlIHByZS1hbGxvY2F0ZWQgY2h1bmsgaXNuJ3QgYmlnIGVub3VnaCB0byByZWZlciB0byBhbGwgcm93cy4gRWFjaCByb3cgZGlyZWN0b3J5IGhhcyBhCi0gKiBmaWVsZF9zbG90X3QgcGVyIGNvbHVtbiwgd2hpY2ggaGFzIHRoZSBzaXplLCBvZmZzZXQsIGFuZCB0eXBlIG9mIHRoZSBkYXRhIGZvciB0aGF0IGZpZWxkLgotICogTm90ZSB0aGF0IHRoZSBkYXRhIHR5cGVzIGNvbWUgZnJvbSBzcWxpdGUzLmguCi0gKi8KLWNsYXNzIEN1cnNvcldpbmRvdwotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yV2luZG93KHNpemVfdCBtYXhTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdygpe30KLSAgICBib29sICAgICAgICAgICAgICAgIHNldE1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfkN1cnNvcldpbmRvdygpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBpbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KTsKLSAgICBzcDxJTWVtb3J5PiAgICAgICAgIGdldE1lbW9yeSgpIHtyZXR1cm4gbU1lbW9yeTt9Ci0KLSAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSB7cmV0dXJuIG1TaXplO30KLSAgICB1aW50OF90ICogICAgICAgICAgIGRhdGEoKSB7cmV0dXJuIG1EYXRhO30KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bVJvd3MoKSB7cmV0dXJuIG1IZWFkZXItPm51bVJvd3M7fQotICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0TnVtQ29sdW1ucygpIHtyZXR1cm4gbUhlYWRlci0+bnVtQ29sdW1uczt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBmcmVlTGFzdFJvdygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRlci0+bnVtUm93cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtUm93cy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICBib29sICAgICAgICAgICAgICAgIHNldE51bUNvbHVtbnModWludDMyX3QgbnVtQ29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1ciA9IG1IZWFkZXItPm51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPiAwICYmIGN1ciAhPSBudW1Db2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJUcnlpbmcgdG8gZ28gZnJvbSAlZCBjb2x1bW5zIHRvICVkIiwgY3VyLCBudW1Db2x1bW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgaW50MzJfdCAgICAgICAgICAgICBmcmVlU3BhY2UoKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHJvdyBzbG90IGFuZCBpdHMgZGlyZWN0b3J5LiBUaGUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgcm93J3MgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBOVUxMIGlmIHRoZXJlIHdhc24ndCByb29tLiBUaGUgZGlyZWN0b3J5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBpbml0aWFsaWVkIHdpdGggTlVMTCBlbnRyaWVzIGZvciBlYWNoIGZpZWxkLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBhbGxvY1JvdygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcG9ydGlvbiBvZiB0aGUgd2luZG93LiBSZXR1cm5zIHRoZSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBhbGxvY2F0aW9uLCBvciAwIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIGFsaWduZWQgaXMgdHJ1ZSwgdGhlIGFsbG9jYXRpb24gZ2V0cyA0IGJ5dGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdWludDMyX3QgICAgICAgICAgICBhbGxvYyhzaXplX3Qgc2l6ZSwgYm9vbCBhbGlnbmVkID0gZmFsc2UpOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICByZWFkX2ZpZWxkX3Nsb3QoaW50IHJvdywgaW50IGNvbHVtbiwgZmllbGRfc2xvdF90ICogc2xvdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weSBkYXRhIGludG8gdGhlIHdpbmRvdyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weU91dCh1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgY29weU91dERvdWJsZSh1aW50MzJfdCBvZmZzZXQpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgKiB2YWx1ZU91dCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpOwotCi0gICAgdWludDhfdCAqICAgICAgICAgICBvZmZzZXRUb1B0cih1aW50MzJfdCBvZmZzZXQpIHtyZXR1cm4gbURhdGEgKyBvZmZzZXQ7fQotCi0gICAgcm93X3Nsb3RfdCAqICAgICAgICBhbGxvY1Jvd1Nsb3QoKTsKLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgZ2V0Um93U2xvdChpbnQgcm93KTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQ4X3QgKiBtRGF0YTsKLSAgICBzaXplX3QgbVNpemU7Ci0gICAgc2l6ZV90IG1NYXhTaXplOwotICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgotICAgICAqLwotICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKaW5kZXggODhiYmFmZC4uYjA2MjI2NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcApAQCAtMzEzLDYgKzMxMywxMCBAQAogICAgIHJldHVybiBiaXRtYXAtPmNvbmZpZygpOw0KIH0NCiANCitzdGF0aWMgaW50IEJpdG1hcF9nZXRHZW5lcmF0aW9uSWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCisgICAgcmV0dXJuIGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7DQorfQ0KKw0KIHN0YXRpYyBqYm9vbGVhbiBCaXRtYXBfaGFzQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCiAgICAgcmV0dXJuICFiaXRtYXAtPmlzT3BhcXVlKCk7DQogfQ0KQEAgLTYwNiw2ICs2MTAsNyBAQAogICAgICAgICAodm9pZCopQml0bWFwX3dyaXRlVG9QYXJjZWwgfSwNCiAgICAgeyAgICJuYXRpdmVFeHRyYWN0QWxwaGEiLCAgICAgICAiKElJW0kpTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsDQogICAgICAgICAodm9pZCopQml0bWFwX2V4dHJhY3RBbHBoYSB9LA0KKyAgICB7ICAgIm5hdGl2ZUdlbmVyYXRpb25JZCIsICAgICAgICIoSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRHZW5lcmF0aW9uSWQgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbCIsICAgICAgICAgICAiKElJSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVscyIsICAgICAgICAgICIoSVtJSUlJSUlJKVYiLCAodm9pZCopQml0bWFwX2dldFBpeGVscyB9LA0KICAgICB7ICAgIm5hdGl2ZVNldFBpeGVsIiwgICAgICAgICAgICIoSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9zZXRQaXhlbCB9LA0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAppbmRleCBlMWU5NTM2Li5iZjE1MGE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJTa0NhbnZhcy5oIgogI2luY2x1ZGUgIlNrRGV2aWNlLmgiCi0jaW5jbHVkZSAiU2tHTENhbnZhcy5oIgogI2luY2x1ZGUgIlNrR3JhcGhpY3MuaCIKICNpbmNsdWRlICJTa0ltYWdlUmVmX0dsb2JhbFBvb2wuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKQEAgLTMwLDYgKzI5LDEzIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNkZWZpbmUgVElNRV9EUkFXeAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X3RocmVhZF9tc2VjKCkgewpAQCAtNjAsMTMgKzY2LDggQEAKICAgICAgICAgcmV0dXJuIGJpdG1hcCA/IG5ldyBTa0NhbnZhcygqYml0bWFwKSA6IG5ldyBTa0NhbnZhczsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIFNrQ2FudmFzKiBpbml0R0woSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTa0dMQ2FudmFzOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBmcmVlQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7CiAgICAgICAgIC8vIHRoZXNlIGFyZSBjYWxsZWQgaW4gbm8gcGFydGljdWxhciBvcmRlcgotICAgICAgICBTa0dMQ2FudmFzOjpEZWxldGVBbGxUZXh0dXJlcygpOwogICAgICAgICBTa0ltYWdlUmVmX0dsb2JhbFBvb2w6OlNldFJBTVVzZWQoMCk7CiAgICAgICAgIFNrR3JhcGhpY3M6OlNldEZvbnRDYWNoZVVzZWQoMCk7CiAgICAgfQpAQCAtMTAzLDExICsxMDQsNiBAQAogICAgICAgICByZXR1cm4gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKS5oZWlnaHQoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBzZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgY2FudmFzLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgc2V0Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwKSB7CiAgICAgICAgIGNhbnZhcy0+c2V0Qml0bWFwRGV2aWNlKCpiaXRtYXApOwpAQCAtNzQzLDQ1ICs3MzksNDkgQEAKICAgICAgICAgY2FudmFzLT5kcmF3VmVydGljZXMobW9kZSwgcHRDb3VudCwgdmVydHMsIHRleHMsIGNvbG9ycywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywgaW5kZXhDb3VudCwgKnBhaW50KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrQ2FudmFzKiBjID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUNhbnZhcyhlbnYsIGNhbnZhcyk7Ci0gICAgICAgIGMtPmRyYXdUZXh0KHRleHRfLCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwKLSAgICAgICAgICAgICAgICAgICAgKkdyYXBoaWNzSk5JOjpnZXROYXRpdmVQYWludChlbnYsIHBhaW50KSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAorICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGpjaGFyKiBjaGFycyA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjaGFycywgSk5JX0FCT1JUKTsKICAgICB9Ci0gICAgCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmosIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgamludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY29uc3QgamNoYXIqIGNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIGNoYXJzKTsKKyAgICB9CisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKQEAgLTgwNCwxMCArODA0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCkgOiBOVUxMOwogICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA6IDA7CiAgICAgICAgIGZsb2F0KiBwb3NBcnJheSA9IHBvcyA/IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvcywgTlVMTCkgOiBOVUxMOwpAQCAtODI3LDI3ICs4MjgsMjcgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRBcnJheSwgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDw8IDE7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0XywgYnl0ZUxlbmd0aCwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBpbnQgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRfLCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIGJvb2wgZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYm91bmRzKSB7CiAgICAgICAgIFNrUmVjdCAgIHI7CkBAIC04NjgsMTIgKzg2OSwxMCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ2FudmFzTWV0aG9kc1tdID0gewogICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZmluYWxpemVyfSwKICAgICB7ImluaXRSYXN0ZXIiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRSYXN0ZXJ9LAotICAgIHsiaW5pdEdMIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRHTH0sCiAgICAgeyJpc09wYXF1ZSIsIigpWiIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppc09wYXF1ZX0sCiAgICAgeyJnZXRXaWR0aCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRXaWR0aH0sCiAgICAgeyJnZXRIZWlnaHQiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0SGVpZ2h0fSwKICAgICB7Im5hdGl2ZV9zZXRCaXRtYXAiLCIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRCaXRtYXB9LAotICAgIHsibmF0aXZlU2V0Vmlld3BvcnQiLCAiKElJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldFZpZXdwb3J0fSwKICAgICB7InNhdmUiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZUFsbH0sCiAgICAgeyJzYXZlIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlfSwKICAgICB7Im5hdGl2ZV9zYXZlTGF5ZXIiLCIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3RGO0lJKUkiLApAQCAtOTQwLDI2ICs5MzksMjcgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBSUn0sCiAgICAgeyJuYXRpdmVfZHJhd0JpdG1hcCIsICIoSVtJSUlGRklJWkkpViIsCiAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcEFycmF5fSwKLSAgICAKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNYXRyaXgiLCAiKElJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNYXRyaXh9LAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1lc2giLCAiKElJSUlbRklbSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWVzaH0sCiAgICAgeyJuYXRpdmVEcmF3VmVydGljZXMiLCAiKElJSVtGSVtGSVtJSVtTSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3VmVydGljZXN9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50fSwKLSAgICB7ImRyYXdUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO0ZGTGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7KVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1N0cmluZ30sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJW0NJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSVtDSUlbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQaWN0dXJlIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQaWN0dXJlfSwKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAppbmRleCBlYmZiMjA5Li5mM2JlOGIwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcApAQCAtMjMsMjggKzIzLDY5IEBACiAjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZpbHRlci5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgogCisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKIGNsYXNzIFNrQ29sb3JGaWx0ZXJHbHVlIHsKIHB1YmxpYzoKLQotICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqKSB7CisgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmosIFNraWFDb2xvckZpbHRlciogZikgeworICAgICAgICBkZWxldGUgZjsKICAgICAgICAgb2JqLT5zYWZlVW5yZWYoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQmxlbmRGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9Ci0gCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG11bCwgamludCBhZGQpIHsKKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKKworICAgICAgICBmbG9hdCogY29sb3JNYXRyaXggPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBtZW1jcHkoY29sb3JNYXRyaXgsIHNyYywgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzRdLCAmc3JjWzVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbOF0sICZzcmNbMTBdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbMTJdLCAmc3JjWzE1XSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGZsb2F0KiBjb2xvclZlY3RvciA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMF0gPSBzcmNbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzFdID0gc3JjWzldOworICAgICAgICBjb2xvclZlY3RvclsyXSA9IHNyY1sxNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzNdID0gc3JjWzE5XTsKKworICAgICAgICByZXR1cm4gbmV3IFNraWFDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCwgY29sb3JWZWN0b3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgewogICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGphcnJheSkgeworCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOwogICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOwogCkBAIC01OCwyNiArOTksMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKHNyYyk7CiAjZW5kaWYKICAgICB9Ci0gCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9yZmlsdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQorICAgIHsiZmluYWxpemVyIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBwb3J0ZXJkdWZmX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBsaWdodGluZ19tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyIH0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9ybWF0cml4X21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwiKFtGKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlcn0KKyAgICB7ICJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyICAgfSwKKyAgICB7ICJuQ29sb3JNYXRyaXhGaWx0ZXIiLCAgICAgICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgfQogfTsKIAogI2RlZmluZSBSRUcoZW52LCBuYW1lLCBhcnJheSkgXApAQCAtODUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS19BUlJBWV9DT1VOVChhcnJheSkpOyAgXAogICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gcmVzdWx0CiAKLQogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0OwogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAppbmRleCA3ODBiYWRjLi5lNGQ0ODUwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcApAQCAtMzEsNiArMzEsMTEgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKy8vIHRlbXBvcmFyeSBmb3IgZGVidWdnaW5nCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTcsNiArNjIsOSBAQAogCiBjbGFzcyBTa1BhaW50R2x1ZSB7CiBwdWJsaWM6CisgICAgZW51bSBNb3ZlT3B0IHsKKyAgICAgICAgQUZURVIsIEFUX09SX0FGVEVSLCBCRUZPUkUsIEFUX09SX0JFRk9SRSwgQVQKKyAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBvYmopIHsKICAgICAgICAgZGVsZXRlIG9iajsKQEAgLTM5NSwyMCArNDAzLDE2MSBAQAogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKLSAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwotICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKworICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqZmxvYXQgYWR2YW5jZXNBcnJheVtjb3VudF07CisgICAgICAgIGpmbG9hdCB0b3RhbEFkdmFuY2U7CisKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKHBhaW50LCB0ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlc0FycmF5LCB0b3RhbEFkdmFuY2UpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24oYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIGNvdW50LCBhZHZhbmNlc0FycmF5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOwogICAgIH0KLSAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKworICAgIHN0YXRpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBqaW50IGluZGV4LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRJbmRleCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBqaW50IGZsYWdzLCBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqZmxvYXQgcmVzdWx0ID0gZG9UZXh0UnVuQWR2YW5jZXMoZW52LCBwYWludCwgdGV4dEFycmF5ICsgY29udGV4dEluZGV4LAorICAgICAgICAgICAgaW5kZXggLSBjb250ZXh0SW5kZXgsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19TdHJpbmdJSUlJSV9GSShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsCisgICAgICAgICAgICBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLAorICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHRleHRBcnJheSArIHN0YXJ0LCAoZW5kIC0gc3RhcnQpIDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBlbmQgLSBzdGFydCwgY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCwgZmxhZ3MsIGFkdmFuY2VzLAorICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZG9UZXh0UnVuQ3Vyc29yKEpOSUVudiAqZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGppbnQgc3RhcnQsCisgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBvcHQpIHsKKyAgICAgICAgU2tTY2FsYXIgc2NhbGFyQXJyYXlbY291bnRdOworICAgICAgICBqY2hhciBidWZmZXJbY291bnRdOworCisgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6CisgICAgICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMgYW5kIHdpZHRocyByZXR1cm5lZCBmcm9tIHNraWEKKworICAgICAgICBpbnQgd2lkdGhzOworICAgICAgICBpZiAoZmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKKyAgICAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgICAgICB1X3NoYXBlQXJhYmljKHRleHQgKyBzdGFydCwgY291bnQsIGJ1ZmZlciwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHMoYnVmZmVyLCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0ICsgc3RhcnQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aHMgPCBjb3VudCkgeworICAgICAgICAgICAgLy8gU2tpYSBvcGVyYXRlcyBvbiBjb2RlIHBvaW50cywgbm90IGNvZGUgdW5pdHMsIHNvIHN1cnJvZ2F0ZSBwYWlycyByZXR1cm4gb25seSBvbmUKKyAgICAgICAgICAgIC8vIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAgICAgLy8gTm90ZSwgc2tpYSdzIGdldFRleHRXaWR0aCBnZXRzIGNvbmZ1c2VkIGlmIGl0IGVuY291bnRlcnMgYSBzdXJyb2dhdGUgcGFpciwKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIHJlbWFpbmluZyB3aWR0aHMgemVyby4gIE5vdCBuaWNlLgorICAgICAgICAgICAgY29uc3QgamNoYXIgKmNoYXJzID0gdGV4dCArIHN0YXJ0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50LCBwID0gd2lkdGhzIC0gMTsgLS1pID4gcDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPj0gMHhkYzAwICYmIGNoYXJzW2ldIDwgMHhlMDAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tpLTFdID49IDB4ZDgwMCAmJiBjaGFyc1tpLTFdIDwgMHhkYzAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc2NhbGFyQXJyYXlbaV0gPSBzY2FsYXJBcnJheVstLXBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGppbnQgcG9zID0gb2Zmc2V0IC0gc3RhcnQ7CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgIGNhc2UgQUZURVI6CisgICAgICAgICAgaWYgKHBvcyA8IGNvdW50KSB7CisgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgQVRfT1JfQUZURVI6CisgICAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ICYmIHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRToKKyAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgLS1wb3M7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0JFRk9SRToKKyAgICAgICAgICB3aGlsZSAocG9zID4gMCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICBwb3MgPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zICE9IC0xKSB7CisgICAgICAgICAgcG9zICs9IHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwKKyAgICAgICAgICAgIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBjdXJzb3JPcHQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGppbnQgcmVzdWx0ID0gZG9UZXh0UnVuQ3Vyc29yKGVudiwgcGFpbnQsIHRleHRBcnJheSwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGgoSk5JRW52KiBlbnYsIFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwgamludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFBhdGgocGFpbnQsIHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGdldFRleHRQYXRoKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksIEpOSV9BQk9SVCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgc2V0U2hhZG93TGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QganBhaW50LCBqZmxvYXQgcmFkaXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBpbnQgY29sb3IpIHsKICAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwganBhaW50KTsKQEAgLTU3Niw4ICs3MjUsMTUgQEAKICAgICB7Im5hdGl2ZV9icmVha1RleHQiLCIoTGphdmEvbGFuZy9TdHJpbmc7WkZbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6YnJlYWtUZXh0U30sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJW0NJSVtGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0V2lkdGhzX19fQ0lJX0Z9LAogICAgIHsibmF0aXZlX2dldFRleHRXaWR0aHMiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX1N0cmluZ0lJX0Z9LAotICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aH0sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGh9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJW0NJSUlJSVtGSSlGIiwgKHZvaWQqKQorICAgICAgICBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJW0ZJKUYiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX1N0cmluZ0lJSUlJX0ZJfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yIiwgIihJW0NJSUlJSSlJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkN1cnNvcl9fX0N9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJSSlJIiwKKyAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUlMamF2YS9sYW5nL1N0cmluZztJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX1N0cmluZ30sCiAgICAgeyJuYXRpdmVHZXRTdHJpbmdCb3VuZHMiLCAiKElMamF2YS9sYW5nL1N0cmluZztJSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFN0cmluZ0JvdW5kcyB9LAogICAgIHsibmF0aXZlR2V0Q2hhckFycmF5Qm91bmRzIiwgIihJW0NJSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVYiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCmluZGV4IGIwOWM2MmIuLmNiMWMzMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKQEAgLTgsNiArOCwxNSBAQAogI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgogCisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcjsKKworc3RhdGljIHN0cnVjdCB7CisgICAgamNsYXNzIGNsYXp6OworICAgIGpmaWVsZElEIHNoYWRlcjsKK30gZ1NoYWRlckNsYXNzSW5mbzsKKwogc3RhdGljIHZvaWQgVGhyb3dJQUVfSWZOdWxsKEpOSUVudiogZW52LCB2b2lkKiBwdHIpIHsKICAgICBpZiAoTlVMTCA9PSBwdHIpIHsKICAgICAgICAgZG9UaHJvd0lBRShlbnYpOwpAQCAtNDEsOCArNTAsOSBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgdm9pZCBTaGFkZXJfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgU2tTaGFkZXIqIHNoYWRlcikKK3N0YXRpYyB2b2lkIFNoYWRlcl9kZXN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsIFNraWFTaGFkZXIqIHNraWFTaGFkZXIpCiB7CisgICAgZGVsZXRlIHNraWFTaGFkZXI7CiAgICAgc2hhZGVyLT5zYWZlVW5yZWYoKTsKIH0KIApAQCAtNTEsNyArNjEsOCBAQAogICAgIHJldHVybiBzaGFkZXIgPyBzaGFkZXItPmdldExvY2FsTWF0cml4KG1hdHJpeCkgOiBmYWxzZTsKIH0KICAKLXN0YXRpYyB2b2lkIFNoYWRlcl9zZXRMb2NhbE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCwgU2tTaGFkZXIqIHNoYWRlciwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkKK3N0YXRpYyB2b2lkIFNoYWRlcl9zZXRMb2NhbE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLCBTa2lhU2hhZGVyKiBza2lhU2hhZGVyLAorICAgICAgICBjb25zdCBTa01hdHJpeCogbWF0cml4KQogewogICAgIGlmIChzaGFkZXIpIHsKICAgICAgICAgaWYgKE5VTEwgPT0gbWF0cml4KSB7CkBAIC02MCwyNCArNzEsNDAgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBzaGFkZXItPnNldExvY2FsTWF0cml4KCptYXRyaXgpOwogICAgICAgICB9CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICBza2lhU2hhZGVyLT5zZXRNYXRyaXgoY29uc3RfY2FzdDxTa01hdHJpeCo+KG1hdHJpeCkpOworI2VuZGlmCiAgICAgfQogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgU2tTaGFkZXIqIEJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwKK3N0YXRpYyBTa1NoYWRlciogQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZU1vZGVYLCBpbnQgdGlsZU1vZGVZKQogewogICAgIFNrU2hhZGVyKiBzID0gU2tTaGFkZXI6OkNyZWF0ZUJpdG1hcFNoYWRlcigqYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTa1NoYWRlcjo6VGlsZU1vZGUpdGlsZU1vZGVYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTa1NoYWRlcjo6VGlsZU1vZGUpdGlsZU1vZGVZKTsKKwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHMpOwogICAgIHJldHVybiBzOwogfQorCitzdGF0aWMgU2tpYVNoYWRlciogQml0bWFwU2hhZGVyX3Bvc3RDb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa0JpdG1hcCogYml0bWFwLCBpbnQgdGlsZU1vZGVYLCBpbnQgdGlsZU1vZGVZKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUJpdG1hcFNoYWRlcihiaXRtYXAsIHNoYWRlciwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGVYKSwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZVkpLAorICAgICAgICAgICAgTlVMTCwgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CiAgICAgCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCitzdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkKIHsKQEAgLTg1LDMxICsxMTIsOTUgQEAKICAgICBwdHNbMF0uc2V0KFNrRmxvYXRUb1NjYWxhcih4MCksIFNrRmxvYXRUb1NjYWxhcih5MCkpOwogICAgIHB0c1sxXS5zZXQoU2tGbG9hdFRvU2NhbGFyKHgxKSwgU2tGbG9hdFRvU2NhbGFyKHkxKSk7CiAKLSAgICBzaXplX3QgICAgICBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgc2l6ZV90IGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKICAgICBjb25zdCBqaW50KiBjb2xvclZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBOVUxMKTsKIAogICAgIFNrQXV0b1NUTWFsbG9jPDgsIFNrU2NhbGFyPiBzdG9yYWdlKHBvc0FycmF5ID8gY291bnQgOiAwKTsKICAgICBTa1NjYWxhciogICAgICAgICAgICAgICAgICAgcG9zID0gTlVMTDsKLSAgICAKKwogICAgIGlmIChwb3NBcnJheSkgewogICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CiAgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOwogICAgICAgICBwb3MgPSAoU2tTY2FsYXIqKXN0b3JhZ2UuZ2V0KCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBwb3NbaV0gPSBTa0Zsb2F0VG9TY2FsYXIocG9zVmFsdWVzW2ldKTsKKyAgICAgICAgfQogICAgIH0KLQorICAgIAogICAgIFNrU2hhZGVyKiBzaGFkZXIgPSBTa0dyYWRpZW50U2hhZGVyOjpDcmVhdGVMaW5lYXIocHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvclZhbHVlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpKTsKLSAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSV9BQk9SVCk7CisKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwgSk5JX0FCT1JUKTsKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzaGFkZXIpOwogICAgIHJldHVybiBzaGFkZXI7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCwKK3N0YXRpYyBTa2lhU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwgamludEFycmF5IGNvbG9yQXJyYXksCisgICAgICAgIGpmbG9hdEFycmF5IHBvc0FycmF5LCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgc2l6ZV90IGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKKyAgICBjb25zdCBqaW50KiBjb2xvclZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBOVUxMKTsKKworICAgIGpmbG9hdCogc3RvcmVkQm91bmRzID0gbmV3IGpmbG9hdFs0XTsKKyAgICBzdG9yZWRCb3VuZHNbMF0gPSB4MDsgc3RvcmVkQm91bmRzWzFdID0geTA7CisgICAgc3RvcmVkQm91bmRzWzJdID0geDE7IHN0b3JlZEJvdW5kc1szXSA9IHkxOworICAgIGpmbG9hdCogc3RvcmVkUG9zaXRpb25zID0gbmV3IGpmbG9hdFtjb3VudF07CisgICAgdWludDMyX3QqIHN0b3JlZENvbG9ycyA9IG5ldyB1aW50MzJfdFtjb3VudF07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHN0b3JlZENvbG9yc1tpXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvclZhbHVlc1tpXSk7CisgICAgfQorCisgICAgaWYgKHBvc0FycmF5KSB7CisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvUG9zKGVudiwgcG9zQXJyYXksIGNvdW50KTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHBvc1ZhbHVlcyA9IGF1dG9Qb3MucHRyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zW2ldID0gcG9zVmFsdWVzW2ldOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcmVkUG9zaXRpb25zWzBdID0gMC4wZjsKKyAgICAgICAgc3RvcmVkUG9zaXRpb25zWzFdID0gMS4wZjsKKyAgICB9CisKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihzdG9yZWRCb3VuZHMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgY291bnQsIHNoYWRlciwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSksIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBmbG9hdCogc3RvcmVkQm91bmRzID0gbmV3IGZsb2F0WzRdOworICAgIHN0b3JlZEJvdW5kc1swXSA9IHgwOyBzdG9yZWRCb3VuZHNbMV0gPSB5MDsKKyAgICBzdG9yZWRCb3VuZHNbMl0gPSB4MTsgc3RvcmVkQm91bmRzWzNdID0geTE7CisKKyAgICBmbG9hdCogc3RvcmVkUG9zaXRpb25zID0gbmV3IGZsb2F0WzJdOworICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgc3RvcmVkUG9zaXRpb25zWzFdID0gMS4wZjsKKworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbMl07CisgICAgc3RvcmVkQ29sb3JzWzBdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yMCk7CisgICAgc3RvcmVkQ29sb3JzWzFdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yMSk7CisKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihzdG9yZWRCb3VuZHMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgMiwgc2hhZGVyLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSkKIHsKQEAgLTEyMCw4ICsyMTEsOSBAQAogICAgIFNrQ29sb3IgY29sb3JzWzJdOwogICAgIGNvbG9yc1swXSA9IGNvbG9yMDsKICAgICBjb2xvcnNbMV0gPSBjb2xvcjE7Ci0KKyAgICAKICAgICBTa1NoYWRlciogcyA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsIGNvbG9ycywgTlVMTCwgMiwgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KQEAgLTIyMiwxOCArMzE0LDQyIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKQorc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKKyAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKQogewogICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIG1vZGUpOwogfQogCi1zdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrUG9ydGVyRHVmZjo6TW9kZSBwb3J0ZXJEdWZmTW9kZSkKIHsKLSAgICBTa0F1dG9VbnJlZiBhdShTa1BvcnRlckR1ZmY6OkNyZWF0ZVhmZXJtb2RlKG1vZGUpKTsKKyAgICBTa0F1dG9VbnJlZiBhdShTa1BvcnRlckR1ZmY6OkNyZWF0ZVhmZXJtb2RlKHBvcnRlckR1ZmZNb2RlKSk7CisgICAgU2tYZmVybW9kZSogbW9kZSA9IChTa1hmZXJtb2RlKikgYXUuZ2V0KCk7CisgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7Cit9CiAKLSAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCAoU2tYZmVybW9kZSopYXUuZ2V0KCkpOworc3RhdGljIFNraWFTaGFkZXIqIENvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tpYVNoYWRlciogc2hhZGVyQSwgU2tpYVNoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSA9IFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUocG9ydGVyRHVmZk1vZGUpOworICAgIHJldHVybiBuZXcgU2tpYUNvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNraWFTaGFkZXIqIENvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tpYVNoYWRlciogc2hhZGVyQSwgU2tpYVNoYWRlciogc2hhZGVyQiwgU2tYZmVybW9kZSogbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa1hmZXJtb2RlOjpNb2RlIHNraWFNb2RlOworICAgIGlmICghU2tYZmVybW9kZTo6SXNNb2RlKG1vZGUsICZza2lhTW9kZSkpIHsKKyAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBvdGhlciBtb2RlcworICAgICAgICBza2lhTW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorICAgIHJldHVybiBuZXcgU2tpYUNvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgc2tpYU1vZGUsIHNoYWRlcik7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yNDQsMTggKzM2MCwyMSBAQAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZURlc3RydWN0b3IiLCAgICAgICAgIihJKVYiLCAgICAgKHZvaWQqKVNoYWRlcl9kZXN0cnVjdG9yICAgICAgICB9LAorICAgIHsgIm5hdGl2ZURlc3RydWN0b3IiLCAgICAgICAgIihJSSlWIiwgICAgKHZvaWQqKVNoYWRlcl9kZXN0cnVjdG9yICAgICAgICB9LAogICAgIHsgIm5hdGl2ZUdldExvY2FsTWF0cml4IiwgICAgIihJSSlaIiwgICAgKHZvaWQqKVNoYWRlcl9nZXRMb2NhbE1hdHJpeCAgICB9LAotICAgIHsgIm5hdGl2ZVNldExvY2FsTWF0cml4IiwgICAgIihJSSlWIiwgICAgKHZvaWQqKVNoYWRlcl9zZXRMb2NhbE1hdHJpeCAgICB9CisgICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJSSlWIiwgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0JpdG1hcFNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICIoSUlJKUkiLCAgKHZvaWQqKUJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvciB9CisgICAgeyAibmF0aXZlQ3JlYXRlIiwgICAgICIoSUlJKUkiLCAgKHZvaWQqKUJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvciB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUiLCAiKElJSUkpSSIsICh2b2lkKilCaXRtYXBTaGFkZXJfcG9zdENvbnN0cnVjdG9yIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0xpbmVhckdyYWRpZW50TWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgIihGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUxICAgfSwKLSAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICIoRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMiAgIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUxIiwgICAgICIoRkZGRltJW0ZJKUkiLCAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICAgIH0sCisgICAgeyAibmF0aXZlQ3JlYXRlMiIsICAgICAiKEZGRkZJSUkpSSIsICAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgICB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUxIiwgIihJRkZGRltJW0ZJKUkiLCAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTEgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMiIsICIoSUZGRkZJSUkpSSIsICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUyIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ1JhZGlhbEdyYWRpZW50TWV0aG9kc1tdID0gewpAQCAtMjY5LDggKzM4OCwxMCBAQAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ29tcG9zZVNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNyZWF0ZTEiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgfQorICAgIHsibmF0aXZlQ3JlYXRlMSIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMSAgICAgfSwKKyAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgICAgICIoSUlJKUkiLCAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgICAgIH0sCisgICAgeyJuYXRpdmVQb3N0Q3JlYXRlMSIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMSB9LAorICAgIHsibmF0aXZlUG9zdENyZWF0ZTIiLCAgIihJSUlJKUkiLCAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTIgfQogfTsKIAogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZTFmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisKKyNpbmNsdWRlICJTa1RlbXBsYXRlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBtaWdodCBuZWVkIGxheW91dC4gIElmIGJpZGlGbGFncyBmb3JjZSBMVFIsIGFzc3VtZSBubyBsYXlvdXQsIGlmCisvLyBiaWRpRmxhZ3MgaW5kaWNhdGUgdGhlcmUgcHJvYmFibHkgaXMgUlRMLCBhc3N1bWUgd2UgZG8sIG90aGVyd2lzZSBzY2FuIHRoZSB0ZXh0CisvLyBsb29raW5nIGZvciBhIGNoYXJhY3RlciA+PSB0aGUgZmlyc3QgUlRMIGNoYXJhY3RlciBpbiB1bmljb2RlIGFuZCBhc3N1bWUgd2UgZG8gaWYKKy8vIHdlIGZpbmQgb25lLgorYm9vbCBUZXh0TGF5b3V0OjpuZWVkc0xheW91dChjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgYmlkaUZsYWdzKSB7CisgICAgaWYgKGJpZGlGbGFncyA9PSBrQmlkaV9Gb3JjZV9MVFIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKGJpZGlGbGFncyA9PSBrQmlkaV9SVEwpIHx8IChiaWRpRmxhZ3MgPT0ga0JpZGlfRGVmYXVsdF9SVEwpIHx8CisgICAgICAgICAgICBiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfUlRMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIGlmICh0ZXh0W2ldID49IDB4MDU5MCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoYXJhY3Rlci1iYXNlZCBBcmFiaWMgc2hhcGluZy4KKyAqCisgKiBXZSdsbCB1c2UgaGFyZmJ1enogYW5kIGdseXBoLWJhc2VkIHNoYXBpbmcgaW5zdGVhZCBvbmNlIHdlJ3JlIHNldCB1cCBmb3IgaXQuCisgKgorICogQGNvbnRleHQgdGhlIHRleHQgY29udGV4dAorICogQHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIKKyAqIEBjb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIHJlbmRlciwgc3RhcnQgKyBjb3VudCAgbXVzdCBiZSA8PSBjb250ZXh0Q291bnQKKyAqIEBjb250ZXh0Q291bnQgdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICogQHNoYXBlZCB3aGVyZSB0byBwdXQgdGhlIHNoYXBlZCB0ZXh0LCBtdXN0IGhhdmUgY2FwYWNpdHkgZm9yIGNvdW50IHVjaGFycworICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzaGFwZWQgdGV4dCwgb3IgLTEgaWYgZXJyb3IKKyAqLworaW50IFRleHRMYXlvdXQ6OnNoYXBlUnRsVGV4dChjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplIGNvdW50LCBqc2l6ZSBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBqY2hhciogc2hhcGVkLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBqY2hhciBidWZmZXJbY29udGV4dENvdW50XTsKKworICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgIHVfc2hhcGVBcmFiaWMoY29udGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAvLyB0cmltIG91dCAweGZmZmYgZm9sbG93aW5nIGxpZ2F0dXJlcywgaWYgYW55CisgICAgICAgIGludCBlbmQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldICE9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltlbmQrK10gPSBidWZmZXJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSBlbmQ7CisgICAgICAgIC8vIExPRyhMT0dfSU5GTywgIkNTUlRMIiwgInN0YXJ0ICVkIGNvdW50ICVkIGNjb3VudCAlZFxuIiwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQpOworICAgICAgICB1YmlkaV93cml0ZVJldmVyc2UoYnVmZmVyLCBjb3VudCwgc2hhcGVkLCBjb3VudCwgVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfT1VUUFVUX1JFVkVSU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORywgJnN0YXR1cyk7CisgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIEJhc2ljIGNoYXJhY3Rlci1iYXNlZCBsYXlvdXQgc3VwcG9ydGluZyBydGwgYW5kIGFyYWJpYyBzaGFwaW5nLgorICogUnVucyBiaWRpIG9uIHRoZSB0ZXh0IGFuZCBnZW5lcmF0ZXMgYSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lIGluIGJ1ZmZlciwgcmV0dXJuaW5nCisgKiB0aGUgbGVuZ3RoLgorICogQHRleHQgdGhlIHRleHQKKyAqIEBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB1Y2hhcnMKKyAqIEBkaXIgcmVjZWl2ZXMgdGhlIHJlc29sdmVkIHBhcmFncmFwaCBkaXJlY3Rpb24KKyAqIEBidWZmZXIgdGhlIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lLiAgTXVzdCBoYXZlIGNhcGFjaXR5IG9mCisgKiBhdCBsZWFzdCBsZW4gamNoYXJzLgorICogQGZsYWdzIGxpbmUgYmlkaSBmbGFncworICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lLCBvciAtMSBpZiBlcnJvcgorICovCitqaW50IFRleHRMYXlvdXQ6OmxheW91dExpbmUoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGZsYWdzLCBpbnQgJmRpciwgamNoYXIqIGJ1ZmZlciwKKyAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgc3RhdGljIGNvbnN0IGludCBSVExfT1BUUyA9IFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcgfAorICAgICAgICAgICAgVUJJRElfUkVNT1ZFX0JJRElfQ09OVFJPTFMgfCBVQklESV9PVVRQVVRfUkVWRVJTRTsKKworICAgIFVCaURpTGV2ZWwgYmlkaVJlcSA9IDA7CisgICAgc3dpdGNoIChmbGFncykgeworICAgIGNhc2Uga0JpZGlfTFRSOiBiaWRpUmVxID0gMDsgYnJlYWs7IC8vIG5vIElDVSBjb25zdGFudCwgY2Fub25pY2FsIExUUiBsZXZlbAorICAgIGNhc2Uga0JpZGlfUlRMOiBiaWRpUmVxID0gMTsgYnJlYWs7IC8vIG5vIElDVSBjb25zdGFudCwgY2Fub25pY2FsIFJUTCBsZXZlbAorICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9MVFI6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX0xUUjsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9EZWZhdWx0X1JUTDogYmlkaVJlcSA9IFVCSURJX0RFRkFVTFRfUlRMOyBicmVhazsKKyAgICBjYXNlIGtCaWRpX0ZvcmNlX0xUUjogbWVtY3B5KGJ1ZmZlciwgdGV4dCwgbGVuICogc2l6ZW9mKGpjaGFyKSk7IHJldHVybiBsZW47CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9SVEw6IHJldHVybiBzaGFwZVJ0bFRleHQodGV4dCwgMCwgbGVuLCBsZW4sIGJ1ZmZlciwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc3VsdCA9IC0xOworCisgICAgVUJpRGkqIGJpZGkgPSB1YmlkaV9vcGVuKCk7CisgICAgaWYgKGJpZGkpIHsKKyAgICAgICAgdWJpZGlfc2V0UGFyYShiaWRpLCB0ZXh0LCBsZW4sIGJpZGlSZXEsIE5VTEwsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFBhcmFMZXZlbChiaWRpKSAmIDB4MTsgLy8gMCBpZiBsdHIsIDEgaWYgcnRsCisKKyAgICAgICAgICAgIGludCByYyA9IHViaWRpX2NvdW50UnVucyhiaWRpLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIC8vIExPRyhMT0dfSU5GTywgIkxBWU9VVCIsICJwYXJhIGJpZGlSZXE9JWQgZGlyPSVkIHJjPSVkXG4iLCBiaWRpUmVxLCBkaXIsIHJjKTsKKworICAgICAgICAgICAgICAgIGludDMyX3Qgc2xlbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBVQmlEaURpcmVjdGlvbiBydW5EaXIgPSB1YmlkaV9nZXRWaXN1YWxSdW4oYmlkaSwgaSwgJnN0YXJ0LCAmbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnVuRGlyID09IFVCSURJX1JUTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBzaGFwZVJ0bFRleHQodGV4dCArIHN0YXJ0LCAwLCBsZW5ndGgsIGxlbmd0aCwgYnVmZmVyICsgc2xlbiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIgKyBzbGVuLCB0ZXh0ICsgc3RhcnQsIGxlbmd0aCAqIHNpemVvZihqY2hhcikpOworICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHViaWRpX2Nsb3NlKGJpZGkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgVGV4dExheW91dDo6cHJlcGFyZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sIGppbnQgYmlkaUZsYWdzLAorICAgICAgICBjb25zdCBqY2hhcioqIG91dFRleHQsIGludDMyX3QqIG91dEJ5dGVzLCBqY2hhcioqIG91dEJ1ZmZlcikgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dCA9IHRleHQ7CisgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgaW50IGRpciA9IGtEaXJlY3Rpb25fTFRSOworICAgIGlmIChuZWVkc0xheW91dCh0ZXh0LCBsZW4sIGJpZGlGbGFncykpIHsKKyAgICAgICAgYnVmZmVyID0oamNoYXIgKikgbWFsbG9jKGxlbiAqIHNpemVvZihqY2hhcikpOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBsZW4gPSBsYXlvdXRMaW5lKHRleHQsIGxlbiwgYmlkaUZsYWdzLCBkaXIsIGJ1ZmZlciwgc3RhdHVzKTsgLy8gbWlnaHQgY2hhbmdlIGxlbiwgZGlyCisgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgIkxBWU9VVCIsICJkcmF3VGV4dCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuJ3QgcmVuZGVyCisgICAgICAgIH0KKworICAgICAgICB3b3JrVGV4dCA9IGJ1ZmZlcjsgLy8gdXNlIHRoZSBzaGFwZWQgdGV4dAorICAgIH0KKworICAgIGJvb2wgdHJpbUxlZnQgPSBmYWxzZTsKKyAgICBib29sIHRyaW1SaWdodCA9IGZhbHNlOworCisgICAgU2tQYWludDo6QWxpZ24gaG9yaXogPSBwYWludC0+Z2V0VGV4dEFsaWduKCk7CisgICAgc3dpdGNoIChob3JpeikgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtMZWZ0X0FsaWduOiB0cmltTGVmdCA9IGRpciAmIGtEaXJlY3Rpb25fTWFzazsgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjogdHJpbUxlZnQgPSB0cmltUmlnaHQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246IHRyaW1SaWdodCA9ICEoZGlyICYga0RpcmVjdGlvbl9NYXNrKTsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGNvbnN0IGpjaGFyKiB3b3JrTGltaXQgPSB3b3JrVGV4dCArIGxlbjsKKworICAgIGlmICh0cmltTGVmdCkgeworICAgICAgICB3aGlsZSAod29ya1RleHQgPCB3b3JrTGltaXQgJiYgKndvcmtUZXh0ID09ICcgJykgeworICAgICAgICAgICAgKyt3b3JrVGV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHJpbVJpZ2h0KSB7CisgICAgICAgIHdoaWxlICh3b3JrTGltaXQgPiB3b3JrVGV4dCAmJiAqKHdvcmtMaW1pdCAtIDEpID09ICcgJykgeworICAgICAgICAgICAgLS13b3JrTGltaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0Qnl0ZXMgPSAod29ya0xpbWl0IC0gd29ya1RleHQpIDw8IDE7CisgICAgKm91dFRleHQgPSB3b3JrVGV4dDsKKyAgICAqb3V0QnVmZmVyID0gYnVmZmVyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERyYXdzIG9yIGdldHMgdGhlIHBhdGggb2YgYSBwYXJhZ3JhcGggb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBydW5uaW5nIGJpZGkgYW5kIHNoYXBpbmcuCisvLyBUaGlzIHdpbGwgZHJhdyBpZiBjYW52YXMgaXMgbm90IG51bGwsIG90aGVyd2lzZSBwYXRoIG11c3QgYmUgbm9uLW51bGwgYW5kIGl0IHdpbGwgY3JlYXRlCisvLyBhIHBhdGggcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRoYXQgd291bGQgaGF2ZSBiZWVuIGRyYXduLgordm9pZCBUZXh0TGF5b3V0OjpoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksU2tDYW52YXMgKmNhbnZhcywgU2tQYXRoICpwYXRoKSB7CisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0OworICAgIGpjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGludDMyX3Qgd29ya0J5dGVzOworICAgIGlmIChwcmVwYXJlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsICZ3b3JrVGV4dCwgJndvcmtCeXRlcywgJmJ1ZmZlcikpIHsKKyAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOworICAgICAgICBpZiAoY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sIHBhdGgpOworICAgICAgICB9CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICB9Cit9CisKK2Jvb2wgVGV4dExheW91dDo6cHJlcGFyZVJ0bFRleHRSdW4oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSYgY291bnQsCisgICAgICAgIGpzaXplIGNvbnRleHRDb3VudCwgamNoYXIqIHNoYXBlZCkgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGNvdW50ID0gc2hhcGVSdGxUZXh0KGNvbnRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQsIHN0YXR1cyk7CisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhMT0dfV0FSTiwgIkxBWU9VVCIsICJkcmF3VGV4dFJ1biBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKworICAgICB1aW50OF90IHJ0bCA9IGRpckZsYWdzICYgMHgxOworICAgICBpZiAocnRsKSB7CisgICAgICAgICBTa0F1dG9TVE1hbGxvYzw4MCwgamNoYXI+IGJ1ZmZlcihjb250ZXh0Q291bnQpOworICAgICAgICAgaWYgKHByZXBhcmVSdGxUZXh0UnVuKGNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgYnVmZmVyLmdldCgpKSkgeworICAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgICB9CisgICAgIH0gZWxzZSB7CisgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGNoYXJzICsgc3RhcnQsIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgfQorIH0KKwordm9pZCBUZXh0TGF5b3V0OjpnZXRUZXh0UnVuQWR2YW5jZXMoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICpjaGFycywgamludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGRpckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpIHsKKyAgICBqY2hhciBidWZmZXJbY29udGV4dENvdW50XTsKKworICAgIFNrU2NhbGFyKiBzY2FsYXJBcnJheSA9IChTa1NjYWxhciAqKXJlc3VsdEFkdmFuY2VzOworICAgIHJlc3VsdFRvdGFsQWR2YW5jZSA9IDA7CisKKyAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMKKworICAgIGludCB3aWR0aHM7CisgICAgY29uc3QgamNoYXIqIHRleHQ7CisgICAgaWYgKGRpckZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICAgICAgdV9zaGFwZUFyYWJpYyhjaGFycywgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKyAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGV4dCA9IGJ1ZmZlciArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dCA9IGNoYXJzICsgc3RhcnQ7CisgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICB9CisKKyAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgLy8gU2tpYSBvcGVyYXRlcyBvbiBjb2RlIHBvaW50cywgbm90IGNvZGUgdW5pdHMsIHNvIHN1cnJvZ2F0ZSBwYWlycyByZXR1cm4gb25seQorICAgICAgICAvLyBvbmUgdmFsdWUuIEV4cGFuZCB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgb25lIHZhbHVlIHBlciBVVEYtMTYgY29kZSB1bml0LgorCisgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgIC8vIGxlYXZpbmcgdGhlIHJlbWFpbmluZyB3aWR0aHMgemVyby4gIE5vdCBuaWNlLgorICAgICAgICBmb3IgKGludCBpID0gMCwgcCA9IDA7IGkgPCB3aWR0aHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlICs9IHJlc3VsdEFkdmFuY2VzW3ArK10gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICAgICAgaWYgKHAgPCBjb3VudCAmJiB0ZXh0W3BdID49IDB4ZGMwMCAmJiB0ZXh0W3BdIDwgMHhlMDAwICYmCisgICAgICAgICAgICAgICAgICAgIHRleHRbcC0xXSA+PSAweGQ4MDAgJiYgdGV4dFtwLTFdIDwgMHhkYzAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0QWR2YW5jZXNbcCsrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1tpXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gRHJhd3MgYSBwYXJhZ3JhcGggb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBydW5uaW5nIGJpZGkgYW5kIHNoYXBpbmcKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgaGFuZGxlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsIHgsIHksIGNhbnZhcywgTlVMTCk7Cit9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFBhdGgoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCkgeworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBOVUxMLCBwYXRoKTsKK30KKworCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0T25QYXRoKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgU2tTY2FsYXIgaF8gPSBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCk7CisgICAgU2tTY2FsYXIgdl8gPSBTa0Zsb2F0VG9TY2FsYXIodk9mZnNldCk7CisKKyAgICBpZiAoIW5lZWRzTGF5b3V0KHRleHQsIGNvdW50LCBiaWRpRmxhZ3MpKSB7CisgICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0LCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY291bnQpOworICAgIGludCBkaXIgPSBrRGlyZWN0aW9uX0xUUjsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjb3VudCA9IGxheW91dExpbmUodGV4dCwgY291bnQsIGJpZGlGbGFncywgZGlyLCBidWZmZXIuZ2V0KCksIHN0YXR1cyk7CisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVihidWZmZXIuZ2V0KCksIGNvdW50IDw8IDEsICpwYXRoLCBoXywgdl8sICpwYWludCk7CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSAiU2tDYW52YXMuaCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUZXh0TGF5b3V0IHsKK3B1YmxpYzoKKworICAgIGVudW0geworICAgICAgICBrRGlyZWN0aW9uX0xUUiA9IDAsCisgICAgICAgIGtEaXJlY3Rpb25fUlRMID0gMSwKKworICAgICAgICBrRGlyZWN0aW9uX01hc2sgPSAweDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtCaWRpX0xUUiA9IDAsCisgICAgICAgIGtCaWRpX1JUTCA9IDEsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfTFRSID0gMiwKKyAgICAgICAga0JpZGlfRGVmYXVsdF9SVEwgPSAzLAorICAgICAgICBrQmlkaV9Gb3JjZV9MVFIgPSA0LAorICAgICAgICBrQmlkaV9Gb3JjZV9SVEwgPSA1LAorCisgICAgICAgIGtCaWRpX01hc2sgPSAweDcKKyAgICB9OworCisgICAgLyoKKyAgICAgKiBEcmF3cyBhIHVuaWRpcmVjdGlvbmFsIHJ1biBvZiB0ZXh0LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpckZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpOworCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGRpckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKnJlc3VsdEFkdmFuY2VzLCBqZmxvYXQgJnJlc3VsdFRvdGFsQWR2YW5jZSk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBTa0NhbnZhcyogY2FudmFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIHN0YXRpYyBib29sIHByZXBhcmVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgY29uc3QgamNoYXIqKiBvdXRUZXh0LCBpbnQzMl90KiBvdXRCeXRlcywgamNoYXIqKiBvdXRCdWZmZXIpOworICAgIHN0YXRpYyBib29sIHByZXBhcmVSdGxUZXh0UnVuKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUmIGNvdW50LAorICAgICAgICBqc2l6ZSBjb250ZXh0Q291bnQsIGpjaGFyKiBzaGFwZWQpOworICAgICAgICAKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBuZWVkc0xheW91dChjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgYmlkaUZsYWdzKTsKKyAgICBzdGF0aWMgaW50IHNoYXBlUnRsVGV4dChjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplIGNvdW50LCBqc2l6ZSBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgamludCBsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpOworICAgIHN0YXRpYyB2b2lkIGhhbmRsZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksU2tDYW52YXMgKmNhbnZhcywgU2tQYXRoICpwYXRoKTsKK307CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKaW5kZXggN2M3YmZlYi4uMWZlNzJlNiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKQEAgLTEzMCw3ICsxMzAsMTMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIAotICAgIHJldHVybiBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKG5ldyBBc3NldFN0cmVhbShhc3NldCwgdHJ1ZSkpOworICAgIFNrU3RyZWFtKiBzdHJlYW0gPSBuZXcgQXNzZXRTdHJlYW0oYXNzZXQsIHRydWUpOworICAgIFNrVHlwZWZhY2UqIGZhY2UgPSBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKHN0cmVhbSk7CisgICAgLy8gU2tUeXBlRmFjZTo6Q3JlYXRlRnJvbVN0cmVhbSBjYWxscyByZWYoKSBvbiB0aGUgc3RyZWFtLCBzbyB3ZQorICAgIC8vIG5lZWQgdG8gdW5yZWYgaXQgaGVyZSBvciBpdCB3b24ndCBiZSBmcmVlZCBsYXRlciBvbgorICAgIHN0cmVhbS0+dW5yZWYoKTsKKworICAgIHJldHVybiBmYWNlOwogfQogCiBzdGF0aWMgU2tUeXBlZmFjZSogVHlwZWZhY2VfY3JlYXRlRnJvbUZpbGUoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpzdHJpbmcganBhdGgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGU0NDA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aF9TY29Tb2NrZXQuY3BwIgotCi0jaW5jbHVkZSAiYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgInV0aWxzL21pc2MuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotCi0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSNpbmNsdWRlIDxibHVldG9vdGgvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3Njby5oPgotI2luY2x1ZGUgPGJsdWV0b290aC9oY2kuaD4KLQotI2RlZmluZSBNQVhfTElORSAyNTUKLQotLyoKLSAqIERlZmluZXMgdGhlIG1vZHVsZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGJsYWNrbGlzdCBmaWxlLgotICogVGhlc2UgYXJlIHVzZWQgYnkgY29uc3VtZXJzIG9mIHRoZSBibGFja2xpc3QgZmlsZSB0byBzZWUgaWYgdGhlIGxpbmUgaXMKLSAqIHVzZWQgYnkgdGhhdCBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgU0NPX0JMQUNLTElTVF9NT0RVTEVfTkFNRSAic2NvU29ja2V0IgotCi0KLS8qIERlZmluZSB0aGUgdHlwZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGJsYWNrbGlzdCBmaWxlLiAqLwotI2RlZmluZSBCTEFDS0xJU1RfQllfTkFNRSAibmFtZSIKLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX1BBUlRJQUxfTkFNRSAicGFydGlhbF9uYW1lIgotI2RlZmluZSBCTEFDS0xJU1RfQllfT1VJICJ2ZW5kb3Jfb3VpIgotCi0jZW5kaWYKLQotLyogSWRlYWxseSwgYmxvY2tpbmcgSS9PIG9uIGEgU0NPIHNvY2tldCB3b3VsZCByZXR1cm4gd2hlbiBhbm90aGVyIHRocmVhZAotICogY2FsbHMgY2xvc2UoKS4gSG93ZXZlciBpdCBkb2VzIG5vdCByaWdodCBub3csIGluIGZhY3QgY2xvc2UoKSBvbiBhIFNDTwotICogc29ja2V0IGhhcyBzdHJhbmdlIGJlaGF2aW9yIChyZXR1cm5zIGEgYm9ndXMgdmFsdWUpIHdoZW4gb3RoZXIgdGhyZWFkcwotICogYXJlIHBlcmZvcm1pbmcgYmxvY2tpbmcgSS9PIG9uIHRoYXQgc29ja2V0LiBTbywgdG8gd29ya2Fyb3VuZCwgd2UgYWx3YXlzCi0gKiBjYWxsIGNsb3NlKCkgZnJvbSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBkb2VzIGJsb2NraW5nIEkvTy4gVGhpcyByZXF1aXJlcyB0aGUKLSAqIHVzZSBvZiBhIHNvY2tldHBhaXIgdG8gc2lnbmFsIHRoZSBibG9ja2luZyBJL08gdG8gYWJvcnQuCi0gKgotICogVW5mb3J0dW5hdGVseSBJIGRvbid0IGtub3cgYSB3YXkgdG8gYWJvcnQgY29ubmVjdCgpIHlldCwgYnV0IGF0IGxlYXN0IHRoaXMKLSAqIHRpbWVzIG91dCBhZnRlciB0aGUgQlQgcGFnZSB0aW1lb3V0ICgxMCBzZWNvbmRzIGN1cnJlbnRseSksIHNvIHRoZSB0aHJlYWQKLSAqIHdpbGwgZGllIGV2ZW50dWFsbHkuIFRoZSBmYWN0IHRoYXQgdGhlIHRocmVhZCBjYW4gb3V0bGl2ZQotICogdGhlIEphdmEgb2JqZWN0IGZvcmNlcyB1cyB0byB1c2UgYSBtdXRleCBpbiBkZXN0b3J5TmF0aXZlKCkuCi0gKgotICogVGhlIEpOSSBBUEkgaXMgZW50aXJlbHkgYXN5bmMuCi0gKgotICogQWxzbyBub3RlIHRoaXMgY2xhc3MgZGVhbHMgb25seSB3aXRoIFNDTyBjb25uZWN0aW9ucywgbm90IHdpdGggZGF0YQotICogdHJhbnNtaXNzaW9uLgotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLQotc3RhdGljIEphdmFWTSAqanZtOwotc3RhdGljIGpmaWVsZElEIGZpZWxkX21OYXRpdmVEYXRhOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BY2NlcHRlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ29ubmVjdGVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25DbG9zZWQ7Ci0KLXN0cnVjdCB0aHJlYWRfZGF0YV90Owotc3RhdGljIHZvaWQgKndvcmtfdGhyZWFkKHZvaWQgKmFyZyk7Ci1zdGF0aWMgaW50IGNvbm5lY3Rfd29yayhjb25zdCBjaGFyICphZGRyZXNzLCB1aW50MTZfdCBzY29fcGt0X3R5cGUpOwotc3RhdGljIGludCBhY2NlcHRfd29yayhpbnQgc2lnbmFsX3NrKTsKLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2Nsb3NlKGludCBzaywgaW50IHNpZ25hbF9zayk7Ci1zdGF0aWMgdm9pZCBjbG9zZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpOwotCi1zdGF0aWMgdm9pZCBwYXJzZUJsYWNrbGlzdCh2b2lkKTsKLXN0YXRpYyB1aW50MTZfdCBnZXRTY29UeXBlKGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0jZGVmaW5lIENPTVBBUkVfU1RSSU5HKGtleSwgcykgKCFzdHJuY21wKGtleSwgcywgc3RybGVuKHMpKSkKLQotLyogQmxhY2tsaXN0IGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IHNjb0JsYWNrbGlzdCB7Ci0gICAgaW50IGZpZWxkVHlwZTsKLSAgICBjaGFyICp2YWx1ZTsKLSAgICB1aW50MTZfdCBzY29UeXBlOwotICAgIHN0cnVjdCBzY29CbGFja2xpc3QgKm5leHQ7Ci19IHNjb0JsYWNrbGlzdF90OwotCi0jZGVmaW5lIEJMX1RZUEVfTkFNRSAxICAgLy8gRmllbGQgdHlwZSBpcyBuYW1lIHN0cmluZwotCi1zdGF0aWMgc2NvQmxhY2tsaXN0X3QgKmJsYWNrbGlzdCA9IE5VTEw7Ci0KLS8qIHNoYXJlZCBuYXRpdmUgZGF0YSAtIHByb3RlY3RlZCBieSBtdXRleCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKLSAgICBpbnQgc2lnbmFsX3NrOyAgICAgICAgLy8gc29ja2V0IHRvIHNpZ25hbCBibG9ja2VkIEkvTyB0byB1bmJsb2NrCi0gICAgam9iamVjdCBvYmplY3Q7ICAgICAgIC8vIEpOSSBnbG9iYWwgcmVmIHRvIHRoZSBKYXZhIG9iamVjdAotICAgIHRocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhOyAgLy8gcG9pbnRlciB0byB0aHJlYWQgbG9jYWwgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4IDEgdGhyZWFkIHBlciBzY28gc29ja2V0Ci19IG5hdGl2ZV9kYXRhX3Q7Ci0KLS8qIHRocmVhZCBsb2NhbCBkYXRhICovCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdCB7Ci0gICAgbmF0aXZlX2RhdGFfdCAqbmF0OwotICAgIGJvb2wgaXNfYWNjZXB0OyAgICAgICAgLy8gYWNjZXB0IChsaXN0ZW5pbmcpIG9yIGNvbm5lY3QgKG91dGdvaW5nKSB0aHJlYWQKLSAgICBpbnQgc2lnbmFsX3NrOyAgICAgICAgIC8vIHNvY2tldCBmb3IgdGhyZWFkIHRvIGxpc3RlbiBmb3IgdW5ibG9jayBzaWduYWwKLSAgICBjaGFyIGFkZHJlc3NbQlRBRERSX1NJWkVdOyAgLy8gQlQgYWRkcmVzIGFzIHN0cmluZwotICAgIHVpbnQxNl90IHNjb19wa3RfdHlwZTsgICAvLyBTQ08gcGFja2V0IHR5cGVzIHN1cHBvcnRlZAotfTsKLQotc3RhdGljIGlubGluZSBuYXRpdmVfZGF0YV90ICogZ2V0X25hdGl2ZV9kYXRhKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIHJldHVybiAobmF0aXZlX2RhdGFfdCAqKShlbnYtPkdldEludEZpZWxkKG9iamVjdCwgZmllbGRfbU5hdGl2ZURhdGEpKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IHN0cjJzY29UeXBlIChjaGFyICprZXkpIHsKLSAgICBMT0dWKCIlczoga2V5ID0gJXMiLCBfX0ZVTkNUSU9OX18sIGtleSk7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYxIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjIiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYyOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMyIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjQiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVY0OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWNSIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fMkVWMyIpKQotICAgICAgICByZXR1cm4gRVNDT18yRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzNFVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fM0VWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18yRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPXzJFVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fM0VWNSIpKQotICAgICAgICByZXR1cm4gRVNDT18zRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJTQ09fRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBTQ09fRVNDT19NQVNLOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFRFJfRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBFRFJfRVNDT19NQVNLOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJBTExfRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBBTExfRVNDT19NQVNLOwotICAgIExPR0UoIlVua25vd24gU0NPIFR5cGUgKCVzKSBza2lwcGluZyIsa2V5KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2VCbGFja2xpc3Qodm9pZCkgewotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gIi9ldGMvYmx1ZXRvb3RoL2JsYWNrbGlzdC5jb25mIjsKLSAgICBjaGFyIGxpbmVbTUFYX0xJTkVdOwotICAgIHNjb0JsYWNrbGlzdF90ICpsaXN0ID0gTlVMTDsKLSAgICBzY29CbGFja2xpc3RfdCAqbmV3ZWxlbTsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLQotICAgIC8qIE9wZW4gZmlsZSAqLwotICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICAgaWYoIWZwKSB7Ci0gICAgICAgIExPR0UoIkVycm9yKCVzKW9wZW5pbmcgYmxhY2tsaXN0IGZpbGUiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIE1BWF9MSU5FLCBmcCkgIT0gTlVMTCkgewotICAgICAgICBpZiAoKENPTVBBUkVfU1RSSU5HKGxpbmUsICIvLyIpKSB8fCAoIXN0cmNtcChsaW5lLCAiIikpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNoYXIgKm1vZHVsZSA9IHN0cnRvayhsaW5lLCI6Iik7Ci0gICAgICAgIGlmIChDT01QQVJFX1NUUklORyhtb2R1bGUsIFNDT19CTEFDS0xJU1RfTU9EVUxFX05BTUUpKSB7Ci0gICAgICAgICAgICBuZXdlbGVtID0gKHNjb0JsYWNrbGlzdF90ICopY2FsbG9jKDEsIHNpemVvZihzY29CbGFja2xpc3RfdCkpOwotICAgICAgICAgICAgaWYgKG5ld2VsZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcGFyc2UgbGluZQotICAgICAgICAgICAgY2hhciAqdHlwZSA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgY2hhciAqdmFsdWVMaXN0ID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBjaGFyICpwYXJhbUxpc3QgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGlmIChDT01QQVJFX1NUUklORyh0eXBlLCBCTEFDS0xJU1RfQllfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IE5hbWUgZnJvbSBWYWx1ZSBsaXN0Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+ZmllbGRUeXBlID0gQkxfVFlQRV9OQU1FOwotICAgICAgICAgICAgICAgIG5ld2VsZW0tPnZhbHVlID0gKGNoYXIgKiljYWxsb2MoMSwgc3RybGVuKHZhbHVlTGlzdCkpOwotICAgICAgICAgICAgICAgIGlmIChuZXdlbGVtLT52YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZUxpc3QrKzsgIC8vIFNraXAgb3BlbiBxdW90ZQotICAgICAgICAgICAgICAgIHN0cm5jcHkobmV3ZWxlbS0+dmFsdWUsIHZhbHVlTGlzdCwgc3RybGVuKHZhbHVlTGlzdCkgLSAxKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCBTY28gU2V0dGluZ3MgZnJvbSBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBzdHJ0b2socGFyYW1MaXN0LCAiOyIpOwotICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjb1R5cGVzID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGFyYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY287Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVswXSA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgJj0gfnNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgfD0gc2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtWzBdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyA9IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgU0NPIHR5cGUgbXVzdCBiZSA9LCArIG9yIC0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IHN0cnRvayhOVUxMLCAiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdlbGVtLT5zY29UeXBlID0gc2NvVHlwZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gU0NPIHR5cGUgZW50cnkgaW4gQmxhY2tsaXN0IGZpbGUiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdC0+bmV4dCA9IG5ld2VsZW07Ci0gICAgICAgICAgICAgICAgbGlzdCA9IG5ld2VsZW07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IGxpc3QgPSBuZXdlbGVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HSSgiRW50cnkgbmFtZSA9ICVzIFNjb1R5cGVzID0gMHgleCIsIG5ld2VsZW0tPnZhbHVlLAotICAgICAgICAgICAgICAgICBuZXdlbGVtLT5zY29UeXBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybjsKLX0KLXN0YXRpYyB1aW50MTZfdCBnZXRTY29UeXBlKGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICB1aW50MTZfdCByZXQgPSAwOwotICAgIHNjb0JsYWNrbGlzdF90ICpsaXN0ID0gYmxhY2tsaXN0OwotCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotICAgICAgICBpZiAobGlzdC0+ZmllbGRUeXBlID09IEJMX1RZUEVfTkFNRSkgewotICAgICAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKG5hbWUsIGxpc3QtPnZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGxpc3QtPnNjb1R5cGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICAgIExPR0koIiVzICVzIC0gMHgleCIsICBfX0ZVTkNUSU9OX18sIG5hbWUsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eikgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIGlmIChlbnYtPkdldEphdmFWTSgmanZtKSA8IDApIHsKLSAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCBoYW5kbGUgdG8gdGhlIFZNIik7Ci0gICAgfQotICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZ2V0X2ZpZWxkKGVudiwgY2xhenosICJtTmF0aXZlRGF0YSIsICJJIik7Ci0gICAgbWV0aG9kX29uQWNjZXB0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25BY2NlcHRlZCIsICIoSSlWIik7Ci0gICAgbWV0aG9kX29uQ29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29ubmVjdGVkIiwgIihJKVYiKTsKLSAgICBtZXRob2Rfb25DbG9zZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25DbG9zZWQiLCAiKClWIik7Ci0KLSAgICAvKiBSZWFkIHRoZSBibGFja2xpc3QgZmlsZSBpbiBoZXJlICovCi0gICAgcGFyc2VCbGFja2xpc3QoKTsKLSNlbmRpZgotfQotCi0vKiBSZXR1cm5zIGZhbHNlIGlmIGEgc2VyaW91cyBlcnJvciBvY2N1cmVkICovCi1zdGF0aWMgamJvb2xlYW4gaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLQotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopIGNhbGxvYygxLCBzaXplb2YobmF0aXZlX2RhdGFfdCkpOwotICAgIGlmIChuYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbmF0LT5tdXRleCwgTlVMTCk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkX21OYXRpdmVEYXRhLCAoamludCluYXQpOwotICAgIG5hdC0+c2lnbmFsX3NrID0gLTE7Ci0gICAgbmF0LT5vYmplY3QgPSBOVUxMOwotICAgIG5hdC0+dGhyZWFkX2RhdGEgPSBOVUxMOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICAKLSAgICBjbG9zZU5hdGl2ZShlbnYsIG9iamVjdCk7Ci0gICAgCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT50aHJlYWRfZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG5hdC0+dGhyZWFkX2RhdGEtPm5hdCA9IE5VTEw7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm5hdC0+bXV0ZXgpOwotCi0gICAgZnJlZShuYXQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBqYm9vbGVhbiBhY2NlcHROYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3Nrc1syXTsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIHN0cnVjdCB0aHJlYWRfZGF0YV90ICpkYXRhID0gTlVMTDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+c2lnbmFsX3NrICE9IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBzZXR1cCBzb2NrZXRwYWlyIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiB0aHJlYWRzCi0gICAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNpZ25hbF9za3MpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0cGFpcigpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzBdOwotICAgIG5hdC0+b2JqZWN0ID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLQotICAgIGRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YodGhyZWFkX2RhdGFfdCkpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+dGhyZWFkX2RhdGEgPSBkYXRhOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGRhdGEtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMV07Ci0gICAgZGF0YS0+bmF0ID0gbmF0OwotICAgIGRhdGEtPmlzX2FjY2VwdCA9IHRydWU7Ci0KLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgJndvcmtfdGhyZWFkLCAodm9pZCAqKWRhdGEpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBjb25uZWN0TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBhZGRyZXNzLAotICAgICAgICBqc3RyaW5nIG5hbWUpIHsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9za3NbMl07Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfdCAqZGF0YTsKLSAgICBjb25zdCBjaGFyICpjX2FkZHJlc3M7Ci0gICAgY29uc3QgY2hhciAqY19uYW1lOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT5zaWduYWxfc2sgIT0gLTEpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIHNldHVwIHNvY2tldHBhaXIgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHRocmVhZHMKLSAgICBpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2lnbmFsX3NrcykgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXRwYWlyKCkgZmFpbGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1swXTsKLSAgICBuYXQtPm9iamVjdCA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCk7Ci0KLSAgICBkYXRhID0gKHRocmVhZF9kYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHRocmVhZF9kYXRhX3QpKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBkYXRhLT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzFdOwotICAgIGRhdGEtPm5hdCA9IG5hdDsKLSAgICBjX2FkZHJlc3MgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIE5VTEwpOwotICAgIHN0cmxjcHkoZGF0YS0+YWRkcmVzcywgY19hZGRyZXNzLCBCVEFERFJfU0laRSk7Ci0gICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYWRkcmVzcywgY19hZGRyZXNzKTsKLSAgICBkYXRhLT5pc19hY2NlcHQgPSBmYWxzZTsKLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IE51bGwgcG9pbnRlciBwYXNzZWQgaW4gZm9yIGRldmljZSBuYW1lIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGF0YS0+c2NvX3BrdF90eXBlID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBjX25hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgICAgICAvKiBTZWUgaWYgdGhpcyBkZXZpY2UgaXMgaW4gdGhlIGJsYWNrIGxpc3QgKi8KLSAgICAgICAgZGF0YS0+c2NvX3BrdF90eXBlID0gZ2V0U2NvVHlwZShkYXRhLT5hZGRyZXNzLCBjX25hbWUpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBjX25hbWUpOwotICAgIH0KLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgJndvcmtfdGhyZWFkLCAodm9pZCAqKWRhdGEpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9zazsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgc2lnbmFsX3NrID0gbmF0LT5zaWduYWxfc2s7Ci0gICAgbmF0LT5zaWduYWxfc2sgPSAtMTsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihuYXQtPm9iamVjdCk7Ci0gICAgbmF0LT5vYmplY3QgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGlmIChzaWduYWxfc2sgPj0gMCkgewotICAgICAgICBMT0dWKCIlczogc2lnbmFsX3NrID0gJWQiLCBfX0ZVTkNUSU9OX18sIHNpZ25hbF9zayk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZHVtbXk7Ci0gICAgICAgIHdyaXRlKHNpZ25hbF9zaywgJmR1bW15LCBzaXplb2YoZHVtbXkpKTsKLSAgICAgICAgY2xvc2Uoc2lnbmFsX3NrKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0vKiB0aHJlYWQgZW50cnkgcG9pbnQgKi8KLXN0YXRpYyB2b2lkICp3b3JrX3RocmVhZCh2b2lkICphcmcpIHsKLSAgICBKTklFbnYqIGVudjsKLSAgICB0aHJlYWRfZGF0YV90ICpkYXRhID0gKHRocmVhZF9kYXRhX3QgKilhcmc7Ci0gICAgaW50IHNrOwotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIGlmIChqdm0tPkF0dGFjaEN1cnJlbnRUaHJlYWQoJmVudiwgTlVMTCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIExPR0UoIiVzOiBBdHRhY2hDdXJyZW50VGhyZWFkKCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogY29ubmVjdCB0aGUgU0NPIHNvY2tldCAqLwotICAgIGlmIChkYXRhLT5pc19hY2NlcHQpIHsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCBBQ0NFUFQgIyMjIyMiLCBkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgICAgIHNrID0gYWNjZXB0X3dvcmsoZGF0YS0+c2lnbmFsX3NrKTsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCBFTkQgQUNDRVBUICoqKioqIiwgZGF0YS0+bmF0LT5vYmplY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrID0gY29ubmVjdF93b3JrKGRhdGEtPmFkZHJlc3MsIGRhdGEtPnNjb19wa3RfdHlwZSk7Ci0gICAgfQotCi0gICAgLyogY2FsbGJhY2sgd2l0aCBjb25uZWN0aW9uIHJlc3VsdCAqLwotICAgIGlmIChkYXRhLT5uYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogb2JqZWN0IGRlc3Ryb3llZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgaWYgKGRhdGEtPm5hdC0+b2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgICAgICBMT0dWKCIlczogY2FsbGJhY2sgY2FuY2VsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBpZiAoZGF0YS0+aXNfYWNjZXB0KSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkFjY2VwdGVkLCBzayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQ29ubmVjdGVkLCBzayk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLQotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgJWQgQ09OTkVDVEVEICsrKyAoJXMpIiwgZGF0YS0+bmF0LT5vYmplY3QsIHNrLAotICAgICAgICAgZGF0YS0+aXNfYWNjZXB0ID8gImluIiA6ICJvdXQiKTsKLQotICAgIC8qIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gY2xvc2UgKi8KLSAgICBMT0dWKCJ3YWl0X2Zvcl9jbG9zZSgpLi4uIik7Ci0gICAgd2FpdF9mb3JfY2xvc2Uoc2ssIGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgTE9HVigid2FpdF9mb3JfY2xvc2UoKSByZXR1cm5lZCIpOwotCi0gICAgLyogY2FsbGJhY2sgd2l0aCBjbG9zZSByZXN1bHQgKi8KLSAgICBpZiAoZGF0YS0+bmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IG9iamVjdCBkZXN0cm95ZWQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIGlmIChkYXRhLT5uYXQtPm9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBjYWxsYmFjayBjYW5jZWxsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkNsb3NlZCk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLQotZG9uZToKLSAgICBpZiAoc2sgPj0gMCkgewotICAgICAgICBjbG9zZShzayk7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgJWQgQ0xPU0VEIC0tLSAoJXMpIiwgZGF0YS0+bmF0LT5vYmplY3QsIHNrLCBkYXRhLT5pc19hY2NlcHQgPyAiaW4iIDogIm91dCIpOwotICAgIH0KLSAgICBpZiAoZGF0YS0+c2lnbmFsX3NrID49IDApIHsKLSAgICAgICAgY2xvc2UoZGF0YS0+c2lnbmFsX3NrKTsKLSAgICB9Ci0gICAgTE9HVigiU0NPIHNvY2tldCBjbG9zZWQiKTsKLQotICAgIGlmIChkYXRhLT5uYXQgIT0gTlVMTCkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgICAgIGRhdGEtPm5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICAgICAgZGF0YS0+bmF0LT50aHJlYWRfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICB9Ci0KLSAgICBmcmVlKGRhdGEpOwotICAgIGlmIChqdm0tPkRldGFjaEN1cnJlbnRUaHJlYWQoKSAhPSBKTklfT0spIHsKLSAgICAgICAgTE9HRSgiJXM6IERldGFjaEN1cnJlbnRUaHJlYWQoKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIExPR1YoIndvcmtfdGhyZWFkKCkgZG9uZSIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGFjY2VwdF93b3JrKGludCBzaWduYWxfc2spIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgaW50IHNrOwotICAgIGludCBuc2s7Ci0gICAgaW50IGFkZHJfc3o7Ci0gICAgaW50IG1heF9mZDsKLSAgICBmZF9zZXQgZmRzOwotICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gYWRkcjsKLQotICAgIHNrID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fU0NPKTsKLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzIHNvY2tldCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIG1lbWNweSgmYWRkci5zY29fYmRhZGRyLCBCREFERFJfQU5ZLCBzaXplb2YoYmRhZGRyX3QpKTsKLSAgICBpZiAoYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXMgYmluZCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKGxpc3RlbihzaywgMSkpIHsKLSAgICAgICAgTE9HRSgiJXM6IGxpc3RlbigpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHJfc3ogPSBzaXplb2YoYWRkcik7Ci0KLSAgICBGRF9aRVJPKCZmZHMpOwotICAgIEZEX1NFVChzaywgJmZkcyk7Ci0gICAgRkRfU0VUKHNpZ25hbF9zaywgJmZkcyk7Ci0KLSAgICBtYXhfZmQgPSAoc2sgPiBzaWduYWxfc2spID8gc2sgOiBzaWduYWxfc2s7Ci0gICAgTE9HSSgiTGlzdGVuaW5nIFNDTyBzb2NrZXQuLi4iKTsKLSAgICB3aGlsZSAoc2VsZWN0KG1heF9mZCArIDEsICZmZHMsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBzZWxlY3QoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogc2VsZWN0KCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgTE9HVigic2VsZWN0KCkgcmV0dXJuZWQiKTsKLSAgICBpZiAoRkRfSVNTRVQoc2lnbmFsX3NrLCAmZmRzKSkgewotICAgICAgICAvLyBzaWduYWwgdG8gY2FuY2VsIGxpc3RlbmluZwotICAgICAgICBMT0dWKCJjYW5jZWxsZWQgbGlzdGVuaW5nIHNvY2tldCwgY2xvc2luZyIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBpZiAoIUZEX0lTU0VUKHNrLCAmZmRzKSkgewotICAgICAgICBMT0dFKCJlcnJvcjogc2VsZWN0KCkgcmV0dXJuZWQgPj0gMCB3aXRoIG5vIGZkcyBzZXQiKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBuc2sgPSBhY2NlcHQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJfc3opOwotICAgIGlmIChuc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBhY2NlcHQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBMT0dJKCJDb25uZWN0ZWQgU0NPIHNvY2tldCAoaW5jb21pbmcpIik7Ci0gICAgY2xvc2Uoc2spOyAgLy8gVGhlIGxpc3RlbmluZyBzb2NrZXQKLQotICAgIHJldHVybiBuc2s7Ci0KLWVycm9yOgotICAgIGNsb3NlKHNrKTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBjb25uZWN0X3dvcmsoY29uc3QgY2hhciAqYWRkcmVzcywgdWludDE2X3Qgc2NvX3BrdF90eXBlKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gYWRkcjsKLSAgICBpbnQgc2sgPSAtMTsKLQotICAgIHNrID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fU0NPKTsKLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogQmluZCB0byBsb2NhbCBhZGRyZXNzICovCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBtZW1jcHkoJmFkZHIuc2NvX2JkYWRkciwgQkRBRERSX0FOWSwgc2l6ZW9mKGJkYWRkcl90KSk7Ci0gICAgaWYgKGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBiaW5kKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIGdldF9iZGFkZHIoYWRkcmVzcywgJmFkZHIuc2NvX2JkYWRkcik7Ci0gICAgYWRkci5zY29fcGt0X3R5cGUgPSBzY29fcGt0X3R5cGU7Ci0gICAgTE9HSSgiQ29ubmVjdGluZyB0byBzb2NrZXQiKTsKLSAgICB3aGlsZSAoY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBjb25uZWN0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IGNvbm5lY3QoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLSAgICBMT0dJKCJTQ08gc29ja2V0IGNvbm5lY3RlZCAob3V0Z29pbmcpIik7Ci0KLSAgICByZXR1cm4gc2s7Ci0KLWVycm9yOgotICAgIGlmIChzayA+PSAwKSBjbG9zZShzayk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9jbG9zZShpbnQgc2ssIGludCBzaWduYWxfc2spIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgcG9sbGZkIHBbMl07Ci0KLSAgICBtZW1zZXQocCwgMCwgMiAqIHNpemVvZihwb2xsZmQpKTsKLSAgICBwWzBdLmZkID0gc2s7Ci0gICAgcFsxXS5mZCA9IHNpZ25hbF9zazsKLSAgICBwWzFdLmV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkk7Ci0KLSAgICBMT0dWKCJwb2xsLi4uIik7Ci0KLSAgICB3aGlsZSAocG9sbChwLCAyLCAtMSkgPCAwKSB7ICAvLyBibG9ja3MKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogcG9sbCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogcG9sbCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgTE9HVigicG9sbCgpIHJldHVybmVkIik7Ci19Ci0jZW5kaWYKLQotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewotICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LAotICAgIHsiaW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWluaXROYXRpdmV9LAotICAgIHsiZGVzdHJveU5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWRlc3Ryb3lOYXRpdmV9LAotICAgIHsiY29ubmVjdE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWNvbm5lY3ROYXRpdmV9LAotICAgIHsiYWNjZXB0TmF0aXZlIiwgIigpWiIsICh2b2lkICopYWNjZXB0TmF0aXZlfSwKLSAgICB7ImNsb3NlTmF0aXZlIiwgIigpViIsICh2b2lkICopY2xvc2VOYXRpdmV9LAotfTsKLQotaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldChKTklFbnYgKmVudikgewotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKLSAgICAgICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQiLCBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKaW5kZXggNDNjM2E5NS4uYTM4ZDNiMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCkBAIC02OSw2ICs2OSwxMCBAQAogICAgIHsiVVVJRHMiLCBEQlVTX1RZUEVfQVJSQVl9LAogfTsKIAorc3RhdGljIFByb3BlcnRpZXMgaW5wdXRfcHJvcGVydGllc1tdID0geworICAgIHsiQ29ubmVjdGVkIiwgREJVU19UWVBFX0JPT0xFQU59LAorfTsKKwogdHlwZWRlZiB1bmlvbiB7CiAgICAgY2hhciAqc3RyX3ZhbDsKICAgICBpbnQgaW50X3ZhbDsKQEAgLTY5OSw2ICs3MDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwogfQogCitqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZywgKFByb3BlcnRpZXMgKikgJmlucHV0X3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKIGpvYmplY3RBcnJheSBwYXJzZV9hZGFwdGVyX3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcikgewogICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0aWVzKGVudiwgaXRlciwgKFByb3BlcnRpZXMgKikgJmFkYXB0ZXJfcHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWRhcHRlcl9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CkBAIC03MDksNiArNzE4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKIH0KIAoram9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcikgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0aWVzKGVudiwgaXRlciwgKFByb3BlcnRpZXMgKikgJmlucHV0X3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKSB7CiAgICAgY2hhciAqZCA9ICgoY2hhciAqKWJhKSArIDUsICplbmRwOwogICAgIGludCBpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmggYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaAppbmRleCAzNzhiYjZmLi4yN2EwMGFlIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaApAQCAtMTYyLDYgKzE2Miw4IEBACiBqb2JqZWN0QXJyYXkgcGFyc2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOwogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIGpvYmplY3RBcnJheSBwYXJzZV9hZGFwdGVyX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOwogdm9pZCBhcHBlbmRfdmFyaWFudChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCB0eXBlLCB2b2lkICp2YWwpOwogaW50IGdldF9iZGFkZHIoY29uc3QgY2hhciAqc3RyLCBiZGFkZHJfdCAqYmEpOwogdm9pZCBnZXRfYmRhZGRyX2FzX3N0cmluZyhjb25zdCBiZGFkZHJfdCAqYmEsIGNoYXIgKnN0cik7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKaW5kZXggOTE0NDliYy4uMDQwZGFjMyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiYW5kcm9pZF91dGlsX0JpbmRlci5oIgogCkBAIC0yMjUsNzAgKzIyNSw2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc0Jsb2JfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgYmxvYiBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9CTE9CIHx8IGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9OVUxMOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNTdHJpbmdfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgc3RyaW5nIG9yIG51bGwgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX1NUUklORyB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYW4gaW50ZWdlciBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfSU5URUdFUjsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzRmxvYXRfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgZmxvYXQgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0ZMT0FUOwotfQotCiBzdGF0aWMganN0cmluZyBnZXRTdHJpbmdfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQogewogICAgIGludDMyX3QgZXJyOwpAQCAtNDg3LDEwICs0MjMsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIGpib29sZWFuIGlzTnVsbF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCitib29sIGlzTnVsbF9uYXRpdmUoQ3Vyc29yV2luZG93ICp3aW5kb3csIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGZvciBOVUxMIGF0ICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKKyAgICBMT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CiAKICAgICBib29sIGlzTnVsbDsKICAgICBpZiAod2luZG93LT5nZXROdWxsKHJvdywgY29sdW1uLCAmaXNOdWxsKSkgewpAQCAtNjUyLDYgKzU4NywyNiBAQAogICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKIH0KIAorc3RhdGljIGppbnQgZ2V0VHlwZV9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCit7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7CisgICAgTE9HX1dJTkRPVygicmV0dXJuaW5nIGNvbHVtbiB0eXBlIGFmZmluaXR5IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisKKyAgICBpZiAoaXNOdWxsX25hdGl2ZSh3aW5kb3csIHJvdywgY29sdW1uKSkgeworICAgICAgcmV0dXJuIEZJRUxEX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgICBmaWVsZF9zbG90X3QgZmllbGQ7CisgICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGZpZWxkLnR5cGU7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwpAQCAtNjYyLDExICs2MTcsOSBAQAogICAgIHsiY2xvc2VfbmF0aXZlIiwgIigpViIsICh2b2lkICopbmF0aXZlX2Nsb3NlfSwKICAgICB7ImdldExvbmdfbmF0aXZlIiwgIihJSSlKIiwgKHZvaWQgKilnZXRMb25nX25hdGl2ZX0sCiAgICAgeyJnZXRCbG9iX25hdGl2ZSIsICIoSUkpW0IiLCAodm9pZCAqKWdldEJsb2JfbmF0aXZlfSwKLSAgICB7ImlzQmxvYl9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzQmxvYl9uYXRpdmV9LAogICAgIHsiZ2V0U3RyaW5nX25hdGl2ZSIsICIoSUkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKilnZXRTdHJpbmdfbmF0aXZlfSwKICAgICB7ImNvcHlTdHJpbmdUb0J1ZmZlcl9uYXRpdmUiLCAiKElJSUxhbmRyb2lkL2RhdGFiYXNlL0NoYXJBcnJheUJ1ZmZlcjspW0MiLCAodm9pZCAqKWNvcHlTdHJpbmdUb0J1ZmZlcl9uYXRpdmV9LAogICAgIHsiZ2V0RG91YmxlX25hdGl2ZSIsICIoSUkpRCIsICh2b2lkICopZ2V0RG91YmxlX25hdGl2ZX0sCi0gICAgeyJpc051bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc051bGxfbmF0aXZlfSwKICAgICB7ImdldE51bVJvd3NfbmF0aXZlIiwgIigpSSIsICh2b2lkICopZ2V0TnVtUm93c30sCiAgICAgeyJzZXROdW1Db2x1bW5zX25hdGl2ZSIsICIoSSlaIiwgKHZvaWQgKilzZXROdW1Db2x1bW5zfSwKICAgICB7ImFsbG9jUm93X25hdGl2ZSIsICIoKVoiLCAodm9pZCAqKWFsbG9jUm93fSwKQEAgLTY3Niw5ICs2MjksNyBAQAogICAgIHsicHV0RG91YmxlX25hdGl2ZSIsICIoRElJKVoiLCAodm9pZCAqKXB1dERvdWJsZV9uYXRpdmV9LAogICAgIHsiZnJlZUxhc3RSb3dfbmF0aXZlIiwgIigpViIsICh2b2lkICopZnJlZUxhc3RSb3d9LAogICAgIHsicHV0TnVsbF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKXB1dE51bGxfbmF0aXZlfSwKLSAgICB7ImlzU3RyaW5nX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNTdHJpbmdfbmF0aXZlfSwKLSAgICB7ImlzRmxvYXRfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Zsb2F0X25hdGl2ZX0sCi0gICAgeyJpc0ludGVnZXJfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0ludGVnZXJfbmF0aXZlfSwKKyAgICB7ImdldFR5cGVfbmF0aXZlIiwgIihJSSlJIiwgKHZvaWQgKilnZXRUeXBlX25hdGl2ZX0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsLmNwcAppbmRleCA4ZDFjMzllZS4uZGU0YzVjOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKQEAgLTkxLDIyICs5MSwxMSBAQAogICAgIGNvbXBpbGUoZW52LCBvYmplY3QsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCBzcWxTdHJpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIGludCBlcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7Ci0KLSAgICBpZiAoc3RhdGVtZW50ICE9IE5VTEwpIHsKLSAgICAgICAgc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotICAgICAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZ1N0YXRlbWVudEZpZWxkLCAwKTsKLSAgICB9Ci19CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsibmF0aXZlX2NvbXBpbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfY29tcGlsZX0sCi0gICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAppbmRleCAzNjIzNGE5Li40YjNmMWMwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkRhdGFiYXNlIgorI2RlZmluZSBMT0dfVEFHICJTcWxpdGVEYXRhYmFzZUNwcCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTYyLDkgKzYyLDExIEBACiB9OwogCiBzdGF0aWMgamZpZWxkSUQgb2Zmc2V0X2RiX2hhbmRsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjazsKK3N0YXRpYyBqY2xhc3Mgc3RyaW5nX2NsYXNzID0gTlVMTDsKIAotc3RhdGljIGNoYXIgKmNyZWF0ZVN0cihjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKK3N0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCwgc2hvcnQgZXh0cmEpIHsKKyAgICBpbnQgbGVuID0gc3RybGVuKHBhdGgpICsgZXh0cmE7CiAgICAgY2hhciAqc3RyID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7CiAgICAgc3RybmNweShzdHIsIHBhdGgsIGxlbik7CiAgICAgc3RyW2xlbl0gPSBOVUxMOwpAQCAtODUsNyArODcsNyBAQAogICAgIH0KIAogICAgIExPR1YoIlJlZ2lzdGVyaW5nIHNxbGl0ZSBsb2dnaW5nIGZ1bmMgXG4iKTsKLSAgICBpbnQgZXJyID0gc3FsaXRlM19jb25maWcoU1FMSVRFX0NPTkZJR19MT0csICZzcWxMb2dnZXIsICh2b2lkICopY3JlYXRlU3RyKHBhdGgpKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jb25maWcoU1FMSVRFX0NPTkZJR19MT0csICZzcWxMb2dnZXIsICh2b2lkICopY3JlYXRlU3RyKHBhdGgsIDApKTsKICAgICBpZiAoZXJyICE9IFNRTElURV9PSykgewogICAgICAgICBMT0dFKCJzcWxpdGVfY29uZmlnIGZhaWxlZCBlcnJvcl9jb2RlID0gJWQuIFRISVMgU0hPVUxEIE5FVkVSIG9jY3VyLlxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTc2LDEzICsxNzgsMTcgQEAKICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHNxbGl0ZTNfY2xvc2UoaGFuZGxlKTsKIH0KIAotc3RhdGljIGNoYXIgKmdldERhdGFiYXNlTmFtZShKTklFbnYqIGVudiwgc3FsaXRlMyAqIGhhbmRsZSwganN0cmluZyBkYXRhYmFzZU5hbWUpIHsKK3N0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBzaG9ydCBjb25uTnVtKSB7CiAgICAgY2hhciBjb25zdCAqcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZGF0YWJhc2VOYW1lLCBOVUxMKTsKICAgICBpZiAocGF0aCA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIkZhaWx1cmUgaW4gZ2V0RGF0YWJhc2VOYW1lKCkuIFZNIHJhbiBvdXQgb2YgbWVtb3J5P1xuIik7CiAgICAgICAgIHJldHVybiBOVUxMOyAvLyBWTSB3b3VsZCBoYXZlIHRocm93biBPdXRPZk1lbW9yeUVycm9yCiAgICAgfQotICAgIGNoYXIgKmRiTmFtZVN0ciA9IGNyZWF0ZVN0cihwYXRoKTsKKyAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCwgNCk7CisgICAgaWYgKGNvbm5OdW0gPiA5OTkpIHsgLy8gVE9ETzogaWYgbnVtYmVyIG9mIHBvb2xlZCBjb25uZWN0aW9ucyA+IDk5OSwgZml4IHRoaXMgbGluZS4KKyAgICAgIGNvbm5OdW0gPSAtMTsKKyAgICB9CisgICAgc3ByaW50ZihkYk5hbWVTdHIgKyBzdHJsZW4ocGF0aCksICJ8JTAzZCIsIGNvbm5OdW0pOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgcGF0aCk7CiAgICAgcmV0dXJuIGRiTmFtZVN0cjsKIH0KQEAgLTE5MiwxMCArMTk4LDEwIEBACiB9CiAKIC8qIHB1YmxpYyBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKCk7ICovCi1zdGF0aWMgdm9pZCBlbmFibGVTcWxUcmFjaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxUcmFjaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUsIGpzaG9ydCBjb25uVHlwZSkKIHsKICAgICBzcWxpdGUzICogaGFuZGxlID0gKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgb2Zmc2V0X2RiX2hhbmRsZSk7Ci0gICAgc3FsaXRlM190cmFjZShoYW5kbGUsICZzcWxUcmFjZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUsIGNvbm5UeXBlKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNxbFByb2ZpbGUodm9pZCAqZGF0YWJhc2VOYW1lLCBjb25zdCBjaGFyICpzcWwsIHNxbGl0ZTNfdWludDY0IHRtKSB7CkBAIC0yMDQsMTMgKzIxMCwxMyBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKCk7ICovCi1zdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSkKK3N0YXRpYyB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lKSk7CisgICAgc3FsaXRlM19wcm9maWxlKGhhbmRsZSwgJnNxbFByb2ZpbGUsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUsCisgICAgICAgICAgICBjb25uVHlwZSkpOwogfQogCi0KIC8qIHB1YmxpYyBuYXRpdmUgdm9pZCBjbG9zZSgpOyAqLwogc3RhdGljIHZvaWQgZGJjbG9zZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC0yNDAsNzMgKzI0Niw2IEBACiAgICAgfQogfQogCi0vKiBwdWJsaWMgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoU3RyaW5nIHNxbCk7ICovCi1zdGF0aWMgdm9pZCBuYXRpdmVfZXhlY1NRTChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgc3FsU3RyaW5nKQotewotICAgIGludCBlcnI7Ci0gICAgaW50IHN0ZXBFcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gTlVMTDsKLSAgICBzcWxpdGUzICogaGFuZGxlID0gKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgb2Zmc2V0X2RiX2hhbmRsZSk7Ci0gICAgamNoYXIgY29uc3QgKiBzcWwgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAganNpemUgc3FsTGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3FsU3RyaW5nKTsKLQotICAgIGlmIChzcWwgPT0gTlVMTCB8fCBzcWxMZW4gPT0gMCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIllvdSBtdXN0IHN1cHBseSBhbiBTUUwgc3RyaW5nIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBlcnIgPSBzcWxpdGUzX3ByZXBhcmUxNl92MihoYW5kbGUsIHNxbCwgc3FsTGVuICogMiwgJnN0YXRlbWVudCwgTlVMTCk7Ci0KLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhzcWxTdHJpbmcsIHNxbCk7Ci0KLSAgICBpZiAoZXJyICE9IFNRTElURV9PSykgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gcHJlcGFyaW5nICclcycuXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZXBFcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKLSAgICBlcnIgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7Ci0KLSAgICBpZiAoc3RlcEVyciAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICBpZiAoc3RlcEVyciA9PSBTUUxJVEVfUk9XKSB7Ci0gICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsICJRdWVyaWVzIGNhbm5vdCBiZSBwZXJmb3JtZWQgdXNpbmcgZXhlY1NRTCgpLCB1c2UgcXVlcnkoKSBpbnN0ZWFkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBleGVjdXRpbmcgJyVzJ1xuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKLQotICAgICAgICB9Ci0gICAgfSBlbHNlCi0jaWZuZGVmIERCX0xPR19TVEFURU1FTlRTCi0gICAgSUZfTE9HVigpCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICBMT0dWKCJTdWNjZXNzIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgfQotfQotCi0vKiBuYXRpdmUgbG9uZyBsYXN0SW5zZXJ0Um93KCk7ICovCi1zdGF0aWMgamxvbmcgbGFzdEluc2VydFJvdyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCi17Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotCi0gICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoaGFuZGxlKTsKLX0KLQotLyogbmF0aXZlIGludCBsYXN0Q2hhbmdlQ291bnQoKTsgKi8KLXN0YXRpYyBqaW50IGxhc3RDaGFuZ2VDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCi17Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotCi0gICAgcmV0dXJuIHNxbGl0ZTNfY2hhbmdlcyhoYW5kbGUpOwotfQotCiAvKiBuYXRpdmUgaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOyAqLwogc3RhdGljIGppbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKIHsKQEAgLTQ0MywxOSArMzgyLDkzIEBACiAgICAgcmV0dXJuIHNxbGl0ZTNfcmVsZWFzZV9tZW1vcnkoU1FMSVRFX1NPRlRfSEVBUF9MSU1JVCk7CiB9CiAKK3N0YXRpYyB2b2lkIG5hdGl2ZV9maW5hbGl6ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgc3RhdGVtZW50SWQpCit7CisgICAgaWYgKHN0YXRlbWVudElkID4gMCkgeworICAgICAgICBzcWxpdGUzX2ZpbmFsaXplKChzcWxpdGUzX3N0bXQgKilzdGF0ZW1lbnRJZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUgKiogYXJndikgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGlmICghZW52KSB7CisgICAgICAgIExPR0UoImN1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayBjYW5ub3QgY2FsbCBpbnRvIEphdmEgb24gdGhpcyB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBnZXQgZ2xvYmFsIHJlZiB0byBDdXN0b21GdW5jdGlvbiBvYmplY3QgZnJvbSBvdXIgdXNlciBkYXRhCisgICAgam9iamVjdCBmdW5jdGlvbiA9IChqb2JqZWN0KXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOworCisgICAgLy8gcGFjayB1cCB0aGUgYXJndW1lbnRzIGludG8gYSBzdHJpbmcgYXJyYXkKKyAgICBpZiAoIXN0cmluZ19jbGFzcykKKyAgICAgICAgc3RyaW5nX2NsYXNzID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZihlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpKTsKKyAgICBqb2JqZWN0QXJyYXkgc3RyQXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KGFyZ2MsIHN0cmluZ19jbGFzcywgTlVMTCk7CisgICAgaWYgKCFzdHJBcnJheSkKKyAgICAgICAgZ290byBkb25lOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNoYXIqIGFyZyA9IChjaGFyICopc3FsaXRlM192YWx1ZV90ZXh0KGFyZ3ZbaV0pOworICAgICAgICBpZiAoIWFyZykgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBhcmd1bWVudCBpbiBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2suICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdTdHJpbmdVVEYoYXJnKTsKKyAgICAgICAgaWYgKCFvYmopCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHN0ckFycmF5LCBpLCBvYmopOworICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7CisgICAgfQorCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChmdW5jdGlvbiwgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjaywgc3RyQXJyYXkpOworCitkb25lOgorICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY3VzdG9tIHNxbGl0ZTMgZnVuY3Rpb24uIik7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworc3RhdGljIGppbnQgbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAganN0cmluZyBuYW1lLCBqaW50IG51bUFyZ3MsIGpvYmplY3QgZnVuY3Rpb24pCit7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOworICAgIGNoYXIgY29uc3QgKm5hbWVTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOworICAgIGpvYmplY3QgcmVmID0gZW52LT5OZXdHbG9iYWxSZWYoZnVuY3Rpb24pOworICAgIExPR0QoIm5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiAlcyByZWY6ICVwIiwgbmFtZVN0ciwgcmVmKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oaGFuZGxlLCBuYW1lU3RyLCBudW1BcmdzLCBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICh2b2lkICopcmVmLCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG5hbWVTdHIpOworCisgICAgaWYgKGVyciA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiAoaW50KXJlZjsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgic3FsaXRlM19jcmVhdGVfZnVuY3Rpb24gcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihyZWYpOworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAwOworICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJlZikKK3sKKyAgICBMT0dEKCJuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uICVkIiwgcmVmKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZigoam9iamVjdClyZWYpOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsiZGJvcGVuIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKWRib3Blbn0sCiAgICAgeyJkYmNsb3NlIiwgIigpViIsICh2b2lkICopZGJjbG9zZX0sCi0gICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopZW5hYmxlU3FsVHJhY2luZ30sCi0gICAgeyJlbmFibGVTcWxQcm9maWxpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxQcm9maWxpbmd9LAotICAgIHsibmF0aXZlX2V4ZWNTUUwiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfZXhlY1NRTH0sCi0gICAgeyJsYXN0SW5zZXJ0Um93IiwgIigpSiIsICh2b2lkICopbGFzdEluc2VydFJvd30sCi0gICAgeyJsYXN0Q2hhbmdlQ291bnQiLCAiKClJIiwgKHZvaWQgKilsYXN0Q2hhbmdlQ291bnR9LAorICAgIHsiZW5hYmxlU3FsVHJhY2luZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7UylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKKyAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7UylWIiwgKHZvaWQgKillbmFibGVTcWxQcm9maWxpbmd9LAogICAgIHsibmF0aXZlX3NldExvY2FsZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgKHZvaWQgKiluYXRpdmVfc2V0TG9jYWxlfSwKICAgICB7Im5hdGl2ZV9nZXREYkxvb2thc2lkZSIsICIoKUkiLCAodm9pZCAqKW5hdGl2ZV9nZXREYkxvb2thc2lkZX0sCiAgICAgeyJyZWxlYXNlTWVtb3J5IiwgIigpSSIsICh2b2lkICopbmF0aXZlX3JlbGVhc2VNZW1vcnl9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIihJKVYiLCAodm9pZCAqKW5hdGl2ZV9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lMYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb247KUkiLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbn0sCisgICAgeyJuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uIiwgIihJKVYiLCAodm9pZCAqKW5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb259LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UoSk5JRW52ICplbnYpCkBAIC00NzQsNyArNDg3LDE5IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJjYWxsYmFjayIsICIoW0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgaWYgKG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIG1ldGhvZCBTUUxpdGVEYXRhYmFzZS5DdXN0b21GdW5jdGlvbi5jYWxsYmFja1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsCisgICAgICAgICAgICBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKIH0KIAogLyogdGhyb3cgYSBTUUxpdGVFeGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgYXBwcm9wcmlhdGUgZm9yIHRoZSBlcnJvciBpbiBoYW5kbGUgKi8KQEAgLTUyMyw2ICs1NDgsNyBAQAogICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlza0lPRXhjZXB0aW9uIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICBjYXNlIFNRTElURV9OT1RBREI6IC8vIHRyZWF0ICJ1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdCIgZXJyb3IgYXMgY29ycnVwdGlvbiBhbHNvCiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CkBAIC01NDAsNiArNTY2LDMzIEBACiAgICAgICAgIGNhc2UgU1FMSVRFX01JU1VTRToKICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uIjsKICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1BFUk06CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfQlVTWToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS0VEOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9SRUFET05MWToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DQU5UT1BFTjoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9UT09CSUc6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUkFOR0U6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9OT01FTToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTUlTTUFUQ0g6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRXhjZXB0aW9uIjsKICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCmluZGV4IDQ0MjcxNjgzLi43NDdlZTUwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCmluZGV4IGZmMmVkNWQuLjIyMTJkOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKICovCiAKICN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkN1cnNvciIKKyNkZWZpbmUgTE9HX1RBRyAiU1FMaXRlU3RhdGVtZW50Q3BwIgogCiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8Sk5JSGVscC5oPgpAQCAtNDgsMjIgKzQ4LDQwIEBACiAgICAgICAgIChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIGdIYW5kbGVGaWVsZCkKIAogCi1zdGF0aWMgdm9pZCBuYXRpdmVfZXhlY3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCitzdGF0aWMgamludCBuYXRpdmVfZXhlY3V0ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CiAgICAgaW50IGVycjsKICAgICBzcWxpdGUzICogaGFuZGxlID0gR0VUX0hBTkRMRShlbnYsIG9iamVjdCk7CiAgICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7CisgICAgaW50IG51bUNoYW5nZXMgPSAtMTsKIAogICAgIC8vIEV4ZWN1dGUgdGhlIHN0YXRlbWVudAogICAgIGVyciA9IHNxbGl0ZTNfc3RlcChzdGF0ZW1lbnQpOwogCi0gICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQKLSAgICBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CisgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwKKyAgICAgICAgICAgICAgICAiUXVlcmllcyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIFNRTGl0ZURhdGFiYXNlIHF1ZXJ5IG9yIHJhd1F1ZXJ5IG1ldGhvZHMgb25seS4iKTsKKyAgICB9IGVsc2UgaWYgKGVyciAhPSBTUUxJVEVfRE9ORSkgewogICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbl9lcnJjb2RlKGVudiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBudW1DaGFuZ2VzID0gc3FsaXRlM19jaGFuZ2VzKGhhbmRsZSk7CiAgICAgfQogCi0gICAgLy8gUmVzZXQgdGhlIHN0YXRtZW50IHNvIGl0J3MgcmVhZHkgdG8gdXNlIGFnYWluCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlbWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgogICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKKyAgICByZXR1cm4gbnVtQ2hhbmdlczsKK30KKworc3RhdGljIGpsb25nIG5hdGl2ZV9leGVjdXRlSW5zZXJ0KEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKK3sKKyAgICBzcWxpdGUzICogaGFuZGxlID0gR0VUX0hBTkRMRShlbnYsIG9iamVjdCk7CisgICAgamludCBudW1DaGFuZ2VzID0gbmF0aXZlX2V4ZWN1dGUoZW52LCBvYmplY3QpOworICAgIGlmIChudW1DaGFuZ2VzID4gMCkgeworICAgICAgICByZXR1cm4gc3FsaXRlM19sYXN0X2luc2VydF9yb3dpZChoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBqbG9uZyBuYXRpdmVfMXgxX2xvbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQpAQCAtMTE1LDExICsxMzMsMTEgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLQogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKaW5kZXggNTBkZjlkMy4uM2NkZTlkNiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcApAQCAtMjIsOCArMjIsMjkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG5ldHV0aWxzL2lmYy5oPgotI2luY2x1ZGUgPG5ldHV0aWxzL2RoY3AuaD4KK2V4dGVybiAiQyIgeworaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpOworaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHVpbnQzMl90IGFkZHIpOworaW50IGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBnYXRld2F5KTsKK2ludCBpZmNfZ2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVzZXRfY29ubmVjdGlvbnMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGlwYWRkciwgaW5fYWRkcl90IG5ldG1hc2ssIGluX2FkZHJfdCBnYXRld2F5LCBpbl9hZGRyX3QgZG5zMSwgaW5fYWRkcl90IGRuczIpOworCitpbnQgZGhjcF9kb19yZXF1ZXN0KGNvbnN0IGNoYXIgKmlmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZ2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczEsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMiwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqbGVhc2UpOworaW50IGRoY3Bfc3RvcChjb25zdCBjaGFyICppZm5hbWUpOworaW50IGRoY3BfcmVsZWFzZV9sZWFzZShjb25zdCBjaGFyICppZm5hbWUpOworY2hhciAqZGhjcF9nZXRfZXJybXNnKCk7Cit9CiAKICNkZWZpbmUgTkVUVVRJTFNfUEtHX05BTUUgImFuZHJvaWQvbmV0L05ldHdvcmtVdGlscyIKIApAQCAtMjAxLDEwICsyMjIsMTAgQEAKIAogICAgIHsgImVuYWJsZUludGVyZmFjZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19lbmFibGVJbnRlcmZhY2UgfSwKICAgICB7ICJkaXNhYmxlSW50ZXJmYWNlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2Rpc2FibGVJbnRlcmZhY2UgfSwKLSAgICB7ICJhZGRIb3N0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2FkZEhvc3RSb3V0ZSB9LAorICAgIHsgImFkZEhvc3RSb3V0ZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfYWRkSG9zdFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlSG9zdFJvdXRlcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVIb3N0Um91dGVzIH0sCi0gICAgeyAic2V0RGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19zZXREZWZhdWx0Um91dGUgfSwKLSAgICB7ICJnZXREZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCisgICAgeyAic2V0RGVmYXVsdFJvdXRlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19zZXREZWZhdWx0Um91dGUgfSwKKyAgICB7ICJnZXREZWZhdWx0Um91dGVOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlRGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZURlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlc2V0Q29ubmVjdGlvbnMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVzZXRDb25uZWN0aW9ucyB9LAogICAgIHsgInJ1bkRoY3AiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3J1bkRoY3AgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCmluZGV4IDNmYzBkNTguLmFlYzUzN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcApAQCAtMzAsNiArMzAsMjMgQEAKIAogc3RhdGljIGpib29sZWFuIHNTY2FuTW9kZUFjdGl2ZSA9IGZhbHNlOwogCisvKgorICogVGhlIGZvbGxvd2luZyByZW1lbWJlcnMgdGhlIGpmaWVsZElEJ3Mgb2YgdGhlIGZpZWxkcworICogb2YgdGhlIERoY3BJbmZvIEphdmEgb2JqZWN0LCBzbyB0aGF0IHdlIGRvbid0IGhhdmUKKyAqIHRvIGxvb2sgdGhlbSB1cCBldmVyeSB0aW1lLgorICovCitzdGF0aWMgc3RydWN0IGZpZWxkSWRzIHsKKyAgICBqY2xhc3MgZGhjcEluZm9DbGFzczsKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0b3JJZDsKKyAgICBqZmllbGRJRCBpcGFkZHJlc3M7CisgICAgamZpZWxkSUQgZ2F0ZXdheTsKKyAgICBqZmllbGRJRCBuZXRtYXNrOworICAgIGpmaWVsZElEIGRuczE7CisgICAgamZpZWxkSUQgZG5zMjsKKyAgICBqZmllbGRJRCBzZXJ2ZXJBZGRyZXNzOworICAgIGpmaWVsZElEIGxlYXNlRHVyYXRpb247Cit9IGRoY3BJbmZvRmllbGRJZHM7CisKIHN0YXRpYyBpbnQgZG9Db21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqcmVwbHlidWYsIGludCByZXBseWJ1ZmxlbikKIHsKICAgICBzaXplX3QgcmVwbHlfbGVuID0gcmVwbHlidWZsZW4gLSAxOwpAQCAtODEsNiArOTgsMTEgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2lzRHJpdmVyTG9hZGVkKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQoreworICAgIHJldHVybiAoamJvb2xlYW4pKDo6aXNfd2lmaV9kcml2ZXJfbG9hZGVkKCkgPT0gMSk7Cit9CisKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2xvYWREcml2ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgcmV0dXJuIChqYm9vbGVhbikoOjp3aWZpX2xvYWRfZHJpdmVyKCkgPT0gMCk7CkBAIC00NzYsNiArNDk4LDI4IEBACiAgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoIkJMQUNLTElTVCBjbGVhciIsICJPSyIpOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGluZm8pCit7CisgICAgamludCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2U7CisgICAgamJvb2xlYW4gc3VjY2VlZGVkID0gKChqYm9vbGVhbik6OmRvX2RoY3BfcmVxdWVzdCgmaXBhZGRyLCAmZ2F0ZXdheSwgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRuczEsICZkbnMyLCAmc2VydmVyLCAmbGVhc2UpID09IDApOworICAgIGlmIChzdWNjZWVkZWQgJiYgZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmlwYWRkcmVzcywgaXBhZGRyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmdhdGV3YXksIGdhdGV3YXkpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMubmV0bWFzaywgbWFzayk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQoaW5mbywgZGhjcEluZm9GaWVsZElkcy5kbnMxLCBkbnMxKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmRuczIsIGRuczIpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMuc2VydmVyQWRkcmVzcywgc2VydmVyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmxlYXNlRHVyYXRpb24sIGxlYXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2NlZWRlZDsKK30KKworc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKDo6Z2V0X2RoY3BfZXJyb3Jfc3RyaW5nKCkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qCkBAIC00ODUsNiArNTI5LDcgQEAKICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KIAogICAgIHsgImxvYWREcml2ZXIiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9sb2FkRHJpdmVyIH0sCisgICAgeyAiaXNEcml2ZXJMb2FkZWQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9pc0RyaXZlckxvYWRlZH0sCiAgICAgeyAidW5sb2FkRHJpdmVyIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfdW5sb2FkRHJpdmVyIH0sCiAgICAgeyAic3RhcnRTdXBwbGljYW50IiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfc3RhcnRTdXBwbGljYW50IH0sCiAgICAgeyAic3RvcFN1cHBsaWNhbnQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9zdG9wU3VwcGxpY2FudCB9LApAQCAtNTMyLDYgKzU3Nyw5IEBACiAgICAgeyAic2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQgfSwKICAgICB7ICJhZGRUb0JsYWNrbGlzdENvbW1hbmQiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2FkZFRvQmxhY2tsaXN0Q29tbWFuZCB9LAogICAgIHsgImNsZWFyQmxhY2tsaXN0Q29tbWFuZCIsICIoKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfY2xlYXJCbGFja2xpc3RDb21tYW5kIH0sCisKKyAgICB7ICJkb0RoY3BSZXF1ZXN0IiwgIihMYW5kcm9pZC9uZXQvRGhjcEluZm87KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdCB9LAorICAgIHsgImdldERoY3BFcnJvciIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IgfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX25ldF93aWZpX1dpZmlNYW5hZ2VyKEpOSUVudiogZW52KQpAQCAtNTM5LDYgKzU4NywxOCBAQAogICAgIGpjbGFzcyB3aWZpID0gZW52LT5GaW5kQ2xhc3MoV0lGSV9QS0dfTkFNRSk7CiAgICAgTE9HX0ZBVEFMX0lGKHdpZmkgPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzICIgV0lGSV9QS0dfTkFNRSk7CiAKKyAgICBkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9uZXQvRGhjcEluZm8iKTsKKyAgICBpZiAoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzICE9IE5VTEwpIHsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5jb25zdHJ1Y3RvcklkID0gZW52LT5HZXRNZXRob2RJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICI8aW5pdD4iLCAiKClWIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMuaXBhZGRyZXNzID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgImlwQWRkcmVzcyIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMuZ2F0ZXdheSA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJnYXRld2F5IiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5uZXRtYXNrID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgIm5ldG1hc2siLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLmRuczEgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAiZG5zMSIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMuZG5zMiA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJkbnMyIiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5zZXJ2ZXJBZGRyZXNzID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgInNlcnZlckFkZHJlc3MiLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLmxlYXNlRHVyYXRpb24gPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAibGVhc2VEdXJhdGlvbiIsICJJIik7CisgICAgfQorCiAgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAogICAgICAgICAgICAgV0lGSV9QS0dfTkFNRSwgZ1dpZmlNZXRob2RzLCBORUxFTShnV2lmaU1ldGhvZHMpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCmluZGV4IDIxY2I5MTkuLmQzZmFhMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKQEAgLTExMyw2ICsxMTMsMTEgQEAKICAgICAjZW5kaWYKIH0KIAoramludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFzayhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBtYXNrKQoreworICAgIHJldHVybiB1bWFzayhtYXNrKTsKK30KKwogamludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBwYXRoKQogewogICAgICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTE3MCw2ICsxNzUsNyBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7CiAgICAgeyJzZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFBlcm1pc3Npb25zfSwKICAgICB7ImdldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRQZXJtaXNzaW9uc30sCisgICAgeyJzZXRVTWFzayIsICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2t9LAogICAgIHsiZ2V0RmF0Vm9sdW1lSWQiLCAgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZH0sCiAgICAgeyJnZXRGaWxlU3RhdHVzIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvRmlsZVV0aWxzJEZpbGVTdGF0dXM7KVoiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmlsZVN0YXR1c30sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAppbmRleCA4NDhhNTdhLi5lY2VlZjFjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcApAQCAtNjYsNiArNjYsMjYgQEAKICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JDbG9uZTsKIH0KIAorc3RhdGljIGludCBhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmUoSk5JRW52KiBlbnYsCisgICAgam9iamVjdCBjbGF6eiwgam9iamVjdEFycmF5IG91dEZkcykKK3sKKyAgICBpbnQgZmRzWzJdOworICAgIGlmIChwaXBlKGZkcykgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworICAgICAgICBqb2JqZWN0IGZkT2JqID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgICAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgICAgICBpZiAoZmRPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmZE9iaiwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChvdXRGZHMsIGksIGZkT2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGppbnQgZ2V0RmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgam9iamVjdCBkZXNjcmlwdG9yID0gZW52LT5HZXRPYmplY3RGaWVsZChjbGF6eiwgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRmlsZURlc2NyaXB0b3IpOwpAQCAtMTA5LDYgKzEyOSw4IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdQYXJjZWxGaWxlRGVzY3JpcHRvck1ldGhvZHNbXSA9IHsKICAgICB7ImdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldCIsICIoTGphdmEvbmV0L1NvY2tldDspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0fSwKKyAgICB7ImNyZWF0ZVBpcGVOYXRpdmUiLCAiKFtMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspSSIsCisgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmV9LAogICAgIHsiZ2V0U3RhdFNpemUiLCAiKClKIiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0U3RhdFNpemV9LAogICAgIHsic2Vla1RvIiwgIihKKUoiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggMDFiNjcxMS4uNGRjMDEyYyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCkBAIC02NCw2ICs2NCw5IEBACiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50QXV0aG9yaXplOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BZ2VudENhbmNlbDsKIAorc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0OworCiB0eXBlZGVmIGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCBuYXRpdmVfZGF0YV90OwogCiAjZGVmaW5lIEVWRU5UX0xPT1BfUkVGUyAxMApAQCAtMTE2LDYgKzExOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7WilWIik7CiAKICAgICBmaWVsZF9tTmF0aXZlRGF0YSA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVEYXRhIiwgIkkiKTsKICNlbmRpZgpAQCAtMjI2LDYgKzIzMywyMCBAQAogICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKICAgICAgICAgfQogICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLklucHV0JyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuTmV0d29yayciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAogICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkF1ZGlvU2luayciLAogICAgICAgICAgICAgICAgICZlcnIpOwogICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKQEAgLTg1Myw2ICs4NzQsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHJlbW90ZV9kZXZpY2VfcGF0aCkpOwogICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOwogICAgIH0KIAogICAgIHJldCA9IGEyZHBfZXZlbnRfZmlsdGVyKG1zZywgZW52KTsKQEAgLTEyMTAsNiArMTI0NywzMiBAQAogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYWRkcik7CiAgICAgZnJlZSh1c2VyKTsKIH0KKwordm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworCisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gKG5hdGl2ZV9kYXRhX3QgKiluOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSAoY29uc3QgY2hhciAqKXVzZXI7CisgICAgREJ1c0Vycm9yIGVycjsKKyAgICBkYnVzX2Vycm9yX2luaXQoJmVycik7CisgICAgSk5JRW52ICplbnY7CisgICAgbmF0LT52bS0+R2V0RW52KCh2b2lkKiopJmVudiwgbmF0LT5lbnZWZXIpOworCisgICAgYm9vbCByZXN1bHQgPSBKTklfVFJVRTsKKyAgICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlKCZlcnIsIG1zZykpIHsKKyAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgIHJlc3VsdCA9IEpOSV9GQUxTRTsKKyAgICB9CisgICAgTE9HVigiLi4uIERldmljZSBQYXRoID0gJXMsIHJlc3VsdCA9ICVkIiwgcGF0aCwgcmVzdWx0KTsKKyAgICBqc3RyaW5nIGpQYXRoID0gZW52LT5OZXdTdHJpbmdVVEYocGF0aCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKICNlbmRpZgogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IDQ0MjBhY2EuLjY5YTgwMDMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgREJVU19BREFQVEVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5BZGFwdGVyIgogI2RlZmluZSBEQlVTX0RFVklDRV9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuRGV2aWNlIgorI2RlZmluZSBEQlVTX0lOUFVUX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5JbnB1dCIKKwogI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhTZXJ2aWNlLmNwcCIKIAogI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgpAQCAtNjgsNiArNzAsNyBAQAogdm9pZCBvbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwogdm9pZCBvbkRpc2NvdmVyU2VydmljZXNSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIHZvaWQgb25DcmVhdGVEZXZpY2VSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKK3ZvaWQgb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIAogCiAvKiogR2V0IG5hdGl2ZSBkYXRhIHN0b3JlZCBpbiB0aGUgb3BhcXVlIChKYXZhIGNvZGUgbWFpbnRhaW5lZCkgcG9pbnRlciBtTmF0aXZlRGF0YQpAQCAtODgxLDYgKzg4NCw2MSBAQAogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3BhdGgsIGV2ZW50TG9vcE5hdCwgY19wYXRoLCBEQlVTX0lOUFVUX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCkBAIC05MjYsNiArOTg0LDkgQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk0YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPE9wZW5HTFJlbmRlcmVyLmg+CisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPFNraWFDb2xvckZpbHRlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKKy8qKgorICogTm90ZTogT3BlbkdMUmVuZGVyZXIgSk5JIGxheWVyIGlzIGdlbmVyYXRlZCBhbmQgY29tcGlsZWQgb25seSBvbiBzdXBwb3J0ZWQKKyAqICAgICAgIGRldmljZXMuIFRoaXMgbWVhbnMgYWxsIHRoZSBsb2dpYyBtdXN0IGJlIGNvbXBpbGVkIG9ubHkgd2hlbiB0aGUKKyAqICAgICAgIHByZXByb2Nlc3NvciB2YXJpYWJsZSBVU0VfT1BFTkdMX1JFTkRFUkVSIGlzIGRlZmluZWQuCisgKi8KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphdmEgQVBJcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIHNldDsKK30gZ1JlY3RDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0cnVjdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgT3BlbkdMUmVuZGVyZXIqIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlUmVuZGVyZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzKSB7CisgICAgcmV0dXJuIG5ldyBPcGVuR0xSZW5kZXJlcjsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICBkZWxldGUgcmVuZGVyZXI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNldHVwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgcmVuZGVyZXItPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3ByZXBhcmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cHJlcGFyZSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdGF0ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLCBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsCisgICAgICAgIGppbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmUoZmxhZ3MpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgc2F2ZUNvdW50KSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExheWVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgamludCBhbHBoYSwgamludCBzYXZlRmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmVMYXllckFscGhhKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaXBwaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrQ2FudmFzOjpFZGdlVHlwZSBlZGdlKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5xdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5jbGlwUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBsZWZ0LCBqaW50IHRvcCwgamludCByaWdodCwgamludCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSwgb3ApOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpvYmplY3QgcmVjdCkgeworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGR4LCBqZmxvYXQgZHkpIHsKKyAgICByZW5kZXJlci0+dHJhbnNsYXRlKGR4LCBkeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZGVncmVlcykgeworICAgIHJlbmRlcmVyLT5yb3RhdGUoZGVncmVlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPnNldE1hdHJpeChtYXRyaXgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5nZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBzcmNMZWZ0LCBzcmNUb3AsIHNyY1JpZ2h0LCBzcmNCb3R0b20sCisgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBTa01hdHJpeCogbWF0cml4LCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbWF0cml4LCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBqYnl0ZUFycmF5IGNodW5rcywKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIGpieXRlKiBzdG9yYWdlID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIE5VTEwpOworICAgIFJlc19wbmdfOXBhdGNoKiBwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVzX3BuZ185cGF0Y2gqPihzdG9yYWdlKTsKKyAgICBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUocGF0Y2gpOworCisgICAgcmVuZGVyZXItPmRyYXdQYXRjaChiaXRtYXAsIHBhdGNoLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgc3RvcmFnZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICByZW5kZXJlci0+ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1JlZ2lvbiogcmVnaW9uLCBTa1BhaW50KiBwYWludCkgeworICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdCgqcmVnaW9uKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBjb25zdCBTa0lSZWN0JiByID0gaXQucmVjdCgpOworICAgICAgICByZW5kZXJlci0+ZHJhd1JlY3Qoci5mTGVmdCwgci5mVG9wLCByLmZSaWdodCwgci5mQm90dG9tLCBwYWludCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFkZXJzIGFuZCBjb2xvciBmaWx0ZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRDb2xvckZpbHRlcigpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBTaGFkZXIoc2hhZGVyKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIHJlbmRlcmVyLT5zZXR1cENvbG9yRmlsdGVyKGZpbHRlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dChPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAoVGV4dExheW91dDo6cHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGNvdW50LCBmbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSB3b3JrVGV4dCwgd29ya0J5dGVzLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW5kZXJUZXh0UnVuKE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsCisgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksCisgICAgICAgIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgIGlmIChydGwpIHsKKyAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgamNoYXIqIHNoYXBlZCA9IGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQpKSB7CisgICAgICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBzaGFwZWQsIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJkcmF3VGV4dFJ1biBlcnJvciIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgKHRleHQgKyBzdGFydCksIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0QXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHQocmVuZGVyZXIsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bkFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0UnVuKHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBjb250ZXh0SW5kZXgsIGluZGV4IC0gY29udGV4dEluZGV4LAorICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyRmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgIGppbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworI2VuZGlmIC8vIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgIm5Jc0F2YWlsYWJsZSIsICAgICAgICIoKVoiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUgfSwKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICJuU2V0Vmlld3BvcnQiLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0IH0sCisgICAgeyAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisKKyAgICB7ICJuU2F2ZSIsICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUgfSwKKyAgICB7ICJuUmVzdG9yZSIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmUgfSwKKyAgICB7ICJuUmVzdG9yZVRvQ291bnQiLCAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmVUb0NvdW50IH0sCisgICAgeyAibkdldFNhdmVDb3VudCIsICAgICAgIihJKUkiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRTYXZlQ291bnQgfSwKKworICAgIHsgIm5TYXZlTGF5ZXIiLCAgICAgICAgICIoSUZGRkZJSSlJIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyIH0sCisgICAgeyAiblNhdmVMYXllckFscGhhIiwgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYSB9LAorCisgICAgeyAiblF1aWNrUmVqZWN0IiwgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19xdWlja1JlamVjdCB9LAorICAgIHsgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUZGRkZJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3RGIH0sCisgICAgeyAibkNsaXBSZWN0IiwgICAgICAgICAgIihJSUlJSUkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdCB9LAorCisgICAgeyAiblRyYW5zbGF0ZSIsICAgICAgICAgIihJRkYpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc190cmFuc2xhdGUgfSwKKyAgICB7ICJuUm90YXRlIiwgICAgICAgICAgICAiKElGKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JvdGF0ZSB9LAorICAgIHsgIm5TY2FsZSIsICAgICAgICAgICAgICIoSUZGKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUgfSwKKworICAgIHsgIm5TZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4IH0sCisgICAgeyAibkdldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRNYXRyaXggfSwKKyAgICB7ICJuQ29uY2F0TWF0cml4IiwgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NvbmNhdE1hdHJpeCB9LAorCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwIH0sCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUZGRkZGRkZGSSlWIiwgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdCB9LAorICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeCB9LAorICAgIHsgIm5EcmF3UGF0Y2giLCAgICAgICAgICIoSUlbQkZGRkZJKVYiLCAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoIH0sCisgICAgeyAibkRyYXdDb2xvciIsICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Q29sb3IgfSwKKyAgICB7ICJuRHJhd1JlY3QiLCAgICAgICAgICAiKElGRkZGSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0IH0sCisgICAgeyAibkRyYXdSZWN0cyIsICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdHMgfSwKKyAgICB7ICJuRHJhd1BhdGgiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRoIH0sCisKKyAgICB7ICJuUmVzZXRNb2RpZmllcnMiLCAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc2V0TW9kaWZpZXJzIH0sCisgICAgeyAiblNldHVwU2hhZGVyIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRlciB9LAorICAgIHsgIm5TZXR1cENvbG9yRmlsdGVyIiwgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBDb2xvckZpbHRlciB9LAorCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJW0NJSUZGSUkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0IH0sCisKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElbQ0lJSUlGRklJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1biB9LAorCisgICAgeyAgICJuR2V0Q2xpcEJvdW5kcyIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylaIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRDbGlwQm91bmRzIH0sCisjZW5kaWYKK307CisKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKSBcCisgICAgICAgICAgICB2YXIgPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBjbGFzcyAiIGNsYXNzTmFtZSk7IFwKKyAgICAgICAgICAgIHZhciA9IGpjbGFzcyhlbnYtPk5ld0dsb2JhbFJlZih2YXIpKTsKKyAgICAKKyAgICAjZGVmaW5lIEdFVF9NRVRIT0RfSUQodmFyLCBjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcikgXAorICAgICAgICAgICAgdmFyID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcik7IFwKKyAgICAgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIG1ldGhvZCAiIG1ldGhvZE5hbWUpOworI2Vsc2UKKyAgICAjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpCisjZW5kaWYKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpIHsKKyAgICBGSU5EX0NMQVNTKGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7CisgICAgR0VUX01FVEhPRF9JRChnUmVjdENsYXNzSW5mby5zZXQsIGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAic2V0IiwgIihJSUlJKVYiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKaW5kZXggNTE3M2JiOC4uMjk4OGFlOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCkBAIC03NiwxMCArNzYsNiBAQAogICAgIGNhbnZhcy0+cmVzdG9yZSgpOwogfQogCi1zdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7Ci0gICAgU2tHTENhbnZhczo6QWJhbmRvbkFsbFRleHR1cmVzKCk7Ci19Ci0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04Nyw5ICs4Myw3IEBACiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKICAgICB7ICAgIm5hdGl2ZVNob3dGUFMiLCAiKExhbmRyb2lkL2dyYXBoaWNzL0NhbnZhcztJKVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9LAotICAgIHsgICAibmF0aXZlQWJhbmRvbkdsQ2FjaGVzIiwgIigpViIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0KIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QoSk5JRW52KiBlbnYpIHsKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE5YjMwY2MuLjFmNjZkMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtODMsNiArODMsOCBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NPTk5FQ1RFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9ESVNDT05ORUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfU1RBVEUiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCIgLz4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgdGhpbmdzIHRoYXQgY29zdCBtb25leSAtLT4KQEAgLTM0OCw2ICszNTAsMTMgQEAKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19hY2NvdW50TWFuYWdlclNlcnZpY2UiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hY2NvdW50TWFuYWdlclNlcnZpY2UiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBpbnRlcm5hbCB1c2VyIHRvIHVzZSBwcml2YWxlZGdlZCBDb25uZWN0aXZpdHlNYW5hZ2VyCisgICAgQVBJcy4KKyAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLk5FVFdPUksiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmVPclN5c3RlbSIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgYWNjb3VudHMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyMjBlNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2RmNzIuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEyMDRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYwpAQCAtMCwwICsxLDk3ODQgQEAKK0lTTzg4NTktMQorTEVGVEhZUEhFTk1JTiAyCitSSUdIVEhZUEhFTk1JTiAzCisuYTJjaDQKKy5hZDRkZXIKKy5hMmQKKy5hZDFkNAorLmEyZjF0CisuYTJmCisuYTRsM3QKKy5hbTVhdAorLjRhMW1hCisuYW41YworLmEybgorLjJhbmc0CisuYW4xaTVtCisuYW4xdDQKKy5hbjN0ZQorLmFudGk1cworLmFudDJpCisuYTRyNXMyCisuMmEycgorLmFyNHQyaWU0CisuYXIxdGkKKy5hcjR0eQorLmFzM2MKKy5hczFwCisuYTJzMXMKKy5hc3RlcjUKKy5hMnRvbTUKKy5hMXRvCisuYXUxZAorLmF2NGkKKy5hd240CisuYmE0ZworLmJhNW5hCisuYmEybgorLmJhczRlCisuYmVyNAorLmJlNXIxYQorLmJlM3MxbQorLjRiZXM0CisuYjRlNXMydG8KKy5icmkyCisuYnV0NHRpCisuYnU0dDN0MgorLmNhbTRwZQorLjFjYQorLmNhNG0xcAorLmNhbjVjCisuY2EybgorLmNhcGE1YgorLmNhMXBhCisuY2FyNW9sCisuYzJhMnIKKy5jYTR0CisuY2U0bGEKKy4yY2g0CisuY2hpbGw1aQorLmNoNGlsMgorLmNoaWwxbAorLjFjaTIKKy5jaXQ1cgorLjJjMWl0CisuY28zZTIKKy4xY28KKy5jbzRyCisuY29yNW4xZXIKKy5jb3JuMmUKKy5kZTRtb2kyCisuZDRlbQorLmRlMW1vCisuZGUzbworLmRlM3IxYQorLmRlM3IxaQorLmRlMXM0YworLmRlczIKKy5kaWMxdDJpbzUKKy4zZGkyYzF0CisuZG80dAorLjFkbworLmR1NGMKKy4xZHUKKy5kdTRtMWI1CisuZWFydGg1CisuZWFyMnQKKy5lMmEycgorLmVhczNpCisuMmUxYjQKKy5lZXI0CisuZWcyCisuZTJsNWQKKy5lbDNlbQorLmVuYW0zCisuZTFuYQorLmVuM2cKKy5lMm4zczIKKy5lcTV1aTV0CisuZTFxCisuZXF1MgorLmVxMnVpMgorLmVyNHJpCisuZXIxcjQKKy5lczMKKy40ZXUzCisuZXllNQorLmZlczMKKy5mb3I1bWVyCisuMWZvCisuZm8ycgorLmZvcjFtCisuZm9yMm1lCisuMWdhMgorLmdlMgorLmdlbjN0NAorLjFnZW4KKy5nZTVvMmcKKy4xZ2VvCisuMWcyaTVhCisuZ2k0YgorLmdvNHIKKy4xZ28KKy5oYW5kNWkKKy5oYTJuCisuaDRhbmQKKy5oYTRuNWsyCisuaGUyCisuaGVybzVpMgorLmgyZXJvCisuaDFlczMKKy5oZTR0MworLmhpM2IKKy5oaTNlcgorLmgyaWU0CisuaG9uNWV5CisuaG8ybgorLmhvbjNvCisuaG92NQorLmlkNGwKKy4yaWQKKy5pZG9sMworLmkxZG8KKy5pbTNtCisuaW01cDFpMm4KKy5pNG0xcAorLmltMnBpCisuaW4xCisuaW4zY2kKKy4yaW5lMgorLjRpNG4yazIKKy4yaTJuM3MyCisuaXI1cjQKKy40aXIKKy5pczRpCisuanUzcgorLmxhNGN5CisubGE0bQorLmxhdDVlcgorLmw0YXRoNQorLmxlMgorLmxlZzVlCisubGVuNAorLmxlcDUKKy5sZXYxCisubDJpNGcKKy5saTFnNWEKKy5saTJuCisubDJpM28KKy5sMWk0dAorLm1hMWc1YTUKKy4xbWEKKy5tYWw1bworLm1hMW41YQorLm1hMm4KKy5tYXI1dGkKKy5tMmEycgorLm1lMgorLm1lcjNjCisubWU1dGVyCisubWUxdGUKKy5tMmlzMQorLm1pczR0NWkKKy5tb24zZQorLjFtbworLm1vMm4KKy5tbzNybworLm1vMnIKKy5tdTV0YQorLjFtdQorLm11MnRhNWIKKy5uaTRjCisub2QyCisub2QxZDUKKy5vZjV0ZQorLm8yZnQKKy5vcjVhMXRvCisubzFyYQorLm9yM2MKKy5vcjFkCisub3IzdAorLm9zMworLm9zNHRsCisuNG90aDMKKy5vdXQzCisub3UyCisucGVkNWFsCisuMnAyZWQKKy5wMmUyZDJhCisucGU1dGUKKy5wZTJ0CisucGU1dGl0CisucDJpNGU0CisucGlvNW40CisuM3AyaTFvCisucGkydAorLnByZTNtCisucHIyCisucmE0YworLnJhbjR0CisucmEybgorLnJhdGlvNW4xYQorLnJhdGlvMm40CisucmExdDJpbworLnJlZTIKKy5yZTVtaXQKKy5yZXMyCisucmU1c3RhdAorLnJlczJ0CisucmVzMXRhCisucjJpNGcKKy5yaTJ0NXUKKy5ybzRxCisucm9zNXQKKy5yb3c1ZAorLnJ1NGQKKy4zczRjMmkzZTQKKy5zMWNpCisuNXNlMmwyZjUKKy5zZWwxbDUKKy5zZTJuCisuc2U1cjJpZTQKKy5zZXIxaQorLnMyaDIKKy5zaTIKKy5zM2luZzQKKy4yczFpbgorLnN0NAorLnN0YTViMmwyCisuczF0YQorLnMydGFiCisuczR5MgorLjF0YTQKKy50ZTQKKy4zdGVuNWEybgorLnRlMW5hCisudGgyCisudGkyCisudGlsNAorLnRpMW01bzUKKy4xdGltCisudGluZzQKKy4ydDFpbgorLnQ0aTRuNWsyCisudG8xbjRhCisuMXRvCisudG8ybgorLnRvNHAKKy50b3A1aQorLnRvMnU1cworLnRvdTIKKy50cmliNXV0CisudHI0aWIKKy51MW4xYQorLnVuM2NlCisudW5kZXI1CisudW4xZGUKKy51Mm4xZQorLnU0bjVrMgorLnVuNW8KKy51bjN1NAorLnVwMworLnVyZTMKKy51czVhMgorLjJ1cworLnZlbjRkZQorLnZlNXIxYQorLndpbDVpCisud2kyCisud2lsMgorLnllNAorNGFiLgorYTViYWwKK2E1YmEybgorYWJlMgorYWI1ZXJkCithYjJpNWEKK2FiNWkydDVhYgorYWJpMnQKK2FiaTF0YQorYWI1bGF0CithYjJsMgorYWI1bzVsMWl6CithYm9sMmkKKzRhYnIKK2FiNXJvZworYWIzdWwKK2E0YzJhMnIKK2ExY2EKK2FjNWFyZAorYWM1YXJvCithNWNlb3UyCithYzFlcgorYTVjaGU0dAorYTJjaAorYWNoZTIKKzRhMmNpCithM2MyaWU0CithMmMxaW4KK2EzYzJpbworYWM1cm9iCithY3Q1aWYyCithMmMxdAorYWMzdWwKK2FjNHVtCithMmQKK2FkNGQxaW4KK2FkMWQ0CithZDVlci4KKzJhZGkKK2EzZDRpM2EKK2FkM2kxY2EKK2FkaTRlcgorYWQyaWU0CithM2QyaW8KK2EzZGl0CithNWRpMXUKK2FkNGxlCithZDNvdworYTFkbworYWQ1cmEybgorYTFkcgorYWQ0c3UKK2EyZDFzMgorNGExZHUKK2EzZHUyYworYWQ1dW0KK2FlNHIKK2FlcjJpNGU0CithZXIxaQorYTJmCithNGYxZjQKK2E0Z2FiCithMWdhCithZ2E0bgorYWc1ZWwxbAorYTFnZTRvCis0YWc0ZXUKK2FnMWkKKzRhZzRsMgorYWcxbgorYTJnbworM2EzZzRvNGcKK2FnM28zbmkKK2FnbzJuMgorYTVndWVyCithMmd1ZQorYWc1dWwKK2E0Z3kKK2EzaGEKK2EzaGUKK2E0aDRsNAorYTNobworYWkyCithNWkxYQorYTNpYy4KK2FpNWx5CithNGk0bgorYWluNWluCithMmluaQorYTJpMW41bworYWl0NWVuCithMml0ZQorYTFqCithazFlbgorYWw1YWIKK2FsM2EyZAorYTRsMmEycgorNGFsZGk0CithMmxkCisyYWxlCithbDNlbmQKK2E0bGVudDJpCithMWxlbjF0CithNWxlNW8KK2FsMWkKK2FsNGlhLgorYWwyaTFhCithbDJpNGU0CithbDVsZXYKK2FsMWwKK2FsMmxlCis0YWxsaWMKK2FsbDJpCis0YTJsbQorYTVsb2cuCithNGx5LgorYTFseQorNGEybHlzNAorNWE1bHlzMXQKKzVhbHl0CiszYWx5egorNGExbWEKK2EybTVhYgorYW0zYWcKK2FtYTVyYQorYW0yYTJyCithbTVhc2MKK2E0bWEzdGlzCithNG01YTF0bworYW01ZXIxYQorYW0zaWMKK2FtNWlmCithbTVpMWx5CithbTFpbgorYW0yaTRubworYTJtbworYTVtbzJuCithbW9yNWkKK2FtbzJyCithbXA1ZW4KK2E0bTFwCithMm4KK2FuM2FnZQorYTFuYQorM2FuYTFseQorYTNuMmEycgorYW4zYXIzYworYW5hcjRpCithM25hdGkKK2FuMmF0Cis0YW5kCithbmRlNHMyCithbjFkZQorYW4zZGlzMQorYW4xZGwKK2FuNGRvdworYW4xZG8KK2E1bmVlCithM25lbgorYW41ZTJzdC4KK2ExbmVzCithMm5lc3QKK2EzbjRldQorMmFuZworYW5nNWllNAorYW4xZ2wyCithNG4xaWMKK2EzbmllcworYW4yaWU0CithbjNpM2YKK2FuNGltZQorYW4xaW0KK2E1bmltMWkKK2E1bjJpbmUKK2FuMWluCithbjNpNG8KK2EzbjJpcAorYW4zaXMyaAorYW4zaXQKK2EzbmkxdQorYW40a2xpCithNG5rMgorYW4xazFsCis1YW5uaXoKK2E0bjFuMgorYW5vNAorYW41b3QKK2FuNG90aDUKK2FuMnNhMgorYTJuMXMyCithbjRzMWNvCithbnM0YworYW40czFuNAorYW4yc3AKK2FuczNwbworYW40c3QKK2FuNHN1MnIKK2FuMXN1CithbnRhMmw0CithbjF0CithbjF0YQorYW40dDJpZTQKK2FudDJpCis0YW4xdG8KK2FuMnRyCithbjR0dzQKK2FuM3UxYQorYW4zdWwKK2E1bnVyCis0YW8KK2FwMmEycjQKK2ExcGEKK2FwNWF0CithcDVlcjNvCithM3BoNGVyCis0YXBoaQorYTRwaWxsYQorYXBpbDFsCithcDVpbGwyYTJyCithcDNpMm4KK2FwM2kxdGEKK2EzcGkydHUKK2EycDJsMgorYXBvNGM1CithcDVvMWxhCithcG9yNWkKK2ExcDRvcgorYXBvczN0CithMXBvcworYXBzNWU0cworYTJwMXMyCithcDJzZQorYTNwdQorYXF1ZTUKK2FxdTIKKzJhMnIKK2FyM2EyYzF0CithNXJhZGUKK2FyYTJkCithcjVhZGlzMQorYXIyYWRpCithcjNhbAorYTVyYW1lMXRlCithcmFtM2V0CithcjJhbjRnCithcmEybgorYXJhM3AKK2FyNGF0CithNXJhMXQyaW8KK2FyNWExdDJpdgorYTVyYXUKK2FyNWF2NAorYXJhdzQKK2FyYmFsNAorYXIxYgorYXI0Y2hhMm4KK2FyMWMKK2FyM2NoYQorYXIyY2gKK2FyNWQyaW5lCithcmQyaQorYXJkMWluNAorYXI0ZHIKK2FyNWVhcworYTNyZWUKK2FyM2VuMXQKK2E1cjJlMnNzCithcjRmaQorYXIxZgorYXI0ZjRsMgorYXIxaQorYXI1aTJhbAorYXIyaTNhCithcjNpMmEybgorYTNyaTVldAorYXIyaWU0CithcjRpbQorYXI1aW4yYXQKK2FyMmkxbmEKK2FyM2kxbworYXIyaXoKK2FyMm1pCithcjFtCithcjVvNWQKK2E1cm9uaQorYXJvMm4KK2Ezcm9vMgorYXIycAorYXIzcQorYXJyZTQKK2FyMXI0CithcjRzYTIKK2E0cnMyCithcjJzMmgKKzRhcy4KK2EyczRhYgorYXNhMgorYXMzYW4xdAorYXNhMm4KK2FzaGk0CithczJoCithNXNpYS4KK2FzMmkxYQorYTNzaTFiCithM3NpYworNWE1c2k0dAorYXNrM2kKK2FzazIKK2FzNGwyCithNHNvYworYTFzbworYXM1cGgKK2FzNHMyaAorYTJzcworYXMzdGVuCithczF0NHIKK2FzdTFyNWEKK2Exc3UKK2FzdTJyCithMnRhCithdDNhYjJsMgorYTJ0YWIKK2F0NWFjCithdDNhbG8KK2F0YTJsCithdDVhcAorYXRlNWMKK2F0NWUyY2gKK2F0M2UxZ28KK2F0ZWc0CithdDNlbi4KK2F0M2VyMWEKK2F0ZXI1bgorYTV0ZXIxbmEKK2F0M2VzdAorYXQ1ZXYKKzRhdGgKK2F0aDVlbQorYXRoMmUKK2E1dGhlMm4KK2F0NGhvCithdGg1b20KKzRhdGkuCithNXQyaTFhCithMnQ1aTViCithdDFpYworYXQzaWYyCithdGlvbjVhMnIKK2ExdDJpbworYXRpbzJuCithdGlvMW4xYQorYXQzaTF0dQorYTR0b2cKK2ExdG8KK2EydG9tCithdDVvbTJpegorYTR0b3AKK2E0dG9zMgorYTF0cgorYXQ1cm9wCithdDRzazIKK2E0dDFzMgorYXQ0dGFnCithNHQzdDIKK2F0MXRhCithdDV0ZQorYXQ0dGgKK2EydHUKK2F0NXUxYQorYTR0NXVlCithdDN1bAorYXQzdTFyYQorYTJ0eQorYXU0YgorYXVnaDMKK2F1M2d1CithdTRsMgorYXVuNWQKK2F1M3IKK2F1NXNpMWIKK2EydXMKK2E0dXQ1ZW4KK2F1MXRoCithMnZhCithdjNhZzQKK2E1dmEybgorYXY0ZTRubworYXYzZXIxYQorYXY1ZXJuCithdjVlcnkKK2F2MWkKK2F2aTRlcgorYXYyaWU0CithdjNpZworYXY1b2MKK2Exdm9yCiszYXdheQorYXczaTIKK2F3NGx5Cithd3M0CitheDRpNWMKK2F4M2kKK2F4NGlkCitheTVhbAorYXllNAorYXlzNAorYXppNGVyCithMnoxaQorYXoyaWU0CithejJ6NWkKK2E0ejF6MgorNWJhLgorYmFkNWdlcgorYmEyZAorYmE0Z2UKK2JhbDFhCitiYW41ZGFnCitiYTJuCitiNGFuZAorYmFuMWQyYQorYmFuNGUKK2JhbjNpCitiYXJiaTUKK2IyYTJyCitiYXIxYgorYmFyMmk0YQorYmFyMWkKK2JhczRzaQorYmEyc3MKKzFiYXQKK2JhNHoKKzJiMWIKK2IyYmUKK2IzYmVyCitiYmk0bmEKKzRiMWQKKzRiZS4KK2JlYWs0CitiZWEydDMKKzRiZTJkCitiMmUzZDJhCitiZTNkZQorYjRlM2RpCitiZTNnaQorYmU1Z3UKKzFiZWwKK2JlMWwyaQorYmUzbG8KKzRiZTVtCitiZTVuMmlnCitiZTVudQorNGJlczQKK2JlM3NwCitiMmU1c3Q0cgorM2JldAorYmUxdDVpegorYmU1dHIKK2JlM3R3NAorYmUzdworYmU1eTFvNAorMmJmCis0YjNoCitiaTJiCitiMmk0ZAorM2IyaWU0CitiaTVlbgorYmk0ZXIKKzJiM2lmCisxYmlsCitiaTNsMml6CitiaWwxaQorYmluMmE1cjQKK2JpMW5hCitiNGluNGQKK2JpNW5ldAorYjJpbmUKK2JpM28yZ3IKK2IyaW8KK2JpNW91MgorYmkydAorM2IyaTN0MmlvCitiaTF0aQorYmkzdHIKKzNiaXQ1dTFhCitiaTF0dQorYjVpNHR6CitiMWoKK2JrNAorYjJsMgorYmw0YXRoNQorYjRsZS4KK2JsZW40Cis1YmxlMXNwCitibGVzMgorYjNsaXMKK2I0bG8KK2JsdW40dAorNGIxbQorNGIzbgorYm5lNWcKKzNib2QKK2JvZDNpCitibzRlCitib2wzaWMKK2JvbDJpCitib200YmkKK2JvNG0xYgorYm8xbjRhCitibzJuCitib241YXQKKzNib28yCis1Ym9yLgorNGIxbzFyYQorYm9yNWQKKzVib3JlCis1Ym9yaQorNWJvczQKK2I1bzF0YQorYjRvdGg1CitibzR0bworYm91bjJkMworYm91MgorNGJwCis0YnJpdAorYnI0b3RoMworMmI1czIKK2Jzb3I0CitiMXNvCisyYnQKK2IydDRsCitiNHRvCitiM3RyCitidWY0ZmVyMQorYnU0ZjFmCitidTRnYQorYnUzbDJpCitidTFtaTQKK2J1NG4KK2J1bnQ0aQorYnVuMXQKK2J1M3JlCitidXM1aWU0CitiMnVzCitidXNzNGUKK2J1MnNzCis1YnVzdAorNGJ1MXRhCiszYnUxdDJpbworYjR1MXQyaQorYjV1MXRvCitiMXYKKzRiNXcKKzVieS4KK2J5czQKKzFjYQorY2FiM2luCitjYTFiMmwyCitjYTJjaDQKK2NhNWRlbgorY2EyZAorNGNhZzQKKzJjNWFoCitjYTNsYXQKK2NhbDRsYQorY2FsMWwKK2NhbDJsNWluNAorY2FsbDJpCis0Y2FsbworYzRhbjVkCitjYTJuCitjYW40ZQorY2E0bjRpYworY2FuNWlzCitjYW4zaXoKK2NhbjR0eQorY2FuMXQKK2Nhbnk0CitjYTVwZXIKK2NhcjVvbQorYzJhMnIKK2Nhc3Q1ZXIKK2NhczV0MmlnCitjYXN0MmkKKzRjYXM0eQorYzRhNHRoCis0Y2ExdDJpdgorY2F2NWFsCitjYTJ2YQorYzNjCitjY2hhNQorYzJjaAorYzNjMmk0YQorYzFjaQorY2NvbTFwYTUKK2MxY28KK2NjbzRtMXAKK2NjbzJuNAorY2NvdTN0CitjY291MgorMmNlLgorNGNlZC4KKzRjZTFkZW4KKzNjZWkyCis1Y2VsLgorM2NlbDFsCisxY2VuCiszY2VuYworMmNlbjRlCis0Y2VuaQorM2NlbjF0CiszY2VwCitjZTVyYW0KK2NlcjFhCis0Y2UxczRhMgorM2NlczFzaQorYzJlMnNzCitjZXM1c2k1YgorY2VzNXQKK2NldDQKK2M1ZTR0YQorY2V3NAorMmNoCis0Y2guCis0Y2gzYWIKKzVjaGE0bjFpYworY2hhMm4KK2NoNWE1bmlzCitjaGUyCitjaGVhcDMKKzRjaDRlZAorY2g1ZTVsbworM2NoZW1pCitjaDVlbmUKK2NoZTJuCitjaDNlci4KK2NoM2U0cjFzMgorNGNoMWluCis1Y2hpMm5lLgorY2gyaW5lCitjaDVpNW4yZTJzcworY2hpMW5lcworNWNoMmluaQorNWNoMmlvCiszY2hpdAorY2hpMnoKKzNjaG8yCitjaDR0aQorMWNpCiszYzJpMWEKK2NpMmE1YgorY2kyYTVyCitjaTVjCis0Y2llcgorYzJpZTQKKzVjNGkyZjNpYy4KK2NpMWZpCis0YzRpNWk0CitjaTRsYQorM2NpbDFpCisyY2ltCisyY2luCitjNGkxbmEKKzNjaW4yYXQKK2NpbjNlbQorYzJpbmUKK2MxaW5nCitjNWluZy4KKzVjMmkxbm8KK2NpbzJuNAorYzJpbworNGNpcGU0CitjMmlwCitjaTNwaAorNGNpcDRpYworY2lwM2kKKzRjaXMxdGEKKzRjaXMxdDJpCisyYzFpdAorY2kxdDNpegorY2kxdGkKKzVjaXoKK2NrMQorY2szaQorMWM0bDQKKzRjbDJhMnIKK2M1bGE1cmExdDJpbworY2xhcjRhdAorNWNsYXJlCitjbGU0bQorNGNsaWMKK2NsaW00CitjMWx5NAorYzVuCisxY28KK2NvNWFnCitjNG9hCitjb2UyCisyY29nCitjbzRncgorY29pNAorY28zaW5jCitjb2w1aQorNWNvbG8KK2NvbDNvNHIKK2NvbTVlcgorY28ybWUKK2NvMW40YQorY28ybgorYzRvbmUKK2NvbjNnCitjb241dAorY28zcGEKK2NvcDNpYworY280cDJsMgorNGNvcjFiCitjb3JvM24KK2NvczRlCitjb3YxCitjb3ZlNAorY293NWEKK2NvMno1ZQorY281ejFpCitjMXEKK2NyYXM1dAorY3IyYXMKKzVjcmF0LgorNWNyYXQxaWMKK2NyZTNhMnQKKzVjMnIyZWQKKzRjM3JlMXRhCitjcmU0djIKK2NyaTIKK2NyaTVmCitjNHJpbgorY3IyaXM0Cis1Y3JpMXRpCitjcm80cDJsMgorY3JvcDVvCitjcm9zNGUKK2NydTRkCis0YzNzMgorMmMxdAorYzJ0YTRiCitjMXRhCitjdDVhbmcKK2N0YTJuCitjNXRhbjF0CitjMnRlCitjM3RlcgorYzR0NGljMXUKK2N0aW0zaQorYzF0aW0KK2N0dTRyCitjMXR1CitjNHR3NAorY3VkNQorYzR1ZgorYzR1aTIKK2N1NWkxdHkKKzVjdWwyaQorY3VsNHRpczQKK2N1bDF0aQorY3U0bHQKKzNjNHVsMXR1MgorY3UybWEKK2MzdW1lCitjdTRtaQorM2N1bgorY3UzcGkKK2N1NXB5CitjdTJyNWE0YgorY3UxcmEKK2N1NXIyaTNhCisxYzJ1cworY3VzMXM0aQorY3Uyc3MKKzNjNHV0CitjdTR0MmllNAorYzR1MXQyaQorNGM1dTF0Mml2Cis0Y3V0cgorMWN5CitjMnplNAorMWQyYQorNWRhLgorMmQzYTRiCitkYTJjaDQKKzRkYTJmCisyZGFnCitkYTJtMgorZDJhbjNnCitkYTJuCitkYXJkNQorZDJhMnIKK2Rhcms1Cis0ZGFyeQorM2RhdAorNGRhMXQyaXYKKzRkYTF0bworNWRhdjQKK2RhdjVlCis1ZGF5CitkMWIKK2Q1YworZDFkNAorMmRlLgorZGVhMmY1CitkZTRiNWkydAorZDJlMWIKK2RlNGJvMm4KK2RlY2EybjQKK2RlMWNhCitkZTRjaWwKK2RlMWMyaQorZGU1Y29tCitkZTFjbworMmQxZWQKKzRkZWUuCitkZTVpZgorZGVpMgorZGVsMmk0ZTQKK2RlbDJpCitkZTRsNWk1cQorZGU1bG8KK2Q0ZW0KKzVkZW0uCiszZGVtaWMKK2RlbTVpYy4KK2RlNW1pbAorZGU0bW8ybjNzMgorZGUxbW8KK2RlbW8ybgorZGVtbzJyNQorMWRlbgorZGU0bjJhMnIKK2RlMW5hCitkNGUzbm8KK2RlbnRpNWYyCitkZW4xdAorZGVudDJpCitkZTNudQorZGUxcAorZGUzcGEKK2RlcGk0CitkZTJwdQorZDNlMXEKK2Q0ZXIxaDQKKzVkZXIzbTQKK2Q1ZXJuNWl6CitkZTRyNXMyCitkZXMyCitkMmVzLgorZGUxczJjCitkZTJzNW8KK2RlczN0MmkKK2QyZTNzdDRyCitkZTRzdQorZGUxdAorZGUydG8KK2RlMXYKK2RlMnYzaTRsCitkZTF2aQorNGRleQorNGQxZgorZDRnYQorZDNnZTR0CitkZzFpCitkMmd5CitkMWgyCis1ZGkuCisxZDRpM2EKK2RpYTViCitkNGk0Y2FtCitkaTFjYQorZDRpY2UKKzNkaTJjMXQKKzNkMmlkCis1ZGkzZW4KK2QyaWU0CitkMWlmCitkaTNnZQorZDJpZworZGk0bGExdG8KK2RpMWxhCitkMWluCisxZGkxbmEKKzNkaTJuZS4KK2QyaW5lCis1ZDJpbmkKK2RpNW5pegorMWQyaW8KK2RpbzVnCitkaTRwMmwyCitkMmlwCitkNGlyMgorZGkxcmUKK2RpcjF0NWkKK2RpczEKKzVkaXNpCitkNGlzM3QKK2QyaTF0aQorMWQyaTF2CitkMWoKK2Q1azIKKzRkNWxhCiszZGxlLgorM2RsZWQKKzNkbGVzLgorZGxlczIKKzRkM2wyZTJzcworMmQzbG8KKzRkNWx1CisyZDFseQorZDFtCis0ZDFuNAorMWRvCiszZG8uCitkbzVkZQorNWRvZQorMmQ1b2YKK2Q0b2cKK2RvNGxhCitkb2wyaTQKK2RvNWxvNHIKK2RvbTVpegorZG8zbjJhdAorZG8ybgorZG8xbjFhCitkb25pNAorZG9vM2QKK2RvbzIKK2RvNHA0cAorZDRvcgorM2RvcworNGQ1b3V0Citkb3UyCitkbzR2CiszZG94CitkMXAKKzFkcgorZHJhZzVvMm4yCitkcmEyZ28KKzRkcjJhaTIKK2RyZTQKK2RyZTJhNXIKKzVkcmVuCitkcjRpNGIKK2RyaWw0Citkcm80cAorNGRyb3cKKzVkcnVwbGkKK2RydTNwMmwyCis0ZHJ5CisyZDFzMgorZHM0cAorZDRzdzIKK2Q0czR5CitkMnRoCisxZHUKK2QxdTFhCitkdTJjCitkMXUzY2EKK2R1YzVlcgorNGR1Y3QuCitkdTJjMXQKKzRkdWM0dDFzMgorZHU1ZWwKK2R1NGcKK2QzdWw0ZQorZHVtNGJlCitkdTRtMWIKK2R1NG4KKzRkdXAKK2R1NHBlCitkMXYKK2QxdworZDJ5Cis1ZHluCitkeTRzMmUKK2R5czVwCitlMWE0YgorZTNhMmMxdAorZWEyZDEKK2VhZDVpZTQKK2UyYWRpCitlYTRnZQorZWE1Z2VyCitlYTRsCitlYWw1ZXIKK2UyYWxlCitlYWwzb3UyCitlYW0zZXIKK2U1YW5kCitlYTJuCitlYXIzYQorZTJhMnIKK2VhcjRjCitlYXI1ZXMKK2VhcjRpYworZWFyMWkKK2VhcjRpbAorZWFyNWsKK2VhcjJ0CitlYXJ0M2UKK2VhNXNwCitlM2Eyc3MKK2Vhc3QzCitlYTJ0CitlYXQ1ZW4KK2VhdGgzaQorZTRhdGgKK2U1YXQzaWYyCitlNGEzdHUKK2VhMnYKK2VhdjNlbgorZWF2NWkKK2VhdjVvCisyZTFiCitlNGJlbC4KK2UxYmVsCitlNGJlMmwxczIKK2U0YmVuCitlNGJpMnQKK2UzYnIKK2U0Y2EyZAorZTFjYQorZWNhbjVjCitlY2EybgorZWMxY2E1CitlYzNjCitlMWNlCitlYzVlczFzYTIKK2VjMmUyc3MKK2UxYzJpCitlNGNpYgorZWM1aWZpY2F0CitlY2kxZmkKK2VjaWZpMWNhCitlYzVpM2YyaWU0CitlYzVpMWZ5CitlMmMzaW0KK2UyYzFpNHQKK2U1YzJpdGUKK2U0Y2xhbQorZTFjNGw0CitlNGNsMnVzCitlMmNvbAorZTFjbworZTRjb20xbQorZTRjb21wZQorZWNvNG0xcAorZTRjb24xYworZWNvMm4KK2UyY29yCitlYzNvMXJhCitlY281cm8KK2UxY3IKK2U0Y3JlbQorZWM0dGEybgorZTJjMXQKK2VjMXRhCitlYzR0ZQorZTFjdQorZTRjdWwKK2VjM3UxbGEKKzJlMmQyYQorNGVkM2Q0CitlNGQxZXIKK2VkZTRzMgorNGVkaQorZTNkNGkzYQorZWQzaWIKK2VkM2kxY2EKK2VkM2ltCitlZDFpdAorZWRpNXoKKzRlMWRvCitlNGRvbAorZWRvMm4yCitlNGRyaQorZTFkcgorZTRkdWwKK2UxZHUKK2VkNXUxbDRvCitlZTJjCitlNGVkM2kKK2VlMmYKK2VlbDNpCitlZTRseQorZWUybQorZWU0bmEKK2VlNHAxCitlZTJzNAorZWVzdDQKK2VlNHR5CitlNWV4CitlMWYKK2U0ZjNlcmUKK2VmZXIxCisxZTRmMWYKK2U0ZmljCitlMWZpCis1ZWYyaTFjNGkKK2VmaWw0CitlM2YyaTJuZQorZTJmaW4KK2VmNWk1bjJpdGUKK2VmMmluaQorZWZpbjJpdAorM2VmaXQKK2Vmb3I1ZXMKK2UxZm8KK2VmbzJyCitlNGZ1NHNlLgorZTNmdQorZWYydXMKKzRlZ2FsCitlMWdhCitlZ2VyNAorZWc1aWIKK2VnNGljCitlZzVpbmcKK2U1Z2l0NQorZWc1bgorZTRnby4KK2UxZ28KK2U0Z29zCitlZzF1bAorZTVndXIKKzVlMWd5CitlMWg0CitlaGVyNAorZWkyCitlNWljCitlMmk1ZAorZTJpZzIKK2VpNWc0bDIKK2UzaTRtMWIKK2UzaW4zZgorZTFpbmcKK2U1aW5zdAorZTJpMm4xczIKK2VpcjRkCitlNGlyCitlMml0M2UKK2UyaTN0aAorZTVpMXR5CitlMWoKK2U0anVkCitlajV1ZGkKK2VraTRuCitlazFpCitlazRsYQorZWsxbAorZTFsYQorZTRsYS4KK2U0bGFjCitlM2w0YW40ZAorZWxhMm4KK2U0bDVhMXQyaXYKK2U0bGF3CitlbGF4MWE0CitlM2xlMmEKK2VsNWVicmEKK2VsMmUxYgorZWxlM2JyCis1ZWxlYworZTRsZWQKK2VsM2UxZ2EKK2U1bGVuCitlNGwxZXIKK2UxbGVzMgorZTJsMmYKK2VsMmkKK2UzbGliZTQKK2U0bDVpYy4KK2VsM2kxY2EKK2UzbGllcgorZWwyaWU0CitlbDVpM2dpYgorZWwyaWcKK2VsNGlnaQorZTVsaW0KK2U0bDNpbmcKK2UzbDJpbworZTJsaXMKK2VsNWlzMmgKK2UzbDJpdjMKKzRlbGxhCitlbDFsCitlbDRsYWIKK2VsbDRvNAorZTVsb2MKK2VsNW9nCitlbDNvcC4KK2VsMnMyaAorZTJsMXMyCitlbDR0YQorZTRsdAorZTVsdWQKK2VsNXVnCitlNG1hYworZTFtYQorZTRtYWcKK2U1bWEybgorZW01YTFuYQorZTRtNWIKK2UxbWUKK2UybWVsCitlNG1ldAorZW0zaTFjYQorZW0yaTRlNAorZW01aWdyYQorZW0yaWc0CitlbWkxZ3IKK2VtMWluMgorZW01aW5lCitlbTNpM25pCitlNG0yaXMKK2VtNWlzMmgKK2U1bTRpMnMxcworZW0zaXoKKzVlbW5pegorZTRtMW4KK2VtbzRnCitlMW1vCitlbW8zbjJpNW8KK2VtbzJuCitlbTNwaQorZTRtMXAKK2U0bXVsCitlMW11CitlbTV1MWxhCitlbXUzbjIKK2UzbXkKK2VuNWEybW8KK2UxbmEKK2U0bmFuMXQKK2VuMmEybgorZW5jaDRlcgorZW4yY2gKK2VuY2hlMgorZW4zZGljCitlNW5lYQorZTVuZWUKK2VuM2VtCitlbjVlcm8KK2VuMWVyCitlbjVlMXNpCitlMW5lcworZTJuNWVzdAorZW4zZXRyCitlM25lNHcKK2VuNWk0YzNzMgorZTVuMmllNAorZTVuaWwKK2UzbjJpNG8KK2VuM2lzMmgKK2VuM2l0CitlNW5pMXUKKzVlbml6Cis0ZTRuMW4yCis0ZW5vCitlNG5vNGcKK2U0bm9zCitlbjNvdgorZW40c3cyCitlMm4xczIKK2VudDVhZ2UKK2VuMXQKK2VuMXRhCis0ZW50aDFlcworZW50aDJlCitlbjN1MWEKK2VuNXVmCitlM255LgorNGU0bjN6CitlNW9mCitlbzJnCitlNG9pNAorZTNvbAorZW9wM2EycgorZW8ycGEKK2Uxb3IKK2VvM3JlCitlbzVyb2wKK2VvczQKK2U0b3QKK2VvNHRvCitlNW91dAorZW91MgorZTVvdworZTJwYQorZTNwNGFpMgorZXA1YW5jCitlcGEybgorZTVwZWwKK2UzcGVuMXQKK2VwNWU1dDJpMXQyaW8KK2VwZTJ0CitlcGV0aTF0aQorZXBoZTQKK2U0cGxpCitlMXAybDIKK2UxcG8KK2U0cHJlYworZXByMgorZXA1cmUxY2EKK2U0cDJyMmVkCitlcDNyZTFoNAorZTNwcm8KK2U0cHJvYgorZXA0czRoCitlMnAxczIKK2VwNXRpNWIKK2UycDF0CitlNHB1MnQKK2VwNXUxdGEKK2UxcQorZXF1aTNsCitlcXUyCitlcTJ1aTIKK2U0cTN1aTNzCitlcjFhCitlMnJhNGIKKzRlcjRhbmQKK2VyYTJuCitlcjNhMnIKKzRlcjRhdGkuCisyZXIxYgorZXI0YjJsMgorZXIzY2gKK2VyMWMKK2VyNGNoZTIKKzJlMnJlLgorZTNyZTFhNGwKK2VyZTVjbworZXJlM2luCitlcmVpMgorZXI1ZWwuCitlcjNlMW1vCitlcjVlMW5hCitlcjVlbmNlCis0ZXJlbmUKK2VyM2VuMXQKK2VyZTRxCitlcjVlMnNzCitlcjNlczJ0CitlcmV0NAorZXIxaDQKK2VyMWkKK2UxcjJpM2E0Cis1ZXJpY2sxCitlM3JpZW4KK2VyMmllNAorZXJpNGVyCitlcjNpbjRlCitlMXIyaTFvCis0ZXJpdAorZXI0aTF1CitlcjJpNHYKK2U0cmkxdmEKK2VyM200CitlcjRuaXM0Cis0ZXIzbjJpdAorNWVybml6CitlcjNubzQKKzJlcm8KK2VyNW9iCitlNXIyb2MKK2VybzRyCitlcjFvdTIKK2U0cjFzMgorZXIzc2V0CitlcjJzZQorZXJ0M2VyCis0ZXIydGwKK2VyM3R3NAorNGVydQorZXJ1NHQKKzVlcndhdQorZXIxdworZTFzNGEyCitlNHNhMmdlLgorZTRzYWdlcworZXMyYworZTJzMWNhCitlczVjYTJuCitlM3NjcgorZXM1Y3UKK2UxczJlCitlMnNlYworZXM1ZTFjcgorZTRzNWVuYworZTRzZXJ0LgorZTRzZXI0dDFzMgorZTRzZXIxdmEKKzRlczJoCitlM3NoYQorZXNoNWUybgorZTFzaQorZTJzaWMKK2UyczJpZAorZXM1aTFkZW4KK2U0czVpZzFuNGEKK2VzMmlnCitlMnM1aW0KK2UyczRpNG4KK2VzaXM0dGUKK2Uxc2lzCitlNXNpNHUKK2U1c2tpbgorZXNrMgorZXNrMWkKK2VzNG1pCitlMnMxbQorZTJzb2wKK2Uxc28KK2VzM29sdQorZTJzbzJuCitlczVvMW4xYTQKK2Uxc3AKK2UyczNwZXIKK2VzNXBpMXJhCitlc3A0aXIKK2VzNHByZQorZXNwcjIKKzJlMnNzCitlczRzaTRiCitlczFzaQorZXN0YTJuNAorZXMxdGEKK2VzM3QyaWcKK2VzdDJpCitlczV0aW0KKzRlczJ0bworZTNzdG8ybgorMmVzdDRyCitlNXN0cm8KK2VzdHJ1YzUKK2Uyc3UycgorZTFzdQorZXM1dXIxcjQKK2VzNHcyCitlMnRhNGIKK2UxdGEKK2UzdGVuNGQKK2UzdGVvCitldGhvZDMKK2V0MWljCitlNXRpZGUKK2V0MmlkCitlMnQxaW40CitldDJpNG5vCitlNXQ0aXIKK2U1dDJpMXQyaW8KK2V0aTF0aQorZXQ1aTF0Mml2Cis0ZTJ0MW4yCitldDVvMW4xYQorZTF0bworZXRvMm4KK2UzdHJhCitlM3RyZQorZXQzcmljCitldDVyaWYKK2V0M3JvZworZXQ1cm9zCitldDN1MWEKK2UxdHUKK2V0NXltCitlMXR5CitlNHQ1egorNGV1CitlNXVuCitlM3VwCitldTNybworZTJ1czQKK2V1dGU0CitldXRpNWwKK2U0dTF0MmkKK2V1NXRyCitldmEycDUKK2UxdmEKK2UydmFzCitldjVhc3QKK2U1dmVhCitldjNlbDFsCitldmU0bDNvCitlNXZlbmcKK2V2ZW40aQorZXYxZXIKK2U1djJlcjFiCitlMXZpCitldjNpZAorZTJ2aTRsCitlNHYxaW4KK2UzdjJpNHYKK2U1dm9jCitlNXZ1CitlMXdhCitlNHdhZworZTV3ZWUKK2Uzd2gKK2V3aWw1Citld2kyCitldzNpbjRnCitlM3dpdAorMWV4M3AKKzVleTFjCis1ZXllLgorZXlzNAorMWZhCitmYTNiMmwyCitmNGFiM3IKK2ZhNGNlCis0ZmFnCitmYTRpNG40CitmYWkyCitmYWwybDVlCitmYWwxbAorNGY0YTRtYQorZmFtNWlzCis1ZjJhMnIKK2ZhcjV0aAorZmEzdGEKK2ZhM3RoMmUKK2Y0YXRoCis0ZmExdG8KK2ZhdTRsdDUKK2ZhdTRsMgorNGY1YgorNGZkCis0ZmUuCitmZWFzNAorZmU0YXRoMworZmVhMnQKK2YyZTRiCis0ZmUxY2EKKzVmZTJjMXQKKzJmZWQKK2ZlM2wyaQorZmU0bW8KK2ZlbjJkCitmZW4xZDVlCitmZXIxCis1ZmVyMXI0CitmZXY0Cis0ZjFmCitmNGZlcworZjRmMmllNAorZjFmaQorZjVmMmluLgorZjJmaW4KK2YyZjVpcworZjRmMmx5NQorZmY0bDIKK2YyZnkKKzRmaAorMWZpCitmMmkzYQorMmYzaWMuCis0ZjNpY2FsCitmaTFjYQorZjNpY2EybgorNGZpY2F0ZQorZjNpMWNlbgorZmkzY2VyCitmMmkxYzRpCis1ZmkzYzJpMWEKKzVmaWMyaWU0Cis0Zmk0YzNzMgorZmkzY3UKK2ZpNWRlbAorZjJpZAorZmlnaHQ1CitmMmlnCitmaWw1aQorZmlsMmw1aW40CitmaWwxbAorZmlsbDJpCis0ZmkxbHkKKzJmaW4KKzVmaTFuYQorZjRpbjJkNQorZjJpMm5lCitmMWluM2cKK2YyaTRuNG4yCitmaXM0dDJpCitmNGwyCitmNWwyZTJzcworZmxlczIKK2ZsaW40CitmbG8zcmUKK2YybHk1Cis0Zm0KKzRmbgorMWZvCis1Zm8ybgorZm9uNGRlCitmMm9uZAorZm9uNHQKK2ZvMnIKK2ZvNXJhdAorZm8xcmEKK2ZvcjVheQorZm9yZTV0Citmb3I0aQorZm9yMXQ1YQorZm9zNQorNGY1cAorZnJhNHQKK2Y1cmVhCitmcmVzNWMKK2ZyaTIKK2ZyaWw0Citmcm9sNQorMmYzcworMmZ0CitmNHRvCitmMnR5CiszZnUKK2Z1NWVsCis0ZnVnCitmdTRtaW4KK2Z1MW1pCitmdTVuZQorZnUzcmkKK2Z1c2k0CitmMnVzCitmdTJzNHMKKzRmdTF0YQorMWZ5CisxZ2EKK2dhMmY0Cis1Z2FsLgorM2dhbDFpCitnYTNsbworMmdhbQorZ2E1bWV0CitnNWEybW8KK2dhbjVpcworZ2EybgorZ2Ezbml6CitnYW5pNXphMQorNGdhbm80CitnYXI1bjQKK2cyYTJyCitnYTJzczQKK2c0YXRoMworNGdhMXQyaXYKKzRnYXoKK2czYgorZ2Q0CisyZ2UuCisyZ2VkCitnZWV6NAorZ2VsNGluCitnZWwyaQorZ2U1bGlzCitnZTVsMWl6Cis0Z2UxbHkKKzFnZW4KK2dlNG4yYXQKK2dlMW5hCitnNWU1bml6Cis0ZzRlbm8KKzRnZW55CisxZ2VvCitnZTNvbQorZzRlcnkKKzVnZTFzaQorZ2V0aDUKKzRnZTF0bworZ2U0dHkKK2dlNHYKKzRnMWcyCitnMmdlCitnM2dlcgorZ2dsdTUKK2dnbDIKK2cxZ280CitnaDNpbgorZ2g1b3V0CitnaG91MgorZ2g0dG8KKzVnaS4KKzFnMmk0YQorZ2kyYTVyCitnMWljCis1Z2kzYzJpMWEKK2cyaTFjaQorZzRpMWNvCitnaWVuNQorZzJpZTQKKzVnaWVzLgorZ2lsNAorZzNpMW1lbgorM2c0aW4uCitnNGluNWdlCis1ZzRpMm4xczIKKzVnMmlvCiszZzRpcgorZ2lyNGwKK2czaXMxbDIKK2dpNHUKKzVnMml2CiszZ2l6CitnbDIKK2dsYTQKK2dsMmFkNWkKK2dsYTJkCis1Z2xhcworMWdsZQorZ2xpNGIKK2czbDJpZworM2dsbworZ2xvM3IKK2cxbQorZzRteQorZzFuNGEKK2c0bmEuCitnbmU0dDR0MgorZzFuaQorZzJuMWluCitnNG4yaTRvCitnMW5vCitnNG5vNG4KKzFnbworM2dvLgorZ29iNQorNWdvZQorM2c0bzRnCitnbzNpcworZ29pMgorZ28ybjIKKzRnM28zbjFhCitnb241ZG81CitnMm9uZAorZ28zbmkKKzVnb28yCitnbzVyaXoKK2dvcjVvdTIKKzVnb3MuCitnb3YxCitnM3AKKzFncgorNGdyYTFkMmEKK2dyYTJkCitnNHIyYWkyCitncmEybjIKKzVncmE0cGguCitnNXJhM3BoNGVyCis1Z3JhcGgxaWMKK2dyNGFwaGkKKzRnM3JhMXBoeQorNGdyYXkKK2dyZTRuCis0Z3Jlc3MuCitncjJlMnNzCis0Z3JpdAorZzRybworZ3J1ZjQKK2dzMgorZzVzdGUKK2d0aDMKK2d1NGEKKzNndWFyMmQKK2d1MmEycgorMmd1ZQorNWd1aTV0CitnMnVpMgorM2d1bgorM2cydXMKKzRndTR0CitnM3cKKzFneQorMmc1eTNuCitneTVyYQoraDNhYjRsMgoraGEyY2g0CitoYWU0bQoraGFlNHQKK2g1YWd1CitoYTNsYQoraGFsYTNtCitoYTRtCitoYW40Y2kKK2hhMm4KK2hhbjRjeQorNWhhbmQuCitoNGFuZAoraDJhbjRnCitoYW5nNWVyCitoYW4xZzVvCitoNWE1bml6CitoYTRuNGsyCitoYW40dGUKK2hhbjF0CitoYTJwM2wyCitoYTJwNXQKK2hhM3JhMm4KK2gyYTJyCitoYTVyMmFzCitoYXIyZAoraGFyZDNlCitoYXI0bGU0CitoYXIxbAoraGFycDVlbgoraGFyMnAKK2hhcjV0ZXIKK2hhMnM1cworaGF1bjQKKzVoYXoKK2hhejNhMQoraDFiCisxaGVhMmQxCiszaGUyYTJyCitoZTRjYTJuCitoZTFjYQoraDVlY2F0CitoNGVkCitoNGU1ZG81CitoZTNsNGkKK2hlbDRsaXMKK2hlbDFsCitoZWxsMmkKK2hlbDRseQoraDVlbG8KK2hlNG00cAoraGUybgoraGUxbmE0CitoZW41YXQKK2hlMW81cgoraGVwNQoraDRlcjFhCitoZXJhM3AKK2hlcjRiYQoraDJlcjFiCitoZXJlNWEKK2gzZXJuCitoNWVyMW91MgoraDJlcm8KK2gzZXJ5CitoMWVzCitoZTJzNXAKK2hlNHQKK2hlMnQ0ZWQKK2g0ZXU0CitoMWYKK2gxaAoraGk1YTJuCitoMmkxYQoraGk0Y28KK2hpZ2g1CitoMmlnCitoNGlsMgoraGltZXI0CitoNGkxbmEKK2hpb240ZQoraDJpbworaGlvMm4KK2gyaTRwCitoaXI0bAoraDRpcgoraGkzcm8KK2hpcjRwCitoaXI0cjQKK2hpczNlbAoraDRpc2UKK2g0aTJzNHMKK2hpdGg1ZXIKK2gyaXRoCitoaXRoMmUKK2gyaTJ2Cis0aGsKKzRoMWw0CitobGEybjQKK2gybG8KK2hsbzNyaQorNGgxbQoraG1ldDQKKzJoMW4KK2g1b2RpegoraDVvMmQxczIKK2hvNGcKK2hvMWdlNAoraG9sNWEycgoraG8xbGEKKzNob2w0ZQoraG80bWEKK2hvMm1lMworaG8xbjRhCitobzJuCitobzVueQorM2hvb2QKK2hvbzIKK2hvbzJuNAoraG9yNWF0CitobzFyYQoraG81cjJpcworaG9ydDNlCitobzVydQoraG9zNGUKK2hvNXNlbgoraG9zMXAKKzFobzJ1cworaG91MgoraG91c2UzCitob3Y1ZWwKKzRoNXAKKzRocjQKK2hyZWU1Citocm81bml6Citocm8ybgoraHJvM3BvCis0aDFzMgoraDRzMmgKK2g0dDJhMnIKK2gxdGEKK2h0MWVuCitodDVlcworaDR0eQoraHU0ZworaHU0bWluCitodTFtaQoraHVuNWtlCitodTRuazIKK2h1bjR0CitodXMzdDQKK2gydXMKK2h1NHQKK2gxdworaDR3YXI0dAoraHcyYTJyCitoeTNwZQoraHkzcGgKK2h5MnMKKzJpMWEKK2kyYWwKK2lhbTQKK2lhbTVlMXRlCitpMmEybgorNGlhbmMKK2lhbjNpCis0aWFuNHQKK2lhNXBlCitpYTJzczQKK2k0YTF0Mml2CitpYTR0cmljCitpYTF0cgoraTRhMnR1CitpYmU0CitpYjNlcjFhCitpYjVlcnQKK2liNWkxYQoraWIzaW4KK2liNWl0LgoraWJpMnQKK2liNWl0ZQoraTFiMmwyCitpYjNsaQoraTVibworaTFicgoraTJiNXJpCitpNWJ1NG4KKzRpY2FtCitpMWNhCis1aWNhcAorNGljMmEycgoraTRjYXIuCitpNGNhcmEKK2ljYXM1CitpNGNheQoraWNjdTQKK2ljM2MKKzRpY2VvCis0aTJjaAorMmkxY2kKK2k1YzJpZAoraWM1aTFuYQoraTJjaW4KK2kyYzJpcAoraWMzaTFwYQoraTRjMWx5NAoraTFjNGw0CitpMmM1b2MKK2kxY28KKzRpMWNyCis1aWNyYQoraTRjcnkKK2ljNHRlCitpMmMxdAoraWMxdHUyCitpYzR0M3UxYQoraWMzdTFsYQoraWM0dW0KK2ljNXVvCitpM2N1cgorMmlkCitpNGRhaTIKK2kxZDJhCitpZDVhbmMKK2lkYTJuCitpZDVkNAoraWRlM2E0bAoraWRlNHMyCitpMmRpCitpZDVpMmEybgoraTFkNGkzYQoraWRpNGEycgoraTVkMmllNAoraTFkM2lvCitpZGk1b3UyCitpZDFpdAoraWQ1aTF1CitpM2RsZQoraTRkb20KK2kxZG8KK2lkM293CitpNGRyCitpMmR1CitpZDV1bworMmllNAoraWVkNGUKKzVpZTVnYQoraWUybGQzCitpZTFuNWE0CitpZW40ZQoraTVlNG4xbjIKK2kzZW50MmkKK2llbjF0CitpMWVyLgoraTNlczJjCitpMWVzdAoraTNldAorNGlmLgoraWY1ZXJvCitpZmVyMQoraWZmNWVuCitpNGYxZgoraWY0ZnIKKzRpMmYzaWMuCitpMWZpCitpM2YyaWU0CitpM2Y0bDIKKzRpMmZ0CisyaWcKK2lnYTViCitpMWdhCitpZzNlcjFhCitpZ2h0M2kKKzRpZ2kKK2kzZ2liCitpZzNpbDQKK2lnM2luCitpZzNpdAoraTRnNGwyCitpMmdvCitpZzNvcgoraWc1b3QKK2k1Z3JlCitpMWdyCitpZzJ1NWkyCitpZzF1cgoraTNoCis0aTVpNAoraTNqCis0aWsKK2kxbGEKK2lsM2E0YgoraTRsNGFkZQoraWxhMmQKK2kybDVhbQoraWxhNXJhCitpbDJhMnIKK2kzbGVnCitpbDFlcgoraWxldjQKK2kybDVmCitpbDFpCitpbDNpMWEKK2lsMmliCitpbDNpbworaWw0aXN0CisyaWwxaXQKK2lsMml6CitpbGw1YWIKK2lsMWwKKzRpMmwxbjIKK2lsM28xcQoraWw0dHkKK2k0bHQKK2lsNXVyCitpbDN2CitpNG1hZworaTFtYQoraW0zYWdlCitpbWE1cnkKK2ltMmEycgoraW1lbnQyYTVyCitpMW1lbgoraTNtZW4xdAoraW1lbjF0YQorNGltZXQKK2ltMWkKK2ltNWkxZDRhCitpbTJpZAoraW1pNWxlCitpNW0yaW5pCis0aW1pdAoraW00bmkKK2k0bTFuCitpM21vMm4KK2kxbW8KK2kybXUKK2ltM3UxbGEKKzJpbi4KK2k0bjNhdQoraTFuYQorNGluYXYKK2luY2VsNAoraW4zY2VyCis0aW5kCitpbjVkbGluZworMmluZQoraTNuZWUKK2luNGVyNGEycgoraW4xZXIKK2luZXIxYQoraTVuMmUyc3MKK2kxbmVzCis0aW4xZ2EKKzRpbmdlCitpbjVnZW4KKzRpbmdpCitpbjVnbGluZworaW5nbDIKKzRpbjFnbworNGluMWd1CisyaW5pCitpNW5pLgoraTRuNGkxYQoraW4zaTRvCitpbjFpcworaTVuaTR0ZS4KK2luMml0CitpbjJpdGUKKzVpM24yaTF0MmlvCitpbmkxdGkKK2luM2kxdHkKKzRpNG5rMgorNGk0bjFsCisyaTRuMW4yCisyaTFubworaTRubzRjCitpbm80cworaTRub3QKKzJpMm4xczIKK2luM3NlCitpbnN1MXI1YQoraW4xc3UKK2luc3UycgorMmludC4KK2luMXQKKzJpbjR0aAoraW4xdQoraTVuMnVzCis0aW55CisyaW8KKzRpby4KK2lvMWdlNAoraW8yZ3IKK2kxb2wKK2lvNG0KK2lvbjNhdAoraW8ybgoraW8xbjFhCitpb240ZXJ5Citpb24xZXIKK2lvbjNpCitpMm81cGgKK2lvcjNpCitpNG9zCitpNG81dGgKK2k1b3RpCitpbzR0bworaTRvdXIKK2lvdTIKKzJpcAoraXBlNAoraXBocjJhczQKK2lwNGhyNAoraXAzaQoraXA0aWMKK2lwNHJlNAoraXByMgoraXAzdWwKK2kzcXVhCitpcXUyCitpcTV1ZTFmCitpcTN1MmlkCitpcTJ1aTIKK2lxM3VpM3QKKzRpcgoraTFyYQoraTJyYTRiCitpNHJhYworaXJkNWUKK2lyZTRkZQoraTJyMmVkCitpNHJlMWYKK2k0cmVsNAoraTRyZXMKK2lyNWdpCitpcmcyCitpcjFpCitpcmk1ZGUKK2lyMmlkCitpcjRpcworaXJpM3R1Cis1aTVyMml6CitpcjRtaW4KK2lyMW0KK2lybzRnCis1aXJvbi4KK2lybzJuCitpcjV1bAorMmlzLgoraXM1YWcKK2lzYTIKK2lzM2EycgoraXNhczUKKzJpczFjCitpczNjaDIKKzRpc2UKK2lzM2VyCiszaTRzM2YKK2lzNWhhMm4KK2lzMmgKK2lzM2hvMm4zCitpc2hvNAoraXNoNW9wCitpczNpMWIKK2lzMmk0ZAoraTVzaXMKK2lzNWkxdDJpdgoraXNpMXRpCis0aXM0azIKK2lzbGEybjQKK2lzMWwyCis0aXM0bTFzMgoraTJzMW0KK2kyc28KK2lzbzVtZXIKK2kzc29tCitpc28ybWUKK2lzMXAKK2lzMnBpCitpczRweQorNGkyczFzCitpczRzYWwKK2lzMXNhMgoraXNzZW40CitpczRzMWU0cworaXM0dGEuCitpczF0YQoraXMxdGUKK2lzMXQyaQoraXN0NGx5CitpczJ0bAorNGlzdHJhbAoraXN0NHIKK2lzMXRyYQoraTJzdQoraXM1dXMKKzRpM3RhLgoraTF0YQoraXRhNGJpCitpMnRhYgoraTR0YWcKKzRpdGE1bQoraTN0YTJuCitpM3RhdAorMml0ZQoraXQzZXIxYQoraTV0ZXIxaQoraXQ0ZXMKKzJpdGgKK2kxdGkKKzRpMXQyaTFhCis0aTJ0aWMKK2l0M2kxY2EKKzVpNXRpY2sxCitpMnQzaWcKK2l0NWlsMWwKK2kydGltCisyaTF0MmlvCis0aXRpcworaTR0aTJzNG0KK2kydDVvNW0KK2kxdG8KKzRpdG8ybgoraTR0cmFtCitpMXRyYQoraXQ1cnkKKzRpNHQzdDIKK2l0M3UxYXQKK2kxdHUKK2l0dTFhCitpNXR1ZDIKK2l0M3VsCis0aXR6LgoraTR0egoraTF1CisyaXYKK2l2M2VsMWwKK2l2M2VuLgoraTR2M2VyLgoraTR2ZXJzLgoraXZlNHIxczIKK2l2NWlsLgoraTJ2aWwKK2l2NWlvCitpdjFpdAoraTV2b3JlCitpdjNvM3JvCitpNHYzb3QKKzRpNXcKK2l4NG8KKzRpeQorNGl6MmEycjIKK2l6YTEKK2kyejFpNAorNWl6b24xdAoraTF6bworaXpvMm4KKzVqYQoramFjNHEKK2phNHAKKzFqZQoramU0cjVzMgorNGplczR0MmllNAoramVzdDJpCis0amVzMnR5CitqZXczCitqbzRwCis1anVkZworM2thLgorazNhYgorazVhZwora2FpczQKK2thaTIKK2thbDQKK2sxYgorazJlZAorMWtlZQora2U0Zwora2U1bDJpCitrM2VuNGQKK2sxZXIKK2tlczQKK2szZTJzdC4KK2tlNHR5CitrM2YKK2toNAorazFpCis1a2kuCis1azJpYworazRpbDFsCitraWxvNQorazRpbQorazRpbi4KK2tpbjRkZQorazRpbmQKK2s1aTVuMmUyc3MKK2syaW5lCitraTFuZXMKK2tpbjRnCitrMmk0cAora2lzNAorazVpczJoCitrazQKK2sxbAorNGszbGV5Cis0azFseQorazFtCitrNW5lcworMWsybm8KK2tvNXIKK2tvczJoNAorazNvdTIKK2tybzVuCis0azFzMgorazRzYwora3M0bDIKK2s0czR5CitrNXQKK2sxdworbGFiM2ljCitsNGFibworbDRhMmNpNAorbDRhZGUKK2xhMmQKK2xhM2QyeQorbGFnNG4KK2xhMm0zbworM2w0YW5kCitsYTJuCitsYW40ZGwKK2xhbjVldAorbGFuNHRlCitsYW4xdAorbGFyNGcyCitsMmEycgorbGFyM2kKK2xhczRlCitsYTV0YTJuCitsYTJ0YQorNGxhdGVsMmk0Cis0bGExdDJpdgorNGxhdgorbGE0djRhCisybDFiCitsYmluNAorNGwxYzIKK2xjZTQKK2wzY2kKKzJsZAorbDJkZQorbGQ0ZXJlCitsZDRlcjFpCitsZGk0CitsZDVpczEKK2wzZHIKK2w0ZHJpCitsZTJhCitsZTRiaQorbDJlMWIKK2xlMmZ0NQorbGUxZgorNWxlZy4KKzVsZTRnMWcyCitsZTRtYXQKK2xlMW1hCitsZW01YXQxaWMKKzRsZW4uCiszbGVuYworNWxlMm5lLgorMWxlbjF0CitsZTNwaAorbGU0cHIyCitsZTJyYTViCitsZXIxYQorbGVyNGUKKzNsZXJnMgorM2w0ZXIxaQorbDRlcm8KK2xlczIKK2xlNXMxY28KK2xlczJjCis1bGVzcQorM2wyZTJzcworNWxlc3MuCitsM2UxdmEKK2xldjRlci4KK2xldjFlcgorbGV2NGVyMWEKK2xldjRlNHIxczIKKzNsZXkKKzRsZXllCisybGYKK2w1ZnIKKzRsMWc0CitsNWdhCitsZzJhMnIzCitsNGdlcworbDFnbzMKKzJsM2gKK2xpNGFnCitsMmkxYQorbGkyYW00CitsaWFyNWl6CitsaTJhMnIKK2xpYXIxaQorbGk0YXMKK2xpNGExdG8KK2xpNWJpCis1bGljMmlvCitsMmkxY2kKK2xpNGNvcgorbGkxY28KKzRsaTRjM3MyCis0bGljdC4KK2xpMmMxdAorbDRpY3UKK2wzaTFjeQorbDNpMWQyYQorbDJpZAorbGlkNWVyCiszbGkyZGkKK2xpZjNlcjEKK2w0aTRmMWYKK2xpNGY0bDIKKzVsaWdhdGUKK2wyaWcKK2xpMWdhCiszbGlnaAorbGk0Z3JhCitsaTFncgorM2w0aWsKKzRsNGk0bAorbGltNGIybDIKK2xpNG0xYgorbGltM2kKK2xpNG1vCitsNGk0bTRwCitsNGkxbmEKKzFsNGluZQorbGluM2VhCitsMmluM2kKK2xpbms1ZXIKK2w0aTRuazIKK2xpNW9nCitsMmlvCis0bDRpcQorbGlzNHAKK2wxaXQKK2wyaXQuCis1bGl0M2kxY2EKK2xpMXRpCitsNGkydGljCitsNWk1dGk0YzNzMgorbGl2M2VyCitsMml2CitsMWl6Cis0bGoKK2xrYTMKK2wza2FsNAorbGthNHQKK2wxbAorbDRsYXcKK2wybGUKK2w1bGUyYQorbDNsZWMKK2wzbGVnCitsM2xlbAorbDNsZTRuCitsM2xlNHQKK2xsMmkKK2wybGluNAorbDVsNGkxbmEKK2xsNG8KK2xsb3EydWk1CitsbG8xcQorbGxvcXUyCitsMmw1b3V0CitsbG91MgorbDVsb3cKKzJsbQorbDVtZXQKK2xtM2luZworbDRtbzJkMQorbDFtbworbG1vMm40CisybDFuMgorM2xvLgorbG9iNWFsCitsbzRjaQorNGxvZgorM2xvZzFpYworbDVvMWdvCiszbG9ndQorbG9tM2VyCitsbzJtZQorNWxvbmcKK2xvMm4KK2xvbjRpCitsM28zbml6Citsb29kNQorbG9vMgorNWxvNHBlLgorbG9wM2kKK2wzbzRwMW0KK2xvMXJhNAorbG80cmExdG8KK2xvNXIyaWU0Citsb3I1b3UyCis1bG9zLgorbG9zNWV0Cis1bG9zNW8zcGhpegorbG8yc28KK2xvczRvcAorbG9zMm9waAorNWxvczVvMXBoeQorbG9zNHQKK2xvNHRhCitsb3VuNWQKK2xvdTIKKzJsb3V0Cis0bG92CisybHAKK2xwYTViCitsMXBhCitsM3BoYQorbDVwaGkKK2xwNWluZworbHBpMm4KK2wzcGl0CitsNHAybDIKK2w1cHIyCis0bDFyCisybDFzMgorbDRzYworbDJzZQorbDRzMmllNAorNGx0CitsdDVhZworbDF0YQorbHRhbmU1CitsdGEybgorbDF0ZQorbHRlbjQKK2x0ZXIxYTQKK2x0aDNpCitsNXRpZXMuCitsdDJpZTQKK2x0aXM0CitsMXRyCitsMXR1MgorbHR1MXIzYQorbHU1YQorbHUzYnIKK2x1MmNoNAorbHUzY2kKK2x1M2VuCitsdWY0CitsdTVpZAorbDJ1aTIKK2x1NG1hCis1bHUxbWkKK2w1dW1uLgorbHU0bTFuCis1bHVtM240aTFhCitsdTNvCitsdW8zcgorNGx1cAorbHUyc3M0CitsMnVzCitsdXMzdGUKKzFsdXQKK2w1dmVuCitsNXZldDQKKzJsMXcKKzFseQorNGx5YQorNGx5MWIKK2x5NW1lNAorbHkzbm8KKzJseXM0CitsNXkzczJlCisxbWEKKzJtYWIKK21hMmNhCittYTVjaDJpbmUKK21hMmNoCittYTRjaDFpbgorbWE0YzRsNAorbWFnNWluCittYWcxaQorNW1hZzFuCisybWFoCittYTJpZDUKK21haTIKKzRtYTJsZAorbWEzbDJpZworbWFsMWkKK21hNWxpbgorbWFsNGwyaQorbWFsMWwKK21hbDR0eQorbWE0bHQKKzVtYTNuNGkxYQorbWEybgorbWFuNWlzCittYW4zaXoKKzRtYXAKK21hNXJpMm5lLgorbTJhMnIKK21hcjFpCittYXIyaW40ZQorbWE1cjJpegorbWFyNGx5CittYXIxbAorbWFyM3YKK21hNXNjZQorbWFzNGUKK21hczF0Cis1bWF0ZQorbTRhdGgzCittYTN0aXMKKzRtYXRpM3phMQorbWExdGl6Cis0bTFiCittMWJhNHQ1CittNWJpbAorbTRiM2luZworbWIyaTR2Cis0bTVjCis0bWUuCisybWVkCis0bWVkLgorNW1lM2Q0aTNhCittNGVkaQorbWUzZDJpZTQKK201ZTVkMnkKK21lMmcKK21lbDVvMm4KK21lNGw0dAorbWUybQorbWUxbTFvMworMW1lbgorbWUxbjRhCittZW41YWMKK21lbjRkZQorNG1lbmUKK21lbjRpCittZTJuMXM0CittZW4xc3U1CiszbWVuMXQKK21lbjR0ZQorbWU1bzJuCittNWVyMXNhMgorbWU0cjFzMgorMm1lcworM21lc3QyaQorbWU0dGEKK21ldDNhMmwKK21lMXRlCittZTV0aGkKK200ZXRyCis1bWV0M3JpYworbWU1dHIyaWU0CittZTN0cnkKK21lNHYKKzRtMWYKKzJtaAorNW1pLgorbTJpM2EKK21pMWQ0YQorbTJpZAorbWlkNGcKK20yaWc0CiszbWlsM2kxYQorbWlsMWkKK201aTVsMmllNAorbTRpbDFsCittaTFuNGEKKzNtNGluZAorbTVpM25lZQorbTJpbmUKK200aW5nbDIKK21pbjVnbGkKK201aW5nMWx5CittaW40dAorbTRpbjF1CittaW90NAorbTJpbworbTJpcworbWk0czRlci4KK200aXNlCittaXMzZXIKK21pczVsMgorbWlzNHQyaQorbTVpNHN0cnkKK21pc3Q0cgorNG0yaXRoCittMml6Cis0bWsKKzRtMWwKK20xbQorbW1hNXJ5CittMW1hCittbTJhMnIKKzRtMW4KK20xbjRhCittNG4xaW4KK21uNG8KKzFtbworNG1vY3IKKzVtb2M1cmExdGl6CittbzJkMQorbW80Z28KK21vaXMyCittb2kyCittbzRpNXNlCis0bTJvaworbW81bGVzdAorbW9sZXMyCittbzNtZQorbW9uNWV0CittbzJuCittb241Z2UKK21vM240aTNhCittb240aTJzMW0KK21vbjFpcworbW9uNGlzdAorbW8zbml6Cittb25vbDQKK21vM255LgorbW8ycgorNG1vNXJhLgorbW8xcmEKK21vczIKK21vNXNleQorbW8zc3AKK200b3RoMworbTVvdWYKK21vdTIKKzNtbzJ1cworbW8ydgorNG0xcAorbXBhcmE1CittMXBhCittcDJhMnIKK21wYTVyYWIKK21wNGE0cjVpCittM3BlMnQKK21waGFzNAorbTJwaQorbXAyaTRhCittcDVpZXMKK21wMmllNAorbTRwMWkybgorbTVwNGlyCittcDVpcworbXBvM3JpCittMXA0b3IKK21wb3M1aXRlCittMXBvcworbTRwbzJ1cworbXBvdTIKK21wb3Y1CittcDR0cgorbTJwMXQKK20ycHkKKzRtM3IKKzRtMXMyCittNHMyaAorbTVzaQorNG10CisxbXUKK211bDJhNXI0CittdTFsYQorNW11NGx0CittdWwxdGkzCiszbXVtCittdW4yCis0bXVwCittdTR1Cis0bXcKKzFuYQorMm4xYTJiCituNGFidQorNG5hYy4KK25hNGNhCituNWEyYzF0CituYWc1ZXIuCituYWs0CituYTRsMWkKK25hNWwyaTFhCis0bmE0bHQKK25hNW1pdAorbjJhMm4KK25hbjFjaTQKK25hbjRpdAorbmE0bms0CituYXIzYworbjJhMnIKKzRuYXJlCituYXIzaQorbmFyNGwKK241YXIxbQorbjRhcworbmFzNGMKK25hczV0MmkKK24yYXQKK25hM3RhMmwKK25hMnRhCituYXQ1bzVtMml6CituYTJ0b20KK25hMXRvCituMmF1CituYXUzc2UKK25hMnVzCiszbmF1dAorbmF2NGUKKzRuMWI0CituYzJhMnI1CituMWNhCituNGNlcy4KK24zY2hhCituMmNoCituNWNoZW8KK25jaGUyCituNWNoNGlsMgorbjNjaGlzCituMmMxaW4KK24xY2kKK24yYzRpdAorbmNvdTFyNWEKK24xY28KK25jb3UyCituMWNyCituMWN1CituNGRhaTIKK24xZDJhCituNWRhMm4KK24xZGUKK25kNWUyc3QuCituZGVzMgorbmRpNGIKK241ZDJpZgorbjFkaXQKK24zZGl6CituNWR1MmMKK24xZHUKK25kdTRyCituZDJ3ZQorbmQxdworMm5lLgorbjNlMmEycgorbjJlMmIKK25lYjN1CituZTJjCis1bmVjazEKKzJuZWQKK25lNGdhdAorbmUxZ2EKK25lNGc1YTF0Mml2Cis1bmVnZQorbmU0bGEKK25lbDVpegorbmVsMmkKK25lNW1pCituZTRtbworMW5lbgorNG5lbmUKKzNuZW8KK25lNHBvCituZTJxCituMWVyCituZTJyYTViCituZXIxYQorbjRlcjNhMnIKK24yZXJlCituNGVyNWkKK25lcjRyNAorMW5lcworMm5lcy4KKzRuZTFzcAorMm5lc3QKKzRuZXM0dzIKKzNuZXQxaWMKK25lNHYKK241ZXZlCituZTR3CituM2YKK240Z2FiCituMWdhCituM2dlbAorbmdlNG40ZQorbjFnZW4KK241Z2VyZQorbjNnZXIxaQorbmc1aGEKK24zZ2liCituZzFpbgorbjVnaXQKK240Z2xhNAorbmdsMgorbmdvdjQKK24xZ28KK25nNXMyaAorbmdzMgorbjFndQorbjRndW0KK24yZ3kKKzRuMWg0CituaGE0CituaGFiMworbmhlNAorM240aTFhCituaTNhMm4KK25pNGFwCituaTNiYQorbmk0YjJsMgorbjJpNGQKK25pNWRpCituaTRlcgorbjJpZTQKK25pMmZpCituaTVmaWNhdAorbmlmaTFjYQorbjVpMWdyCituMmlnCituNGlrNAorbjFpbQorbmkzbTJpegorbmltMWkKK24xaW4KKzVuaTJuZS4KK24yaW5lCituaW40ZworbjJpNG8KKzVuMmlzLgorbmlzNHRhCituMml0CituNGl0aAorM24yaTF0MmlvCituaTF0aQorbjNpdG9yCituaTF0bworbmkzdHIKK24xagorNG5rMgorbjVrMmVybworbmsxZXIKK24za2V0CituazNpbgorbmsxaQorbjFrMWwKKzRuMWwKK241bQorbm1lNAorbm1ldDQKKzRuMW4yCitubmU0CitubmkzYWwKK24zbjRpMWEKK25uMmk0dgorbm9iNGwyCitubzNibGUKK241bzFjNGw0Cis0bjNvMmQKKzNub2UKKzRub2cKK25vMWdlNAorbm9pczVpCitub2kyCitubzVsNGkKKzVub2wxbzFnaXMKKzNub21pYworbjVvNW0yaXoKK25vNG1vCitubzNteQorbm80bgorbm9uNGFnCitubzFuMWEKK25vbjVpCituNW9uaXoKKzRub3AKKzVub3A1bzVsMmkKK25vMnI1YWIKK25vMXJhCitubzRyYXJ5Citub3IyYTJyCis0bm9zMmMKK25vczRlCitub3M1dAorbm81dGEKKzFub3UyCiszbm91bgorbm92M2VsMworbm93bDMKK24xcDQKK25waTQKK25wcmU0YworbnByMgorbjFxCituMXIKK25ydTQKKzJuMXMyCituMnM1YWIKK25zYTIKK25zYXRpNAorbnM0YworbjJzZQorbjRzM2U0cworbnMyaWQxCituczJpZzQKK24yczFsMgorbjJzM20KK240c29jCituMXNvCituczRwZQorbjVzcGkKK25zdGE1YjJsMgorbnMxdGEKK25zMnRhYgorbjF0CituMnRhNGIKK24xdGEKK250ZTRyM3MyCitudDJpCituNXRpMmIKK250aTRlcgorbnQyaWU0CitudGkyZjIKK24zdDJpbmUKK24ydDFpbgorbjR0M2luZworbnQyaTRwCitudHJvbDVsMmkKK250cm9sMWwKK240dDRzMgorbnR1M21lCituMXR1CituM3R1bQorbnUxYQorbnU0ZAorbnU1ZW4KK251ZjRmZQorbnU0ZjFmCituM3VpNG4KK24ydWkyCiszbnUzaXQKK240dW0KK251MW1lCituNXUxbWkKKzNudTRuCituM3VvCitudTN0cgorbjF2MgorbjF3NAorbnltNAorbnlwNAorNG56CituM3phMQorNG9hCitvYTJkMworbzVhNWxlczIKK28yYWxlCitvYXJkMworbzJhMnIKK29hczRlCitvYXN0NWUKK29hdDVpCitvYjNhM2IKK281YjJhMnIKK28xYmU0bAorbzFiaQorbzJiaW4KK29iNWluZworbzNicgorb2IzdWwKK28xY2UKK28yY2g0CitvM2NoZTR0CitvY2hlMgorb2NpZjMKK28xY2kKK280Y2lsCitvNGNsYW0KK28xYzRsNAorbzRjb2QKK28xY28KK29jM3JhYworb2M1cmExdGl6CitvY3JlMworNW9jcml0CitvY3JpMgorb2N0bzJyNWEKK28yYzF0CitvYzF0bworb2MzdTFsYQorbzVjdXJlCitvZDVkMWVkCitvZDFkNAorb2QzaWMKK28xZDJpM28KK28yZG80CitvZDRvcjMKK280ZDV1Y3QuCitvMWR1CitvZHUyYworb2R1MmMxdAorbzRkNXVjNHQxczIKK280ZWwKK281ZW5nCitvM2VyCitvZTR0YQorbzNldgorbzJmaQorb2Y1aXRlCitvZjRpNHQ0dDIKK28yZzVhNXIKK28xZ2EKK280ZzVhMXQyaXYKK280Z2ExdG8KK28xZ2UKK281Z2VuZQorbzFnZW4KK281Z2VvCitvNGdlcgorbzNnMmllNAorMW8xZ2lzCitvZzNpdAorbzRnbDIKK281ZzJseQorM29nbml6CitvZzFuaQorbzRnNHJvCitvMWdyCitvZzJ1NWkyCisxbzFneQorMm8yZzV5M24KK28xaDIKK29oYWI1CitvaTIKK29pYzNlcworb2kzZGVyCitvMmlkCitvaTRmMWY0CitvMmlnNAorb2k1bGV0CitvM2luZworb2ludDVlcgorb2luMXQKK281aTJzMW0KK29pNXNvMm4KK29pMnNvCitvaXN0NWVuCitvaXMxdGUKK29pM3RlcgorbzJpdGUKK281agorMm9rCitvM2tlbgorb2s1aWU0CitvazFpCitvMWxhCitvNGxhMm4KK29sYTJzczQKK28ybDJkCitvbDJkMWUKK29sM2VyCitvM2xlczJjCitvbGVzMgorbzNsZXQKK29sNGZpCitvMmxmCitvbDJpCitvM2wyaTFhCitvM2xpY2UKK29sNWlkLgorb2wyaWQKK28zbGk0ZgorbzVsNGk0bAorb2wzaW5nCitvNWwyaW8KK281bDJpcy4KK29sM2lzMmgKK281bDJpdGUKK29sMWl0CitvNWwyaTF0MmlvCitvbGkxdGkKK281bDJpdgorb2xsMmk0ZTQKK29sMWwKK29sbDJpCitvbDVvM2dpegorb2xvNHIKK29sNXAybDIKK28ybHAKK280bDJ0CitvbDN1Ygorb2wzdW1lCitvbDN1bgorbzVsMnVzCitvbDJ2CitvMmx5CitvMm01YWgKK28xbWEKK29tYTVsCitvbTVhMXRpegorb20yYmUKK280bTFiCitvbTRiMmwyCitvMm1lCitvbTNlMW40YQorbzFtZW4KK29tNWVyMnNlCitvbWU0cjFzMgorbzRtZXQKK29tNWUzdHJ5CitvbTRldHIKK28zbTJpM2EKK29tM2ljLgorb20zaTFjYQorbzVtMmlkCitvbTFpbgorbzVtMmluaQorNW9tbWVuZAorb20xbQorb20xbWVuCitvbW80Z2UKK28xbW8KK280bW8ybgorb20zcGkKK280bTFwCitvbXBybzUKK29tcHIyCitvMm4KK28xbjFhCitvbjRhYworbzNuMmEybgorb24xYworM29uY2lsCitvbjFjaQorMm9uZAorb241ZG8KK28zbmVuCitvMm41ZXN0CitvMW5lcworb240Z3UKK29uMWljCitvM24yaTRvCitvbjFpcworbzVuaTF1CitvbjNrZXkKK280bmsyCitvbjRvZGkKK280bjNvMmQKK29uM28zbXkKK28ybjNzMgorb241c3BpNAorb25zcGkxcjVhCitvbnNwNGlyCitvbjFzdTQKK29udGVuNAorb24xdAorb24zdDRpCitvbnRpMmY1CitvbjV1bQorb24xdmE1CitvbjF2Mgorb28yCitvb2Q1ZQorb29kNWkKK28ybzRrCitvb3AzaQorbzNvcmQKK29vc3Q1CitvMnBhCitvMnAyZTVkCitvcDFlcgorM29wZXIxYQorNG9wNGVyYWcKKzJvcGgKK281cGhhMm4KK281cGg0ZXIKK29wM2luZworb3BpMm4KK28zcGl0CitvNXBvMm4KK280cG9zaQorbzFwb3MKK28xcHIyCitvcDF1CitvcHk1CitvMXEKK28xcmEKK281cmEuCitvNHIzYWcKK29yNWFsMWl6CitvcmFsMWkKK29yNWFuNGdlCitvcmEybgorb3IyYW5nCitvcmU1YQorbzVyZTFhNGwKK29yM2VpMgorb3I0ZTVzMmgKK29yNWUyc3QuCitvcmVzMnQKK29yZXc0CitvcjRndQorb3JnMgorNG81cjJpM2EKK29yM2kxY2EKK281cmlsCitvcjFpbgorbzFyMmkxbworb3IzaTF0eQorbzNyaTF1CitvcjJtaQorb3IxbQorb3JuMmUKK281cm9mCitvcjNvdWcKK29yb3UyCitvcjVwZQorb3IxcAorM29ycmg0CitvcjFyNAorb3I0c2UKK280cnMyCitvcnM1ZW4KK29yc3Q0CitvcjN0aGkKK29yM3RoeQorb3I0dHkKK281cnVtCitvMXJ5CitvczNhbAorb3NhMgorb3MyYworb3M0Y2UKK28zc2NvcAorb3MxY28KKzRvc2NvcGkKK281c2NyCitvczRpNGU0CitvczVpMXQyaXYKK29zaTF0aQorb3MzaTF0bworb3MzaTF0eQorbzVzaTR1CitvczRsMgorbzJzbworbzJzNHBhCitvczRwbworb3MydGEKK281c3RhdGkKK29zNXRpbAorb3N0MmkKK29zNXRpdAorbzR0YTJuCitvMXRhCitvdGVsZTRnCitvdDNlci4KK290NWU0cjFzMgorbzR0ZXMKKzRvdGgKK290aDVlMXNpCitvdGgyZQorb3RoMWVzCitvdGgzaTQKK290M2ljLgorb3Q1aTFjYQorbzN0aWNlCitvM3RpZjIKK28zdGlzCitvdG81czIKK28xdG8KK291Mgorb3UzYjJsMgorb3VjaDVpCitvdTJjaAorb3U1ZXQKK291NGwKK291bmM1ZXIKK291bjJkCitvdTV2Mgorb3Y0ZW4KK292ZXI0bmUKK292ZTRyM3MyCitvdjRlcnQKK28zdmlzCitvNHZpMXRpNAorbzV2NG9sCitvdzNkZXIKK293M2VsCitvdzVlc3QzCitvdzFpMgorb3duNWkKK280d28yCitveTFhCisxcGEKK3BhNGNhCitwYTRjZQorcGEyYzR0CitwNGEyZAorNXBhZ2E0bgorcGExZ2EKK3AzYWdhdAorcDRhaTIKK3BhNGk0bjQKK3A0YWwKK3BhMW40YQorcGEybgorcGFuM2VsCitwYW40dHkKK3BhbjF0CitwYTNueQorcGExcAorcGE0cHUKK3BhcmE1YjJsMgorcDJhMnIKK3BhMnJhYgorcGFyNWFnZQorcGFyNWQyaQorM3BhcmUKK3BhcjVlbAorcDRhNHIxaQorcGFyNGlzCitwYTJ0ZQorcGE1dGVyCis1cGF0aGljCitwNGF0aAorcGE1dGh5CitwYTR0cmljCitwYTF0cgorcGF2NAorM3BheQorNHAxYgorcGQ0Cis0cGUuCiszcGU0YQorcGVhcjRsCitwZTJhMnIKK3BlMmMKKzJwMmVkCiszcGVkZQorM3A0ZWRpCitwZTNkNGkzYTQKK3BlZDRpYworcDRlZQorcGVlNGQKK3BlazQKK3BlNGxhCitwZWwyaTRlNAorcGVsMmkKK3BlNG4yYTJuCitwZTFuYQorcDRlbmMKK3BlbjR0aAorcGVuMXQKK3BlNW8ybgorcDRlcmEuCitwZXIxYQorcGVyYTViMmwyCitwZTJyYTRiCitwNGVyYWcKK3A0ZXIxaQorcGVyaTVzdAorcGVyMmlzCitwZXI0bWFsCitwZXIzbTQKK3BlcjFtYQorcGVyMm1lNQorcDRlcm4KK3AyZXIzbworcGVyM3RpCitwNGU1cnUKK3BlcjF2CitwZTJ0CitwZTV0ZW4KK3BlNXRpegorNHBmCis0cGcKKzRwaC4KK3BoYXI1aQorcGgyYTJyCitwaDRlM25vCitwaGUybgorcGg0ZXIKK3BoNGVzLgorcGgxZXMKK3BoMWljCis1cGgyaWU0CitwaDVpbmcKKzVwaGlzMXQyaQorM3BoaXoKK3A0aDJsNAorM3Bob2IKKzNwaG9uZQorcGhvMm4KKzVwaG9uaQorcGhvNHIKKzRwNGgxczIKK3BoM3QKKzVwaHUKKzFwaHkKK3AyaTNhCitwaTJhMm40CitwaTRjMmllNAorcDJpMWNpCitwaTRjeQorcDRpZAorcDVpMWQyYQorcGkzZGUKKzVwaTJkaQorM3BpZWMKK3AyaWU0CitwaTNlbgorcGk0Z3JhcAorcDJpZworcGkxZ3IKK3BpM2xvCitwaTJuCitwNGluLgorcDRpbmQ0CitwNGkxbm8KKzNwMmkxbworcGlvMm40CitwM2l0aAorcGk1dGhhCitwaTJ0dQorMnAzazIKKzFwMmwyCiszcGxhMm4KK3BsYXM1dAorcGwyaTNhCitwbGk1ZXIKK3BsMmllNAorNHBsMmlnCitwbGk0bgorcGxvaTQKK3BsdTRtCitwbHU0bTRiCis0cDFtCisycDNuCitwbzRjCis1cG9kLgorcG81ZW0KK3BvM2V0NQorNXBvNGcKK3BvaW4yCitwb2kyCis1cG9pbjF0Citwb2x5NXQKK3BvMmx5CitwbzRuaQorcG8ybgorcG80cAorMXA0b3IKK3BvNHJ5CisxcG9zCitwbzJzMXMKK3A0b3QKK3BvNHRhCis1cG91bgorcG91MgorNHAxcAorcHBhNXJhCitwMXBhCitwcDJhMnIKK3AycGUKK3A0cDJlZAorcDVwZWwKK3AzcGVuCitwM3BlcgorcDNwZTJ0CitwcG81czJpdGUKK3AxcG9zCitwcjIKK3ByYXk0ZTQKKzVwcmUxYzJpCitwcmU1Y28KK3ByZTNlMm0KK3ByZTRmNWFjCitwcmUxZgorcHJlMWZhCitwcmU0bGEKK3ByMWUzcjQKK3AzcmUxczJlCiszcHIyZTJzcworcHJlNXRlbgorcHJlM3YyCis1cHIyaTRlNAorcHJpbjR0MworcHIyaTRzCitwcmkyczNvCitwM3JvMWNhCitwcjJvYworcHJvZjVpdAorcHJvMmZpCitwcm8zbAorcHJvczNlCitwcm8xdAorMnAxczIKK3Ayc2UKK3BzNGgKK3A0c2kxYgorMnAxdAorcDJ0NWE0YgorcDF0YQorcDJ0ZQorcDJ0aAorcDF0aTNtCitwdHU0cgorcDF0dQorcDR0dzQKK3B1YjMKK3B1ZTQKK3B1ZjQKK3B1NGwzYzIKK3B1NG0KK3B1Mm4KK3B1cjRyNAorNXAydXMKK3B1MnQKKzVwdXRlCitwdXQzZXIKK3B1M3RyCitwdXQ0dDFlZAorcHU0dDN0MgorcHV0NHQxaW4KK3AzdworcXUyCitxdWE1djQKKzJxdWUuCiszcXVlcgorM3F1ZXQKKzJyYWIKK3JhM2JpCityYWNoNGUyCityYTJjaAorcjVhMWM0bDQKK3JhZjVmaQorcmEyZgorcmE0ZjFmNAorcmEyZjR0CityMmFpMgorcmE0bG8KK3JhbTNldAorcjJhbWkKK3JhM25lNW8KK3JhMm4KK3JhbjRnZQorcjJhbmcKK3I0YW5pCityYTVubzQKK3JhcDNlcgorM3JhMXBoeQorcmFyNWMKK3IyYTJyCityYXJlNAorcmFyNWUxZgorNHJhcmlsCityYXIxaQorcjJhcworcmF0aW8ybjQKK3JhMXQyaW8KK3JhdTR0CityYTV2YWkyCityYTJ2YQorcmF2M2VsCityYTV6MmllNAorcmEyejFpCityMWIKK3I0YmFiCityNGJhZworcmJpMgorcjJiM2k0ZgorcjJiaW4KK3I1YjJpbmUKK3JiNWluZy4KK3JiNG8KK3IxYworcjJjZQorcjFjZW40CityM2NoYQorcjJjaAorcmNoNGVyCityY2hlMgorcjRjaTRiCityMWNpCityMmM0aXQKK3JjdW0zCityNGRhbAorcjFkMmEKK3JkMmkKK3IxZDRpNGEKK3JkaTRlcgorcmQyaWU0CityZDFpbjQKK3JkM2luZworMnJlLgorcmUxYTRsCityZTNhMm4KK3JlNWFyMXI0CityZTJhMnIKKzVyZWEydgorcmU0YXcKK3I1ZWJyYXQKK3IyZTFiCityZTNicgorcmVjNW9sMWwKK3JlMmNvbAorcmUxY28KK3JlNGM1b21wZQorcmVjbzRtMXAKK3JlNGNyZQorcmUxY3IKKzJyMmVkCityZTFkZQorcmUzZGlzMQorcjRlZGkKK3JlZDVpdAorcmU0ZmFjCityZTFmCityZTFmYQorcmUyZmUKK3JlNWZlci4KK3JlZmVyMQorcmUzZmkKK3JlNGZ5CityZWczaXMKK3JlNWl0CityZWkyCityZTFsMmkKK3JlNWx1CityNGVuNHRhCityZW4xdAorcmVuNHRlCityZTFvCityZTVwaTJuCityZTRwb3NpCityZTFwbworcmUxcG9zCityZTFwdQorcjFlcjQKK3I0ZXIxaQorcjJlcm80CityNGU1cnUKK3I0ZXMuCityZTRzcGkKK3JlMXNwCityZXM0czVpNGIKK3IyZTJzcworcmVzMXNpCityZXMydAorcmU1czJ0YTJsCityZXMxdGEKK3IyZTNzdDRyCityZTR0ZXIKK3JlNHRpNHoKK3JlM3RyaQorcjRldTIKK3JlNXUxdDJpCityZXYyCityZTR2YWwKK3JlMXZhCityZXYzZWwKK3I1ZXY1ZXIuCityZXYxZXIKK3JlNXZlNHIxczIKK3JlNXZlcnQKK3JlNXZpNGwKK3JlMXZpCityZXY1b2x1CityZTR3aAorcjFmCityM2Z1NAorcjRmeQorcmcyCityZzNlcgorcjNnZXQKK3IzZzFpYworcmdpNG4KK3JnM2luZworcjVnaXMKK3I1Z2l0CityMWdsMgorcmdvNG4yCityMWdvCityM2d1CityaDQKKzRyaC4KKzRyaGFsCityMmkzYQorcmlhNGIKK3JpNGFnCityNGliCityaWIzYQorcmljNWFzNQorcmkxY2EKK3I0aWNlCis0cjJpMWNpCis1cmk1YzJpZAorcmk0YzJpZTQKK3I0aTFjbworcmlkNWVyCityMmlkCityaTNlbmMKK3IyaWU0CityaTNlbjF0CityaTFlcgorcmk1ZXQKK3JpZzVhMm4KK3IyaWcKK3JpMWdhCis1cjRpZ2kKK3JpbDNpegorcmlsMWkKKzVyaW1hMm4KK3JpMW1hCityaW01aQorM3JpMW1vCityaW00cGUKK3JpNG0xcAorcjJpMW5hCis1cmluYS4KK3I0aW40ZAorcjJpbjRlCityaW40ZworcjJpMW8KKzVyaXBoCityMmlwCityaXBoNWUKK3JpMnAybDIKK3JpcDVsaWMKK3I0aXEKK3IyaXMKK3I0aXMuCityMmlzNGMKK3IzaXMyaAorcmlzNHAKK3JpM3RhM2IKK3JpMXRhCityNWl0ZWQuCityMml0ZQorcmkydDFlZAorcml0NWVyLgorcml0NWU0cjFzMgorcjRpMnQzaWMKK3JpMXRpCityaTJ0dQorcml0NXVyCityaXY1ZWwKK3IyaXYKK3JpdjNldAorcml2M2kKK3IzagorcjNrZXQKK3JrNGxlCityazFsCityazRsaW4KK3IxbAorcmxlNAorcjJsZWQKK3I0bDJpZworcjRsaXMKK3JsNWlzMmgKK3IzbG80CityMW0KK3JtYTVjCityMW1hCityMm1lCityM21lbgorcm01ZTRyMXMyCitybTNpbmcKK3I0bWluZy4KK3I0bTJpbworcjNtaXQKK3I0bXkKK3I0bjJhMnIKK3IxbmEKK3IzbmVsCityNG4xZXIKK3I1bmV0CityM25leQorcjVuaWMKK3IxbmlzNAorcjNuMml0CityM24yaXYKK3JubzQKK3I0bm91MgorcjNudQorcm9iM2wyCityMm9jCitybzNjcgorcm80ZQorcm8xZmUKK3JvNWZpbAorcm8yZmkKK3Iyb2syCitybzVrMWVyCis1cm9sZS4KK3JvbTVlMXRlCitybzJtZQorcm80bWV0Cityb200aQorcm80bTRwCityb240YWwKK3JvMm4KK3JvMW4xYQorcm9uNGUKK3JvNW40aXMKK3JvbjR0YQorcm9uMXQKKzFyb29tCityb28yCis1cm9vdAorcm8zcGVsCityb3AzaWMKK3JvcjNpCitybzVybworcm8yczVwZXIKK3JvMnM0cworcm80dGgyZQorcjRvdGgKK3JvNHR5CitybzR2YQorcm92NWVsCityb3g1CityMXAKK3I0cGU0YQorcjVwZW4xdAorcnA1ZXIuCityM3BlMnQKK3JwNGg0CitycDNpbmcKK3JwaTJuCityM3BvCityMXI0CitycmU0YworcnJlNGYKK3I0cmUxbworcnJlNHMydAorcnIyaTRvCitycjJpNHYKK3JybzJuNAorcnJvczQKK3JyeXM0Cis0cnMyCityMXNhMgorcnNhNXRpCityczRjCityMnNlCityM3NlYworcnNlNGNyCityNHM1ZXIuCityczNlNHMKK3I1c2U1djIKK3IxczJoCityNXNoYQorcjFzaQorcjRzaTRiCityc28ybjMKK3Ixc28KK3Ixc3AKK3I1c3cyCitydGEyY2g0CityMXRhCityNHRhZworcjN0MmUxYgorcjN0ZW40ZAorcjF0ZTVvCityMXRpCityMnQ1aTJiCitydDJpNGQKK3I0dGllcgorcnQyaWU0CityM3QyaWcKK3J0aWwzaQorcnRpbDRsCityNHRpMWx5CityNHRpc3QKK3I0dDJpdgorcjN0cmkKK3J0cjJvcGg0CitydDRzMmg0CityNHQxczIKK3J1M2EKK3J1M2U0bAorcnUzZW4KK3J1NGdsMgorcnUzaTRuCityMnVpMgorcnVtM3AybDIKK3J1NG0ycAorcnUybgorcnU0bms1CitydW40dHkKK3J1bjF0CityNXVzYzIKK3IydXMKK3J1MnQxaTVuCityNHUxdDJpCitydjRlCitydmVsNGkKK3IzdmVuCitydjVlci4KK3I1dmVzdAorcnY0ZTJzCityM3ZleQorcjN2aWMKK3IzdjJpNHYKK3Izdm8KK3Ixdworcnk0YworNXJ5bmdlCityeW41ZworcnkzdAorc2EyCisyczFhYgorNXNhY2sxCitzYWMzcmkyCitzM2EyYzF0Cis1c2FpMgorc2E0bDJhMnI0CitzNGEybDRtCitzYTVsbworc2E0bDR0Ciszc2FuYworc2Eybgorc2FuNGRlCitzNGFuZAorczFhcAorc2E1dGEKKzVzYTN0MmlvCitzYTJ0M3UKK3NhdTQKK3NhNXZvcgorNXNhdworNHM1Ygorc2NhbjR0NQorczFjYQorc2NhMm4KK3NjYTRwCitzY2F2NQorczRjZWQKKzRzM2NlaTIKK3M0Y2VzCitzMmNoMgorczRjaG8yCiszczRjMmllNAorczFjaQorNXNjNGluNGQKK3MyY2luCitzY2xlNQorczFjNGw0CitzNGNsaQorc2NvZjQKK3MxY28KKzRzY29weTUKK3Njb3UxcjVhCitzY291MgorczFjdQorNHM1ZAorNHNlLgorc2U0YQorc2VhczQKK3NlYTV3CitzZTJjM28KKzNzZTJjMXQKKzRzNGVkCitzZTRkNGUKK3M1ZWRsCitzZTJnCitzZTFnM3IKKzVzZWkyCitzZTFsZQorNXNlMmwyZgorNXNlbHYKKzRzZTFtZQorc2U0bW9sCitzZTFtbworc2VuNWF0CitzZTFuYQorNHNlbmMKK3NlbjRkCitzNWUybmVkCitzZW41ZworczVlbjFpbgorNHNlbjR0MWQKK3NlbjF0Cis0c2VuMnRsCitzZTJwM2EzCis0czFlci4KK3M0ZXIxbAorczJlcjRvCis0c2VyM3ZvCitzMWU0cworczRlNXMyaAorc2VzNXQKKzVzZTV1bQorczRldQorNXNldgorc2V2M2VuCitzZXc0aTIKKzVzZXgKKzRzM2YKKzJzM2cKK3MyaAorMnNoLgorc2gxZXIKKzVzaGV2CitzaDFpbgorc2gzaW8KKzNzaDJpNHAKK3NoMmkydjUKK3NobzQKK3NoNW8ybDJkCitzaG8ybjMKK3Nob3I0CitzaG9ydDUKKzRzaDF3CitzaTFiCitzNWljM2MKKzNzaTJkZS4KK3MyaWQKKzVzaWRlNHMyCis1c2kyZGkKK3NpNWRpegorNHNpZzFuNGEKK3MyaWcKK3NpbDRlCis0c2kxbHkKKzJzMWluCitzMmkxbmEKKzVzaTJuZS4KK3MyaW5lCitzM2luZworMXMyaW8KKzVzaW8ybgorc2lvMW41YQorczRpMnIKK3NpMXI1YQorMXNpcworM3MyaTF0MmlvCitzaTF0aQorNXNpMXUKKzFzMml2Cis1c2l6CitzazIKKzRza2UKK3Mza2V0CitzazVpbmUKK3NrMWkKK3NrNWluNGcKK3MxbDIKK3MzbGF0CitzMmxlCitzbDJpdGg1CitzbDFpdAorMnMxbQorczNtYQorc21hbDFsMworc21hMm4zCitzbWVsNAorczVtZW4KKzVzNG0yaXRoCitzbW8ybDVkNAorczFtbworczFuNAorMXNvCitzbzRjZQorc28yZnQzCitzbzRsYWIKK3NvMWxhCitzbzJsM2QyCitzbzNsaWMKK3NvbDJpCis1c29sMnYKKzNzb20KKzNzNG9uLgorc28ybgorc28xbjFhNAorc29uNGcKK3M0b3AKKzVzb3BoMWljCitzMm9waAorczVvM3BoaXoKK3M1bzFwaHkKK3NvcjVjCitzb3I1ZAorNHNvdgorc281dmkKKzJzMXBhCis1c3A0YWkyCitzcGE0bgorc3BlbjRkCisyczVwZW8KKzJzcGVyCitzMnBoZQorM3NwaDRlcgorc3BobzUKK3NwaWw0CitzcDVpbmcKK3NwaTJuCis0czNwMmkxbworczRwMWx5CitzMXAybDIKK3M0cG8ybgorczFwNG9yNAorNHNwNG90CitzcXVhbDRsCitzcXUyCitzMXIKKzJzcworczFzYTIKK3NzYXMzCitzMnM1YworczNzZWwKK3M1c2VuNWcKK3M0c2VzLgorc3MxZTRzCitzNXNldAorczFzaQorczRzMmllNAorc3NpNGVyCitzNHM1aTFseQorczRzMWwyCitzczRsaQorczRzMW40Citzc3BlbjRkNAorc3MydAorc3N1MXI1YQorczFzdQorc3N1MnIKK3NzNXcyCisyc3QuCitzMnRhZworczF0YQorczJ0YTJsCitzdGFtNGkKKzVzdDRhbmQKK3N0YTJuCitzNHRhNHAKKzVzdGF0LgorczR0MWVkCitzdGVybjVpCitzNXQyZXJvCitzdGUydworc3RlMXc1YQorczN0aDJlCitzdDJpCitzNHRpLgorczV0MmkxYQorczF0aWMKKzVzNHRpY2sxCitzNHQyaWU0CitzM3RpZjIKK3N0M2luZworczJ0MWluCis1c3Q0aXIKK3MxdGxlCitzMnRsCis1c3RvY2sxCitzMXRvCitzdG8ybTNhCis1c3RvbmUKK3N0bzJuCitzNHRvcAorM3N0b3JlCitzdDRyCitzNHRyYTJkCitzMXRyYQorNXN0cmEydHUKK3M0dHJheQorczR0cjJpZAorNHN0cnkKKzRzdDN3NAorczJ0eQorMXN1CitzdTFhbAorc3U0YjMKK3N1MmczCitzdTVpcworczJ1aTIKK3N1aXQzCitzNHVsCitzdTJtCitzdTFtM2kKK3N1Mm4KK3N1MnIKKzRzdgorc3cyCis0czF3bzIKK3M0eQorNHN5MWMKKzNzeWwKK3N5bjVvCitzeTVyaW4KKzF0YQorM3RhLgorMnRhYgordGE1YmxlczIKK3RhYjJsMgorNXRhYjVvNWwxaXoKK3RhYm9sMmkKKzR0NGEyY2kKK3RhNWRvCit0YTJkCis0dGEyZjQKK3RhaTVsbwordGFpMgordGEybAordGE1bGEKK3RhbDVlbgordDJhbGUKK3RhbDNpCis0dGFsawordGFsNGxpcwordGFsMWwKK3RhbGwyaQordGE1bG9nCit0YTVtbwordGFuNGRlCit0YTJuCit0NGFuZAorMXRhbjF0YTMKK3RhbjF0Cit0YTVwZXIKK3RhNXAybDIKK3RhcjRhCit0MmEycgorNHRhcjFjCis0dGFyZQordGEzcjJpegordGFyMWkKK3RhczRlCit0YTVzNHkKKzR0YXQxaWMKK3RhNHR1cgordGEydHUKK3RhdW40Cit0YXY0CisydGF3Cit0YXg0aXMKK3RheDNpCisydDFiCis0dGMKK3Q0Y2gKK3RjaDVlNHQKK3RjaGUyCis0dDFkCis0dGUuCit0ZTJhZDRpCit0ZWEyZDEKKzR0ZWEydAordGUxY2U0Cis1dGUyYzF0CisydDFlZAordDRlNWRpCisxdGVlCit0ZWc0Cit0ZTVnZXI0Cit0ZTVnaQorM3RlbC4KK3RlbDJpNAorNXRlMmwxczIKK3RlMm1hMgordGVtM2F0CiszdGVuMmEybgordGUxbmEKKzN0ZW5jCiszdGVuZAorNHRlMW5lcworMXRlbjF0Cit0ZW40dGFnCit0ZW4xdGEKKzF0ZW8KK3RlNHAKK3RlNXBlCit0ZXIzYworNXRlcjNkCisxdGVyMWkKK3RlcjVpZXMKK3RlcjJpZTQKK3RlcjNpcwordGVyaTV6YTEKKzV0NGVyM24yaXQKK3RlcjV2Cis0dGVzLgorNHQyZTJzcwordDNlc3MuCit0ZXRoNWUKKzN0NGV1CiszdGV4Cis0dGV5CisydDFmCis0dDFnCisydGguCit0aGEybjQKK3RoMmUKKzR0aGVhCit0aDNlYXMKK3RoZTVhMnQKK3RoZTNpcwordGhlaTIKKzN0aGU0dAordGg1aWMuCit0aDVpMWNhCis0dGg0aWwyCis1dGg0aTRuazIKKzR0NGgxbDQKK3RoNW9kZQorNXRob2QzaWMKKzR0aG9vMgordGhvcjVpdAordGhvNXJpegorMnQ0aDFzMgorMXQyaTFhCit0aTRhYgordGk0YTF0bworMnRpMmIKKzR0aWNrMQordDRpMWNvCit0NGljMXUKKzV0aTJkaQordDJpZAorM3RpZW4KK3QyaWU0Cit0aWYyCit0aTVmeQorMnQyaWcKKzV0aWd1Cit0aWwybDVpbjQKK3RpbDFsCit0aWxsMmkKKzF0aW0KKzR0aTRtMXAKK3RpbTV1bAordGkybXUKKzJ0MWluCit0MmkxbmEKKzN0aTJuZS4KK3QyaW5lCiszdDJpbmkKKzF0MmlvCit0aTVvYwordGlvbjVlZQordGlvMm4KKzV0aXEKK3RpM3NhMgorM3Q0aXNlCit0aTJzNG0KK3RpNXNvCit0aXM0cAorNXRpc3RpMWNhCit0aXMxdDJpCit0aXMxdGljCit0aTN0bAordGk0dQorMXQyaXYKK3RpMXY0YQorMXRpegordGkzemExCit0aTN6ZTRuCit0aTJ6ZQorMnRsCit0NWxhCit0bGEybjQKKzN0bGUuCiszdGxlZAorM3RsZXMuCit0bGVzMgordDVsZXQuCit0NWxvCis0dDFtCit0bWU0CisydDFuMgorMXRvCit0bzNiCit0bzVjcmF0Cis0dG8yZG80CisydG9mCit0bzJncgordG81aWMKK3RvaTIKK3RvMm1hCit0bzRtNGIKK3RvM215Cit0b240YTRsMWkKK3RvMm4KK3RvMW4xYQordG8zbjJhdAorNHRvbm8KKzR0b255Cit0bzJyYQordG8zcjJpZTQKK3RvcjVpegordG9zMgorNXRvdXIKK3RvdTIKKzR0b3V0Cit0bzN3MmEycgorNHQxcAorMXRyYQordDJyYTNiCit0cmE1Y2gKK3RyNGEyY2k0Cit0cmEyYzRpdAordHJhYzR0ZQordHJhMmMxdAordHIyYXM0Cit0cmE1dmVuCit0cmF2NWUyczUKK3RyZTVmCit0cmU0bQordHJlbTVpCis1dHIyaTNhCit0cmk1Y2VzCit0cjRpY2UKKzV0cmkzYzJpMWEKK3Q0cjJpMWNpCis0dHJpNGMzczIKKzJ0cmltCit0cjJpNHYKK3RybzVtNGkKK3Ryb241aQordHJvMm4KKzR0cm9ueQordHJvNXBoZQordHIyb3BoCit0cm8zc3AKK3RybzN2Cit0cjJ1NWkyCit0cjJ1czQKKzR0MXMyCit0NHNjCit0czJoNAordDRzdzIKKzR0M3QyCit0NHRlcwordDV0bwordDF0dTQKKzF0dQordHUxYQordHUzYTJyCit0dTRiNGkKK3R1ZDIKKzR0dWUKKzR0dWY0Cis1dDJ1M2kyCiszdHVtCit0dTRuaXMKK3R1MW5pCisydDN1cC4KKzN0dXJlCis1dHVyaQordHVyM2lzCit0dXI1bwordHU1cnkKKzN0MnVzCis0dHYKK3R3NAorNHQxd2EKK3R3aXM0Cit0d2kyCis0dDF3bzIKKzF0eQorNHR5YQorMnR5bAordHlwZTMKK3R5NXBoCis0dHoKK3QyejRlCis0dWFiCit1YWM0Cit1YTVuYQordWEybgordWFuNGkKK3VhcjVhbjF0Cit1MmEycgordWFyYTJuCit1YXIyZAordWFyM2kKK3VhcjN0Cit1MWF0Cit1YXY0Cit1YjRlCit1NGJlbAordTNiZXIKK3U0YjJlcm8KK3UxYjRpCit1NGI1aW5nCit1M2I0bGUuCit1YjJsMgordTNjYQordWNpNGIKK3UxY2kKK3UyYzRpdAordWNsZTMKK3UxYzRsNAordTNjcgordTNjdQordTRjeQordWQ1ZDQKK3VkM2VyCit1ZDVlc3QKK3VkZXMyCit1ZGUxdjQKK3UxZGljCit1ZDNpZWQKK3VkMmllNAordWQzaWVzCit1ZDVpczEKK3U1ZGl0Cit1NGRvMm4KK3UxZG8KK3VkNHNpCit1MmQxczIKK3U0ZHUKK3U0ZW5lCit1ZTJuMXM0Cit1ZW40dGUKK3VlbjF0Cit1ZXI0aWwKK3VlcjFpCiszdTFmYQordTNmNGwyCit1Z2gzZTJuCit1ZzVpbgorMnVpMgordWlsNWl6Cit1aWwxaQordWk0bgordTFpbmcKK3VpcjRtCit1NGlyCit1aTF0YTQKK3UyaXYzCit1aTR2NGVyLgordTVqCis0dWsKK3UxbGEKK3VsYTViCit1NWxhdGkKK3VsMmNoNAordTRsMWMyCis1dWxjaGUyCit1bDNkZXIKK3UybGQKK3VsMmRlCit1bDRlCit1MWxlbgordWw0Z2kKK3U0bDFnNAordWwyaQordTVsMmkxYQordWwzaW5nCit1bDVpczJoCit1bDRsMmEycgordWwxbAordWw0bGk0YgordWxsMmkKK3VsNGxpcworNHUybDNtCit1MWw0bworNHUybDFzMgordWxzNWU0cwordWwyc2UKK3VsMXRpCit1NGx0Cit1bDF0cmEzCit1bDF0cgorNHVsMXR1MgordTNsdQordWw1dWwKK3VsNXYKK3UybTVhYgordTFtYQordW00YmkKK3U0bTFiCit1bTRiMWx5Cit1bWIybDIKK3UxbWkKK3U0bTNpbmcKK3Vtb3I1bwordTFtbwordW1vMnIKK3U0bTJwCit1bjJhdDQKK3UxbmEKK3UybmUKK3VuNGVyCit1MW5pCit1bjRpbQordTJuMWluCit1bjVpczJoCit1bjJpM3YKK3UybjNzNAordW40c3cyCit1bjJ0M2E0YgordW4xdAordW4xdGEKK3VuNHRlci4KK3VuNHRlcwordW51NAordW41eQordTRuNXoKK3U0bzRyczIKK3U1b3MKK3Uxb3UyCit1MXBlCit1cGU0cjVzMgordTVwMmkzYQordXAzaW5nCit1cGkybgordTNwMmwyCit1NHAzcAordXBwb3J0NQordXAxcDRvcgordXAydDVpMmIKK3UycDF0Cit1cDF0dTQKK3UxcmEKKzR1cmEuCit1NHJhZwordTRyMmFzCit1cjRiZQordXIxYgordXIxYzQKK3VyMWQKK3VyZTVhMnQKK3VyNGZlcjEKK3VyMWYKK3VyNGZyCit1M3JpZgordXJpNGZpYwordXJpMWZpCit1cjFpbgordTNyMmkxbwordTFyaXQKK3VyM2l6Cit1cjJsCit1cmw1aW5nLgordXI0bm80Cit1cm9zNAordXI0cGUKK3VyMXAKK3VyNHBpCit1cnM1ZXIKK3U0cnMyCit1cjJzZQordXI1dGVzCit1cjN0aDJlCit1cjF0aTQKK3VyNHQyaWU0Cit1M3J1CisydXMKK3U1c2EyZAordXNhMgordTVzYTJuCit1czRhcAordXNjMgordXMzY2kKK3VzZTVhCit1NXMyaTFhCit1M3NpYwordXM0bGluCit1czFsMgordXMxcAordXM1czFsMgordTJzcwordXM1dGVyZQordXMxdDRyCit1MnN1Cit1c3UycjQKK3UydGE0YgordTF0YQordTN0YXQKKzR1NHRlLgorNHV0ZWwKKzR1dGVuCit1dGVuNGkKKzR1MXQyaQordXRpNWwyaXoKK3V0aWwxaQordTN0MmluZQordTJ0MWluCit1dDNpbmcKK3V0aW8xbjVhCit1MXQyaW8KK3V0aW8ybgordTR0aXMKKzV1NXRpegordTR0MWwKK3UydDVvZgordTF0bwordXRvNWcKK3V0bzVtYXQxaWMKK3V0bzJtYQordTV0bzJuCit1NHRvdTIKK3U0dDFzNAordTN1Cit1dTRtCit1MXYyCit1eDF1MwordTJ6NGUKKzF2YQorNXZhLgorMnYxYTRiCit2YWM1aWwKK3Y0YTJjaQordmFjM3UKK3ZhZzQKK3ZhNGdlCit2YTVsMmk0ZTQKK3ZhbDFpCit2YWw1bwordmFsMXUKK3ZhNW1vCit2YTVuaXoKK3ZhMm4KK3ZhNXBpCit2YXI1aWVkCit2MmEycgordmFyMWkKK3ZhcjJpZTQKKzN2YXQKKzR2ZS4KKzR2ZWQKK3ZlZzMKK3YzZWwuCit2ZWwzbDJpCit2ZWwxbAordmU0bG8KK3Y0ZTFseQordmVuM29tCit2NGVubwordjVlbnVlCit2NGVyZAorNXYyZTJyZS4KK3Y0ZXJlbAordjNlcmVuCit2ZXI1ZW5jCit2NGVyZXMKK3ZlcjNpZTQKK3ZlcjFpCit2ZXJtaTRuCit2ZXIzbTQKKzN2ZXIyc2UKK3ZlNHIxczIKK3ZlcjN0aAordjRlMnMKKzR2ZXMuCit2ZXM0dGUKK3ZlNHRlCit2ZXQzZXIKK3ZlNHR5Cit2aTVhbDFpCit2MmkxYQordmkyYWwKKzV2aTJhMm4KKzV2aTJkZS4KK3YyaWQKKzV2aTJkMWVkCis0djNpMWRlbgorNXZpZGU0czIKKzV2aTJkaQordjNpZgordmk1Z24KK3YyaWcKK3Y0aWs0CisydmlsCis1djJpbDFpdAordmlsMWkKK3YzaTNsMml6Cit2MWluCis0dmk0bmEKK3YyaW5jCit2NGluNWQKKzR2aW5nCit2aTFvM2wKK3YyaW8KK3YzaW80cgordmkxb3UyCit2Mmk0cAordmk1cm8KK3Y0aXIKK3ZpczNpdAordmkzc28KK3ZpM3N1Cis0dmkxdGkKK3ZpdDNyCis0dmkxdHkKKzN2Mml2Cis1dm8uCit2b2k0CiszdjJvawordm80bGEKK3Y1b2xlCis1dm80bDJ0Ciszdm9sMnYKK3ZvbTVpCit2bzJyNWFiCit2bzFyYQordm9yaTQKK3ZvNHJ5Cit2bzR0YQorNHZvMXRlZQorNHZ2NAordjR5Cit3NWFiMmwyCisyd2FjCit3YTVnZXIKK3dhMmc1bword2FpdDUKK3dhaTIKK3c1YWwuCit3YW00Cit3YXI0dAordzJhMnIKK3dhczR0Cit3YTF0ZQord2E1dmVyCit3MWIKK3dlYTVyMmllNAord2UyYTJyCit3ZWFyMWkKK3dlNGF0aDMKK3dlYTJ0Cit3ZTRkNG40Cit3ZWV0Mword2VlNXYKK3dlbDRsCit3MWVyCit3ZXN0MwordzNldgord2hpNAord2kyCit3aWwyCit3aWwybDVpbjQKK3dpbDFsCit3aWxsMmkKK3dpbjRkZQordzRpbmQKK3dpbjRnCit3NGlyNAorM3c0aXNlCit3Mml0aDMKK3dpejUKK3c0aword2w0ZXMyCit3bDNpbgordzRubworMXdvMgord29tMQord281djRlbgordzVwCit3cmE0Cit3cmk0Cit3cmkxdGE0Cit3M3MyaAord3M0bDIKK3dzNHBlCit3NXM0dAorNHd0Cit3eTQKK3gxYQoreGFjNWUKK3g0YTJnbworeGFtMworeDRhcAoreGFzNQoreDNjMgoreDFlCit4ZTRjdTF0bworeGUxY3UKK3hlM2M0dXQKK3gyZWQKK3hlcjRpCit4MmU1cm8KK3gxaAoreGhpMgoreGg0aWw1Cit4aHU0Cit4M2kKK3gyaTVhCit4aTVjCit4aTVkaQoreDJpZAoreDRpbWUKK3hpNW0yaXoKK3hpbTFpCit4M28KK3g0b2IKK3gzcAoreHA0YW40ZAoreDFwYQoreHBhMm4KK3hwZWMxdG81Cit4cGUyYworeHBlMmMxdAoreDJwMmUzZAoreDF0MgoreDN0aQoreDF1Cit4dTNhCit4eDQKK3k1YWMKKzN5MmEycjQKK3k1YXQKK3kxYgoreTFjCit5MmNlCit5YzVlcgoreTNjaAoreWNoNGUyCit5Y29tNAoreTFjbworeWNvdDQKK3kxZAoreTVlZQoreTFlcgoreTRlcjFmCit5ZXM0Cit5ZTR0Cit5NWdpCis0eTNoCit5MWkKK3kzbGEKK3lsbGE1YjJsMgoreWwxbAoreTNsbworeTVsdQoreW1ib2w1Cit5NG0xYgoreW1lNAoreW0xcGEzCit5NG0xcAoreW4zYzRocjQKK3luMmNoCit5bjVkCit5bjVnCit5bjVpYworNXlueAoreTFvNAoreW81ZAoreTRvNWcKK3lvbTQKK3lvNW5ldAoreW8ybgoreTRvMm4zczIKK3k0b3MKK3k0cDJlZAoreXBlcjUKK3lwM2kKK3kzcG8KK3k0cG80YworeXAydGEKK3kycDF0Cit5NXB1Cit5cmE1bQoreXI1aTNhCit5M3JvCit5cjRyNAoreXM0YworeTNzMmUKK3lzM2kxY2EKK3kxczNpbworM3kxc2lzCit5NHNvCit5MnNzNAoreXMxdAoreXMzdGEKK3lzdTJyNAoreTFzdQoreTN0aGluCit5dDNpYworeTF3Cit6YTEKK3o1YTJiCit6MmEycjIKKzR6YgorMnplCit6ZTRuCit6ZTRwCit6MWVyCit6MmUzcm8KK3pldDQKKzJ6MWkKK3o0aWwKK3o0aXMKKzV6bAorNHptCisxem8KK3pvNG0KK3pvNW9sCit6b28yCit6dGU0Cis0ejF6MgorejR6eQorLmFzOXM4bzljOGk4YTh0ZS4KKy5hczFzbworLmFzc28xY2kKKy5hc3NvM2MyaTFhCisuYXM5czhvOWM4aThhOHQ4ZXMuCisuZGU4YzlsOGk5bjhhOXQ4aThvbi4KKy5kZTFjNGw0CisuZGVjbDRpMW5hCisuZGVjbGluMmF0CisuZGVjbGluYTF0MmlvCisuZGVjbGluYXRpbzJuCisub2I4bDhpOGc5YTl0OG84cnkuCisub2IybDIKKy5vYmwyaWcKKy5vYmxpMWdhCisub2JsaWdhMXRvCisub2JsaWdhdG8xcnkKKy5waDhpOGw5YThuOXQ4aDhyOG84cDhpYy4KKy5waDRpbDIKKy5waGkxbGEKKy5waGlsYTJuCisucGhpbGFuMXQKKy5waGlsYW50NGhyNAorLnBoaWxhbnRocm9wM2ljCisucHI4ZThzOGU4bnQuCisucDNyZTFzMmUKKy5wcmVzZW4xdAorLnByOGU4czhlOG44dHMuCisucHJlc2VuNHQ0czIKKy5wcjhvOGo4ZThjdC4KKy5wcm81agorLnBybzFqZQorLnByb2plMmMxdAorLnByOG84ajhlOGM4dHMuCisucHJvamVjNHQxczIKKy5yZThjOWk5cDhyOG84YzlpOXQ4eS4KKy5yZTFjMmkKKy5yZWMyaXAKKy5yZWNpcHIyCisucmVjaXByMm9jCisucmUxY2lwcm8xY2kKKy5yZWNpcHJvMmMxaXQKKy5yZWNpcHJvY2kxdHkKKy5yZTljOG84ZzluOGk5ejhhOG44Y2UuCisucmUxY28KKy5yZTJjb2cKKy5yZWMzb2duaXoKKy5yZWNvZzFuaQorLnJlY29nbml6YTEKKy5yZWNvZ25pemEybgorLnJlOGY5bzhyOW04YTl0OGk4b24uCisucmUxZgorLnJlMWZvCisucmVmbzJyCisucmVmb3IxbQorLnJlZm9yMW1hCisucmVmb3JtYTF0MmlvCisucmVmb3JtYXRpbzJuCisucmU4dDlyOGk5Yjh1OXQ4aThvbi4KKy5yZTN0cmkKKy5yZXRyNGliCisucmV0cmkzYnUxdDJpbworLnJldHJpYjR1MXQyaQorLnJldHJpYnV0aW8ybgorLnRhOWI4bGUuCisuMnRhYgorLnRhYjJsMgorLmFjOGE4ZDllOW04eS4KKy5hMWNhCisuYWNhMmQKKy5hY2FkNGVtCisuYWNhZGUzbXkKKy5hYzhhOGQ5ZTltOGk4ZThzLgorLmFjYWRlbTJpNGU0CisuYWM5Yzh1OXM4YTl0OGk4djhlLgorLmFjM2MKKy5hYzFjMnVzCisuYWNjdXNhMgorLmFjY3VzYTF0Mml2CisuYWM4cjhvOW44eThtLgorLmFjcm8ybgorLmFjcm9ueW00CisuYWM4cjh5OGw5YThtOGk4ZDhlLgorLmFjcnkzbGEKKy5hY3J5bGFtMmlkCisuYWM4cjh5OGw5YThtOGk4ZDhlOHMuCisuYWNyeWxhbWlkZTRzMgorLmFjOHI4eThsOWE4bDhkOGU5aDh5OGQ4ZS4KKy5hY3J5bGEybGQKKy5hY3J5bGFsMmRlCisuYWNyeWxhbGRlMWg0CisuYWNyeWxhbGRlaHkxZAorLmFkOGQ5YTliOGw4ZS4KKy5hZDFkMmEKKy5hZDJkM2E0YgorLmFkZGFiMmwyCisuYWQ4ZDlpOWI4bDhlLgorLmFkZGkxYjJsMgorLmFkOHI4ZThuOWE5bDhpOG44ZS4KKy5hMWRyCisuYWRyZTQKKy5hNWRyZW4KKy5hZHJlMW5hCisuYWRyZW5hNGwxaQorLmFkcmVuYTFsNGluZQorLmFlOHI4bzlzOHA4YThjOGUuCisuYWU0cgorLmEyZXJvCisuYWVybzJzNHBhCisuYWVyb3NwYTRjZQorLmFmOXQ4ZThyOXQ4aDhvOHU4ZzhoOHQuCisuYWZ0ZXJ0aG91MgorLmFmOXQ4ZThyOXQ4aDhvOHU4ZzhoOHQ4cy4KKy5hZnRlcnRob3VnaDR0MXMyCisuYWc4cjhvOG45bzltOGk4czh0LgorLmExZ3IKKy5hZzRybworLmFncm8ybgorLmFncm9ub20yaXMKKy5hZzhyOG84bjlvOW04aThzOHQ4cy4KKy5hZ3Jvbm9taXM0dDFzMgorLmFsOWc4ZTliOHI4YTlpOWM4YThsOWw4eS4KKy5hNGwxZzQKKy5hbGcyZTFiCisuYWxnZTNicgorLmFsZ2VicjJhaTIKKy5hbGdlYnJhaTFjYQorLmFsZ2VicmFpY2FsMWwKKy5hbGdlYnJhaWNhbDFseQorLmFtOXA4aDhlOHQ5YTltOGk4bjhlLgorLmE0bTFwCisuYW1waGU0dAorLmFtcGhlMXRhCisuYW1waGV0YW0xaW4KKy5hbXBoZXRhbTJpbmUKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZThzLgorLmFtcGhldGFtaTFuZXMKKy5hbjlhOWw4eThzOGUuCisuM2FuYTFseQorLmExbmEKKy5hbjRhMmx5czQKKy5hbmFsNXkzczJlCisuYW45YTlsOHk4czhlOGQuCisuYW5hbHk0czRlZAorLmFuOGE4bDh5OXM4ZThzLgorLmFuYWx5czFlNHMKKy5hbjlpOHM4bzl0OHI4bzhwOWk4Yy4KKy5hbmkyc28KKy5hbmlzb3Ryb3AzaWMKKy5hbjlpOHM4bzl0OHI4bzhwOWk5YzhhOGw5bDh5LgorLmFuaXNvdHJvcGkxY2EKKy5hbmlzb3Ryb3BpY2FsMWwKKy5hbmlzb3Ryb3BpY2FsMWx5CisuYW45aThzOG84dDlyOG85cDhpOHM4bS4KKy5hbmlzb3Ryb3BpMnMxbQorLmFuOWk4czhvOHQ5cjhvOHA4eS4KKy5hbmlzb3Ryb3B5NQorLmFuOG84bTlhOGw4eS4KKy5hbm80CisuYW5vbWE1bAorLmFubzFtYQorLmFub21hMWx5CisuYW44bzhtOWE4bDhpOGU4cy4KKy5hbm9tYWwxaQorLmFub21hbDJpNGU0CisuYW44dDhpOWQ4ZThyOGk4djlhOXQ4aTh2OGUuCisuYW50MmlkCisuYW50aWRlcjFpCisuYW50aWRlcjJpNHYKKy5hbnRpZGU0cmkxdmEKKy5hbnRpZGVyaTN2YXQKKy5hbnRpZGVyMml2YTF0Mml2CisuYW44dDhpOWQ4ZThyOGk4djlhOXQ4aTh2OGU4cy4KKy5hbnRpZGVyaXZhdGl2NGUycworLmFuOHQ4aTloOG84bDhvOW04bzhyOXA4aDhpOGMuCisuYW50aTNoCisuYW50aWhvbG8xbW8KKy5hbnRpaG9sb21vMnIKKy5hbnRpaG9sb21vcjFwCisuYW50aWhvbG9tb3JwNGg0CisuYW50aWhvbG9tb3JwaDFpYworLmFuOXQ4aThuOW85bTh5LgorLmFuMnQxaW4KKy5hbnQyaTFubworLmFudGlubzNteQorLmFuOXQ4aThuOW85bThpOGU4cy4KKy5hbnRpbm9tMmllNAorLmFuOXQ4aTluOHU5YzhsOGU4YThyLgorLmFudGluMXUKKy5hbnRpbnVjbGUzCisuYW50aW51MWM0bDQKKy5hbnRpbnVjbGUyYQorLmFudGludWNsZTJhMnIKKy5hbjl0OGk5bjh1OWM4bDhlOW84bi4KKy5hbnRpbnVjbGVvMm4KKy5hbjl0OGk5cjhlOHY5bzlsOHU5dDhpOG84bjlhOHI4eS4KKy5hbnQ0aXIKKy5hbnRpcmV2MgorLmFudGlyZXY1b2x1CisuYW50aXJldm8xbHV0CisuYW50aXJldm9sNHUxdDJpCisuYW50aXJldm9sdXRpbzFuNWEKKy5hbnRpcmV2b2x1MXQyaW8KKy5hbnRpcmV2b2x1dGlvMm4KKy5hbnRpcmV2b2x1dGlvbjJhMnIKKy5hcDhvOHQ4aDllOW85czhlOHMuCisuYXA0b3QKKy5hcDRvdGgKKy5hcG90aDJlCisuYXBvdGhlb3M0CisuYXBvdGhlb3MxZTRzCisuYXA4bzh0OGg5ZTlvOXM4aThzLgorLmFwb3RoZW8xc2lzCisuYXA5cDhlOG45ZDhpOHguCisuYTRwMXAKKy5hcDJwZQorLmFwM3BlbgorLmFyOWM4aDhpOW04ZTlkOGU4YThuLgorLmFyMWMKKy5hcjJjaAorLmFyY2hpMm1lZAorLmFyY2hpbWVkZWEybgorLmFyOWM4aDhpOXA4ZThsOWE4ZzhvLgorLmFyY2gyaTRwCisuYXJjaGlwZTQKKy5hcmNoaXBlNGxhCisuYXJjaGlwZWxhMmdvCisuYXI5YzhoOGk5cDhlOGw5YTlnOG84cy4KKy5hcjljOGg4aTh2OGUuCisuYXJjaDJpMnYKKy5hcjljOGg4aTh2OGU4cy4KKy5hcmNoaXY0ZTJzCisuYXI5YzhoOGk4djlpOG44Zy4KKy5hcmNoaXYxaW4KKy5hcmNoaTR2aW5nCisuYXI5YzhoOGk4djlpOHM4dC4KKy5hcjljOGg4aTh2OWk4czh0OHMuCisuYXJjaGl2aXM0dDFzMgorLmFyOWM4aDhlOXQ4eThwOWE4bC4KKy5hcmNoZTIKKy5hcmNoZTR0CisuYXJjaGUxdHkKKy5hcmNoZXR5MXBhCisuYXJjaGV0eXA0YWwKKy5hcjljOGg4ZTl0OHk4cDlpOWM4YThsLgorLmFyY2hldHlwM2kKKy5hcmNoZXR5cGkxY2EKKy5hcjhjOXQ4YThuOWc4ZThuOHQuCisuYXIyYzF0CisuYXJjdDVhbmcKKy5hcmMxdGEKKy5hcmN0YTJuCisuYXJjdGFuMWdlbgorLmFyY3RhbmdlbjF0CisuYXI4Yzl0OGE4bjlnOGU4bjh0OHMuCisuYXJjdGFuZ2VuNHQ0czIKKy5hczlzOGk4ZzhuOWE5YjhsOGUuCisuYXMxc2kKKy5hczRzaWcxbjRhCisuYXNzMmlnCisuYXNzaWcybjFhMmIKKy5hc3NpZ25hYjJsMgorLmFzOXM4aThnOG45bzhyLgorLmFzc2lnMW5vCisuYXM5czhpOGc4bjlvOHI4cy4KKy5hc3NpZ25vNHJzMgorLmFzOXM4aThzOHQ5YThuOHQ5czhoOGk4cC4KKy5hczFzaXMKKy5hc3NpczF0YQorLmFzc2lzdGEybgorLmFzc2lzdGFuMXQKKy5hc3Npc3RhbjR0NHMyCisuYXNzaXN0YW50czJoNAorLmFzc2lzdGFudDNzaDJpNHAKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHA4cy4KKy5hc3Npc3RhbnRzaGkycDFzMgorLmFzOHk4bThwOXQ4bzltOGE4dDhpOGMuCisuYXM0eQorLmFzeTRtMXAKKy5hc3ltMnAxdAorLmFzeW1wMXRvCisuYXN5bXB0bzJtYQorLmFzeW1wdG9tYXQxaWMKKy5hczl5OG04cDl0OG84dDlpOGMuCisuYXM4eThuOWM4aDhyOG85bjhvOHU4cy4KKy5hc3luM2M0aHI0CisuYXN5bjJjaAorLmFzeW5jaHJvMm4KKy5hc3luY2hybzFub3UyCisuYXN5bmNocm9ubzJ1cworLmF0OGg5ZThyOW85czhjOGw4ZTlyOG85czhpOHMuCisuNGF0aAorLmF0aDJlCisuYXRoMmVybworLmF0aGVyb3MyYworLmF0aGVyb3NjbGU1CisuYXRoZXJvczFjNGw0CisuYXRoMmVyb3NjbDRlcm8KKy5hdGhlcm9zY2xlcm8xc2lzCisuYXQ5bThvOHM5cDhoOGU4cjhlLgorLmE0dDFtCisuYXQxbW8KKy5hdG1vczIKKy5hdG1vM3NwCisuYXRtb3MycGhlCisuYXRtbzNzcGg0ZXIKKy5hdDltOG84czlwOGg4ZThyOGU4cy4KKy5hdDl0OHI4aThiOXU4dDhlOGQuCisuYTR0M3QyCisuYXR0cjRpYgorLmF0dHJpYnUydDFlZAorLmF0OXQ4cjhpOGI5dTh0OWE4YjhsOGUuCisuYXR0cmk0YnUxdGEKKy5hdHRyaWJ1MnRhNGIKKy5hdHRyaWJ1dGFiMmwyCisuYXU5dDhvOW04YTl0OGk4bzhuLgorLmF1MXRvCisuYXV0bzJtYQorLmF1dG9tYTF0MmlvCisuYXV0b21hdGlvMm4KKy5hdTl0OG84bTlhOXQ4bzhuLgorLmF1dG9tYTF0bworLmF1dG9tYXRvMm4KKy5hdTl0OG84bTlhOXQ4YS4KKy5hdXRvbWEydGEKKy5hdTl0OG85bjh1OG05YjhlOHI5aThuOGcuCisuYXU1dG8ybgorLmF1dG9uNXVtCisuYXV0b251NG0xYgorLmF1dG9udW1iZXIxaQorLmF1dG9udW1iZXJpbjRnCisuYXU5dDhvOG45bzltOG84dThzLgorLmF1NHRvbm8KKy5hdXRvbm80bW8KKy5hdXRvbm8zbW8ydXMKKy5hdXRvbm9tb3UyCisuYXU4dDhvOXI4bzh1OG44ZDlpOG44Zy4KKy5hdXRvcm91MgorLmF1dG9yb3VuMmQKKy5hdXRvcm91bmQxaW4KKy5hdjlvOGk4cjlkOHU5cDhvOGk4cy4KKy5hdm9pNAorLmF2bzRpcgorLmF2b2lyMWR1CisuYXZvaXI0ZHVwCisuYXZvaXJkdXBvaTIKKy5iYThuOGQ5bDhlOGE4ZDhlOHIuCisuYjRhbmQKKy5iYW4xZGwKKy5iYW5kbGUyYQorLmJhbmRsZWEyZDEKKy5iYThuOGQ5bDhlOGE4ZDhlOHI4cy4KKy5iYW5kbGVhZGU0cjVzMgorLmJhOG44azlyOHU4cDh0LgorLmJhNG5rMgorLmJhbmtydTJwMXQKKy5iYThuOGs5cjh1OHA4dDljOHkuCisuYmFua3J1cDR0YworLmJhbmtydXB0MWN5CisuYmE4bjhrOXI4dThwOHQ5YzhpOGU4cy4KKy5iYW5rcnVwdDFjaQorLmJhbmtydXB0YzJpZTQKKy5iYThyOW84bjhpOGU4cy4KKy5iMmEycgorLmJhNXJvbmkKKy5iYXJvMm4KKy5iYXJvbjJpZTQKKy5iYThzOGU5bDhpOG44ZTlzOGs4aThwLgorLmJhc2VsMmkKKy5iYXNlMWw0aW5lCisuYmFzZWxpMW5lcworLmJhc2VsaW5lc2syCisuYmFzZWxpbmVzazFpCisuYmFzZWxpbmVzazJpNHAKKy5iYTl0OGg4eThtOWU5dDhyOHkuCisuMWJhdAorLmI0YXRoCisuYmF0aHltZTQKKy5iYXRoeW00ZXRyCisuYmF0aHltZTN0cnkKKy5iYTh0OGg4eTlzOGM4YThwOGg4ZS4KKy5iYXRoeTJzCisuYmF0aHlzNGMKKy5iYXRoeXNjYTRwCisuYmF0aHlzMWNhCisuYmU4YThuOWk4ZThzLgorLmJlYTJuCisuYmVhM25pZXMKKy5iZWFuMmllNAorLmJlOWg4YTh2OWk4bzh1OHIuCisuYmUxaDQKKy5iZWhhdjFpCisuYmVoYXZpMW91MgorLmJlaGF2MmlvCisuYmVoYXZpNG91cgorLmJlOWg4YTh2OWk4bzh1OHI4cy4KKy5iZWhhdmlvdTRyczIKKy5iZTh2OGk4ZThzLgorLmJlMXZpCisuYmV2MmllNAorLmJpOGI5bDhpOW84ZzlyOGE5cDhoOHk5czh0OHk4bDhlLgorLmJpMmIKKy5iaTFiMmwyCisuYmliM2xpCisuYmlibGk1b2cKKy5iaWJsMmlvCisuYmlibGlvMmdyCisuYmlibGlvNGczcmExcGh5CisuYmlibGlvZ3JhcGh5MnMKKy5iaWJsaW9ncmFwaHlzMXQKKy5iaWJsaW9ncmFwaHlzMnR5CisuYmlibGlvZ3JhcGh5czJ0eWwKKy5iaTlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy5iMmk0ZAorLmJpMmRpCisuYmlkMWlmCisuYmlkaTRmMWYKKy5iaWRpZmZlcjEKKy5iaWRpZmZlcjNlbjF0CisuYmlkaWZmZXJlbnQyaQorLmJpZGlmZmVyZW4xdDJpMWEKKy5iaWRpZmZlcmVudGkyYWwKKy5iaThnOWc4ZThzOHQuCisuYjJpZworLmJpNGcxZzIKKy5iaWcyZ2UKKy5iaThsOGw5YThiOGw4ZS4KKy4xYmlsCisuYmlsbDVhYgorLmJpbDFsCisuYmlsbGFiMmwyCisuYmk4bzltOGE4dDhoOWU5bThhOHQ5aThjOHMuCisuYjJpbworLmJpbzRtCisuYmlvMW1hCisuYmlvbTRhdGgzCisuYmlvbWF0aDVlbQorLmJpb21hdGgyZQorLmJpb21hdGhlMW1hCisuYmlvbWF0aGVtYXQxaWMKKy5iaW9tYXRoZW1hdGk0YzNzMgorLmJpOG85bThlOGQ5aTljOGE4bC4KKy5iaW8ybWUKKy5iaW8ybWVkCisuYmlvbTRlZGkKKy5iaW9tZWQzaTFjYQorLmJpOG85bThlOGQ5aTljOGk4bjhlLgorLmJpb21lZDJpMWNpCisuYmlvbWVkaTJjaW4KKy5iaW9tZWRpYzJpbmUKKy5iaThvOXI4aDh5OHQ4aDhtOHMuCisuYmlvcmg0CisuYmlvcmh5dDRoMW0KKy5iaW9yaHl0aDRtMXMyCisuYmk4dDltOGE4cC4KKy5iaTJ0CisuYmk0dDFtCisuYml0MW1hCisuYml0NG1hcAorLmJpOHQ5bThhOHA4cy4KKy5iaXRtYTJwMXMyCisuYmw4YThuOGQ5ZThyLgorLmIybDIKKy5iM2w0YW5kCisuYmxhMm4KKy5ibGFuMWRlCisuYmw4YThuOGQ5ZThzOHQuCisuYmxhbmRlNHMyCisuYmw4aThuOGQ5ZThyLgorLmJsNGluZAorLmJsaW4xZGUKKy5ibDhvOG44ZDhlOHMuCisuYjRsbworLmJsbzJuCisuYmwyb25kCisuYmxvbjFkZQorLmJsb25kZXMyCisuYmw4dThlOXA4cjhpOG44dC4KKy5ibHVlcHIyCisuYmx1ZXByaW40dDMKKy5ibDh1OGU5cDhyOGk4bjh0OHMuCisuYmx1ZXByaW40dDRzMgorLmJvOWw4bzhtOWU5dDhlOHIuCisuYm9sbzJtZQorLmJvbG80bWV0CisuYm9sb21lMXRlCisuYm84bzhrOXM4ZThsOGw5ZThyLgorLjNib28yCisuYm8ybzRrCisuYm9vNGsxczIKKy5ib29rc2VsMWwKKy5ib29rc2VsMmxlCisuYm84bzhrOXM4ZThsOGw5ZThyOHMuCisuYm9va3NlbGxlNHIxczIKKy5ibzhvOGw5ZThhOG4uCisuYm9vbGUyYQorLmJvb2xlYTJuCisuYm84bzhsOWU4YThuOHMuCisuYm9vbGVhMm4xczIKKy5ibzhyOW44bzlsOG84ZzlpOWM4YThsLgorLmJvcm5vNAorLmJvcm5vM2xvZzFpYworLmJvcm5vbG9naTFjYQorLmJvOHQ5dTlsOGk4czhtLgorLmJvMXR1CisuYm90dWwyaQorLmJvdHVsaTJzMW0KKy5icjh1OHM4cTh1OGU4ci4KKy5icjJ1cworLmJydXNxdTIKKy5icnVzM3F1ZXIKKy5idThmOWY4ZThyLgorLmJ1ZjRmZXIxCisuYnU0ZjFmCisuYnU4ZjlmOGU4cjhzLgorLmJ1ZmZlNHIxczIKKy5idThzOGk4ZThyLgorLmJ1czVpZTQKKy5iMnVzCisuYnU4czhpOGU4czh0LgorLmJ1c2kxZXN0CisuYnU4czhzOGk4bjhnLgorLmJ1MnNzCisuYnVzMXNpCisuYnVzMnMxaW4KKy5idXNzM2luZworLmJ1OHQ4dDhlOGQuCisuYnV0MnQxZWQKKy5idTh6OHo5dzhvOHI4ZC4KKy5idTR6MXoyCisuYnV6ejF3bzIKKy5idTh6OHo5dzhvOHI4ZDhzLgorLmJ1enp3b3IyZDFzMgorLmNhOWM4bzhwOGg5bzluOHkuCisuY2ExY28KKy5jYWMyb3BoCisuY2Fjb3BobzVueQorLmNhY29waG8ybgorLmNhOWM4bzhwOGg5bzluOGk4ZThzLgorLmNhY281cGhvbmkKKy5jYWNvcGhvbjJpZTQKKy5jYThsOGw5ZThyLgorLmNhbDFsCisuY2FsMmxlCisuY2E4bDhsOWU4cjhzLgorLmNhbGxlNHIxczIKKy5jYThtOWU4cjhhOW04ZThuLgorLmNhbTVlcjFhCisuY2FtZXJhMW1lbgorLmNhOHI4dDl3OGg4ZThlOGwuCisuY2FydHc0CisuY2E4cjh0OXc4aDhlOGU4bDhzLgorLmNhcnR3aGVlMmwxczIKKy5jYTl0OGE4cjhyOGg4cy4KKy5jYTJ0YQorLmNhdDJhMnIKKy5jYXRhcjFyNAorLmNhdGFycmg0CisuY2F0YXJyNGgxczIKKy5jYTh0OWE5czh0OHI4bzhwOGg5aThjLgorLmNhdGFzMXQ0cgorLmNhdGFzdHIyb3BoCisuY2F0YXN0cm9waDFpYworLmNhOHQ5YTlzOHQ4cjhvOHA4aDlpOWM4YThsOGw4eS4KKy5jYXRhc3Ryb3BoaTFjYQorLmNhdGFzdHJvcGhpY2FsMWwKKy5jYXRhc3Ryb3BoaWNhbDFseQorLmNhOHQ5ZTluOG84aThkLgorLmNhdDRlbm8KKy5jYXRlbm9pMgorLmNhdGVubzJpZAorLmNhOHQ5ZTluOG84aThkOHMuCisuY2F0ZW5vaTJkMXMyCisuY2E4dTlsOGk5ZjhsOG84dzllOHIuCisuY2F1NGwyCisuY2F1bDJpCisuY2F1bGk0ZjRsMgorLmNhdWxpZmxvdzFlcgorLmNoOGE4cDlhOHI5cjhhOGwuCisuY2hhcDJhMnI0CisuY2hhMXBhCisuY2hhcGFyMXI0CisuY2g4YThyOXQ4cjhlOHU4czhlLgorLmNoMmEycgorLmNoYXJ0cjRldTIKKy5jaGFydHJlMnVzNAorLmNoOGU4bThvOXQ4aDhlOHI5YThwOHkuCisuY2hlMgorLmNoZTFtbworLmNoZW00b3RoMworLmNoZW1vdGgyZQorLmNoZW1vdGg0ZXIxYQorLmNoZW1vdGhlcmEzcAorLmNoOGU4bThvOXQ4aDhlOHI5YTlwOGk4ZThzLgorLmNoZW1vdGhlcmFwMmllNAorLmNoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5jNGgxbDQKKy5jaDJsbworLmNobG9ybzJtZQorLmNobG9ybzRtZXQKKy5jaGxvcm9tZXRoYTJuNAorLmNoOGw4bzhyOG85bThlOHQ4aDlhOG44ZThzLgorLmNobG9yb21ldGhhMW5lcworLmNoOG85bDhlOHM5dDhlOHI4aThjLgorLjNjaG8yCisuYzNob2w0ZQorLmNob2xlczIKKy5jaG9sZXMxdGVyMWkKKy5jaThnOWE5cjhlOHQ4dDhlLgorLmMyaWcKKy5jaTFnYQorLmNpZzJhMnIKKy5jaWdhcmU0dDN0MgorLmNpOGc5YTlyOGU4dDh0OGU4cy4KKy5jaWdhcmV0NHRlcworLmNpOG44cTh1OGU5ZjhvOGk4bC4KKy4yY2luCisuY2luMXEKKy5jaW5xdTIKKy5jaW5xdWUxZgorLmNpbnF1ZTFmbworLmNpbnF1ZWZvaTIKKy5jbzlhOHM4czhvOWM4aThhOXQ4aTh2OGUuCisuYzRvYQorLmNvYTJzcworLmNvYXMxc28KKy5jb2Fzc28xY2kKKy5jb2Fzc28zYzJpMWEKKy5jb2Fzc29jaTRhMXQyaXYKKy5jbzlnOG44YThjLgorLjJjb2cKKy5jb2cxbjRhCisuY285ZzhuOGE4YzhzLgorLmNvZ25hNGMzczIKKy5jbzlrOGU4cjluOGU4bC4KKy5jMm9rCisuY29rMWVyCisuY29rZXIzbmVsCisuY285azhlOHI5bjhlOGw4cy4KKy5jb2tlcm5lMmwxczIKKy5jbzhsOWw4aThuOWU4YTl0OGk4bzhuLgorLmNvbDFsCisuY29sbDJpCisuY29sMmxpbjQKKy5jb2wxbDRpbmUKKy5jb2xsaW4zZWEKKy5jb2xsaW5lYTJ0CisuY29sbGluZWExdDJpbworLmNvbGxpbmVhdGlvMm4KKy5jbzhsOXU4bThuOHMuCisuY29sdTRtMW4KKy5jb2x1bTJuMXMyCisuY284bTlwOGE4cjlhOG44ZC4KKy5jbzRtMXAKKy5jb21wYXJhNQorLmNvbTFwYQorLmNvbXAyYTJyCisuY29tcGFyYTJuCisuY29tcGFyNGFuZAorLmNvOG05cDhhOHI5YThuOGQ4cy4KKy5jb21wYXJhbjJkMXMyCisuY284bTlwOGU4bjlkOGk4dThtLgorLmNvbXBlbmRpMXUKKy5jbzhtOXA4bzluOGU4bjh0OXc4aThzOGUuCisuY29tcG8ybgorLmNvbXBvM25lbgorLmNvbXBvbmVuMXQKKy5jb21wb25lbnR3NAorLmNvbXBvbmVudHdpczQKKy5jb21wb25lbnR3aTIKKy5jb21wb25lbnQzdzRpc2UKKy5jbzhtOHA5dDhyOG84bDlsOGU4ci4KKy5jb21wNHRyCisuY29tMnAxdAorLmNvbXB0cm9sMWwKKy5jb21wdHJvbDJsZQorLmNvOG04cDl0OHI4bzhsOWw4ZThyOHMuCisuY29tcHRyb2xsZTRyMXMyCisuY284bjlmOG84cjhtOWE4YjhsOGUuCisuY28ybgorLmNvbjNmCisuY29uMWZvCisuY29uZm8ycgorLmNvbmZvcjFtCisuY29uZm9yMW1hCisuY29uZm9yMm1hYgorLmNvbmZvcm1hYjJsMgorLmNvOG45ZjhvOHI4bTlpOHM4dC4KKy5jb25mb3IybWkKKy5jb25mb3JtMmlzCisuY284bjlmOG84cjhtOWk4czh0OHMuCisuY29uZm9ybWlzNHQxczIKKy5jbzhuOWY4bzhyOG05aTh0OHkuCisuY29uZm9yM21pdAorLmNvbmZvcm1pMXR5CisuY284bjlnOHI4ZThzOHMuCisuY29uM2cKKy5jb24xZ3IKKy5jb25ncjJlMnNzCisuY284bjlnOHI4ZThzOHM4ZThzLgorLmNvbmdyZXNzMWU0cworLmNvOG45dDhyOGk4Yjl1OHQ4ZS4KKy5jb241dAorLmNvbnRyNGliCisuY284bjl0OHI4aThiOXU4dDhlOHMuCisuY284bjl0OHI4aThiOXU4dDhlOGQuCisuY29udHJpYnUydDFlZAorLmNvOXI4ZTlsOGE5dDhpOG84bi4KKy5jb3JlMWxhCisuY29yZWxhMXQyaW8KKy5jb3JlbGF0aW8ybgorLmNvOXI4ZTlsOGE5dDhpOG84bjhzLgorLmNvcmVsYXRpbzJuM3MyCisuY285cjhlOWw4aTlnOGk4bzhuOWk4czh0LgorLmNvcmUxbDJpCisuY29yZWwyaWcKKy5jb3JlbDRpZ2kKKy5jb3JlbGk1ZzJpbworLmNvcmVsaWdpb24zaQorLmNvcmVsaWdpbzJuCisuY29yZWxpZ2lvbjFpcworLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dDhzLgorLmNvcmVsaWdpb25pczR0MXMyCisuY285cjhlOW84cDlzOGk4cy4KKy5jb3JlMW8KKy5jb3JlbzJwMXMyCisuY29yZW9wMXNpcworLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQuCisuY29yZTFzcAorLmNvcmVzNHBvMm4KKy5jb3Jlc3Ayb25kCisuY29yZXNwb24xZGUKKy5jb3Jlc3BvbjFkZW4KKy5jb3Jlc3BvbmRlbjF0CisuY285cjhlOXM4cDhvOG45ZDhlOG44dDhzLgorLmNvcmVzcG9uZGVuNHQ0czIKKy5jbzlzOGU5YzhhOG44dC4KKy5jb3M0ZQorLmNvc2UxY2EKKy5jb3NlY2EybgorLmNvc2VjYW4xdAorLmNvOXQ4YThuOWc4ZThuOHQuCisuY280dGEybgorLmNvMXRhCisuY290MmFuZworLmNvdGFuMWdlbgorLmNvdGFuZ2VuMXQKKy5jbzh1OHI5czhlOHMuCisuY291MgorLmNvdTRyczIKKy5jb3VyMnNlCisuY291cnMzZTRzCisuY285dzhvOHI4azllOHIuCisuY280d28yCisuY293b3JrMWVyCisuY285dzhvOHI4azllOHI4cy4KKy5jb3dvcmtlNHIxczIKKy5jcjhhOG44azljOGE4czhlLgorLmNyYTJuCisuY3JhNG5rMgorLmNyYW5rMWNhCisuY3I4YThuOGs5czhoOGE4Zjh0LgorLmNyYW40azFzMgorLmNyYW5rczJoCisuY3JhbmtzaGEyZgorLmNyYW5rc2hhMmZ0CisuY3I4bzhjOW85ZDhpOGw4ZS4KKy5jcjJvYworLmNybzRjb2QKKy5jcm8xY28KKy5jcjhvOGM5bzlkOGk4bDhlOHMuCisuY3JvY29kaWxlczIKKy5jcjhvOHM4czloOGE4dDhjOGguCisuY3JvMnM0cworLmNyb3NzMmgKKy5jcm9zc2hhNHRjCisuY3Jvc3NoYXQ0Y2gKKy5jcjhvOHM4czloOGE4dDhjOGg4ZThkLgorLmNyb3NzaGF0Y2hlMgorLmNyb3NzaGF0NGNoNGVkCisuY3I4bzhzOHM5bzh2OGU4ci4KKy5jcm9zMXNvCisuY3JvczRzb3YKKy5jcjh5OHA5dDhvOWc4cjhhOG0uCisuY3J5MnAxdAorLmNyeXAxdG8KKy5jcnlwdG8yZ3IKKy5jcjh5OHA5dDhvOWc4cjhhOG04cy4KKy5jcnlwdG9ncmE0bTFzMgorLmN1OGY4ZjlsOGk4bjhrLgorLmM0dWYKKy5jdTRmMWYKKy5jdWZmNGwyCisuY3VmZmxpbjQKKy5jdWZmbDRpNG5rMgorLmN1OGY4ZjlsOGk4bjhrOHMuCisuY3VmZmxpbjRrMXMyCisuY3U5bjhlOGk5ZjhvOHI4bS4KKy4zY3VuCisuY3UybmUKKy5jdW5laTIKKy5jdW5laTFmbworLmN1bmVpZm8ycgorLmN1bmVpZm9yMW0KKy5jdThzOXQ4bzhtOWk4ejlhOWI4bDhlLgorLjFjMnVzCisuY3VzMXRvCisuY3VzdG9tMml6CisuY3VzdG9taXphMQorLmN1c3RvbWl6NWEyYgorLmN1c3RvbWl6YWIybDIKKy5jdThzOXQ4bzhtOWk4ejhlLgorLmN1c3RvbWkyemUKKy5jdThzOXQ4bzhtOWk4ejhlOHMuCisuY3U4czl0OG84bTlpOHo4ZThkLgorLmRhOGM4aDhzOWg4dThuOGQuCisuMWQyYQorLmRhMmNoNAorLmRhYzRoMXMyCisuZGFjaDRzMmgKKy5kYThtOXM4ZThsOWY4bDh5LgorLmRhMm0yCisuZGE0bTFzMgorLmRhbTVzZTJsMmYKKy5kYW1zZWxmNGwyCisuZGFtc2VsZjJseTUKKy5kYThtOXM4ZThsOWY4bDhpOGU4cy4KKy5kYW1zZWxmbDJpZTQKKy5kYThjOHQ4eThsOW85ZzhyOGE4bS4KKy5kYTJjMXQKKy5kYWMxdHkKKy5kYWMydHlsCisuZGFjdHkzbG8KKy5kYWN0eWxvMWdyCisuZGE4Yzh0OHk4bDlvOWc4cjhhOHA4aC4KKy5kYTh0OGE5YjhhOHM4ZS4KKy4zZGF0CisuZGEydGEKKy5kYTJ0YWIKKy5kYTh0OGE5YjhhOHM4ZThzLgorLmRhdGFiYXMxZTRzCisuZGE4dDhhOXA4YTh0OGguCisuZGF0NWFwCisuZGF0YXA1YXQKKy5kYXRhMXBhCisuZGF0YXA0YXRoCisuZGE4dDhhOXA4YTh0OGg4cy4KKy5kYXRhcGEydDRoMXMyCisuZGE4dDhlOXM4dDhhOG04cC4KKy5kYXQzZXN0CisuZGF0ZXMxdGEKKy5kYXRlc3RhNG0xcAorLmRhOHQ4ZTlzOHQ4YThtOHA4cy4KKy5kYXRlc3RhbTJwMXMyCisuZGU5YzhsOGE4cjlhOGI4bDhlLgorLmRlNGNsMmEycgorLmRlY2xhMnJhYgorLmRlY2xhcmFiMmwyCisuZGU5ZjhpOG45aTl0OGk4djhlLgorLmRlMWYKKy5kZTFmaQorLmRlMmZpbgorLmRlZjJpbmkKKy5kZWZpbjJpdAorLmRlZmluaTF0aQorLmRlZmluaTF0Mml2CisuZGU5bDhlOGM5dDhhOWI4bDhlLgorLmQ1ZWxlYworLmRlbGUyYzF0CisuZGVsZWMydGE0YgorLmRlbGVjMXRhCisuZGVsZWN0YWIybDIKKy5kZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5kZTRtMmlzCisuZGVtNGlzZQorLmRlbWlzZW1pM3F1YQorLmRlbWlzZW1pcXUyCisuZGVtaXNlbWlxdWE1djQKKy5kZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmRlbWlzZW1pcXVhdmU0cjFzMgorLmRlOW04bzhjOXI4YTl0OGk4czhtLgorLmRlNG1vY3IKKy5kZW1vY3JhdGkyczRtCisuZGU4bThvOHMuCisuZGVtb3MyCisuZGU5cjhpOHY5YTl0OGk4djhlLgorLmRlcjJpNHYKKy5kZTRyaTF2YQorLmRlcmkzdmF0CisuZGVyMml2YTF0Mml2CisuZGU5cjhpOHY5YTl0OGk4djhlOHMuCisuZGVyaXZhdGl2NGUycworLmRpOGE5bDhlOGM5dDhpOGMuCisuMWQ0aTNhCisuZGkyYWwKKy5kaTJhbGUKKy5kaWFsZTJjMXQKKy5kaThhOWw4ZThjOXQ4aThjOHMuCisuZGlhbGVjdGk0YzNzMgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG4uCisuZGlhbGVjdDJpMWNpCisuZDJpMWFsZWN0aTNjMmkxYQorLmRpYWxlY3RpY2kyYTJuCisuZGk4YTlsOGU4Yzl0OGk5YzhpOGE4bjhzLgorLmRpYWxlY3RpY2lhMm4xczIKKy5kaTljOGg4bDhvOHI4bzltOGU4dDhoOWE4bjhlLgorLmQ0aTJjaAorLmRpYzRoMWw0CisuZGljaDJsbworLmRpY2hsb3JvMm1lCisuZGljaGxvcm80bWV0CisuZGljaGxvcm9tZXRoYTJuNAorLmRpOGY5ZjhyOGE4Yzh0LgorLmQxaWYKKy5kaWY0ZnIKKy5kaTRmMWYKKy5kaWZmcmEyYzF0CisuZGk4ZjlmOHI4YThjOHQ4cy4KKy5kaWZmcmFjNHQxczIKKy5kaThmOWY4cjhhOGM5dDhpOG84bi4KKy5kaWZmcmFjMXQyaW8KKy5kaWZmcmFjdGlvMm4KKy5kaThmOWY4cjhhOGM5dDhpOG84bjhzLgorLmRpZmZyYWN0aW8ybjNzMgorLmRpOHI4ZThyLgorLmQ0aXIyCisuZGkxcmUKKy5kaXIxZXI0CisuZGk4cjhlOW44ZThzOHMuCisuZGlyZTFuZXMKKy5kaXJlbjJlMnNzCisuZGk4czlwOGE4cjlhOG44ZC4KKy5kaXMxCisuZGlzMXAKKy5kaTJzMXBhCisuZGlzcDJhMnIKKy5kaXNwYXJhMm4KKy5kaXNwYXI0YW5kCisuZGk4czlwOGE4cjlhOG44ZDhzLgorLmRpc3BhcmFuMmQxczIKKy5kaThzOXQ4cjhhOHU4ZzhoOHQ5bDh5LgorLmQ0aXMzdAorLmRpc3Q0cgorLmRpczF0cmEKKy5kaXN0cmF1Z2gzCisuZGlzdHJhdWdoMnRsCisuZGlzdHJhdWdodDFseQorLmRpOHM5dDhyOGk4Yjl1OHQ4ZS4KKy5kaXN0cjRpYgorLmRpOHM5dDhyOGk4Yjl1OHQ4ZThzLgorLmRpOHM5dDhyOGk4Yjl1OHQ4ZThkLgorLmRpc3RyaWJ1MnQxZWQKKy5kbzh1OWI4bDhlOXM4cDhhOGM4ZS4KKy5kb3UyCisuZG91M2IybDIKKy5kb3U1YmxlMXNwCisuZG91YmxlczIKKy5kb3VibGUyczFwYQorLmRvdWJsZXNwYTRjZQorLmRvOHU5YjhsOGU5czhwOGE4YzlpOG44Zy4KKy5kb3VibGVzcDRhMmNpCisuZG91Ymxlc3BhMmMxaW4KKy5kb3VibGVzcGFjMWluZworLmRvOGw4bDlpOHM4aC4KKy5kb2wxbAorLmRvbGwyaQorLmRvbGxpczJoCisuZHI4aThmOHQ5YThnOGUuCisuMWRyCisuZHI0aTJmdAorLmRyaWYxdGEKKy5kcjhpOHY5ZThyOHMuCisuZHIyaXYKKy5kcml2ZTRyMXMyCisuZHI4bzhtOWU5ZDhhOHI4eS4KKy5kcm8ybWUKKy5kcm8ybWVkCisuZHJvbTJlMmQyYQorLmRyb21lNGRhcnkKKy5kcm9tZWQyYTJyCisuZHI4bzhtOWU5ZDhhOHI4aThlOHMuCisuZHJvbWVkYXIxaQorLmRyb21lZGFyMmllNAorLmR1OW84cDlvOWw4aThzOHQuCisuZHVvcG9sMmkKKy5kdTlvOHA5bzlsOGk4czh0OHMuCisuZHVvcG9saXM0dDFzMgorLmR1OW84cDlvOGw4eS4KKy5kdW9wbzJseQorLmR5OHM5bDhlOHg4aThhLgorLmQyeQorLmR5czFsMgorLmR5czJsZQorLmR5c2xleDNpCisuZHlzbGV4Mmk1YQorLmR5OHM5bDhlOGM5dDhpOGMuCisuZHlzbGUyYzF0CisuZWE4czh0OWU4bjhkOWU4cjhzLgorLmVhc3QzCisuZWFzM3RlbgorLmVhczN0ZW5kCisuZWFzdGVuMWRlCisuZWFzdGVuZGU0cjVzMgorLmVjOG85bjhvOG05aThjOHMuCisuZTFjbworLmVjbzJuCisuZWNvM25vbWljCisuZWNvbm9taTRjM3MyCisuZWM4bzhuOW85bThpOHM4dC4KKy5lY29ub20yaXMKKy5lYzhvOG45bzltOGk4czh0OHMuCisuZWNvbm9taXM0dDFzMgorLmVpOWc4ZThuOWM4bDhhOHM4cy4KKy5laTIKKy5lMmlnMgorLmVpMWdlbgorLmVpZ2VuMWM0bDQKKy5laWdlbmNsYTJzcworLmVpOWc4ZThuOWM4bDhhOHM4czhlOHMuCisuZWlnZW5jbGFzczFlNHMKKy5laTlnOGU4bjl2OGE4bDl1OGUuCisuZWlnZW4xdjIKKy5laWdlbjF2YQorLmVpZ2VudmFsMXUKKy5laTlnOGU4bjl2OGE4bDl1OGU4cy4KKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG45aTljOGE4bC4KKy41ZWxlYworLmVsZTJjMXQKKy5lbGVjdHJvMm1lCisuZWxlY3Ryb21lMmNoCisuZWxlY3Ryb21lNWNoYTRuMWljCisuZWxlY3Ryb21lY2hhMm4KKy5lbGVjdHJvbWVjaGFuaTFjYQorLmVsOGU4Yzh0OHI4bzltOGU4YzhoOGE4bjhvOWE4YzhvOHU4czh0OGk4Yy4KKy5lbGVjdHJvbWVjaGFubzQKKy5lbGVjdHJvbWVjaGFuNG9hCisuZWxlY3Ryb21lY2hhbm9hMWNvCisuZWxlY3Ryb21lY2hhbm9hY291MgorLmVsZWN0cm9tZWNoYW5vYWNvMnVzCisuZWxlY3Ryb21lY2hhbm9hY291c3QyaQorLmVsZWN0cm9tZWNoYW5vYWNvdXMxdGljCisuZWw4aTh0OWk4czh0LgorLmVsMmkKKy5lbDFpdAorLmVsaTF0aQorLmVsNGl0aXMKKy5lbDhpOHQ5aThzOHQ4cy4KKy5lbGl0aXM0dDFzMgorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHIuCisuZW4xdAorLmVudHJlcHIyCisuZW50cmVwcmVuNGV1CisuZW45dDhyOGU5cDhyOGU5bjhlOHU4cjlpOGE4bC4KKy5lbnRyZXByZW5ldXIyaTNhCisuZW50cmVwcmVuZXVyaTJhbAorLmVwOWk5bjhlOHA4aDlyOGk4bjhlLgorLmVwaTJuCisuZXAyaW5lCisuZXBpbmVwNGhyNAorLmVwMmluZXBocjJpbjRlCisuZXE4dThpOXY4YThyOGk5YThuOHQuCisuZXF1Mml2MworLmVxdWkxdmEKKy5lcXVpdjJhMnIKKy5lcXVpdmFyMWkKKy5lcXVpdmFyM2kyYTJuCisuZXF1aXZhcjJpM2EKKy5lcXVpdmFyNGlhbjR0CisuZXE4dThpOXY4YThyOGk5YThuOGM4ZS4KKy5lcXVpdmFyNGlhbmMKKy5ldDhoOWE4bjhlLgorLmV0aGEybjQKKy5ldDhoOXk4bDllOG44ZS4KKy5ldjhlOHI5czhpOWI4bDhlLgorLmV2MWVyCisuZXZlNHIxczIKKy5ldmVyMXNpCisuZXZlcjRzaTRiCisuZXZlcnNpMWIybDIKKy5ldjhlOHI4dC4KKy5ldjhlOHI4dDhzLgorLmV2ZXI0dDFzMgorLmV2OGU4cjh0OWU4ZC4KKy5ldmVyMnQxZWQKKy5ldjhlOHI4dDlpOG44Zy4KKy5ldmVyMXRpCisuZXZlcjJ0MWluCisuZXg5cTh1OGk4czlpOHQ4ZS4KKy5leHF1MgorLmV4cTJ1aTIKKy5leHF1aXMyaXRlCisuZXg5dDhyOGE5bzhyOWQ4aTluOGE4cjh5LgorLmV4MXQyCisuZXgxdHJhCisuZXh0cjRhbworLmV4dHJhb3JkMmkKKy5leHRyYW9yZDFpbjQKKy5leHRyYW9yMWRpMW5hCisuZXh0cmFvcmRpbjJhMnIKKy5mYThsOGw5aThuOGcuCisuMWZhCisuZmFsMWwKKy5mYWxsMmkKKy5mYWwybGluNAorLmZlOHI4bThpOW84bjhzLgorLmZlcjEKKy5mZXIzbTQKKy5mZXI0bTJpbworLmZlcm1pbzJuCisuZmVybWlvMm4zczIKKy5maTluOGk4dDhlOWw4eS4KKy4xZmkKKy4yZmluCisuZjJpbmkKKy5maW4yaXQKKy5maW4yaXRlCisuZmluaXRlMWx5CisuZmw4YTlnOGU4bDlsOHU4bS4KKy5mNGwyCisuZmxhZzVlbDFsCisuZmw4YTlnOGU4bDlsOGEuCisuZmxhZzRlbGxhCisuZmw4YThtOW04YTliOGw4ZThzLgorLmZsYW0xbQorLmZsYW0xbWEKKy5mbGFtMm1hYgorLmZsYW1tYWIybDIKKy5mbGFtbWFibGVzMgorLmZsOGU4ZDhnOWw4aThuOGcuCisuZmxlZGdsMgorLmZsOG84dzljOGg4YThyOHQuCisuZmxvdzJjaAorLmZsb3djaDJhMnIKKy5mbDhvOHc5YzhoOGE4cjh0OHMuCisuZmxvd2NoYXI0dDFzMgorLmZsOHU4bzhyOG85YzhhOHI5YjhvOG4uCisuZmx1M28KKy5mbHVvM3IKKy5mbHVvcjJvYworLmZsdW9ybzFjYQorLmZsdW9yb2MyYTJyCisuZmx1b3JvY2FyMWIKKy5mbHVvcm9jYXJiNG8KKy5mbHVvcm9jYXJibzJuCisuZm84cjltOGk5ZDhhOWI4bDhlLgorLmZvcjJtaQorLmZvcm1pMWQ0YQorLmZvcm0yaWQKKy5mb3JtaTJkM2E0YgorLmZvcm1pZGFiMmwyCisuZm84cjltOGk5ZDhhOWI4bDh5LgorLmZvcm1pZGFiMWx5CisuZm84cjlzOHk4dDhoOWk4YS4KKy5mbzRyczIKKy5mb3JzNHkKKy5mb3JzeXRoMmkxYQorLmZvOHI4dDhoOXI4aThnOGg4dC4KKy5mb3J0NGhyNAorLmZvcnRocjJpZworLmZyOGU4ZTlsOG84YThkOGU4ci4KKy5mcmVlbDRvYQorLmZyZWVsb2EyZDMKKy5mcjhlOGU5bDhvOGE4ZDhlOHI4cy4KKy5mcmVlbG9hZGU0cjVzMgorLmZyOGk4ZThuOGQ5bDhpOGU4ci4KKy5mcmkyCisuZnIyaWU0CisuZnJpZW5kbDJpZTQKKy5mcjhpOXY4bzhsOWk4dDh5LgorLmZyMml2CisuZnJpdm9sMmkKKy5mcml2b2wxaXQKKy5mcml2b2xpMXR5CisuZnI4aTl2OG84bDlpOXQ4aThlOHMuCisuZnJpdm9saTF0aQorLmZyaXZvbGl0MmllNAorLmZyOGk4djlvOWw4bzh1OHMuCisuZnJpdm9sb3UyCisuZnJpdm9sbzJ1cworLmdhOWw4YThjOXQ4aThjLgorLmdhbGEyYzF0CisuZ2E4bDlhOHg4eS4KKy5nYThsOWE4eDlpOGU4cy4KKy5nYWxheDNpCisuZ2FsYXgyaWU0CisuZ2E4czlvOG05ZTl0OGU4ci4KKy5nYTFzbworLmdhM3NvbQorLmdhc28ybWUKKy5nYXNvNG1ldAorLmdhc29tZTF0ZQorLmdlOW85ZDhlOHM5aThjLgorLmdlb2RlczIKKy5nZW9kZTFzaQorLmdlb2RlMnNpYworLmdlOW85ZDhlOHQ5aThjLgorLmdlb2RlMXQKKy5nZW9kZXQxaWMKKy5nZThvOW04ZTh0OXI4aThjLgorLmdlM29tCisuZ2VvMm1lCisuZ2VvNG1ldAorLmdlb200ZXRyCisuZ2VvNW1ldDNyaWMKKy5nZThvOW04ZTh0OXI4aThjOHMuCisuZ2VvbWU0dHJpNGMzczIKKy5nZTlvOXM4dDhyOG84cDhoOGk4Yy4KKy5nZW9zNAorLmdlb3N0NHIKKy5nZW9zdHIyb3BoCisuZ2Vvc3Ryb3BoMWljCisuZ2U4bzl0OGg4ZThyOW04YThsLgorLmdlNG90CisuZ2U0b3RoCisuZ2VvdGgyZQorLmdlb3RoZXIzbTQKKy5nZW90aGVyMW1hCisuZ2U5bzh0OXI4bzlwOGk4czhtLgorLmdlb3Ryb3BpMnMxbQorLmduOG85bThvOG4uCisuZzFubworLmdubzRtbworLmdubzRtbzJuCisuZ244bzltOG84bjhzLgorLmdub21vMm4zczIKKy5ncjhhOG44ZDl1OG44YzhsOGUuCisuMWdyCisuZ3JhMm4yCisuZ3I0YW5kCisuZ3JhbjFkdQorLmdyYW5kdTRuCisuZ3JhbmR1bjFjNGw0CisuZ3I4YThuOGQ5dThuOGM4bDhlOHMuCisuZ3JhbmR1bmNsZXMyCisuZ3I4aThlOHY5YThuOGM4ZS4KKy5ncjJpZTQKKy5ncmllMXZhCisuZ3JpZXZhMm4KKy5ncjhpOGU4djlhOG44YzhlOHMuCisuZ3I4aThlOHY5bzh1OHMuCisuZ3JpZXZvdTIKKy5ncmlldm8ydXMKKy5ncjhpOGU4djlvOHU4czlsOHkuCisuZ3JpZXZvdXMxbDIKKy5ncmlldm91czFseQorLmhhOGk4cjlzOHQ4eThsOGUuCisuaGFpMgorLmhhNGlyCisuaGFpNHJzMgorLmhhaXJzMnR5CisuaGFpcnMydHlsCisuaGE4aThyOXM4dDh5OGw4ZThzLgorLmhhaXJzdHlsZXMyCisuaGE4aThyOXM4dDh5OGw5aThzOHQuCisuaGE4aThyOXM4dDh5OGw5aThzOHQ4cy4KKy5oYWlyc3R5bGlzNHQxczIKKy5oYThsOGY5czhwOGE4YzhlLgorLmhhMmxmCisuaGFsMmYzcworLmhhbGYyczFwYQorLmhhbGZzcGE0Y2UKKy5oYThsOGY5czhwOGE4YzhlOHMuCisuaGE4bDhmOXc4YTh5LgorLmhhOHI5YjhpOG45ZzhlOHIuCisuaDJhMnIKKy5oYXIxYgorLmhhcmJpMgorLmhhcjJiaW4KKy5oYXJiNGluZ2UKKy5oYThyOWI4aThuOWc4ZThyOHMuCisuaGFyYmluZ2U0cjFzMgorLmhhOHI5bDhlOXE4dThpOG4uCisuaGFyNGxlNAorLmhhcjFsCisuaGFybGUxcQorLmhhcmxlcXUyCisuaGFybGVxMnVpMgorLmhhcmxlcXVpNG4KKy5oYThyOWw4ZTlxOHU4aThuOHMuCisuaGFybGVxdTJpMm4xczIKKy5oYTh0OGM4aDllOHI4aThlOHMuCisuaGE0dGMKKy5oYXQ0Y2gKKy5oYXRjaGUyCisuaGF0Y2hlcjFpCisuaGF0Y2hlcjJpZTQKKy5oZThtOGk5ZDhlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyLgorLmhlbTJpZAorLmhlbWlkNGVtCisuaGVtaWRlNG0yaXMKKy5oZW1pZGVtNGlzZQorLmhlbWlkZW1pc2VtaTNxdWEKKy5oZW1pZGVtaXNlbWlxdTIKKy5oZW1pZGVtaXNlbWlxdWE1djQKKy5oZThtOGk5ZDhlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyOHMuCisuaGVtaWRlbWlzZW1pcXVhdmU0cjFzMgorLmhlOW04bzlnOGw4bzliOGk4bi4KKy5oZW1vNGcKKy5oZTFtbworLmhlbW80Z2wyCisuaGVtbzNnbG8KKy5oZW1vZ2xvMWJpCisuaGVtb2dsbzJiaW4KKy5oZTltOG85cDhoOGk4bDlpOGEuCisuaGVtMm9waAorLmhlbW9waDRpbDIKKy5oZW1vcGhpbDFpCisuaGVtb3BoaWwzaTFhCisuaGU5bThvOXA4aDhpOGw5aThhOGMuCisuaGU5bThvOXA4aDhpOGw5aThhOGM4cy4KKy5oZW1vcGhpbGlhNGMzczIKKy5oZThtOG85cjhoOGU5bzhsOW84Zzh5LgorLmhlbW8ycgorLmhlbW9yaDQKKy5oZW1vcmhlM29sCisuaGVtb3JoZW9sMW8xZ3kKKy5oZTlwOGE4dDlpOGMuCisuaGVwNQorLmhlMnBhCisuaGVwYXQxaWMKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OGUuCisuaGVyM200CisuaGVyMW1hCisuaGVyNG1hcAorLmhlcm1hcDRocjQKKy5oZXJtYXBocm9kMml0ZQorLmhlOHI5bThhOHA4aDlyOG85ZDhpOHQ5aThjLgorLmhlcm1hcGhyb2QyaTF0aQorLmhlcm1hcGhyb2Q0aTJ0aWMKKy5oZTlyOG84ZThzLgorLmhlcm80ZQorLmhlOHg4YTlkOGU4YzlpOW04YThsLgorLmhleDFhCisuaGV4YTJkCisuaGV4YWRlMWMyaQorLmhleGFkZTJjM2ltCisuaGV4YWRlY2kxbWEKKy5obzlsOG85bjhvOW04eS4KKy5ob2xvMm4KKy5ob2xvbjNvM215CisuaG85bThlOG85bThvOHI5cDhoOGk4Yy4KKy5obzJtZTMKKy5ob21lbzFtbworLmhvbWVvbW8ycgorLmhvbWVvbW9yMXAKKy5ob21lb21vcnA0aDQKKy5ob21lb21vcnBoMWljCisuaG85bThlOG85bThvOHI5cDhoOGk4czhtLgorLmhvbWVvbW9ycGhpMnMxbQorLmhvOW04bzl0OGg4ZTh0OGk4Yy4KKy5obzFtbworLmhvbTRvdGgzCisuaG9tb3RoMmUKKy5ob21vM3RoZTR0CisuaG9tb3RoZXQxaWMKKy5obzhyOHM4ZTlyOGE4ZDlpOHM4aC4KKy5ob3I0c2UKKy5obzRyczIKKy5ob3JzZXIxYQorLmhvcnNlcmEyZAorLmhvcnNlcjJhZGkKKy5ob3JzZXJhZGlzMQorLmhvcnNlcmFkaXMyaAorLmhvOHQ5YjhlOGQuCisuaG8ydDFiCisuaG90NGJlMmQKKy5obzh0OWI4ZThkOHMuCisuaG90YmUyZDFzMgorLmh5OWQ4cjhvOXQ4aDhlOHI5bThhOGwuCisuaHkxZAorLmh5MWRyCisuaHlkcm80dGgyZQorLmh5ZHI0b3RoCisuaHlkcm90aGVyM200CisuaHlkcm90aGVyMW1hCisuaHk5cDhvOXQ4aDhhOGw5YTltOHU4cy4KKy5oeTNwbworLmh5cDRvdAorLmh5cDRvdGgKKy5oeXBvdGhhM2xhCisuaHlwb3RoYWxhM20KKy5oeXBvdGhhbGExbXUKKy5oeXBvdGhhbGFtMnVzCisuaWQ4ZThhOGw4cy4KKy5pZGUzYTRsCisuaWRlYTJsMXMyCisuaWQ4ZThvOWc4cjhhOHA4aDhzLgorLmlkZW8yZworLmlkZW8xZ3IKKy5pZGVvZ3JhNHA0aDFzMgorLmlkOGk4bzlzOHk4bjljOHI4YThzOHkuCisuaTJkaQorLmkxZDNpbworLmlkaTRvcworLmlkaW9zNHkKKy5pZGlvc3luMWNyCisuaWRpb3N5bmNyMmFzCisuaWRpb3N5bmNyYXM0eQorLmlkOGk4bzlzOHk4bjljOHI4YTlzOGk4ZThzLgorLmlkaW9zeW5jcmFzMmllNAorLmlkOGk4bzlzOHk4bjljOHI4YTh0OGk4Yy4KKy5pZGlvc3luNWNyYXQxaWMKKy5pZDhpOG85czh5OG45YzhyOGE4dDlpOWM4YThsOWw4eS4KKy5pZGlvc3luY3JhdGkxY2EKKy5pZGlvc3luY3JhdGljYWwxbAorLmlkaW9zeW5jcmF0aWNhbDFseQorLmlnOW44aTh0OWU4ci4KKy4yaWcKKy5pZzFuaQorLmlnbjJpdAorLmlnbjJpdGUKKy5pZzluOGk4dDllOHI4cy4KKy5pZ25pdGU0cjFzMgorLmlnOW44aTl0OG84ci4KKy5pZ24zaXRvcgorLmlnbmkxdG8KKy5pZzhuOG84cjhlOXM4cDhhOGM4ZThzLgorLmlnMW5vCisuaWdub3JlMXNwCisuaWdub3JlMnMxcGEKKy5pZ25vcmVzcGE0Y2UKKy5pbTlwOGU4ZDlhOG44YzhlLgorLmltMnAyZWQKKy5pbXAyZTJkMmEKKy5pbXBlZGEybgorLmltOXA4ZThkOWE4bjhjOGU4cy4KKy5pbjlkOHU5YjhpOXQ4YTliOGw4ZS4KKy40aW5kCisuaW4xZHUKKy5pbmR1MWI0aQorLmluZHViaTJ0CisuaW5kdWJpMXRhCisuaW5kdWJpMnRhYgorLmluZHViaXRhYjJsMgorLmluOWY4aThuOWk4dDhlOWw4eS4KKy5pbjNmCisuaW4xZmkKKy5pbjJmaW4KKy5pbmYyaW5pCisuaW5maW4yaXQKKy5pbmZpbjJpdGUKKy5pbmZpbml0ZTFseQorLmluOWY4aThuOWk5dDhlOHM5aTltOGE4bC4KKy5pbmZpbml0NGVzCisuaW5maW5pdGUxc2kKKy5pbmZpbml0ZTJzNWltCisuaW5maW5pdGVzaTFtYQorLmluOWY4cjhhOXM4dDhyOHU4Yzl0OHU4cjhlLgorLmluZnIyYXMKKy5pbmZyYXMxdDRyCisuaW5mcmFzdHJ1MmMxdAorLmluZnJhc3RydWN0dTRyCisuaW5mcmFzdHJ1YzF0dQorLmluZnJhc3RydWMzdHVyZQorLmluOWY4cjhhOXM4dDhyOHU4Yzl0OHU4cjhlOHMuCisuaW45czh0OGE4bDhsOWU4ci4KKy5pbnMydGEybAorLmluczF0YQorLmluc3RhbDFsCisuaW5zdGFsMmxlCisuaW45czh0OGE4bDhsOWU4cjhzLgorLmluc3RhbGxlNHIxczIKKy5pbjl0OGU4cjlkOGk4czljOGk5cDhsOGk5bjhhOHI4eS4KKy5pbjF0CisuaW41dGVyM2QKKy5pbnRlcmQyaQorLmludGVyZGlzMQorLmludGVyZDJpczFjCisuaW50ZXJkaXMxY2kKKy5pbnRlcmRpc2MyaXAKKy5pbnRlcmRpc2NpMXAybDIKKy5pbnRlcmRpc2NpcGxpNG4KKy5pbnRlcmRpc2NpcGw0aTFuYQorLmludGVyZGlzY2lwbGluMmEycgorLmluOXQ4ZThyOWc4YTlsOGE4Yzl0OGk4Yy4KKy5pbnRlcmcyCisuaW50ZXIxZ2EKKy5pbnRlcmdhbGEyYzF0CisuaW45dTh0OGk4bDhlLgorLmluMXUKKy5pbjR1MXQyaQorLmluOXU4dDhpOGw5aTl0OHkuCisuaW51dGlsMWkKKy5pbnV0MmlsMWl0CisuaW51dGlsaTF0eQorLmlyOXI4ZTlkOHU4YzlpOGI4bDhlLgorLmlyMnIyZWQKKy5pcnJlMWR1CisuaXJyZWR1MmMKKy5pcnJlZHVjaTRiCisuaXJyZWR1MWNpCisuaXJyZWR1Y2kxYjJsMgorLmlyOXI4ZTlkOHU4YzlpOGI4bDh5LgorLmlycmVkdWNpYjFseQorLmlyOXI4ZTh2OW85YzhhOWI4bDhlLgorLmlycmV2MgorLmlycmU1dm9jCisuaXJyZXZvMWNhCisuaXJyZXZvY2ExYjJsMgorLmlzOG84dDlyOG84cDh5LgorLmkyc28KKy5pc290cm9weTUKKy5pczhvOXQ4cjhvOHA5aThjLgorLmlzb3Ryb3AzaWMKKy5pdDhpOG45ZThyOWE4cjh5LgorLmkxdGkKKy5pMnQxaW4KKy5pdDJpbmUKKy5pdGluNGVyNGEycgorLml0aW4xZXIKKy5pdGluZXIxYQorLml0OGk4bjllOHI5YThyOWk4ZThzLgorLml0aW5lcmFyMWkKKy5pdGluZXJhcjJpZTQKKy5qZTlyOGU5bThpOWE4ZDhzLgorLjFqZQorLmplcmVtMmkzYQorLmplcmVtaWEyZAorLmplcmVtaWEyZDFzMgorLmtlOHk5bjhvOHQ4ZS4KKy5rZTh5OW44bzh0OGU4cy4KKy5rZXlubzR0ZXMKKy5rZTh5OXM4dDhyOG84azhlLgorLmtleXM0Cisua2V5czF0Cisua2V5c3Q0cgorLmtleXN0cjJvazIKKy5rZTh5OXM4dDhyOG84azhlOHMuCisua2V5c3Ryb2tlczQKKy5raThsOG45aThuOGcuCisuazFpCisuazRpMmwxbjIKKy5raWxuMWluCisua2lsbmluNGcKKy5sYThjOWk5ZThzOHQuCisubDRhMmNpNAorLmxhM2MyaWU0CisubGFjaTFlc3QKKy5sYThtOWU4bjl0OGE5YjhsOGUuCisubGExbWVuCisubGEzbWVuMXQKKy5sYW1lbjJ0YTRiCisubGFtZW4xdGEKKy5sYW1lbnRhYjJsMgorLmxhOG44ZDlzOGM4YThwOWU4ci4KKy4zbDRhbmQKKy5sYTJuCisubGFuMmQxczIKKy5sYW5kc2NhNHAKKy5sYW5kczFjYQorLmxhbmRzY2E1cGVyCisubGE4bjhkOXM4YzhhOHA5ZThyOHMuCisubGFuZHNjYXBlNHIxczIKKy5sYThyOWM4ZTluOHkuCisubDJhMnIKKy5sYXIxYworLmxhcjJjZQorLmxhcjFjZW40CisubGE4cjljOGU5bjlpOHM4dC4KKy5sYXI0Y2VuaQorLmxlOGE4ZjloOG84cDlwOGU4ci4KKy5sZTJhCisubGVhMmYKKy5sZWE0ZmgKKy5sZWFmaG80cDFwCisubGVhZmhvcDJwZQorLmxlYWZob3AzcGVyCisubGU4YThmOWg4bzhwOXA4ZThyOHMuCisubGVhZmhvcHBlNHIxczIKKy5sZTh0OXQ4ZThyOXM4cDhhOGM5aThuOGcuCisubGU0dDN0MgorLmxldHRlNHIxczIKKy5sZXR0ZXIxc3AKKy5sZXR0ZXIyczFwYQorLmxldHRlcnNwNGEyY2kKKy5sZXR0ZXJzcGEyYzFpbgorLmxldHRlcnNwYWMxaW5nCisubGk4ZjhlOXM4cDhhOG4uCisubGlmZTFzcAorLmxpZmUyczFwYQorLmxpZmVzcGE0bgorLmxpOGY4ZTlzOHA4YThuOHMuCisubGlmZXNwYTJuMXMyCisubGk4ZjhlOXM4dDh5OGw4ZS4KKy5saWZlczJ0eQorLmxpZmVzMnR5bAorLmxpOGY4ZTlzOHQ4eThsOGU4cy4KKy5saWZlc3R5bGVzMgorLmxpOGc4aDh0OXc4ZThpOGc4aDh0LgorLjNsaWdoCisubGlnaHR3NAorLmxpZ2h0d2VpMgorLmwyaWdodHdlMmlnMgorLmxpOG05bzh1OXM4aThuOGU4cy4KKy5saTRtbworLmxpM21vMnVzCisubGltb3UyCisubGltb3UyczFpbgorLmxpbW91czJpbmUKKy5saW1vdXNpMW5lcworLmxpOG44ZTliOGE4YzhrOGU4ci4KKy4xbDRpbmUKKy5saW4yZTJiCisubGluZWJhY2sxCisubGluZWJhY2sxZXIKKy5saThuOGU5czhwOGE4YzhpOG44Zy4KKy5saTFuZXMKKy5saTRuZTFzcAorLmxpbmUyczFwYQorLmxpbmVzcDRhMmNpCisubGluZXNwYTJjMWluCisubGluZXNwYWMxaW5nCisubGk5bzhuOWU4czhzLgorLmxpbzJuCisubGlvMW5lcworLmxpb24yZTJzcworLmxpOHQ4aDlvOWc4cjhhOHA4aDhlOGQuCisubDJpdGgKKy5saXRobzRnCisubGl0aG8xZ3IKKy5saXRob2dyYXBoNGVkCisubGk4dDhoOW85ZzhyOGE4cDhoOHMuCisubGl0aG9ncmE0cDRoMXMyCisubG85YjhvOHQ5bzhtOHkuCisubG9ibzR0bworLmxvYm90bzNteQorLmxvOWI4bzh0OW84bTlpOHo4ZS4KKy5sb2JvdG9tMml6CisubG9ib3RvbWkyemUKKy5sbzhnOGU4cy4KKy5sbzFnZQorLmxvOG44ZzllOHM4dC4KKy41bG9uZworLmxvMm4KKy5sbzlxOHU4YThjOWk4dDh5LgorLmxvMXEKKy5sb3F1MgorLmxvcXVhYzQKKy5sb3F1NGEyY2kKKy5sb3F1YTJjMWl0CisubG9xdWFjaTF0eQorLmxvOHY4ZTlzOHQ4cjh1OGM4ay4KKy40bG92CisubG92NGUycworLmxvdjJlc3Q0cgorLmxvdmVzdHJ1YzUKKy5sb3Zlc3RydWNrMQorLm1hOGM4cjhvOWU4YzhvOW44bzhtOGk4YzhzLgorLm1hY3JvNGUKKy5tYWNyb2UxY28KKy5tYWNyb2VjbzJuCisubWFjcm9lY28zbm9taWMKKy5tYWNyb2Vjb25vbWk0YzNzMgorLm1hOGw5YTlwOHI4bzhwOWk4czhtLgorLm1hbGFwcjIKKy5tYWxhcHJvcGkyczFtCisubWE4bDlhOXA4cjhvOHA5aThzOG04cy4KKy5tYWxhcHJvcDRpczRtMXMyCisubWE4bjlzOGw4YTh1OGc4aDl0OGU4ci4KKy5tYTJuMXMyCisubWFuMnMxbDIKKy5tYW5zbGF1Z2gzCisubWE4bjl1OXM4YzhyOGk4cDh0LgorLm1hbjJ1cworLm1hbnVzYzIKKy5tYW51c2NyaTIKKy5tYW51c2NyMmlwCisubWFudXNjcmkycDF0CisubWE4cjlnOGk4bjlhOGwuCisubWFyZzIKKy5tYXJnaTRuCisubWFyZ2kxbmEKKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG4uCisubTRhdGgzCisubWF0aDVlbQorLm1hdGgyZQorLjFtYXRoZTFtYQorLm1hdGhlbWF0MWljCisubWF0aGVtYXQyaTFjaQorLm1hdGhlbWF0aTNjMmkxYQorLm1hdGhlbWF0aWNpMmEybgorLm1hOHQ4aDllOW04YTl0OGk5YzhpOGE4bjhzLgorLm1hdGhlbWF0aWNpYTJuMXMyCisubWE4dDh0OGU4cy4KKy5tYXQ1dGUKKy5tYTR0M3QyCisubWF0NHRlcworLm1lOGQ5aThjOWE4aThkLgorLjJtZWQKKy5tNGVkaQorLm1lZDNpMWNhCisubWVkaWNhaTIKKy5tZWRpY2EyaWQKKy5tZThkOGk5bzhjOHI4ZS4KKy5tZTFkMmlvCisubWVkaW9jcmUzCisubWU4ZDhpOW84YzlyOGk5dDhpOGU4cy4KKy5tZWRpNW9jcml0CisubWVkaW9jcmkyCisubWVkaW81Y3JpMXRpCisubWVkaW9jcml0MmllNAorLm1lOGc4YTlsOGk4dDhoLgorLm1lMmcKKy5tNGVnYWwKKy5tZTFnYQorLm1lM2dhbDFpCisubWVnYWwxaXQKKy5tZWdhbDJpdGgKKy5tZThnOGE5bDhpOHQ4aDhzLgorLm1lZ2FsaTJ0NGgxczIKKy5tZTh0OGE5YjhvOGw5aThjLgorLm1lNHRhCisubWUydGE0YgorLm1ldGFib2wzaWMKKy5tZXRhYm9sMmkKKy5tZTl0OGE4YjlvOWw4aThzOG0uCisubWV0YWJvbGkyczFtCisubWU5dDhhOGI5bzlsOGk4czhtOHMuCisubWV0YWJvbDRpczRtMXMyCisubWU5dDhhOGI5bzlsOGk4dDhlLgorLm1ldGFibzVsMml0ZQorLm1ldGFib2wxaXQKKy5tZTl0OGE4YjlvOWw4aTh0OGU4cy4KKy5tZXRhYm9saXQ0ZXMKKy5tZTh0OGE5bDhhOG45Zzh1OGE4ZzhlLgorLm1ldDNhMmwKKy5tZXRhNWxhCisubWV0YWxhMm4KKy5tZXRhbDJhbmcKKy5tZXRhbGFuMWd1CisubWV0YWxhbmd1NGEKKy5tZTh0OGE5bDhhOG45Zzh1OGE4ZzhlOHMuCisubWU4dDhhOXA4aDhvOHI5aThjLgorLm1ldGFwaG80cgorLm1lOHQ4aDlhOG44ZS4KKy5tZXRoYTJuNAorLm1lOXQ4cjhvOHA5bzlsOGk4cy4KKy5tNGV0cgorLm1ldHJvcG9sMmkKKy5tZTl0OHI4bzhwOW85bDhpOHM4ZThzLgorLm1ldHJvcG9sNGlzZQorLm1ldHJvcG9saXMxZTRzCisubWU4dDlyOG85cDhvOGw5aTl0OGE4bi4KKy5tZXRyb3BvbDFpdAorLm1ldHJvcG9saTN0YTJuCisubWV0cm9wb2xpMXRhCisubWU4dDlyOG85cDhvOGw5aTl0OGE4bjhzLgorLm1ldHJvcG9saXRhMm4xczIKKy5taThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tNGkxY3IKKy5taWNybzRlCisubWljcm9lMWNvCisubWljcm9lY28ybgorLm1pY3JvZWNvM25vbWljCisubWljcm9lY29ub21pNGMzczIKKy5taTljOHI4bzlmOGk4YzhoOGUuCisubWljcm8yZmkKKy5taWNyb2Y0aTJjaAorLm1pY3JvZmljaGUyCisubWk5YzhyOG85ZjhpOGM4aDhlOHMuCisubWljcm9maWNoMWVzCisubWk4YzhyOG85bzhyOGc4YThuOWk4czhtLgorLm1pY3JvbzIKKy5taWNyb29yZzIKKy5taWNyb29yMWdhCisubWljcm9vcmdhbjVpcworLm1pY3Jvb3JnYTJuCisubWljcm9vcmdhbmkyczFtCisubWk4YzhyOG85bzhyOGc4YThuOWk4czhtOHMuCisubWljcm9vcmdhbjRpczRtMXMyCisubWk4bDhsOWE4ZzhlLgorLm00aWwxbAorLm1pOGw5bDhpOWw4aTh0OGU4ci4KKy5taWxsMmkKKy5taWw0bDRpNGwKKy5taWxsaWwxaQorLm1pbGwyaWwxaXQKKy5taWxsaWwyaXRlCisubWk4bThlOG85ZzhyOGE4cDhoOGU4ZC4KKy5taW1lbzJnCisubWltZW8xZ3IKKy5taW1lb2dyYXBoNGVkCisubWk4bThlOG85ZzhyOGE4cDhoOHMuCisubWltZW9ncmE0cDRoMXMyCisubWk4bTlpOGM5cjhpOGU4cy4KKy5taW0xaQorLm1pbTRpMWNyCisubWltaWNyaTIKKy5taW1pY3IyaWU0CisubWk4bjlpOHMuCisubTJpbmkKKy5taW4xaXMKKy5taThuOGk5czh5OG05cDhvOXM4aTh1OG0uCisubWluaXM0eQorLm1pbmlzeTRtMXAKKy5taW5pc3ltMXBvcworLm1pbmlzeW1wbzVzaTR1CisubWk4bjhpOXM4eThtOXA4bzlzOGk4YS4KKy5taW5pc3ltcG9zMmkxYQorLm1pOW44dTh0OWU4ci4KKy5tNGluMXUKKy5taTluOHU4dDllOHM4dC4KKy5taThzOWM4aDhpOGU5djhvOHU4czlsOHkuCisubTJpczFjCisubWlzM2NoMgorLm1pc2NoMmllNAorLm1pc2NoaWV2b3UyCisubWlzY2hpZXZvMnVzCisubWlzY2hpZXZvdXMxbDIKKy5taXNjaGlldm91czFseQorLm1pOXM4ZThyOHMuCisubTRpc2UKKy5taXMzZXIKKy5taXNlNHIxczIKKy5taTlzOG84ZzlhOW04eS4KKy5taTJzbworLm1pc28xZ2EKKy5taXNvMmdhbQorLm1vOGQ5ZThsOWw4aThuOGcuCisubW8yZDEKKy5tb2RlbDFsCisubW9kZWxsMmkKKy5tb2RlbDJsaW40CisubW84bDllOWM4dThsOGUuCisubW9sZTFjdQorLm1vbGU0Y3VsCisubW9sZWN1bDRlCisubW84bDllOWM4dThsOGU4cy4KKy5tb2xlY3VsZXMyCisubW84bjlhOHI4YzhoOHMuCisubW8xbjFhCisubW9uYXIzYworLm1vbjJhMnIKKy5tb25hcjJjaAorLm1vbmFyYzRoMXMyCisubW84bjhlOHk5bDhlOG45ZDhlOHIuCisubW9uZXlsZW4xZGUKKy5tbzhuOGU4eTlsOGU4bjlkOGU4cjhzLgorLm1vbmV5bGVuZGU0cjVzMgorLm1vOG44bzljOGg4cjhvOG04ZS4KKy5tb25vMmNoNAorLm1vbm9jNGhyNAorLm1vbm9jaHJvMm1lCisubW84bjhvOWU4bjllOHI5ZzhlOHQ4aThjLgorLm1vM25vZQorLm1vbm9lbjFlcgorLm1vbm9lbmVyZzIKKy5tb25vZW5lcjNnZXQKKy5tb25vZW5lcmdldDFpYworLm1vOG45bzhpOGQuCisubW9ub2kyCisubW9ubzJpZAorLm1vOG44bzlwOG84bDhlLgorLm1vNG5vcAorLm1vOG44bzlwOG84bDhlOHMuCisubW9ub3BvbGVzMgorLm1vOW44bzhwOW84bDh5LgorLm1vbm9wbzJseQorLm1vOG44bzlzOHA4bDhpOG44ZS4KKy5tb25vczFwMmwyCisubW9ub3NwbGk0bgorLm1vbm9zcDFsNGluZQorLm1vOG44bzlzOHA4bDhpOG44ZThzLgorLm1vbm9zcGxpMW5lcworLm1vOG44bzlzOHQ4cjhvOGY4aThjLgorLm1vbm9zNXQKKy5tb25vc3Q0cgorLm1vbm9zdHJvMmZpCisubW85bjhvOHQ5bzluOGk4ZThzLgorLm1vbm8xdG8KKy5tbzJub3RvMm4KKy5tb25vdG9uMmllNAorLm1vOW44bzh0OW85bjhvOHU4cy4KKy5tb25vNHRvbm8KKy5tb25vdG8xbm91MgorLm1vbm90b25vMnVzCisubW85cjhvOG45aThzOG0uCisubW9ybzVuNGlzCisubW9ybzJuCisubW9yb25pMnMxbQorLm1vOHM5cTh1OGk5dDhvLgorLm1vczIKKy5tb3NxdTIKKy5tb3NxMnVpMgorLm1vc3F1aTF0bworLm1vOHM5cTh1OGk5dDhvOHMuCisubW9zcXVpdG9zMgorLm1vOHM5cTh1OGk5dDhvOGU4cy4KKy5tdThkOXI4bzhvOG0uCisubXUxZHIKKy5tdWQxcm9vbQorLm11ZHJvbzIKKy5tdThkOXI4bzhvOG04cy4KKy5tdWRyb280bTFzMgorLm11OGw5dDhpOWY4YThjOWU4dDhlOGQuCisuNW11NGx0CisubXVsMXRpMworLm11bHRpZjIKKy5tdWx0aTFmYQorLm11bHRpZmE0Y2UKKy5tdWx0aWZhY2V0NAorLm11bHRpZmFjZTJ0MWVkCisubXU4bDl0OGk5cDhsOGk4YzlhOGI4bDhlLgorLm11bHQyaXAKKy5tdWx0aTFwMmwyCisubXVsdGlwbGkxY2EKKy5tdWx0aXBsaWNhMWIybDIKKy5tdThsOHQ4aTl1OHM4ZThyLgorLm11bHRpNHUKKy5tdWx0aTJ1cworLm5lOG85ZjhpOGU4bDhkOHMuCisuM25lbworLm5lNW9mCisubmVvMmZpCisubmVvZjJpZTQKKy5uZW9maWUybGQzCisubmVvZmllbDJkMXMyCisubmU4bzluOGE4ejhpLgorLm5lbzJuCisubmVvMW4xYQorLm5lb25hMnoxaQorLm5lOG85bjhhOHo4aThzLgorLm5lb25hejRpcworLm5lOHA4aDllOHc4cy4KKy5uZXBoZTQKKy5uZThwOGg5cjhpOHQ4ZS4KKy5uZXA0aHI0CisubmVwaHIyaXRlCisubmU4cDhoOXI4aTh0OGk4Yy4KKy5uZXBocjRpMnQzaWMKKy5uZXBocmkxdGkKKy5uZTh3OWU4czh0LgorLm5lNHcKKy5uZXdlc3QzCisubmU4dzhzOWw4ZTh0OXQ4ZThyLgorLm5ld3M0bDIKKy5uZXdzMmxlCisubmV3c2xlNHQzdDIKKy5uZTh3OHM5bDhlOHQ5dDhlOHI4cy4KKy5uZXdzbGV0dGU0cjFzMgorLm5pOHQ4cjhvOW04ZTh0OGg5YThuOGUuCisubjJpdAorLm5pM3RyCisubml0cm8ybWUKKy5uaXRybzRtZXQKKy5uaXRyb21ldGhhMm40Cisubm85bjhhOG04ZS4KKy5ubzRuCisubm8xbjFhCisubm84bjlhOHI5aTh0OGg5bThlOHQ5aThjLgorLm5vbmFyM2kKKy5ub24yYTJyCisubm9uYXIyaXRoCisubm9uYXJpdDRoMW0KKy5ub25hcml0aG1ldDQKKy5ub25hcml0aG1ldDFpYworLm5vOG45ZThtOGU4cjlnOGU4bjhjOHkuCisubm9uZTFtZQorLm5vbmVtZXJnMgorLm5vbmVtZXIxZ2VuCisubm9uZW1lcmdlbjFjeQorLm5vOG45ZThxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisubm9uZTJxCisubm9uZXF1MgorLm5vbmVxMnVpMgorLm5vbmVxdTJpdjMKKy5ub25lcXVpMXZhCisubm9uZXF1aXYyYTJyCisubm9uZXF1aXZhcjFpCisubm9uZXF1aXZhcjNpMmEybgorLm5vbmVxdWl2YXIyaTNhCisubm9uZXF1aXZhcjRpYW5jCisubm84bjhlOXQ4aDhlOWw4ZThzOHMuCisubm9uZXRoMmUKKy5ub25ldGhlMWxlczIKKy5ub25ldGhlM2wyZTJzcworLm5vOG45ZTh1OGM4bDhpOGQ5ZThhOG4uCisubm9uNGV1Cisubm9uZXUxYzRsNAorLm5vbmV1Y2wyaWQKKy5ub25ldWNsaWRlYTJuCisubm84bjlpOHM4bzltOG84cjlwOGg4aThjLgorLm5vbjVpCisubm9uMWlzCisubm9uaTJzbworLm5vbmkzc29tCisubm9uaXNvMW1vCisubm9uaXNvbW8ycgorLm5vbmlzb21vcjFwCisubm9uaXNvbW9ycDRoNAorLm5vbmlzb21vcnBoMWljCisubm84bjlwOHM4ZTh1OGQ4bzljOG84bTlwOGE4Yzh0LgorLm5vbjFwNAorLm5vbjJwMXMyCisubm9ucDJzZQorLm5vbnBzNGV1Cisubm9ucHNldTFkbworLm5vbnBzZXVkbzFjbworLm5vbnBzZXVkb2NvNG0xcAorLm5vbnBzZXVkb2NvbTFwYQorLm5vbnBzZXVkb2NvbXBhMmM0dAorLm5vOG45czhtOG84bzh0OGguCisubm8ybjNzMgorLm5vbjJzM20KKy5ub25zMW1vCisubm9uc21vbzIKKy5ub25zbW80b3RoCisubm84bjl1OG44aTlmOG84cjhtLgorLm5vM251NG4KKy5ub251MW5pCisubm9udW5pMWZvCisubm9udW5pZm8ycgorLm5vbnVuaWZvcjFtCisubm84bjl1OG44aTlmOG84cjhtOWw4eS4KKy5ub251bmlmb3I0bTFsCisubm9udW5pZm9ybTFseQorLm5vOHI5ZThwOWk5bjhlOHA4aDlyOGk4bjhlLgorLm5vcmU1cGkybgorLm5vcmVwMmluZQorLm5vcmVwaW5lcDRocjQKKy5ub3JlcDJpbmVwaHIyaW40ZQorLm5vOHQ5dzhpOHQ4aDlzOHQ4YThuOGQ5aThuOGcuCisubm90dzQKKy5ub3R3aTIKKy5ub3R3Mml0aDMKKy5ub3R3aTJ0NGgxczIKKy5ub3R3aXRoNXN0NGFuZAorLm5vdHdpdGhzMXRhCisubm90d2l0aHN0YTJuCisubm90d2l0aHN0YW5kMWluCisubnU5YzhsOGU4bzl0OGk4ZDhlLgorLm51Y2xlMworLm51MWM0bDQKKy5udWNsZTRvdAorLm51Y2xlb3QyaWQKKy5udTljOGw4ZThvOXQ4aThkOGU4cy4KKy5udWNsZW90aWRlNHMyCisubnU4dDljOHI4YThjOGs5ZThyLgorLm51NHRjCisubnV0Y3JhY2sxCisubnV0Y3JhY2sxZXIKKy5udTh0OWM4cjhhOGM4azllOHI4cy4KKy5udXRjcmFja2U0cjFzMgorLm9lOHI5czh0OGU4ZDhzLgorLm8zZXIKKy5vZTRyMXMyCisub2VyczR0MWVkCisub2Vyc3RlMmQxczIKKy5vZjhmOWw4aThuOGUuCisubzRmMWYKKy5vZmY0bDIKKy5vZmZsaW40Cisub2ZmMWw0aW5lCisub2Y4ZjlsOG84YThkLgorLm9mZmw0b2EKKy5vZmZsb2EyZDMKKy5vZjhmOWw4bzhhOGQ4cy4KKy5vZmZsb2EyZDFzMgorLm9mOGY5bDhvOGE4ZDhlOGQuCisub2ZmbG9hMmQxZWQKKy5vbDhpOWc4bzhwOW85bDhpOHM4dC4KKy5vbDJpCisub2wyaWcKKy5vbGkyZ28KKy5vbDJpZ29wb2wyaQorLm9sOGk5ZzhvOHA5bzlsOGk4czh0OHMuCisub2xpZ29wb2xpczR0MXMyCisub2w4aTlnOG84cDlvOGw4eS4KKy5vbGlnb3BvMmx5Cisub2w4aTlnOG84cDlvOGw5aThlOHMuCisub2xpZ29wb2wyaWU0Cisub3A5ZThyOWE4bjhkLgorLm9wMWVyCisuM29wZXIxYQorLm9wNGVyNGFuZAorLm9wZXJhMm4KKy5vcDllOHI5YThuOGQ4cy4KKy5vcGVyYW4yZDFzMgorLm9yOGE4bjhnOXU4dDhhOG4uCisub3JhMm4KKy5vcjJhbmcKKy5vcmFuMWd1Cisub3JhbjRndTR0Cisub3Jhbmd1MXRhCisub3JhMm5ndXRhMm4KKy5vcjhhOG44Zzl1OHQ4YThuOHMuCisub3Jhbmd1dGEybjFzMgorLm9yOXQ4aDhvOWQ4bzhuOXQ4aThzOHQuCisub3J0aG8yZG80Cisub3J0aG9kbzJuCisub3J0aG9kb24zdDRpCisub3J0aG9kb24xdAorLm9yOXQ4aDhvOWQ4bzhuOXQ4aThzOHQ4cy4KKy5vcnRob2RvbnRpczR0MXMyCisub3I5dDhoOG85azhlOHI5YTl0OG84bDlvOGc4eS4KKy5vcnRoMm9rCisub3J0aG9rMWVyCisub3J0aG9rZXIxYQorLm9ydGhva2VyYTF0bworLm9ydGhva2VyYXRvbDFvMWd5Cisub3I4dDhoOG85bjhpOHQ4cjhvOXQ4bzhsOHU4ZThuOGUuCisub3J0aG8ybgorLm9ydGhvbjJpdAorLm9ydGhvbmkzdHIKKy5vcnRob25pdHJvMXRvCisub3J0aG9uaXRyb3RvbHUzZW4KKy5vcnRob25pdHJvdG9sdTRlbmUKKy5vdjhlOHI5djhpOGU4dy4KKy5vdmVydjJpZTQKKy5vdjhlOHI5djhpOGU4dzhzLgorLm94OWk4ZDlpOGMuCisub3gzaQorLm94aTVkaQorLm94MmlkCisucGE4ZDlkOGk4bjhnLgorLjFwYQorLnA0YTJkCisucGFkNGQxaW4KKy5wYWQxZDQKKy5wYThpOG45bDhlOHM4czlsOHkuCisucDRhaTIKKy5wYTRpNG40CisucGE0aTRuMWwKKy5wYWlubGVzMgorLnBhaW4zbDJlMnNzCisucGFpbmxlczRzMWwyCisucGFpbmxlc3MxbHkKKy5wYThsOWU4dDh0OGUuCisucDRhbAorLnAyYWxlCisucGFsZTR0M3QyCisucGE4bDllOHQ4dDhlOHMuCisucGFsZXQ0dGVzCisucGE4cjlhOWI4bzhsOGEuCisucDJhMnIKKy5wYTJyYWIKKy5wYXJhYm8xbGEKKy5wYThyOWE5YjhvOGw5aThjLgorLnBhcmFib2wzaWMKKy5wYXJhYm9sMmkKKy5wYTlyOGE4YjlvOWw4bzhpOGQuCisucGFyYWJvbG9pMgorLnBhcmFib2xvMmlkCisucGE4cjlhOWQ4aThnOG0uCisucGFyYTJkCisucGFyMmFkaQorLnBhcmFkMmlnCisucGFyYWRpZzFtCisucGE4cjlhOWQ4aThnOG04cy4KKy5wYXJhZGlnNG0xczIKKy5wYThyOGE5YzhoOHU4dDhlLgorLnBhcmEyY2gKKy5wYXJhY2h1NHQKKy5wYThyOGE5YzhoOHU4dDhlOHMuCisucGE4cjhhOWQ4aTltOGU4dDhoOHk4bDliOGU4bjh6OGU4bjhlLgorLnBhcmFkNGltZXQKKy5wYXJhZGltZXRoeTJsMWIKKy5wYXJhZGltZXRoeWxiNGU0bjN6CisucGFyYWRpbWV0aHlsYmVuMnplCisucGFyYWRpbWV0aHlsYmVuemU0bgorLnBhOHI4YTlmOGw4dThvOHI4bzl0OG84bDh1OGU4bjhlLgorLnBhcmEyZgorLnBhcmFmNGwyCisucGFyYWZsdTNvCisucGFyYWZsdW8zcgorLnBhcmFmbHVvcm8xdG8KKy5wYXJhZmx1b3JvdG9sdTNlbgorLnBhcmFmbHVvcm90b2x1NGVuZQorLnBhOHI4YTlnOHI4YThwOGg5ZThyLgorLnBhcmExZ3IKKy5wYXJhZzVyYTNwaDRlcgorLnBhOHI4YTlsOGU5ZzhhOGwuCisucGFyM2FsCisucGFyMmFsZQorLnBhcmFsNGVnYWwKKy5wYXJhbGUxZ2EKKy5wYThyOWE4bDlsOGU4bDlpOHM4bS4KKy5wYXJhbDFsCisucGFyYWwybGUKKy5wYXJhbDNsZWwKKy5wYXJhbGxlbDJpCisucGFyYWxsZTJsaXMKKy5wYXJhbGxlbGkyczFtCisucGE4cjhhOW04YThnOW44ZTh0OWk4czhtLgorLnBhcjRhMW1hCisucGFyYW0zYWcKKy5wYXJhNW1hZzFuCisucGFyYW1hZ25ldGkyczRtCisucGE4cjhhOW04ZThkOGk4Yy4KKy5wYXJhMm1lZAorLnBhcmFtNGVkaQorLnBhOHI4YTltOGU4dDhoOHk4bDlhOG44aThzOG84bDhlLgorLnBhcmFtM2V0CisucGFyYW1ldGh5M2xhCisucGFyYW1ldGh5bGEybgorLnBhcmFtZXRoeWxhbmkyc28KKy5wYTlyOGE4bTllOXQ4cjhpOHo4ZS4KKy5wYXJhbTRldHIKKy5wYXJhbWV0cmkyemUKKy5wYThyOGE5bThpOGw5aTl0OGE4cjh5LgorLnBhcjJhbWkKKy5wYXJhbWlsMWkKKy5wYXJhbTJpbDFpdAorLnBhcmFtaWxpMXRhCisucGFyYW1pbGl0MmEycgorLnBhOHI4YTltOG84dThuOHQuCisucGFyYTJtbworLnBhcmFtb3UyCisucGFyYW1vdW4xdAorLnBhOHQ4aDlvOWc4ZThuOWk4Yy4KKy5wNGF0aAorLnBhdDRobworLnBhdGhvNGcKKy5wYXRobzFnZTQKKy5wYXRobzFnZW4KKy5wZThlOHY5aThzOGguCisucDRlZQorLnBlZTF2aQorLnBlZXZpczJoCisucGU4ZTh2OWk4czhoOW44ZThzOHMuCisucGVldmlzMmgxbgorLnBlZXZpc2gxbmVzCisucGVldmlzaG4yZTJzcworLnBlOG45dDhhOWc4bzhuLgorLnBlbjF0CisucGVuMXRhCisucGVudGEyZ28KKy5wZW50YWdvMm4yCisucGU4bjl0OGE5ZzhvOG44cy4KKy5wZW50YWdvMm4zczIKKy5wZTl0OHI4bzlsOGU5dThtLgorLnBldHJvbDRldQorLnBoOGU5bjhvOG05ZTluOG84bi4KKy5waDRlM25vCisucGhlMm4KKy5waGVubzJtZQorLnBoZW5vMW1lbgorLnBoZW5vbTRlbm8KKy5waGVub21lbm80bgorLnBoOGU4bjh5OGw5YThsOGE5bjhpOG44ZS4KKy5waGVueTNsYQorLnBoZW55bGFsYTJuCisucGhlbnlsYWxhNW4yaW5lCisucGhlbnlsYWxhbjFpbgorLnBoOGk5bDhhOHQ5ZTlsOGk4czh0LgorLnBoaTRsYXRlbDJpNAorLnBoaWxhdGUybGlzCisucGg4aTlsOGE4dDllOWw4aThzOHQ4cy4KKy5waGlsYXRlbGlzNHQxczIKKy5waDhvOW44ZThtOGUuCisuM3Bob25lCisucGhvMm4KKy5waG9uZTFtZQorLnBoOG85bjhlOG04ZThzLgorLnBob25lMm1lcworLnBoOG85bjhlOW04aThjLgorLnBob25lNW1pCisucGg4bzhzOXA4aDhvOHI5aThjLgorLnBob3MxcAorLnBob3NwaG81CisucGhvc3BobzRyCisucGg4bzl0OG85ZzhyOGE4cDhoOHMuCisucGhvMXRvCisucGhvdG8yZ3IKKy5waG90b2dyYTRwNGgxczIKKy5waDhvOXQ4bzlvOGY4ZjlzOGU4dC4KKy5waG90b28yCisucGhvdG9vNGYxZgorLnBob3Rvb2YyZjNzCisucGk4YzlhOWQ4bzhyLgorLnBpMWNhCisucGljYTJkCisucGljYTFkbworLnBpY2FkNG9yCisucGk4YzlhOWQ4bzhyOHMuCisucGljYWRvNHJzMgorLnBpOHA4ZTlsOGk4bjhlLgorLnAyaXAKKy5waXBlNAorLnBpcGVsMmkKKy5waXBlMWw0aW5lCisucGk4cDhlOWw4aThuOGU4cy4KKy5waXBlbGkxbmVzCisucGk4cDhlOWw4aThuOWk4bjhnLgorLnBpcGVsMmluM2kKKy5waXBlbGluMWluCisucGlwZWxpbmluNGcKKy5waTlyOGE5bjhoOGE4cy4KKy5wNGlyCisucGkxcmEKKy5waXJhMm4KKy5waXJhNG4xaDQKKy5waXJhbmhhNAorLnBsOGE4YzhhOWI4bDhlLgorLjFwMmwyCisucGxhMWNhCisucGxhY2ExYjJsMgorLnBsOGE4bjh0OWg4bzhwOXA4ZThyLgorLjNwbGEybgorLnBsYW4xdAorLnBsYW50aG80cDFwCisucGxhbnRob3AycGUKKy5wbGFudGhvcDNwZXIKKy5wbDhhOG44dDloOG84cDlwOGU4cjhzLgorLnBsYW50aG9wcGU0cjFzMgorLnBsOGU4YThzOWE4bjhjOGUuCisucGxlMmEKKy5wbGVhc2EyCisucGxlYTNzYW5jCisucGxlYXNhMm4KKy5wbDh1OGc5aThuLgorLnBsdWc1aW4KKy5wbDh1OGc5aThuOHMuCisucGx1NWc0aTJuMXMyCisucG84bDl0OGU4cjlnOGU4aThzOHQuCisucG80bDJ0CisucG9sMXRlCisucG9sdGVyZzIKKy5wb2x0ZXJnZWkyCisucG84bDh5OWU4bjhlLgorLnBvMmx5CisucG84bDh5OWU4dDhoOXk4bDllOG44ZS4KKy5wb2x5ZTR0CisucG85bDh5OGc5YTltOGk4czh0LgorLnBvbHkxZ2EKKy5wb2x5MmdhbQorLnBvbHlnYW0yaXMKKy5wbzlsOHk4ZzlhOW04aThzOHQ4cy4KKy5wb2x5Z2FtaXM0dDFzMgorLnBvOGw4eThnOW84bjlpOXo4YTl0OGk4bzhuLgorLnBvbHkxZ28KKy5wb2x5Z28ybjIKKy5wb2x5Z28zbmkKKy5wb2x5Z29uaXphMQorLnBvbHlnb25pemExdDJpbworLnBvbHlnb25pemF0aW8ybgorLnBvOWw4eThwOGg5bzluOG84dThzLgorLnBvbHlwaG8ybgorLnBvbHlwaG8xbm91MgorLnBvbHlwaG9ubzJ1cworLnBvOGw4eTlzOHQ4eThyOGU4bjhlLgorLnBvMmx5czQKKy5wb2x5czF0CisucG9seXMydHkKKy5wbzhtOGU5ZzhyOGE4bjlhOHQ4ZS4KKy5wbzJtZQorLnBvbWUyZworLnBvbWUxZ3IKKy5wb21lZ3JhMm4yCisucG9tZWdyYTFuYQorLnBvbWVncmFuMmF0CisucG84cjhvOWU4bDhhOHM5dDhpOGMuCisuMXA0b3IKKy5wb3JvNGUKKy5wb3JvNGVsCisucG9yb2UxbGEKKy5wb3JvZWxhc3QyaQorLnBvcm9lbGFzMXRpYworLnBvOHI5bzh1OHMuCisucG9yb3UyCisucG9ybzJ1cworLnBvOHI5dDhhOWI4bDhlLgorLnBvcjF0YQorLnBvcjJ0YWIKKy5wb3J0YWIybDIKKy5wbzhzOHQ5YThtOWI4bDhlLgorLjFwb3MKKy5wb3MydGEKKy5wb3N0YTRtMWIKKy5wb3N0YW1iMmwyCisucG84czh0OWE4bTliOGw4ZThzLgorLnBvc3RhbWJsZXMyCisucG84czh0OWg4dTltOG84dThzLgorLnBvc3RodTFtbworLnBvc3RodTNtbzJ1cworLnBvc3RodW1vdTIKKy5wbzhzOHQ5czhjOHI4aThwOHQuCisucG9zNHQxczIKKy5wb3N0NHNjCisucG9zdHNjcmkyCisucG9zdHNjcjJpcAorLnBvc3RzY3JpMnAxdAorLnBvOHM4dDlzOGM4cjhpOHA4dDhzLgorLnBvc3RzY3JpcDR0MXMyCisucG84czl0OHU4cjlhOGwuCisucG9zMXR1CisucG9zdHUxcmEKKy5wcjhlOWE4bTliOGw4ZS4KKy5wcmVhNG0xYgorLnByZWFtYjJsMgorLnByOGU5YThtOWI4bDhlOHMuCisucHJlYW1ibGVzMgorLnByOGU5bDhvOGE4ZDhlOGQuCisucHJlbDRvYQorLnByZWxvYTJkMworLnByZWxvYTJkMWVkCisucHI4ZTlwOGE4cjlpOG44Zy4KKy5wcmUycGEKKy5wcmVwNGE0cjFpCisucHJlcDJhMnIKKy5wcmVwYXJpbjRnCisucHI4ZTlwOHI4aThuOHQuCisucHIyZXByMgorLnByZXByaW40dDMKKy5wcjhlOXA4cjhpOG44dDhzLgorLnByZXByaW40dDRzMgorLnByOGU5cDhyOG84YzhlOHM5czhvOHIuCisucHJlM3BybworLnByZXByMm9jCisucHJlcHJvMWNlCisucHJlcHJvYzJlMnNzCisucHJlcHJvY2VzMXNvCisucHI4ZTlwOHI4bzhjOGU4czlzOG84cjhzLgorLnByZXByb2Nlc3NvNHJzMgorLnByOGU5czhwOGw4aTh0OXQ4aThuOGcuCisucHJlMXNwCisucHJlczFwMmwyCisucHJlc3BsMWl0CisucHJlc3BsNGk0dDN0MgorLnByZXNwbGl0MnQxaW4KKy5wcjhlOXc4cjhhOHAuCisucHJld3JhNAorLnByOGU5dzhyOGE4cDhwOGU4ZC4KKy5wcmV3cmE0cDFwCisucHJld3JhcDJwZQorLnByZXdyYXA0cDJlZAorLnByOGk4ZThzOHQ5ZThzOHM4ZThzLgorLjVwcjJpNGU0CisucHJpMWVzdAorLnByaWVzNHQyZTJzcworLnByaWVzdGVzczFlNHMKKy5wcjhlOHQ5dDh5OXA4cjhpOG45dDhlOHIuCisucHJlNHQzdDIKKy5wcmV0MXR5CisucHIyZXR0eXByMgorLnByZXR0eXByaW40dDMKKy5wcjhlOHQ5dDh5OXA4cjhpOG45dDhpOG44Zy4KKy5wcmV0dHlwcmludDJpCisucHJldHR5cHJpbjR0M2luZworLnByZXR0eXByaW4ydDFpbgorLnByOG85YzhlOWQ4dThyOWE4bC4KKy5wcjJvYworLnBybzFjZQorLnByb2NlMWR1CisucHJvY2VkdTFyYQorLnByOG84YzhlOHM4cy4KKy5wcm9jMmUyc3MKKy5wcjhvOWM4dThyOWE4bjhjOGUuCisucHJvY3UxcmEKKy5wcm9jdXJhMm4KKy5wcjhvOGc5ZTluOGk4ZThzLgorLnBybzFnZQorLnBybzFnZW4KKy5wcm9nZTVuMmllNAorLnByOG84ZzllOW44eS4KKy5wcm80Z2VueQorLnByOG85ZzhyOGE4bTltOGE4YjhsOGUuCisucHJvMWdyCisucHJvZ3JhbTFtCisucHJvZ3JhbTFtYQorLnByb2dyYW0ybWFiCisucHJvZ3JhbW1hYjJsMgorLnByOG84bTlpOW44ZThuOHQuCisucHJvbTRpCisucHJvbTFpbgorLnByb20yaW5lCisucHJvbWkxbmVuCisucHJvbWluZW4xdAorLnByOG85bThpOHM5Yzh1OW84dThzLgorLnByb20yaXMKKy5wcm9tMmlzMWMKKy5wcm9taXMxY3UKKy5wcm9taXNjdTFvdTIKKy5wcm9taXNjdW8ydXMKKy5wcjhvOG05aThzOXM4bzhyOHkuCisucHJvbTRpMnMxcworLnByb21pczFzbworLnByb21pc3NvMXJ5CisucHI4bzhtOWk4czhlLgorLnByb200aXNlCisucHI4bzhtOWk4czhlOHMuCisucHJvbWlzMWU0cworLnByOG85cDhlOGw5bDhlOHIuCisucHJvM3BlbAorLnByb3BlbDFsCisucHJvcGVsMmxlCisucHI4bzlwOGU4bDlsOGU4cjhzLgorLnByb3BlbGxlNHIxczIKKy5wcjhvOXA4ZThsOWw4aThuOGcuCisucHJvcGVsbDJpCisucHJvcGVsMmxpbjQKKy5wcjhvOWg4aThiOWk5dDhpOHY4ZS4KKy5wcm8xaDIKKy5wcm9oaWJpMnQKKy5wcm9oaWJpMXRpCisucHJvaGliaTF0Mml2CisucHI4bzloOGk4YjlpOXQ4aTh2OGU5bDh5LgorLnByb2hpYml0aXY0ZTFseQorLnByOG85czhjOGk4dTh0OXQ4by4KKy5wcm9zMmMKKy5wcm9zMWNpCisucHJvc2NpMXUKKy5wcm9zY2l1NHQzdDIKKy5wcm9zY2l1dDV0bworLnByOG85dDhlOHM4dDllOHIuCisucHJvMXQKKy5wcm80dGVzCisucHI4bzl0OGU4czh0OWU4cjhzLgorLnByb3Rlc3RlNHIxczIKKy5wcjhvOXQ4ZThzOXQ4bzhyLgorLnByb3Q0ZXMydG8KKy5wcjhvOXQ4ZThzOXQ4bzhyOHMuCisucHJvdGVzdG80cnMyCisucHI4bzl0OG85bDhhOG45Zzh1OGE4ZzhlLgorLnBybzF0bworLnByb3RvMWxhCisucHJvdG80bGEybgorLnByb3RvbDJhbmcKKy5wcm90b2xhbjFndQorLnByb3RvbGFuZ3U0YQorLnByOG85dDhvOXQ4eThwOWE4bC4KKy5wcm90bzF0eQorLnByb3RvdHkxcGEKKy5wcm90b3R5cDRhbAorLnByOG84djlpOG44YzhlLgorLnByb3YxaW4KKy5wcm92MmluYworLnByOG84djlpOG44YzhlOHMuCisucHI4bzl2OGk4bjljOGk4YThsLgorLnByb3ZpbjFjaQorLnByb3ZpbjNjMmkxYQorLnByb3ZpbmNpMmFsCisucHI4bzh3OWU4czhzLgorLnByb3cyZTJzcworLnBzOGU4dTlkOG85ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuMnAxczIKKy5wMnNlCisucHM0ZXUKKy5wc2V1MWRvCisucHNldWRvZDFpZgorLnBzZXVkb2RpNGYxZgorLnBzZXVkb2RpZmZlcjEKKy5wc2V1ZG9kaWZmZXIzZW4xdAorLnBzZXVkb2RpZmZlcmVudDJpCisucHNldWRvZGlmZmVyZW4xdDJpMWEKKy5wc2V1ZG9kaWZmZXJlbnRpMmFsCisucHM4ZTh1OWQ4bzlmOGk5bjhpOHQ4ZS4KKy5wc2V1MmQ1b2YKKy5wc2V1ZG8yZmkKKy5wc2V1ZG8yZmluCisucHNldWRvZjJpbmkKKy5wc2V1ZG9maW4yaXQKKy5wc2V1ZG9maW4yaXRlCisucHM4ZTh1OWQ4bzlmOGk5bjhpOHQ4ZTlsOHkuCisucHNldWRvZmluaXRlMWx5CisucHM4ZTh1OWQ4bzlmOG84cjhjOGU4cy4KKy5wc2V1ZG8xZm8KKy5wc2V1ZG9mbzJyCisucHNldWRvZm9yMWMKKy5wc2V1ZG9mb3IyY2UKKy5wczhlOHU5ZDhvOGc5cjhhOXA4aDhlOHIuCisucHNldWQ0b2cKKy5wc2V1ZG8xZ3IKKy5wc2V1ZG9nNXJhM3BoNGVyCisucHM4ZTh1OWQ4bzlnOHI4bzh1OHAuCisucHNldWRvNGc0cm8KKy5wc2V1ZG9ncm91MgorLnBzOGU4dTlkOG85ZzhyOG84dThwOHMuCisucHNldWRvZ3JvdTJwMXMyCisucHM4ZTh1OWQ4bzluOHk4bS4KKy5wc2V1NGRvMm4KKy5wc2V1ZG9ueW00CisucHM4ZTh1OWQ4bzluOHk4bThzLgorLnBzZXVkb255NG0xczIKKy5wczhlOHU5ZDhvOXc4bzhyOGQuCisucHNldWRvNHdvMgorLnBzOGU4dTlkOG85dzhvOHI4ZDhzLgorLnBzZXVkb3dvcjJkMXMyCisucHM4eTljOGg4ZTlkOGU4bDlpOGMuCisucHM0eQorLnA0c3kxYworLnBzeTNjaAorLnBzeWNoNGUyCisucHN5NGNoNGVkCisucHN5Y2hlZGVsMmkKKy5wczh5OGM4aDhzLgorLnBzeWM0aDFzMgorLnB1OWI4ZThzOWM4ZThuOGM4ZS4KKy5wdWIzCisucHViNGUKKy5wdTRiZXM0CisucHViZXMyYworLnB1YmVzMWNlbgorLnB1YmVzM2NlbmMKKy5xdThhOGQ5ZDhpOG44Zy4KKy5xdTIKKy5xdWEyZAorLnF1YWQ0ZDFpbgorLnF1YWQxZDQKKy5xdThhOWQ4cjhhOHQ5aThjLgorLnF1YTFkcgorLnF1YWRyYXQxaWMKKy5xdThhOWQ4cjhhOHQ5aThjOHMuCisucXVhZHJhdGk0YzNzMgorLnF1OGE4ZDlyOGE5dDh1OHI4ZS4KKy5xdWFkcmEydHUKKy5xdWFkcmEzdHVyZQorLnF1OGE4ZDlyOGk5cDhsOGU4ZzlpOGMuCisucXVhZHJpMnAybDIKKy5xdWFkcjJpcAorLnF1YWRyaXBsZWc0aWMKKy5xdThhOGk4bjh0OWU4ci4KKy5xdWFpMgorLnF1YTRpNG4KKy5xdWFpbjF0CisucXU4YThpOG44dDllOHM4dC4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGUuCisucXVhczJpZTQKKy5xdWFzaWUxcQorLnF1MmFzaWVxdTIKKy5xdWFzaWVxMnVpMgorLnF1YXNpZXF1Mml2MworLnF1YXNpZXF1aTF2YQorLnF1YXNpZXF1aXYyYWxlCisucXVhc2llcXVpdmEzbGVuYworLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOGM4ZThzLgorLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOHQuCisucXVhc2llcXVpdmExbGVuMXQKKy5xdThhOXM4aTloOHk5cDhvOW44bzhyOW04YThsLgorLnF1YXNpM2gKKy5xdWFzaWh5M3BvCisucXVhc2loeXBvMm4KKy5xdWFzaWh5cG9ub3IxbQorLnF1YXNpaHlwb25vcjFtYQorLnF1OGE5czhpOXI4YThkOWk5YzhhOGwuCisucXVhczRpMnIKKy5xdWFzaTFyNWEKKy5xdWFzaXJhMmQKKy5xdWFzaXIyYWRpCisucXVhc2lyYWQzaTFjYQorLnF1OGE5czhpOXI4ZThzOGk4ZDl1OGE4bC4KKy5xdWFzaTRyZXMKKy5xdWFzaXJlMXNpCisucXVhc2lyZTJzMmlkCisucXVhc2lyZXNpMmR1CisucXVhc2lyZXNpZDF1MWEKKy5xdThhOXM4aTlzOG04bzhvOHQ4aC4KKy5xdWExc2lzCisucXVhc2kyczFtCisucXVhc2lzMW1vCisucXVhc2lzbW9vMgorLnF1YXNpc21vNG90aAorLnF1OGE5czhpOXM4dDhhOXQ4aThvOG45YThyOHkuCisucXVhc2lzMXRhCisucXVhc2lzdGF0aW9uNWEycgorLnF1YXNpc3RhMXQyaW8KKy5xdWFzaXN0YXRpbzJuCisucXVhc2lzdGF0aW8xbjFhCisucXU4YTlzOGk5dDhvOHA4bzhzLgorLnF1NWE1c2k0dAorLnF1YXNpMXRvCisucXVhc2l0bzFwb3MKKy5xdThhOXM4aTl0OHI4aTlhOG45Zzh1OWw4YThyLgorLnF1YXNpNXRyMmkzYQorLnF1YXNpdHJpMmEybgorLnF1YXNpdHJpMmFuZworLnF1YXNpdHJpYW4xZ3UKKy5xdWFzaXRyaWFuZ3UxbGEKKy5xdWFzaXRyaWFuZ3VsMmEycgorLnF1OGE5czhpOXQ4cjhpOHY5aThhOGwuCisucXVhc2l0cjJpNHYKKy5xdWFzaXRyaXYzaQorLnF1YXNpdHJpdjJpMWEKKy5xdWFzaXRyaXZpMmFsCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZS4KKy5xMnVpMgorLnF1aTRuCisucXVpbjF0CisucXVpbjR0MmUyc3MKKy5xdWludGVzNHNlbmMKKy5xdThpOG45dDhlOHM5czhlOG44YzhlOHMuCisucXU4aThuOXQ4ZThzOXM4ZThuOXQ4aThhOGwuCisucXVpbnRlc3NlbjF0CisucXVpbnRlc3NlbnQyaQorLnF1aW50ZXNzZW4xdDJpMWEKKy5xdWludGVzc2VudGkyYWwKKy5yYThiOWI4aTh0OXI4eS4KKy4ycmFiCisucmEyYjFiCisucmFiYmkydAorLnJhYmJpM3RyCisucmFiYml0NXJ5CisucmE5ZDhpOW84ZzlyOGE5cDhoOHkuCisucmEyZAorLnIyYWRpCisucmEzZDJpbworLnJhZGlvNWcKKy5yYWRpbzJncgorLnJhZGlvNGczcmExcGh5CisucmE4ZjhmOWk4czhoLgorLnJhZjVmaQorLnJhMmYKKy5yYTRmMWY0CisucmFmMmY1aXMKKy5yYWZmaXMyaAorLnJhOGY4ZjlpOHM4aDlsOHkuCisucmFmZmlzNGgxbDQKKy5yYWZmaXNoMWx5CisucmE4bTlzOGg4YThjOGs4bDhlLgorLnJhNG0xczIKKy5yYW00czJoCisucmFtc2hhY2sxCisucmFtc2hhY2sxbAorLnJhOHY5ZThuOW84dThzLgorLnJhdjRlNG5vCisucmF2ZTFub3UyCisucmF2ZW5vMnVzCisucmU5YThyOHI4YThuOGc4ZTltOGU4bjh0LgorLnJlNWFyMXI0CisucmUyYTJyCisucmVhcnJhbjRnZQorLnJlYXJyYTJuCisucmVhcnIyYW5nCisucmVhcnJhbmdlMW1lCisucmVhcnJhbmdlMW1lbgorLnJlYXJyYW5nZTNtZW4xdAorLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dDhzLgorLnJlYXJyYW5nZW1lbjR0NHMyCisucmU4YzlpOXA4cjhvOGM5aTl0OGk4ZThzLgorLnJlY2lwcm9jaTF0aQorLnJlY2lwcm9jaXQyaWU0CisucmU4Yzl0OGE4bjlnOGw4ZS4KKy5yZWM0dGEybgorLnJlMmMxdAorLnJlY3Q1YW5nCisucmVjMXRhCisucmVjdGFuMWdsMgorLnJlY3RhbjFnbGUKKy5yZThjOXQ4YThuOWc4bDhlOHMuCisucmVjdGFuZ2xlczIKKy5yZThjOXQ4YThuOWc4dTlsOGE4ci4KKy5yZWN0YW4xZ3UKKy5yZWN0YW5ndTFsYQorLnJlY3Rhbmd1bDJhMnIKKy5yZTlkOGk5cjhlOGM4dC4KKy4ycjJlZAorLnI0ZWRpCisucmVkNGlyMgorLnJlZGkxcmUKKy5yZWRpcmUyYzF0CisucmU5ZDhpOXI4ZThjOHQ5aThvOG4uCisucmVkaXJlYzF0MmlvCisucmVkaXJlY3RpbzJuCisucmU5ZDh1OGM5aThiOGw4ZS4KKy5yZTFkdQorLnJlZHUyYworLnJlZHVjaTRiCisucmVkdTFjaQorLnJlZHVjaTFiMmwyCisucmU5ZThjOGg4by4KKy5yZWUyYworLnJlZTJjaAorLnJlZTNjaG8yCisucmU5cDhoOHI4YThzOGUuCisucmVwNGhyNAorLnJlcGhyMmFzCisucmU5cDhoOHI4YThzOGU4cy4KKy5yZXBocmFzMWU0cworLnJlOXA4aDhyOGE4czhlOGQuCisucmVwaHJhNHM0ZWQKKy5yZTlwOG85czhpOXQ4aThvOG4uCisucmU0cG9zaQorLnJlMXBvCisucmUxcG9zCisucmVwbzNzMmkxdDJpbworLnJlcG9zaTF0aQorLnJlcG9zaXRpbzJuCisucmU5cDhvOXM4aTl0OGk4bzhuOHMuCisucmVwb3NpdGlvMm4zczIKKy5yZTlwOHI4aThuOHQuCisucmVwcjIKKy5yZXByaW40dDMKKy5yZTlwOHI4aThuOHQ4cy4KKy5yZXByaW40dDRzMgorLnJlOXM4dDhvOHI5YThiOGw4ZS4KKy5yNGVzMnRvCisucmVzdG8ycmEKKy5yZXN0bzJyYWIKKy5yZXN0b3JhYjJsMgorLnJlOHQ4cjhvOWY4aTh0LgorLnJldHJvMmZpCisucmU4dDhyOG85ZjhpOHQ5dDhlOGQuCisucmV0cm9mNGk0dDR0MgorLnJldHJvZml0MnQxZWQKKy5yZTl1OHM5YThiOGw4ZS4KKy5yNGV1MgorLnJlMnVzNAorLnJldXNhMgorLnJldTJzMWFiCisucmV1c2FiMmwyCisucmU5dThzOGUuCisucmU5dzhpOHI4ZS4KKy5yZXdpMgorLnJldzRpcjQKKy5yZTl3OHI4YThwLgorLnJld3JhNAorLnJlOXc4cjhhOHA4cDhlOGQuCisucmV3cmE0cDFwCisucmV3cmFwMnBlCisucmV3cmFwNHAyZWQKKy5yZTl3OHI4aTh0OGUuCisucmV3cmk0CisucmV3cjJpdGUKKy5yaDhpOW44bzhjOWU4cjlvOHMuCisucmg0CisucmgyaTFubworLnJoaTRubzRjCisucmhpbm8xY2UKKy5yaGlub2MyZXJvCisucmk4ZzhoOHQ5ZThvOHU4cy4KKy5yaWdoMXRlbworLnJpZ2h0ZW91MgorLnJpZ2h0ZW8ydXMKKy5yaThnOGg4dDllOG84dThzOW44ZThzOHMuCisucmlnaHRlb3VzMW40CisucmlnaHRlb3VzMW5lcworLnJpZ2h0ZW91c24yZTJzcworLnJpOG44ZzlsOGU4YThkOGU4ci4KKy5yaW40ZworLnJpbmdsMgorLnJpbjFnbGUKKy5yaW5nbGUyYQorLnJpbmdsZWEyZDEKKy5yaThuOGc5bDhlOGE4ZDhlOHI4cy4KKy5yaW5nbGVhZGU0cjVzMgorLnJvOWI4bzh0LgorLnJvOWI4bzh0OHMuCisucm9ibzR0MXMyCisucm85YjhvOHQ4aThjLgorLnJvOWI4bzh0OWk4YzhzLgorLnJvYm90aTRjM3MyCisucm84dThuOGQ5dDhhOGI4bDhlLgorLnJvdTIKKy5yb3VuMmQKKy5yb3VuZDF0YQorLnJvdW5kMnRhYgorLnJvdW5kdGFiMmwyCisucm84dThuOGQ5dDhhOGI4bDhlOHMuCisucm91bmR0YTVibGVzMgorLnNhOGw4ZThzOWM4bDhlOHI4ay4KKy5zYTIKKy5zMmFsZQorLnNhbGVzMgorLnNhbGVzMmMKKy5zYWxlc2NsZTUKKy5zYWxlczFjNGw0Cisuc2E4bDhlOHM5YzhsOGU4cjhrOHMuCisuc2FsZXNjbGVyNGsxczIKKy5zYThsOGU4czl3OG84bThhOG4uCisuc2FsZXM0dzIKKy5zYWxlNHMxd28yCisuc2FsZXN3b20xCisuc2FsZXN3bzFtYQorLnNhbGVzd29tYTJuCisuc2E4bDhlOHM5dzhvOG04ZThuLgorLnNhbGVzd28ybWUKKy5zYWxlc3dvMW1lbgorLnNhOGw5bThvOW44ZThsOWw4YS4KKy5zNGEybDRtCisuc2FsbW8ybjQKKy5zYWwxbW8KKy5zYWxtb240ZWxsYQorLnNhbG1vbmVsMWwKKy5zYThsOXQ4YTl0OGk4bzhuLgorLnNhNGw0dAorLnNhbDF0YQorLnNhbHRhMXQyaW8KKy5zYWx0YXRpbzJuCisuc2E4cjlzOGE5cDhhOHI5aThsOWw4YS4KKy5zMmEycgorLnNhMnI0c2EyCisuc2E0cnMyCisuc2FyczFhcAorLnMyYTJyc2FwMmEycjQKKy5zYXJzYTFwYQorLnNhcnNhcDRhNHIxaQorLnNhcnNhcGFyaWwxbAorLnNhOHU4ZThyOWs4cjhhOHU4dC4KKy5zYXU0Cisuc2F1ZXJrcmF1NHQKKy5zYzhhOHQ5bzlsOG84ZzlpOWM4YThsLgorLnMxY2EKKy5zY2ExdG8KKy5zY2F0bzNsb2cxaWMKKy5zY2F0b2xvZ2kxY2EKKy5zYzhoOGU4ZDl1OGw5aThuOGcuCisuczJjaDIKKy5zY2hlMgorLnM0Y2g0ZWQKKy5zY2hlNGR1bAorLnNjaGUxZHUKKy5zY2hlZHVsMmkKKy5zY2hlZHVsM2luZworLnNjOGg4aTh6OW85cDhoOHI4ZThuOGk4Yy4KKy5zY2hpMnoKKy5zY2hpMXpvCisuc2NoaXoyb3BoCisuc2NoaXpvcDRocjQKKy5zYzhoOG44YTh1OXo4ZThyLgorLnNjMmgxbgorLnNjaDFuYQorLnNjaG4yYXUKKy5zY2huYXUyejRlCisuc2NobmF1ejFlcgorLnNjOGg4bzhvOGw5YzhoOGk4bDhkLgorLnM0Y2hvMgorLnNjaG9vMgorLnNjaG9vNGwxYzIKKy5zMmNob29sMmNoCisuc2Nob29sY2g0aWwyCisuc2Nob29sY2hpMmxkCisuc2M4aDhvOG84bDljOGg4aThsOGQ5cjhlOG4uCisuc2Nob29sY2hpbDNkcgorLnNjaG9vbGNoaWxkcmU0Cisuc2Nob29sY2hpbDVkcmVuCisuc2M4aDhvOG84bDl0OGU4YThjOGg4ZThyLgorLnNjaG9vNGwydAorLnNjaG9vbDF0ZQorLnMyY2hvb2x0ZWEyY2gKKy5zY2hvb2x0ZWFjaGUyCisuc2M4aDhvOG84bDl0OGU4YThjOGg5ZThyOHMuCisuc2Nob29sdGVhY2gzZTRyMXMyCisuc2M4cjh1OXQ4aTluOHkuCisuc2NydTJ0MWk1bgorLnNjcjR1MXQyaQorLnNjcnV0NGlueQorLnNjOHk4dDhoOWk4bjhnLgorLnMxY3kKKy5zY3kzdGhpbgorLnNlOGw4bDllOHIuCisuc2VsMmxlCisuc2U4bDhsOWU4cjhzLgorLnNlbGxlNHIxczIKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dC4KKy5zZTFjcgorLnNlNGMzcmUxdGEKKy5zZWNyZXQyYTJyCisuc2VjcmV0YXIxaQorLnNlY3JldGFyMmkzYQorLnNlOGM5cjhlOXQ4YThyOWk4YTh0OHMuCisuc2VjcmV0YXJpYTR0MXMyCisuc2U4bTlhOXA4aDhvOHI4ZS4KKy5zZTFtYQorLnNlNG1hcAorLnNlbWFwaG80cgorLnNlOG05YTlwOGg4bzhyOGU4cy4KKy5zZTltOGU4czl0OGU4ci4KKy40c2UxbWUKKy5zZTJtZXMKKy5zZThtOGk5ZDhlOGY5aTluOGk4dDhlLgorLnNlbTJpZAorLnNlbWlkZTFmCisuc2VtaWRlZjVpNW4yaXRlCisuc2VtaWRlMWZpCisuc2VtaWRlMmZpbgorLnNlbWlkZWYyaW5pCisuc2VtaWRlZmluMml0Cisuc2U4bThpOWQ4aTlyOGU4Yzh0LgorLnNlbWkyZGkKKy5zZW1pZDRpcjIKKy5zZW1pZGkxcmUKKy5zZW1pZGlyZTJjMXQKKy5zZThtOGk5aDhvOW04bzl0OGg4ZTh0OWk4Yy4KKy5zZW1pM2gKKy5zZW1paG8xbW8KKy5zZW1paG9tNG90aDMKKy5zZW1paG9tb3RoMmUKKy5zZW1paG9tbzN0aGU0dAorLnNlbWlob21vdGhldDFpYworLnNlOG04aTlyOGk4bjhnLgorLnNlbTRpcgorLnNlbWlyMWkKKy5zZW1pcmluNGcKKy5zZThtOGk5cjhpOG44ZzhzLgorLnNlbWlyaW5nczIKKy5zZThtOGk5czhpOG05cDhsOGUuCisuc2U0bTJpcworLnNlbWlzaTRtMXAKKy5zZW1pc2ltMXAybDIKKy5zZThtOGk5czhrOGk4bDhsOGU4ZC4KKy5zZW00aXM0azIKKy5zZW1pc2sxaQorLnNlbWlzazRpbDFsCisuc2VtaXNraWwybGUKKy5zZThyOG85ZThwOGk5ZDhlOW04aTlvOWw4bzhnOWk5YzhhOGwuCisuczJlcjRvCisuc2VybzRlCisuc2Vyb2VwNGlkCisuc2Vyb2VwaTNkZQorLnNlcm9lcGlkNGVtCisuc2Vyb2VwaWRlbTJpbworLnNlcm9lcGlkZW1pMW9sCisuc2Vyb2VwaWRlbWlvM2xvZzFpYworLnNlcm9lcGlkZW1pb2xvZ2kxY2EKKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bS4KKy40c2VyM3ZvCisuc2Vydm8ybWUKKy5zZXJ2b21lMmNoCisuc2Vydm9tZWNoNWE1bmlzCisuc2Vydm9tZWNoYTJuCisuc2Vydm9tZWNoYW5pMnMxbQorLnNlOHI5djhvOW04ZThjOGg5YThuOGk4czhtOHMuCisuc2Vydm9tZWNoYW40aXM0bTFzMgorLnNlOHM5cTh1OGk5cDhlOWQ4YTlsOGk4YThuLgorLnMxZTRzCisuc2VzcXUyCisuc2VzcTJ1aTIKKy5zZXNxdTJpcAorLnNlc3F1aXBlNAorLnNlc3F1aTJwMmVkCisuc2VzcXVpcDJlMmQyYQorLnNlc3F1aXBlZGFsMWkKKy5zZXNxdWlwZWRhbDJpMWEKKy5zZXNxdWlwZWRhbGkyYTJuCisuc2U4dDl1OHAuCisuc2UxdHUKKy5zZTh0OXU4cDhzLgorLnNldHUycDFzMgorLnNlOXY4ZThyOGU5bDh5LgorLjVzZXYKKy5zZXYxZXIKKy5zZXY0ZXJlbAorLnNldmVyZTFseQorLnNoOGE4cDhlOWE4YjhsOGUuCisuc2hhM3BlNGEKKy5zaGFwZTFhNGIKKy5zaGFwZWFiMmwyCisuc2g4bzhlOXM4dDhyOGk4bjhnLgorLnNobzQKKy5zaG8yZXN0NHIKKy5zaG9lc3RyaW40ZworLnNoOG84ZTlzOHQ4cjhpOG44ZzhzLgorLnNob2VzdHJpbmdzMgorLnNpOGQ4ZTlzOHQ4ZThwLgorLjVzaWRlNHMyCisuczJpZAorLnNpZGVzdGU0cAorLnNpOGQ4ZTlzOHQ4ZThwOHMuCisuc2lkZXN0ZTJwMXMyCisuc2k4ZDhlOXM4dzhpOHA4ZS4KKy5zaWRlczR3MgorLnNpZGVzd2kyCisuc2lkZXN3MmlwCisuc2lkZXN3aXBlNAorLnNrOHk5czhjOHI4YThwOGU4ci4KKy5zazIKKy5za3lzNGMKKy5za3lzY3JhcDNlcgorLnNrOHk5czhjOHI4YThwOGU4cjhzLgorLnNreXNjcmFwZTRyMXMyCisuc204bzhrOGU5czh0OGE4YzhrLgorLjJzMW0KKy5zMW1vCisuczRtMm9rCisuc21va2VzNAorLnNtb2tlczF0YQorLnNtb2tlc3RhY2sxCisuc204bzhrOGU5czh0OGE4YzhrOHMuCisuc21va2VzdGFjNGsxczIKKy5zbjhvOHI5azhlOGw5aThuOGcuCisuczFuNAorLnNub3JrZTVsMmkKKy5zbm9ya2U0bDNpbmcKKy5zbzlsOGU5bjhvOGk4ZC4KKy4xc28KKy5zb2w0ZW5vCisuc29sZW5vaTIKKy5zb2xlbm8yaWQKKy5zbzlsOGU5bjhvOGk4ZDhzLgorLnNvbGVub2kyZDFzMgorLnNvOGw4dTh0OGUuCisuc28xbHV0Cisuc284bDh1OHQ4ZThzLgorLnNvOHY5ZThyOWU4aThnOG4uCisuNHNvdgorLnNvdmVyZWkyCisuc292ZXJlMmlnMgorLnNvOHY5ZThyOWU4aThnOG44cy4KKy5zb3ZlcmVpZzJuMXMyCisuc3A4YTljOGU4cy4KKy4yczFwYQorLnNwYTRjZQorLnNwOGU5YzhpOG84dThzLgorLnNwZTJjCisuc3BlMWMyaQorLnNwZWMyaW8KKy5zcGVjaW91MgorLnNwZWNpbzJ1cworLnNwOGU4bDhsOWU4ci4KKy5zcGVsMWwKKy5zcGVsMmxlCisuc3A4ZThsOGw5ZThyOHMuCisuc3BlbGxlNHIxczIKKy5zcDhlOGw4bDlpOG44Zy4KKy5zcGVsbDJpCisuc3BlbDJsaW40Cisuc3A4ZTlsOHU4bjhrOWU4ci4KKy5zcGVsdTRuazIKKy5zcGVsdW5rMWVyCisuc3A4ZThuOGQ5dDhoOHI4aThmOHQuCisuc3BlbjRkCisuc3BlbmQydGgKKy5zcGVuZHQ0aHI0Cisuc3BlbmR0aHI0aTJmdAorLnNwOGg4ZThyOW84aThkLgorLnMycGhlCisuM3NwaDRlcgorLnNwaDJlcm8KKy5zcGhlcm9pMgorLnNwaGVybzJpZAorLnNwOGg4ZThyOW84aThkOWE4bC4KKy5zcGhlcm9pMWQyYQorLnNwOGg4aThuOWc4ZThzLgorLnNwaDVpbmcKKy5zcGg0aW5nZQorLnNwOGk4YzlpOWw4eS4KKy5zcDJpMWNpCisuc3BpY2kxbHkKKy5zcDhpOG45bzhyOHMuCisuc3BpMm4KKy5zcDRpMW5vCisuc3Bpbm80cnMyCisuc3A4bzhrOGU4czl3OG84bThhOG4uCisuc3Ayb2sKKy5zcG9rZXM0Cisuc3Bva2VzNHcyCisuc3Bva2U0czF3bzIKKy5zcG9rZXN3b20xCisuc3Bva2Vzd28xbWEKKy5zcG9rZXN3b21hMm4KKy5zcDhvOGs4ZThzOXc4bzhtOGU4bi4KKy5zcG9rZXN3bzJtZQorLnNwb2tlc3dvMW1lbgorLnNwOG84cjh0OHM5YzhhOHM4dC4KKy5zMXA0b3I0Cisuc3BvcjR0MXMyCisuc3BvcnQ0c2MKKy5zcG9ydHMxY2EKKy5zcDhvOHI4dDhzOWM4YThzOHQ5ZThyLgorLnNwb3J0c2Nhc3Q1ZXIKKy5zcDhvOHI5dDhpOHY4ZTlsOHkuCisuc3BvcjF0aQorLnNwb3I0dDJpdgorLnNwb3J0aXY0ZTFseQorLnNwOG84cjh0OHM5dzhlOGE4ci4KKy5zcG9ydDRzdzIKKy5zcG9ydHN3ZTJhMnIKKy5zcDhvOHI4dDhzOXc4cjhpOHQ4ZThyLgorLnNwb3J0c3dyaTQKKy5zcG9ydHN3cjJpdGUKKy5zcDhvOHI4dDhzOXc4cjhpOHQ4ZThyOHMuCisuc3BvcnRzd3JpdDVlNHIxczIKKy5zcDhyOGk4ZzhoOHQ5bDhpOGU4ci4KKy5zcHIyCisuc3ByMmlnCisuc3ByaWdoMnRsCisuc3ByaWdodGwyaWU0Cisuc3E4dThlOGE5bThpOHM4aC4KKy5zcXUyCisuc3F1ZWFtMmlzCisuc3F1ZWFtaXMyaAorLnN0OGE4bjhkOWE4bDhvOG44ZS4KKy41c3Q0YW5kCisuc3RhMm4KKy5zdGFuMWQyYQorLnN0YW5kYWxvMm4KKy5zdDhhOHI5dDhsOGk4bjhnLgorLnN0MmEycgorLnN0YXIydGwKKy5zdDhhOHI5dDhsOGk4bjhnOWw4eS4KKy5zdGFydGxpbmdsMgorLnN0YXJ0bGluZzFseQorLnN0OGE5dDhpOHM5dDhpOGM4cy4KKy5zdGF0aXMxdDJpCisuc3RhdGlzMXRpYworLnN0YXRpc3RpNGMzczIKKy5zdDhlOGE4bDh0OGg5aThsOHkuCisuc3RlYTRsCisuc3RlYTRsdAorLnN0ZWFsdGgzaQorLnN0ZWFsNHRoNGlsMgorLnN0ZWFsdGhpMWx5Cisuc3Q4ZThlOHA4bDhlOWM4aDhhOHM4ZS4KKy5zMXRlZQorLnN0ZWU0cDEKKy5zdGVlMXAybDIKKy5zdGVlcGxlMmNoCisuc3Q4ZThyOGU4bzlnOHI4YThwOGg5aThjLgorLnN0ZXJlMW8KKy5zdGVyZW8yZworLnN0ZXJlbzFncgorLnN0ZXJlbzVncmFwaDFpYworLnN0ZXJlb2dyNGFwaGkKKy5zdDhvOWM4aDhhOHM5dDhpOGMuCisuczF0bworLnN0bzJjaDQKKy5zdG9jaGFzdDJpCisuc3RvY2hhczF0aWMKKy5zdDhyOGE4bjhnOGU5bjhlOHM4cy4KKy5zdDRyCisuczF0cmEKKy5zdHJhbjRnZQorLnN0cmEybgorLnN0cjJhbmcKKy5zdHJhbmdlNG40ZQorLnN0cmFuMWdlbgorLnN0cmFuZ2UxbmVzCisuc3RyYW5nZW4yZTJzcworLnN0OHI4YThwOWg4YThuOGc4ZThyLgorLnN0cmFwaDJhbjRnCisuc3RyYXBoYW5nNWVyCisuc3RyYXBoYTJuCisuc3Q4cjhhOHQ5YTlnOGU4bS4KKy5zdHJhMnRhCisuc3Q4cjhhOHQ5YTlnOGU4bThzLgorLnN0cmF0YWdlNG0xczIKKy5zdDhyOGU4dDhjOGg5aTllOHIuCisuc3RyZTR0YworLnN0cmV0NGNoCisuc3RyZXRjaDJpZTQKKy5zdDhyOGk4cDl0OGU4YThzOGUuCisuc3RyMmlwCisuc3RyaTJwMXQKKy5zdHJpcDJ0ZQorLnN0OHI4bzhuOGc5aDhvOGw4ZC4KKy5zdHJvMm4KKy5zdHJvbmdobzJsMmQKKy5zdDhyOG84bjhnOWU4czh0LgorLnN0OHU5cDhpOGQ5ZThyLgorLnMxdHUKKy5zdHVwNGlkCisuc3R1cGkzZGUKKy5zdDh1OXA4aThkOWU4czh0LgorLnN0dXBpZGU0czIKKy5zdThiOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjFzdQorLnN1NGIzCisuc3U0YjFkCisuc3ViZDFpZgorLnN1YmRpNGYxZgorLnN1YmRpZmZlcjEKKy5zdWJkaWZmZXIzZW4xdAorLnN1YmRpZmZlcmVudDJpCisuc3ViZGlmZmVyZW4xdDJpMWEKKy5zdWJkaWZmZXJlbnRpMmFsCisuc3U4YjllOHg5cDhyOGU4czlzOGk4bzhuLgorLnN1YjRlCisuc3ViMWV4M3AKKy5zdWJleHByMgorLnN1YmV4M3ByMmUyc3MKKy5zdWJleHByZXMxc2kKKy5zdWJleHByZXMxczJpbworLnN1YmV4cHJlczVzaW8ybgorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bjhzLgorLnN1YmV4cHJlc3NpbzJuM3MyCisuc3U4bTltOGE5YjhsOGUuCisuc3UybQorLnN1bTFtCisuc3VtMW1hCisuc3VtMm1hYgorLnN1bW1hYjJsMgorLnN1OHA4ZThyOWU4ZzhvLgorLnN1MXBlCisuc3VwZXJlMWdvCisuc3U4cDhlOHI5ZThnOG84cy4KKy5zdXBlcmU0Z29zCisuc3U5cDhyOGU4bTlhOWM4aThzOHQuCisuc3VwcjIKKy5zdXByZTRtYWMKKy5zdXByZTFtYQorLnN1cHJlbTRhMmNpCisuc3U5cDhyOGU4bTlhOWM4aThzOHQ4cy4KKy5zdXByZW1hY2lzNHQxczIKKy5zdThyOXY4ZThpOGw5bDhhOG44YzhlLgorLnN1MnIKKy5zdXJ2NGUKKy5zdXJ2ZWkyCisuc3VydmVpbDFsCisuc3VydmVpbGxhMm4KKy5zdzhpOG05bThpOG44ZzlsOHkuCisuc3cyCisuc3dpMgorLnN3aW0xbQorLnN3aW1tNGluZ2wyCisuc3dpbW01aW5nMWx5Cisuc3k4bThwOXQ4bzltOGE4dDhpOGMuCisuc3k0bTFwCisuc3ltMnAxdAorLnN5bXAxdG8KKy5zeW1wdG8ybWEKKy5zeW1wdG9tYXQxaWMKKy5zeThuOWM4aDhyOG85bThlOHM4aC4KKy5zeW4zYzRocjQKKy5zeW4yY2gKKy5zeW5jaHJvMm1lCisuc3luY2hybzJtZXMKKy5zeW5jaHJvbTRlczJoCisuc3k4bjljOGg4cjhvOW44bzh1OHMuCisuc3luY2hybzJuCisuc3luY2hybzFub3UyCisuc3luY2hyb25vMnVzCisuc3k4bjljOGg4cjhvOXQ4cjhvOG4uCisuc3luY2hyb3RybzJuCisudGE4ZjhmOXI4YThpOGwuCisuNHRhMmY0CisudGE0ZjFmNAorLnRhZmZyMmFpMgorLnRhOGw4azlhOXQ4aTh2OGUuCisudGEybAorLjR0YWxrCisudGFsa2EzCisudGFsa2E0dAorLnRhbGthMXQyaXYKKy50YTlwOGU4czl0OHI4eS4KKy50YXAyZXN0NHIKKy50YXBlNHN0cnkKKy50YTlwOGU4czl0OHI4aThlOHMuCisudGFwZXN0cjJpZTQKKy50YThyOXA4YTh1OWw4aThuLgorLnQyYTJyCisudGFyMnAKKy50YXIxcGEKKy50YXJwYXU0bDIKKy50YXJwYXVsMmkKKy50YThyOXA4YTh1OWw4aThuOHMuCisudGFycGF1bDJpMm4xczIKKy50ZTlsOGU4ZzlyOGE5cDhoOGU4ci4KKy50ZWxlMWdyCisudGVsZWc1cmEzcGg0ZXIKKy50ZTlsOGU4ZzlyOGE5cDhoOGU4cjhzLgorLnRlbGVncmFwaGU0cjFzMgorLnRlOGw4ZTlrOGk5bjhlOHQ5aThjLgorLnRlbGVraTRuCisudGVsZWsxaQorLnRlbGVrMmluZQorLnRlbGVraTNuZXQxaWMKKy50ZThsOGU5azhpOW44ZTh0OWk4YzhzLgorLnRlbGVraW5ldGk0YzNzMgorLnRlOGw4ZTlyOG85YjhvOHQ5aThjOHMuCisudGU0bDFlcgorLnRlbDRlcm8KKy50ZWxlcjVvYgorLnRlbGVyb2JvdGk0YzNzMgorLnRlOGw4bDllOHIuCisudGVsMWwKKy50ZWwybGUKKy50ZThsOGw5ZThyOHMuCisudGVsbGU0cjFzMgorLnRlOG05cDhvOXI4YThyOWk4bDh5LgorLnRlNG0xcAorLnRlbTFwNG9yCisudGVtcG8xcmEKKy50ZW1wbzRyYXJpbAorLnRlbXBvcjJhMnIKKy50ZW1wb3JhcjFpCisudGVtcG9yYXJpMWx5CisudGU4bjl1OHI4ZS4KKy50ZThzOHQ5YjhlOGQuCisudGVzMnQxYgorLnRlc3Q0YmUyZAorLnRlOHg4dDl3OGk4ZDh0OGguCisuM3RleAorLnRleDF0MgorLnRleHR3NAorLnRleHR3aTIKKy50ZXh0dzJpZAorLnRleHR3aWQydGgKKy50aDhhOGw5YTltOHU4cy4KKy50aGEzbGEKKy50aGFsYTNtCisudGhhbGExbXUKKy50aGFsYW0ydXMKKy50aDhlOHI5bThvOWU4bDhhOHM5dDhpOGMuCisudGgyZQorLnRoZXIzbTQKKy50aGVyMW1vCisudGhlcm1vNGVsCisudGhlcm1vZTFsYQorLnRoZXJtb2VsYXN0MmkKKy50aGVybW9lbGFzMXRpYworLnRpOG04ZTlzOHQ4YThtOHAuCisudGkybWVzCisudGltZXMxdGEKKy50aW1lc3RhNG0xcAorLnRpOG04ZTlzOHQ4YThtOHA4cy4KKy50aW1lc3RhbTJwMXMyCisudG84bzhsOWs4aTh0LgorLnRvbzIKKy50b29sazFpCisudG84bzhsOWs4aTh0OHMuCisudG9vbGtpNHQxczIKKy50bzhwOG85ZzhyOGE4cDhoOWk5YzhhOGwuCisudG81cG80ZworLnRvcG8xZ3IKKy50b3BvNWdyYXBoMWljCisudG9wb2dyNGFwaGkKKy50b3BvZ3JhcGhpMWNhCisudG84cTh1OGU4cy4KKy50bzFxCisudG9xdTIKKy50cjhhOGk5dDhvOHI5bzh1OHMuCisuMXRyYQorLnRyMmFpMgorLnRyYWkxdG8KKy50cmFpdG9yb3UyCisudHJhaXRvcm8ydXMKKy50cjhhOG44czljOGU4aTh2OGU4ci4KKy50cmEybgorLnRyYTJuMXMyCisudHJhbnM0YworLnRyYW40czNjZWkyCisudHJhbnNjZTJpdgorLnRyOGE4bjhzOWM4ZThpOHY4ZThyOHMuCisudHJhbnNjZWl2ZTRyMXMyCisudHI4YThuOHM5ZzhyOGU4czhzLgorLnRyYW4yczNnCisudHJhbnMxZ3IKKy50cmFuc2dyMmUyc3MKKy50cjhhOG44czl2OGU4cjlzOGE4bC4KKy50cmFuNHN2CisudHJhbnN2ZTRyMXMyCisudHJhbnN2ZXIxc2EyCisudHI4YThuOHM5djhlOHI5czhhOGw4cy4KKy50cmFuc3ZlcnNhMmwxczIKKy50cjhhOG44czl2OGU4czl0OGk4dDhlLgorLnRyYW5zdjRlMnMKKy50cmFuc3Zlc3QyaQorLnRyYW5zdmVzdDJpdGUKKy50cjhhOG44czl2OGU4czl0OGk4dDhlOHMuCisudHJhbnN2ZXN0aXQ0ZXMKKy50cjhhOXY4ZThyOHM5YTliOGw4ZS4KKy50cmF2ZTRyMXMyCisudHJhdmVyMXNhMgorLnRyYXZlcjJzMWFiCisudHJhdmVyc2FiMmwyCisudHI4YTl2OGU4cjlzOGE4bC4KKy50cjhhOXY4ZThyOXM4YThsOHMuCisudHJhdmVyc2EybDFzMgorLnRyOGk5ZTh0OGg4eThsOWE4bThpOG44ZS4KKy50cmk1ZXQKKy50cjJpZTQKKy50cmlldGh5M2xhCisudHJpZXRoeWxhbTFpbgorLnRyaWV0aHlsYW0yaW5lCisudHI4ZThhOGM4aDllOHI4aThlOHMuCisudHJlYTJjaAorLnRyZWFjaGUyCisudHJlYWNoZXIxaQorLnRyZWFjaGVyMmllNAorLnRyOG84dTliOGE5ZDhvOHU4ci4KKy50cm91MgorLnRyb3ViYTJkCisudHJvdWJhMWRvCisudHJvdWJhZG91MgorLnR1OHI5azhlOHkuCisuMXR1CisudHU4cjlrOGU4eThzLgorLnR1cmtleXM0CisudHU4cjhuOWE4cjhvOHU4bjhkLgorLnR1cjRuMmEycgorLnR1cjFuYQorLnR1cm5hcm91MgorLnR1cm5hcm91bjJkCisudHU4cjhuOWE4cjhvOHU4bjhkOHMuCisudHVybmFyb3VuMmQxczIKKy50eThwOWE4bC4KKy4xdHkKKy50eTFwYQorLnR5cDRhbAorLnVuOWE4dDl0OGE4YzhoOGU4ZC4KKy51bjJhdDQKKy51bmE0dDN0MgorLnVuYXQxdGEKKy51bmF0dGEyY2gKKy51bmF0dGFjaGUyCisudW5hdHRhNGNoNGVkCisudW45ZThyOHI5aThuOGc5bDh5LgorLnVuNGVyCisudW5lcjRyNAorLnVuZXJyaW40ZworLnVuZXJyaW5nbDIKKy51bmVycmluZzFseQorLnVuOWY4cjhpOGU4bjhkOWw4eS4KKy51bjNmCisudW5mcmkyCisudW5mcjJpZTQKKy51bmZyaWVuMmQxbHkKKy51bjlmOHI4aThlOG44ZDlsOGk5ZThyLgorLnVuZnJpZW5kbDJpZTQKKy52YThnOHU4ZThyLgorLjF2YQorLnZhZzQKKy52YTVndWVyCisudmEyZ3VlCisudmE4dThkOGU5djhpOGw4bDhlLgorLnZhdWRlMXY0CisudmF1ZGUydjNpNGwKKy52YXVkZTF2aQorLnZhdWRldmlsMWwKKy52YXVkZXZpbDJsZQorLnZpOGM5YThyOHMuCisudjRpYzJhMnIKKy52aTFjYQorLnZpY2E0cnMyCisudmk4bDlsOGE4aThuOWU4czhzLgorLjJ2aWwKKy52aWwxbAorLnZpbGxhaTIKKy52aWxsYTRpNG4KKy52aWxsYTJpbmUKKy52aWxsYWk1bjJlMnNzCisudmlsbGFpMW5lcworLnZpOHM5dThhOGwuCisudmkzc3UKKy52aXN1MWFsCisudmk4czl1OGE4bDlsOHkuCisudmlzdWFsMWwKKy52aXN1YWwxbHkKKy52aTl2OGk4cDlhOXI4bzh1OHMuCisuM3YyaXYKKy52aXYyaTRwCisudml2aTFwYQorLnZpdmlwMmEycgorLnZpdmlwYXJvdTIKKy52aXZpcGFybzJ1cworLnZvOGk4YzhlOXA4cjhpOG44dC4KKy52b2k0Cisudm9pM2NlcAorLnZvaWNlcHIyCisudm9pY2VwcmluNHQzCisudnM4cDhhOGM4ZS4KKy52MnMxcGEKKy52c3BhNGNlCisud2E4ZDlkOGk4bjhnLgorLndhMmQKKy53YWQ0ZDFpbgorLndhZDFkNAorLndhOGw4bDlmOGw4bzh3OGU4ci4KKy53YWwxbAorLndhbDJsZgorLndhbGxmNGwyCisud2FsbGZsb3cxZXIKKy53YThsOGw5ZjhsOG84dzllOHI4cy4KKy53YWxsZmxvd2U0cjFzMgorLndhOHI4bTllOHM4dC4KKy53MmEycgorLndhcjFtCisud2FyMm1lCisud2FyMm1lcworLndhOHM4dDhlOXc4YTh0OGU4ci4KKy53YXM0dAorLndhc3RlMncKKy53YXN0ZTF3NWEKKy53YXN0ZXdhMXRlCisud2E4djhlOWc4dThpOGQ4ZS4KKy53YXZlZzMKKy53YXZlZzJ1aTIKKy53YXZlZ3UyaWQKKy53YTh2OGU5Zzh1OGk4ZDhlOHMuCisud2F2ZWd1aWRlNHMyCisud2E4djhlOWw4ZTh0LgorLndhOHY4ZTlsOGU4dDhzLgorLndhdmVsZTR0MXMyCisud2U4YjlsOGk4azhlLgorLncyZTFiCisud2ViMmwyCisud2ViM2w0aWsKKy53ZThlOGs5bjhpOGc4aDh0LgorLndlZWtuMmlnCisud2U4ZThrOW44aThnOGg4dDhzLgorLndlZWtuaWdoNHQxczIKKy53aDhlOGU4bDljOGg4YThpOHIuCisud2hlZTRsMWMyCisud2hlZWwyY2gKKy53aGVlbGNoYWkyCisud2hlZWxjaGE0aXIKKy53aDhlOGU4bDljOGg4YThpOHI4cy4KKy53aGVlbGNoYWk0cnMyCisud2g4aThjOGg5ZTh2OGU4ci4KKy53aGk0Cisud2g0aTJjaAorLndoaWNoZTIKKy53aGljaGV2MWVyCisud2g4aTh0OGU5czhpOGQ4ZThkLgorLndoMml0ZQorLndoaXQ0ZXMKKy53aGl0ZTFzaQorLndoaXRlMnMyaWQKKy53aGl0ZXNpMmQxZWQKKy53aDhpOHQ4ZTlzOHA4YThjOGUuCisud2hpdGUxc3AKKy53aGl0ZTJzMXBhCisud2hpdGVzcGE0Y2UKKy53aDhpOHQ4ZTlzOHA4YThjOGU4cy4KKy53aThkOGU5czhwOHI4ZThhOGQuCisudzJpZAorLndpZGU0czIKKy53aWRlMXNwCisud2lkZXM0cHJlCisud2lkZXNwcjIKKy53aWRlc3ByZWEyZDEKKy53aThuOGc5czhwOGE4bi4KKy53aW40ZworLndpbmdzMgorLndpbmcyczFwYQorLndpbmdzcGE0bgorLndpOG44ZzlzOHA4YThuOHMuCisud2luZ3NwYTJuMXMyCisud2k4bjhnOXM4cDhyOGU4YThkLgorLndpbmdzcHIyCisud2luZ3NwcmVhMmQxCisud2k4dDhjOGg5YzhyOGE4Zjh0LgorLndpNHRjCisud2l0NGNoCisud2l0Y2hjcmEyZjR0Cisud2l0Y2hjcmEyZgorLndvOHI4ZDlzOHA4YThjOWk4bjhnLgorLjF3bzIKKy53b3IyZDFzMgorLndvcmRzNHAKKy53b3JkMnMxcGEKKy53b3Jkc3A0YTJjaQorLndvcmRzcGEyYzFpbgorLndvcmRzcGFjMWluZworLndvOHI4azlhOHI4bzh1OG44ZC4KKy53b3JrMmEycgorLndvcmthcm91MgorLndvcmthcm91bjJkCisud284cjhrOWE4cjhvOHU4bjhkOHMuCisud29ya2Fyb3VuMmQxczIKKy53bzhyOGs5aDhvOHI4czhlLgorLndvcmtoNAorLndvcmtob3I0c2UKKy53b3JraG80cnMyCisud284cjhrOWg4bzhyOHM4ZThzLgorLndvcmtob3JzM2U0cworLndyOGE4cDlhOHI4bzh1OG44ZC4KKy53cmE0Cisud3JhcDJhMnI0Cisud3JhMXBhCisud3JhcGFyb3UyCisud3JhcGFyb3VuMmQKKy53cjhlOHQ4YzhoOWU4ZC4KKy53cmU0dGMKKy53cmV0NGNoCisud3JldGNoZTIKKy53cmV0NGNoNGVkCisud3I4ZTh0OGM4aDllOGQ5bDh5LgorLndyZXRjaGUyZDFseQorLnllOHM5dDhlOHI5eThlOGE4ci4KKy55ZXM0CisueWVzdGVyeWUyYTJyCisuYWw5ZzhlOWI4cjhhOGk5czhjOGg4ZS4KKy5hbGdlYnJhMmlzMWMKKy5hbGdlYnJhaXMzY2gyCisuYWxnZWJyYWlzY2hlMgorLmFsOWw4ZTlnOGg4ZTluOHkuCisuYWwxbAorLmFsMmxlCisuYWwzbGVnCisuYWxsZWdoZTJuCisuYXI5azhhOG45czhhOHMuCisuYXJrYTJuCisuYXJrYW4yc2EyCisuYXJrYTJuMXMyCisuYXQ4cDlhOHM4ZS4KKy5hNHQxcAorLmF0MXBhCisuYXQ4cDlhOHM4ZThzLgorLmF0cGFzMWU0cworLmF1OHM5dDhyOGE4bDlhOHM4aThhOG4uCisuYTJ1cworLmF1czF0NHIKKy5hdXMxdHJhCisuYXVzdHJhbGFzMmkxYQorLmF1c3RyYWxhc2kyYTJuCisuYXU4dDhvOW04YTh0OGk5czhpOGU4cjl0OGU4ci4KKy5hdXRvbWEzdGlzCisuYXV0b21hdGlzMmllNAorLmF1dG9tYXRpc2llcnQzZXIKKy5iZTlkOGk4ZTluOHU4bjhnLgorLjRiZTJkCisuYjRlM2RpCisuYmU1ZGkzZW4KKy5iZWQyaWU0CisuYmVkaWUzbnU0bgorLmJlOG04YjhvLgorLjRiZTVtCisuYmU0bTViCisuYmk4YjlsOGk5bzlnOHI4YTlwOGg4aTlzOGM4aDhlLgorLmJpYmxpb2dyNGFwaGkKKy5iaWJsaW9ncmFwaDJpczFjCisuYmlibGlvZ3JhcGhpczNjaDIKKy5iaWJsaW9ncmFwaGlzY2hlMgorLmJvOHM5dDhvOG4uCisuNWJvczQKKy5ib3MxdG8KKy5ib3N0bzJuCisuYnI4bzh3OG45aThhOG4uCisuYnJvd241aQorLmJyb3czbjRpMWEKKy5icm93bmkzYTJuCisuYnI4dThuOHM5dzhpOGM4ay4KKy5icnUybgorLmJydTJuM3M0CisuYnJ1bjRzdzIKKy5icnVuc3dpMgorLmJydW5zd2ljazEKKy5idTlkOGE5cDhlOHM4dC4KKy5idTFkMmEKKy5jYThyOWk4YjliOGU4YThuLgorLmNhcjFpCisuY2FyNGliCisuY2FyaTJiMWIKKy5jYXJpYjJiZQorLmNhcmliYmVhMm4KKy5jaDhhOHI4bDhlOHM5dDhvOG4uCisuY2hhcjRsZTQKKy5jaGFyMWwKKy5jaGFybGVzMgorLmNoYXJsNGVzMnRvCisuY2hhcmxlM3N0bzJuCisuY2g4YThyOWw4bzh0OHQ4ZThzOXY4aThsOGw4ZS4KKy5jaGFyM2xvNAorLmNoYXJsbzR0M3QyCisuY2hhcmxvdDR0ZXMKKy5jaGFybG90dGU0c3YKKy5jaGFybG90dGVzMnZpbAorLmNoYXJsb3R0ZXN2aWwxbAorLmNoYXJsb3R0ZXN2aWwybGUKKy5jbzlsOHU4bTliOGk4YS4KKy5jb2x1bTRiaQorLmNvbHU0bTFiCisuY29sdW1iMmkxYQorLmN6OGU4YzhoOG85czhsOG85djhhOWs4aThhLgorLmMyemU0CisuY3plMmNoCisuY3plM2NobzIKKy5jemVjaG9zNGwyCisuY3plY2hvczRsb3YKKy5jemVjaG9zbG8xdmEKKy5jemVjaG9zbG92YWsxaQorLmN6ZWNob3Nsb3ZhazJpMWEKKy5kZThsOWE5dzhhOHI4ZS4KKy5kZTFsYQorLmRlNGxhdworLmRlbGF3MmEycgorLmRpOGo4azlzOHQ4cjhhLgorLmRpM2oKKy5kaWo0azFzMgorLmRpamtzdDRyCisuZGlqa3MxdHJhCisuZHU4YThuOGUuCisuZDF1MWEKKy5kdWEybgorLmR5OW44YTltOGk5czhjOGg4ZS4KKy41ZHluCisuZHkxbmEKKy5keW5hbTJpcworLmR5bmFtMmlzMWMKKy5keW5hbWlzM2NoMgorLmR5bmFtaXNjaGUyCisuZW44ZzlsOGk4czhoLgorLmVuZ2wyCisuZW5nbGlzMmgKKy5ldThsOGU4cjlpOGE4bi4KKy5ldWw0ZQorLmV1M2w0ZXIxaQorLmV1bGUxcjJpM2E0CisuZXVsZXJpMmEybgorLmV2OGE4bjlzOHQ4bzhuLgorLmUxdmEKKy5ldmEybgorLmV2YW40c3QKKy5ldmEybjFzMgorLmV2YW5zMXRvCisuZXZhbnN0bzJuCisuZmU4YjlyOHU5YThyOHkuCisuZjJlNGIKKy5mZTNicgorLmZlYnJ1M2EKKy5mZWJydTJhMnIKKy5mZThzOHQ5czhjOGg4cjhpOGY4dC4KKy5mZXM0dDFzMgorLmZlc3Q0c2MKKy5mZXN0czJjaDIKKy5mZXN0c2M0aHI0CisuZmVzdHNjaHI0aTJmdAorLmZsOG84cjlpOWQ4YS4KKy5mbG9yMmlkCisuZmxvcmkxZDJhCisuZmw4bzhyOWk5ZDlpOGE4bi4KKy5mbG9yaTJkaQorLmZsb3JpZDVpMmEybgorLmZsb3JpMWQ0aTNhCisuZm84cjlzOGM4aDh1OG44ZzhzOWk4bjlzOHQ4aTl0OHU4dC4KKy5mb3JzNGMKKy5mb3JzMmNoMgorLmZvcnNjaHVuZ3MyCisuZm9yc2NodW5nMnMxaW4KKy5mb3JzY2h1bmdzMmkybjFzMgorLmZvcnNjaHVuZ3NpbnN0MmkKKy5mb3JzY2h1bmdzaW5zdGkxdHUKKy5mcjhlOGU5YjhzOGQuCisuZnJlMmUxYgorLmZyZWUyYjVzMgorLmZyZWViNHM1ZAorLmZ1OG44azl0OHM4aThvOG44YThsLgorLjNmdQorLmZ1NG5rMgorLmZ1bms1dAorLmZ1bms0dDFzMgorLmZ1bmt0MXMyaW8KKy5mdW5rdDVzaW8ybgorLmZ1bmt0c2lvMW41YQorLmdhOHU4czhzOWk4YThuLgorLmdhMnVzCisuZ2F1MnNzCisuZ2F1czFzaQorLmdhdXNzMmkxYQorLmdhdXNzaTJhMm4KKy5naDhvOHM4dDlzOGM4cjhpOHA4dC4KKy5naG9zNHQxczIKKy5naG9zdDRzYworLmdob3N0c2NyaTIKKy5naG9zdHNjcjJpcAorLmdob3N0c2NyaTJwMXQKKy5naDhvOHM4dDl2OGk4ZTh3LgorLmdob3M0dHYKKy5naG9zdHYyaWU0CisuZ3I4YThzOHM5bThhOG44bjlpOGE4bi4KKy5ncjJhcworLmdyYTJzcworLmdyYXMyczFtCisuZ3Jhc3MzbWEKKy5ncmFzc21hMm4zCisuZ3Jhc3NtYTRuMW4yCisuZ3Jhc3NtYW4zbjRpMWEKKy5ncmFzc21hMm5uaTNhMm4KKy5ncjhlOGk4ZjhzOXc4YThsOGQuCisuZ3JlaTIKKy5ncmVpMmYzcworLmdyZWlmc3cyCisuZ3JlaWZzd2EybGQKKy5ncjhvOHQ4aDhlOG45ZDhpOGU4YzhrLgorLmc0cm8KKy5ncm80dGgyZQorLmdyNG90aAorLmdyb3RoZTJuCisuZ3JvdGhlbmQyaWU0CisuZ3JvdGhlbmRpZWNrMQorLmdyOHU4bjhkOWw4ZThoOXI4ZThuLgorLmdydTJuCisuZ3J1bmRsZTFoNAorLmdydW5kbGU0aHI0CisuaGE5ZDhhOW04YThyOGQuCisuaGEyZAorLmhhMWQyYQorLmhhZGEybTIKKy5oYWQ0YTFtYQorLmhhZGFtMmEycgorLmhhOGk5ZjhhLgorLmhhaTFmYQorLmhhOG04aThsOXQ4bzhuOWk4YThuLgorLmhhNG0KKy5oYW1pNGx0CisuaGFtaWwxdG8KKy5oYW1pbHRvMm4KKy5oYW1pbHRvM240aTFhCisuaGFtaWx0b25pM2EybgorLmhlOGw5czhpOG44azhpLgorLmhlMmwxczIKKy5oZWwyczFpbgorLmhlbHM0aTRuazIKKy5oZWxzaW5rMWkKKy5oZThyOW04aTh0OWk4YThuLgorLmhlcjNtaXQKKy5oZXJtaTF0aQorLmhlcm00aTF0MmkxYQorLmhlcm1pdGkyYTJuCisuaGk4YjhiOHMuCisuaGkyYjFiCisuaGliMmI1czIKKy5obzhrOWs4YThpOWQ4by4KKy5oMm9rCisuaG9razQKKy5ob2trYWkyCisuaG9ra2EyaWQKKy5ob2trYWkxZG8KKy5qYThjOWs4bzh3OXM4azhpLgorLjVqYQorLmphY2sxCisuamFja293c2syCisuamFja293c2sxaQorLmphOG45dTlhOHI4eS4KKy5qYTJuCisuamFuM3UxYQorLmphbnUyYTJyCisuamE5cDhhOW44ZThzOGUuCisuamE0cAorLmphMXBhCisuamFwYTJuCisuamFwYTFuZXMKKy5qYXBhbmUxczJlCisua2E4ZDlvOG05dDhzOGU4di4KKy5rYTJkCisua2ExZG8KKy5rYWRvNG10Cisua2Fkb200dDFzMgorLmthZG9tdDVzZXYKKy5rYThuOXM4YThzLgorLmthMm4KKy5rYW4yc2EyCisua2EybjFzMgorLmthOHI4bDhzOXI4dThoOGUuCisuazJhMnIKKy5rYXIxbAorLmthcjJsMXMyCisua2FybHMxcgorLmtvOHI5dDhlOXc4ZThnLgorLmtvNXIKKy5rcjhpOHM4aDhuOGEuCisua3IyaXMKKy5rcjNpczJoCisua3JpczJoMW4KKy5rcmlzaDFuYQorLmtyOGk4czhoOW44YTlpOHM4bS4KKy5rcmlzaG5haTIKKy5rcmlzaG5haTJzMW0KKy5rcjhpOHM4aDluOGE4bi4KKy5rcmlzaG4yYTJuCisubGE4bjljOGE4czl0OGU4ci4KKy5sYW4xY2EKKy5sYW5jYXN0NWVyCisubGU5ZzhlOG44ZDhyOGUuCisubGUxZ2VuCisubGVnZW4xZHIKKy5sZWdlbmRyZTQKKy5sZThpOGM4ZThzOXQ4ZThyLgorLmxlaTIKKy5sZTVpYworLmxlaWNlczV0CisubGk4cDlzOGM4aDhpOHQ4ei4KKy5sMmlwCisubGkycDFzMgorLmxpcHMyY2gyCisubGlwczNjaGl0CisubGlwc2NoaTR0egorLmxpOHA5czhjOGg4aTh0OHo5aThhOG4uCisubGlwc2NoaXQyejFpCisubGlwc2NoaXR6MmkxYQorLmxpcHNjaGl0emkyYTJuCisubG84ajliOGE4bi4KKy5sbzVqCisubG9qYmEybgorLmxvOHU5aTlzOGk5YThuOGEuCisubG91MgorLmxvMnVpMgorLmxvdWlzMmkxYQorLmxvdWlzaTJhMm4KKy5sb3Vpc2lhMW5hCisubWE4YzlvOHMuCisubWExY28KKy5tYThuOWM4aDhlOHM5dDhlOHIuCisubWFuMmNoCisubWFuY2hlMgorLm1hbmNoMWVzCisubWE4cjlrOG84djlpOGE4bi4KKy5tYXJrbzV2aTJhMm4KKy5tYXJrb3YyaTFhCisubWE4cjhrOHQ5bzhiOGU4cjlkOG84cjhmLgorLm1hcms1dAorLm1hcmsxdG8KKy5tYXJrdG8zYgorLm1hcmt0b2JlcjFkbworLm1hcmt0b2JlcmQ0b3IKKy5tYXJrdG9iZXJkb3IxZgorLm1hOHM4czlhOWM4aDh1OXM4ZTh0OHQ4cy4KKy5tYTJzcworLm1hczFzYTIKKy5tYXNzYTJjaAorLm1hc3NhY2gydXMKKy5tYXNzYWNodXNlNHQzdDIKKy5tYXNzYWNodXNldDR0MXMyCisubWE4eDl3OGU4bDhsLgorLm1heHdlbDRsCisubWk5YzhyOG85czhvOGY4dC4KKy5taWNybzJzbworLm1pY3Jvc28yZnQzCisubWk4bjluOGU5YThwOW85bDhpOHMuCisubTJpNG4xbjIKKy5taW5uZTQKKy5taW5uZWFwb2wyaQorLm1pOG45bjhlOXM4bzh0OGEuCisubWluMW5lcworLm1pbm5lMXNvCisubWlubmVzbzF0YQorLm1vOHM5YzhvOHcuCisubW9zMmMKKy5tb3MxY28KKy5uYThjOGg5cjhpOGM4aDh0OGU4bi4KKy4xbmEKKy5uYTJjaAorLm5hYzRocjQKKy5uYTJjaHI0aTJjaAorLm5hY2hyaWNodDFlbgorLm5hOHM4aDl2OGk4bDhsOGUuCisubjRhcworLm5hczJoCisubmFzaDJ2aWwKKy5uYXNodmlsMWwKKy5uYXNodmlsMmxlCisubmU4dDliOHM4ZC4KKy5uZTJ0MWIKKy5uZXQyYjVzMgorLm5ldGI0czVkCisubmU4dDlzOGM4YThwOGUuCisubmU0dDFzMgorLm5ldDRzYworLm5ldHNjYTRwCisubmV0czFjYQorLm5pOGo5bThlOWc4ZThuLgorLm5pM2oKKy5uaWptZTJnCisubmlqbWUxZ2VuCisubm84ZTl0OGg4ZThyOWk4YThuLgorLjNub2UKKy5ub2V0aDJlCisubm9ldGhlcjFpCisubm9ldGhlMXIyaTNhNAorLm5vZXRoZXJpMmEybgorLm5vOG84cjhkOXc4aThqOGs4ZThyOWg4bzh1OHQuCisubm9vMgorLm5vM29yZAorLm5vb3JkMXcKKy5ub29yZHdpMgorLm5vb3Jkd2kzagorLm5vb3Jkd2lqazFlcgorLm5vb3Jkd2lqa2VyMWg0Cisubm9vcmR3aWprZXJob3UyCisubm85djhlOG05YjhlOHIuCisubm92ZTRtNWIKKy5vcDhlOG45YjhzOGQuCisub3BlNG4xYjQKKy5vcGVuMmI1czIKKy5vcGVuYjRzNWQKKy5vcDhlOG45bzhmOGY4aThjOGUuCisub3A0ZW5vCisub3Blbm80ZjFmCisub3Blbm9mMWZpCisucGE4bDhhOXQ4aThuOG8uCisucGFsYTJ0MWluCisucGFsYXQyaTFubworLnBhOWw4ZThyOW04by4KKy5wYWxlcjNtNAorLnBhbGVyMW1vCisucGU5dDhyOG84djlzOGs4aS4KKy5wZXRybzN2CisucGV0cm92c2syCisucGV0cm92c2sxaQorLnBmOGE4ZjhmOWk4YThuLgorLjRwZgorLnAxZmEKKy5wZmEyZgorLnBmYTRmMWY0CisucGZhZjFmaQorLnBmYWZmMmkzYQorLnBmYWZmaTJhMm4KKy5waDhpOGw5YTlkOGU4bDlwOGg4aThhLgorLnBoaTRsNGFkZQorLnBoaWxhMmQKKy5waGlsYWRlMmxwCisucGhpbGFkZWw1cGhpCisucGhpbGFkZWxwaDJpMWEKKy5waDhpOGw5bzlzOG84cDhoOWk5czhjOGg4ZS4KKy5waGlsbzJzbworLnBoaWxvczRvcAorLnBoaWxvczJvcGgKKy5waGlsb3NvcGgyaXMxYworLnBoaWxvc29waGlzM2NoMgorLnBoaWxvc29waGlzY2hlMgorLnBvOGk4bjljOGE4cjhlLgorLnBvaW4yCisucG9pMgorLnBvaW5jMmEycjUKKy5wb2luMWNhCisucG85dDhlOG45dDhpOGE4bDlnOGw4ZThpOWM4aDh1OG44Zy4KKy5wNG90CisucG8xdGVuMXQKKy5wb3RlbnQyaQorLnBvdGVuMXQyaTFhCisucG90ZW50aTJhbAorLnBvdGVudGlhNGwxZzQKKy5wb3RlbnRpYWxnbDIKKy5wb3RlbnRpYWwxZ2xlCisucG90ZW50aWFsZ2xlaTIKKy5wb3RlbnRpYWxnbGU1aWMKKy5wb3RlbnRpYWxnbGU0aTJjaAorLnJhOWQ4aDhhOWs4cjhpOHM4aDluOGE4bi4KKy5yYWQxaDIKKy5yYWRoYWtyMmlzCisucmFkaGFrcjNpczJoCisucmFkaGFrcmlzMmgxbgorLnJhZGhha3Jpc2gxbmEKKy5yYWRoYWtyaXNobjJhMm4KKy5yYTh0OGg4czlrOGU4bDlsOGU4ci4KKy5yNGF0aAorLnJhMnQ0aDFzMgorLnJhdGhzazIKKy5yYXRoNHNrZQorLnJhdGhza2VsMWwKKy5yYXRoc2tlbDJsZQorLnJpOGU5bThhOG44bjlpOGE4bi4KKy5yMmllNAorLnJpZTVtYTJuCisucmllMW1hCisucmllbWE0bjFuMgorLnJpZW1hbjNuNGkxYQorLnJpZW1hMm5uaTNhMm4KKy5yeThkOWI4ZThyOGcuCisucnkxZAorLnJ5ZDFiCisucnlkYmVyZzIKKy5zYzhoOG84dDl0OGk4czhjOGg4ZS4KKy5zY2hvNHQzdDIKKy5zY2hvdHQyaXMxYworLnMyY2gyb3R0aXMzY2gyCisuc2Nob3R0aXNjaGUyCisuc2M4aDhyOG85ZDhpOG44ZzllOHIuCisuc2M0aHI0Cisuc2Nocm9kMWluCisuc2Nocm9kNGluZ2UKKy5zYzhoOHc4YTliOGE5YzhoOGU4ci4KKy5zY2gxdworLnNjaHdhYmEyY2gKKy5zY2h3YWJhY2hlMgorLnNjOGg4dzhhOHI4ejlzOGM4aDhpOGw4ZC4KKy5zY2h3MmEycgorLnMyY2h3YXJ6czJjaDIKKy5zY2h3YXJ6c2NoNGlsMgorLnNjaHdhcnpzY2hpMmxkCisuc2U4cDl0OGU4bTliOGU4ci4KKy5zZTJwMXQKKy5zZXAydGUKKy5zZXB0ZTRtNWIKKy5zdDhvOGs4ZThzOXM4YzhoOGUuCisuc3Qyb2sKKy5zdG9rZXM0Cisuc3RvazJlMnNzCisuc3Rva2VzMnM1YworLnN0b2tlc3MyY2gyCisuc3Rva2Vzc2NoZTIKKy5zdDh1OHQ4dDlnOGE4cjh0LgorLnN0dTR0M3QyCisuc3R1dDR0MWcKKy5zdHV0dDFnYQorLnN0dXR0ZzJhMnIKKy5zdThzOXE4dThlOWg4YThuOW44YS4KKy5zMnVzCisuc3VzcXUyCisuc3VzcXVlMWg0Cisuc3VzcXVlaGEybgorLnN1c3F1ZWhhNG4xbjIKKy5zdXNxdWVoYW4xbmEKKy50YTh1OWI4ZThyOWk4YThuLgorLnRhdTRiCisudGF1YjRlCisudGF1M2JlcgorLnRhdWJlcjFpCisudGF1YmUxcjJpM2E0CisudGF1YmVyaTJhMm4KKy50ZThjOGg5bjhpOXM4YzhoOGUuCisudGUyY2gKKy50ZWMyaDFuCisudGVjaG4yaXMxYworLnRlMmNobmlzM2NoMgorLnRlY2huaXNjaGUyCisudGU4bjluOGU4czlzOGU4ZS4KKy50NGU0bjFuMgorLnRlbm5lNAorLnRlbjFuZXMKKy50ZW5uMmUyc3MKKy50bzltOGE5czh6OGU4dzlzOGs4aS4KKy50bzJtYQorLnRvbWFzMnplCisudG9tYXN6ZXdzazIKKy50b21hc3pld3NrMWkKKy50eTlwOG85ZzhyOGE4cDhoOGk4cTh1OGUuCisudHkzcG8KKy50eTVwbzRnCisudHlwbzFncgorLnR5cG9ncjRhcGhpCisudHlwb2dyYXBoaXF1MgorLnVrOHI4YThpOG45aThhOG4uCisuNHVrCisudWtyMmFpMgorLnVrcmE0aTRuCisudWtyYTJpbmkKKy51a3JhaTRuNGkxYQorLnVrcmFpbmkzYTJuCisudmU4cjlhOGw4bDlnOGU5bThlOGk4bjllOHI4dDhlLgorLnZlcmFsMWwKKy52ZXJhbDRsMWc0CisudmVyYWxsZ2UxbWUKKy52ZXJhbGxnZW1laTIKKy52ZXJhbGxnZW1lMmluZQorLnZlcmFsbGdlbWVpbjFlcgorLnZlOHI5ZThpOG45aTlnOHU4bjhnLgorLnZlcmUzaW4KKy52ZXJlaTIKKy52ZXJlMmluaQorLnZlcmVpbjJpZworLnZlcmVpbmkzZ3VuCisudmU4cjl0OGU4aTlsOHU4bjlnOGU4bi4KKy52ZXJ0ZWkyCisudmVydGVpbHVuMWdlbgorLnZpOGk4aTh0OGguCisudjRpNWk0Cisudmk0aTVpNAorLnZpaTJpdGgKKy52aThpOHQ4aC4KKy52aTJpdGgKKy53YThoOHI5czhjOGg4ZThpOG45bDhpOGM4aDlrOGU4aTh0OHM5dDhoOGU4bzlyOGk4ZS4KKy53YTRocjQKKy53YWg0cnMyCisud2FocnM0YworLndhaHJzMmNoMgorLndhaHJzY2hlMgorLndhaHJzY2hlaTIKKy53YWhyc2NoZTRpNG4xbAorLndhaHJzMmNoZWlubDRpMmNoCisud2FocnNjaGVpbmxpYzRoaworLndhaHJzY2hlaW5saWNoa2VpMgorLndhaHJzY2hlaW5saWNoa2VpNHQxczIKKy53YWhyc2NoZWlubGljaGtlaXRzM3RoMmUKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlMW81cgorLndhaHJzY2hlaW5saWNoa2VpdHN0aGVvcjJpZTQKKy53ZThyOW44ZThyLgorLncxZXIKKy53ZXI0bjFlcgorLndlOHI5dDhoOGU4cjlpOGE4bi4KKy53ZXJ0aDJlCisud2VydGhlcjFpCisud2VydGhlMXIyaTNhNAorLndlcnRoZXJpMmEybgorLndpOG45YzhoOGU4czl0OGU4ci4KKy53aW4yY2gKKy53aW5jaGUyCisud2luY2gxZXMKKy53aThyOHQ5czhjOGg4YThmOHQuCisudzRpcjQKKy53aXI0dDFzMgorLndpcnQ0c2MKKy53aXJ0czJjaDIKKy53aXJ0c2NoYTJmCisud2lydHNjaGEyZnQKKy53aThzOXM4ZThuOXM4YzhoOGE4Zjh0OWw4aThjOGguCisudzRpMnMxcworLndpc3NlbjQKKy53aXNzZTJuMXMyCisud2lzc2VuczRjCisud2lzc2VuczJjaDIKKy53aXNzZW5zY2hhMmYKKy53aXNzZW5zY2hhMmZ0Cisud2lzc2Vuc2NoYWYydGwKKy53aXNzZW5zMmNoYWZ0bDRpMmNoCisueHY4aThpOGk4dDhoLgorLnh2NGk1aTQKKy54dmk0aTVpNAorLnh2aWkyaXRoCisueHY4aThpOHQ4aC4KKy54dmkyaXRoCisueHg4aThpOGk4cjhkLgorLnh4NAorLnh4M2kKKy54eDRpNWk0CisueHhpNGk1aTQKKy54eGlpNGlyCisueHg4aThpOG44ZC4KKy54eGk0aW5kCisueWk4bjhnOXk4bzhuOGcuCisueTFpCisueWluMmd5CisueWluZ3kxbzQKKy55aW5neW8ybgorLnNoOHU5eDh1OGUuCisuc2h1eDF1MworLmppOXM4dThhOG4uCisuamkyc3UKKy5qaXN1YTJuCisuemU4YTlsOGE4bjhkLgorLjJ6ZQorLnplYTRsCisuemVhM2w0YW5kCisuemVhbGEybgorLnplOGk4dDlzOGM4aDhyOGk4Zjh0LgorLnplaTIKKy56ZWk0dDFzMgorLnplaXQ0c2MKKy56ZWl0czJjaDIKKy56ZWl0c2M0aHI0CisuemVpdHNjaHI0aTJmdApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E3NjM3NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZi5wbmcKaW5kZXggYWFkOWVmNy4uOTExZTFhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZS5wbmcKaW5kZXggZWFlZTllMC4uZDcyZTJiOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZwppbmRleCA2ZDJjMjkzLi5kNzJlMmI5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGEwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhM2M1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWQucG5nCmluZGV4IDFjNDQyZTkuLjA4ZjQxODEyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3NTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwppbmRleCBiODUyYjJjLi4yNjRmMTAyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTA2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uLnBuZwppbmRleCBjZDVjMTgxLi41NTQxYzY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGUucG5nCmluZGV4IGI0ZmM1MWEuLjc4MDU0NTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwppbmRleCBiZjM0NjQ3Li43ODA1NDU4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNjhkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjNGFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcKaW5kZXggZmE1YzdhMi4uMzdlMzk1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyOWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkLnBuZwppbmRleCBhNmEyMWFkLi5hMGJlYWM0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmNDVjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbGFiZWxfYmFja2dyb3VuZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM1YzZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZwppbmRleCBjMGIxNGFhLi4zMDFjOTdkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2M4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkLnBuZwppbmRleCAzMTg5NTgxLi41ZTZlZjJiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyYmYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZwppbmRleCBmMzM3NzAzLi5kMTFhZTg1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmQxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uLnBuZwppbmRleCBjOTBkMmViLi41YjBkYmU4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhZTM2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCmluZGV4IGQ3OTQ1MGI4Li5jM2EwZDQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIyMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nCmluZGV4IGRiNTBjNDMuLjZjMDVmNDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdmYTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlYjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MDMwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jdXJzb3JfY29udHJvbGxlci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jdXJzb3JfY29udHJvbGxlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwYWRlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExNWIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjMyODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ0M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX2VuZF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX2VuZF9oYW5kbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGFiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zZWxlY3Rpb25fZW5kX2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX3N0YXJ0X2hhbmRsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zZWxlY3Rpb25fc3RhcnRfaGFuZGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZmMjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX3N0YXJ0X2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCmluZGV4IGMwMWMwMTguLjgxMGM5NTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKaW5kZXggMTA1ZjdkMC4uZGE4YWZlZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDczZGI0OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGRhNmUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWFmMWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNjdiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZi5wbmcKaW5kZXggNTZkMzg2MS4uNWU0NGMyOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZS5wbmcKaW5kZXggZTAxMmFmZC4uYTYwM2ZiMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkLnBuZwppbmRleCAwODM3YmJkLi5hNjAzZmIxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTlmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWQucG5nCmluZGV4IDk4NGRmZDcuLjYxMWJiMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBlYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwppbmRleCAyMDg0MmQ0Li5hYTI4ZGYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTExMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uLnBuZwppbmRleCA3OTFhYzFkLi4xMzBkNTYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGUucG5nCmluZGV4IDZjYjAyZjMuLmYxOTk3MmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwppbmRleCA4YTczYjMzLi5mMTk5NzJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc4MDhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcKaW5kZXggMzAwZDY0YS4uZGY3NTNmNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZGQyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkLnBuZwppbmRleCAwYjM2YWRiLi43NTg2ODgxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MDFjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbGFiZWxfYmFja2dyb3VuZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmU4OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2xhYmVsX2JhY2tncm91bmRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmLnBuZwppbmRleCA0MDc2MzJiLi4xNmMxYzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mjg3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkLnBuZwppbmRleCBkNmQ4YTlkLi5iMjUyMTdiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzYjliMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZwppbmRleCA1M2YzZTg3Li5iZWY3NTcyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzU0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uLnBuZwppbmRleCAyNWEzY2NjLi40ZWQ3NDcxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCmluZGV4IGM5MDRhMzUuLjdjZjkxYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTM1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZC5wbmcKaW5kZXggNzhlMWZjMC4uNTZmNmY1YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGQ4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThhNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY3Vyc29yX2NvbnRyb2xsZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9yZXMvcmVzL2RyYXdhYmxlL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKcmVuYW1lIHRvIGNvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZTJiMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmNmNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA3NWViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2VsZWN0aW9uX2VuZF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2VsZWN0aW9uX3N0YXJ0X2hhbmRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwMjJmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBiOGUzOTlkLi5mMGU0ZDA2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMmYwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4OTg5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNlbnRlckNvbG9yPSIjZmZkMWQyZDQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjg1ODc4YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MzA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmUxZTJlNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmOTU5NzlhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYxMTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19saWdodC54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9wcmVzc2VkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfcHJlc3NlZF9saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fbGlnaHQiIC8+CisKKworICAgIDwhLS0gRGlzYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM5MzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19saWdodC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25fbGlnaHQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmZhMGUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiBidWJibGVfd2l0aF9jaGF0cy54bWwKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX3ByZXNzZWQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX25vcm1hbCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0LjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY1MGIzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX25vcm1hbC45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjYzlkYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyMmM4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWNlOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dCI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbApAQCAtMCwwICsxLDU2IEBACis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjdkcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRwIgorICAgICAgICA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjNkcCIKKyAgICAgICAgPgorICAgICAgICA8IS0tY29tLmFuZHJvaWQuc2VydmVyLnN0YXR1cy5BbmltYXRlZEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2ljb24iIC0tPgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNWRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNWRwIgorICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYXJyb3dfZG93bl9mbG9hdCIvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZHAiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZHAiCisgICAgICAgICAgICAvPgorICAgICAgICA8YW5kcm9pZC53aWRnZXQuRGF0ZVRpbWVWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA0NmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiIC8+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9zdWJ0aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsSW52ZXJzZSIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNjY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW1WaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiA+CisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvaW1hZ2VCdXR0b24iCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9hY3Rpb25CdXR0b25TdHlsZSIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEJ1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKzwvY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ1NTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3CisgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmMzI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21vZGVfYmFyLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCA3YWU2OGY5Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCmluZGV4IDZmOWYxZTAuLjE0MTQwMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKQEAgLTEsOCArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCkBAIC0xNyw4ICsxNSw0MiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIC8+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzQ29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorICAgICAgICAKKyAgICAgICAgPFByb2dyZXNzQmFyIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVMYXJnZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvYWRpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0Q29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgICAgICAgICAKKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaW50ZXJuYWxFbXB0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICAKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKaW5kZXggOGY4Njk4MS4uZDUzMGU5NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKQEAgLTQsMjIgKzQsNzAgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIC0tPgotPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCi0gICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIKLSAgICAvPgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIgLz4KKworICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcmVmcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9idXR0b25fYmFyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUmlnaHQ9IkBkcmF3YWJsZS9pY19idG5fbmV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ODhiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IGZvciBhIHByZWZlcmVuY2UgY2F0ZWdvcnkgaXRlbSwgY29udGFpbmluZyBhbiBpY29uIGFuZCBsYWJlbC4gLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvd2lkZ2V0X2ZyYW1lIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAppbmRleCBkZmE5NzMxLi43MmY3MzkyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCkBAIC0yNSw2ICsyNSwxMyBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiA+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKICAgICA8IS0tIFRpdGxlIGJhciAtLT4KICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGVfY29udGFpbmVyIgogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ODUyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGggdGhlIEFjdGlvbiBCYXIgZW5hYmxlZC4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8Vmlld0FuaW1hdG9yIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9hbmltYXRvciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbiIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXQiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbAppbmRleCAzNGM5ZGUwLi5jNjJhMDZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKQEAgLTIxLDYgKzIxLDEzIEBACiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU2l6ZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAppbmRleCA2ZTY5NGMxLi5jM2Y0MWZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCkBAIC0yNiw2ICsyNiwxMyBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiA+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGVfY29udGFpbmVyIiAKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKaW5kZXggZGY1MTFjNi4uODdjMjlmNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCkBAIC0yMSw5ICsyMSwxOSBAQAogZW5hYmxlZC4KIC0tPgogCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIgotICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEluc2lkZVBhZGRpbmc9ImZhbHNlIgotICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKaW5kZXggMzllYTEzMS4uZjUxMzRmOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbApAQCAtMjIsNiArMjIsMTIgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgogICAgIDxGcmFtZUxheW91dAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU2l6ZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAppbmRleCA2MmEwMjI4Li41MWQ2YTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCkBAIC0yMyw2ICsyMywxMiBAQAogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMwOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+CisgICAgPFdlYlZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC93ZWJ2aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgLz4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGxhc2hzY3JlZW4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFN0YXJ0IgorICAgIC8+CisKKzwvRnJhbWVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9yYXcvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sIGIvY29yZS9yZXMvcmVzL3Jhdy9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXcvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIvPgorICAgIDx0aXRsZT5OZXcgaW5jb2duaXRvIHdpbmRvdzwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+PHN0cm9uZz5Zb3UndmUgZ29uZSBpbmNvZ25pdG88L3N0cm9uZz4uIFBhZ2VzIHlvdSB2aWV3IGluIHRoaXMgd2luZG93CisgICAgICB3b24ndCBhcHBlYXIgaW4geW91ciBicm93c2VyIGhpc3Rvcnkgb3Igc2VhcmNoIGhpc3RvcnksIGFuZCB0aGV5IHdvbid0CisgICAgICBsZWF2ZSBvdGhlciB0cmFjZXMsIGxpa2UgY29va2llcywgb24geW91ciBjb21wdXRlciBhZnRlciB5b3UgY2xvc2UgdGhlCisgICAgICBpbmNvZ25pdG8gd2luZG93LiBBbnkgZmlsZXMgeW91IGRvd25sb2FkIG9yIGJvb2ttYXJrcyB5b3UgY3JlYXRlIHdpbGwgYmUKKyAgICAgIHByZXNlcnZlZCwgaG93ZXZlci48L3A+CisKKyAgICA8cD48c3Ryb25nPkdvaW5nIGluY29nbml0byBkb2Vzbid0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgcGVvcGxlLAorCXNlcnZlcnMsIG9yIHNvZnR3YXJlLiBCZSB3YXJ5IG9mOjwvc3Ryb25nPjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5XZWJzaXRlcyB0aGF0IGNvbGxlY3Qgb3Igc2hhcmUgaW5mb3JtYXRpb24gYWJvdXQgeW91PC9saT4KKyAgICAgIDxsaT5JbnRlcm5ldCBzZXJ2aWNlIHByb3ZpZGVycyBvciBlbXBsb3llcnMgdGhhdCB0cmFjayB0aGUgcGFnZXMgeW91IHZpc2l0PC9saT4KKyAgICAgIDxsaT5NYWxpY2lvdXMgc29mdHdhcmUgdGhhdCB0cmFja3MgeW91ciBrZXlzdHJva2VzIGluIGV4Y2hhbmdlIGZvciBmcmVlIHNtaWxleXM8L2xpPgorICAgICAgPGxpPlN1cnZlaWxsYW5jZSBieSBzZWNyZXQgYWdlbnRzPC9saT4KKyAgICAgIDxsaT5QZW9wbGUgc3RhbmRpbmcgYmVoaW5kIHlvdTwvbGk+CisgICAgPC91bD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggYzQ0MmZlZS4uZTc2ODMwOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iVnltYXrDoW7DrSB2xaFlY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJCZXogZGFsxaHDrWhvIHBvdHZyemVuw60gb2Jub3bDrSB2w71jaG96w60gbmFzdGF2ZW7DrSB6IHbDvXJvYnkgYSBzbWHFvmUgdsWhZWNobmEgZGF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb23FryI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJQcsOhY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSmluw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iVmxhc3Ruw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHBvbW9jw60gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJaYWRlanRlIGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJaYWRlanRlIGhlc2xvIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJaYWRlanRlIGvDs2QgUElOIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTmVzcHLDoXZuw70ga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iQ2hjZXRlLWxpIHRlbGVmb24gb2RlbWtub3V0LCBzdGlza27Em3RlIE1lbnUgYSBwb3TDqSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLEjMOtc2xvIHTDrXPFiG92w6kgbGlua3kiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWmF2b2xhdCB6cMSbdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlNwcsOhdm7EmyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTmFiw61qZW7DrSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTmFiaXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplIHphYmxva292w6FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvdsOhbsOtIGthcnR5IFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuYWtyZXNsaWxpIG5lc3Byw6F2bsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiAiXG5cbiJPcGFrdWp0ZSBwcm9zw61tIGFrY2kgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkgaGVzbG8uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkga8OzZCBQSU4uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5lc3Byw6F2bsSbIG5ha3Jlc2xpbGkgc3bDqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gUG8gZGFsxaHDrWNoIG5lw7pzcMSbxaFuw71jaCBwb2t1c2VjaCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4pIGJ1ZGV0ZSBwb8W+w6Fkw6FuaSBvIG9kZW3EjWVuw60gdGVsZWZvbnUgcG9tb2PDrSBwxZlpaGzDocWhZW7DrSBkbyDDusSNdHUgR29vZ2xlLiJcblxuIiBBa2NpIHByb3PDrW0gb3Bha3VqdGUgemEgbsSba29saWsgc2VrdW5kICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNla3VuZHkgemLDvXZhasOtY8OtIGRvIGRhbMWhw61obyBwb2t1c3U6IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlphcG9tbsSbbGkganN0ZSBnZXN0bz8iPC9zdHJpbmc+CkBAIC03MDMsMTcgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlZ5YnJhdCB2xaFlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJPem5hxI1pdCB0ZXh0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iWmFzdGF2aXQgb3puYcSNb3bDoW7DrSB0ZXh0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJWeWptb3V0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IlZ5am1vdXQgdsWhZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29ww61yb3ZhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iS29ww61yb3ZhdCB2xaFlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iVmxvxb5pdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29ww61yb3ZhdCBhZHJlc3UgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB6YWTDoXbDoW7DrSBkYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iUMWZaWRhdCBzbG92byDigJ48eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCcIGRvIHNsb3Zuw61rdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IsOacHJhdnkgdGV4dHUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+Ik3DoWxvIHBhbcSbdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJWIHRlbGVmb251IHpiw712w6EgbcOhbG8gbcOtc3RhIHBybyB1a2zDoWTDoW7DrSBkYXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MjEsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IlpydcWhaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iVXBvem9ybsSbbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJOYcSNw610w6Fuw60uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlpBUE5VVE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJWWVBOT1VUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJEb2tvbsSNaXQgYWtjaSBwb21vY8OtIGFwbGlrYWNlIjwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIHDFmWVkc2TDrWxlbsO9bSBrbMOtxI1lbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIGNlcnRpZmlrw6F0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJadm9saXQgc291Ym9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuw60gdnlicsOhbiDFvsOhZG7DvSBzb3Vib3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldG92YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iT2Rlc2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4ib2Jsw61iZW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkFrdGl2b3bDoW4gcmXFvmltIFYgYXV0xJsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVnliZXJ0ZSwgY2hjZXRlLWxpIHVrb27EjWl0IHJlxb5pbSBOYSBjZXN0xJsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkplIGFrdGl2bsOtIHRldGhlcmluZyBuZWJvIGhvdHNwb3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3R5a2VtIHphaMOhasOtdGUga29uZmlndXJhY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJacMSbdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IkRhbMWhw60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJWeXNva8OpIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJCeWwgcMWZZWtyb8SNZW4gbGltaXQgbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCAzZWE4MjY2Li4yYjY3YTJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlamRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlRpbHBhc3NldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJNYXJrZXIgdGVrc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJIb2xkIG9wIG1lZCBhdCBtYXJrZXJlIHRla3N0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iS2xpcCBhbGxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IktvcGllciBhbGxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5kc8OmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIHdlYmFkcmVzc2UiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5wdXRtZXRvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRsO4aiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB0aWwgb3JkYm9nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRGVyIGVyIGlra2Ugc8OlIG1lZ2V0IHBsYWRzIHRpbGJhZ2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXIgZXIgbsOmc3RlbiBpa2tlIG1lcmUgcGxhZHMgcMOlIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQmVtw6ZyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iSW5kbMOmc2VyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJUSUwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJGUkEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkZ1bGRmw7hyIGhhbmRsaW5nIHZlZCBoasOmbHAgYWYiPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIGJhc2VyZXQgcMOlIGZvcmjDpW5kc2RlbHQgbsO4Z2xla29kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpa2F0YmFzZXJldCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlbDpmxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ik51bHN0aWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbHRpbHN0YW5kIGVyIGFrdGl2ZXJldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6ZsZyBmb3IgYXQgYWZzbHV0dGUgYmlsdGlsc3RhbmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBlbGxlciBob3RzcG90IGVyIGFrdGl2dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWsgZm9yIGF0IGtvbmZpZ3VyZXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVGlsYmFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Ik7DpnN0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuGp0IG1vYmlsZGF0YWZvcmJydWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRyeWsgZm9yIG9wbHlzbmluZ2VyIG9tIGJydWcgYWYgbW9iaWxkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOmbnNlbiBmb3IgbW9iaWxkYXRhIGVyIG92ZXJza3JlZGV0Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggYmYzZWZkNi4uODczNzZmZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJTdGV1ZXJ1bmcgZGVyIEdlcsOkdGVzcGVycmU7IGVyZm9yZGVydCBkaWUgZXJuZXV0ZSBQYXNzd29ydGVpbmdhYmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQWxsZSBEYXRlbiBsw7ZzY2hlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iWnVyw7xja3NldHplbiBhdWYgZGllIFdlcmtzZWluc3RlbGx1bmdlbi4gRGFiZWkgd2VyZGVuIGFsbGUgSWhyZSBEYXRlbiBvaG5lIE5hY2hmcmFnZSBnZWzDtnNjaHQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUHJpdmF0IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkJlcnVmbGljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbmRlcmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iQmVudXR6ZXJkZWZpbmllcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iw7xiZXIgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDDvGJlciA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJQYXNzd29ydCB6dW0gRW50c3BlcnJlbiBlaW5nZWJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iUElOIHp1bSBFbnRzcGVycmVuIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRmFsc2NoZXIgUElOLUNvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkRyw7xja2VuIFNpZSB6dW0gRW50c3BlcnJlbiBkaWUgTWVuw7x0YXN0ZSB1bmQgZGFubiBhdWYgXCIwXCIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik5vdHJ1Zm51bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJadXLDvGNrIHp1bSBBbnJ1ZiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IktvcnJla3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJXaXJkIGdlbGFkZW4gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkF1ZmdlbGFkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkJpdHRlIFBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLUthcnRlIHdpcmQgZW50c3BlcnJ0Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJTaWUgaGFiZW4gSWhyIFBhc3N3b3J0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IE1hbCBmYWxzY2ggZWluZ2VnZWJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlNpZSBoYWJlbiBJaHJlIFBJTiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBNYWwgZmFsc2NoIGVpbmdlZ2ViZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiBOYWNoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHdlaXRlcmVuIGVyZm9sZ2xvc2VuIFZlcnN1Y2hlbiB3ZXJkZW4gU2llIGF1ZmdlZm9yZGVydCwgSWhyIFRlbGVmb24gbWl0aGlsZmUgSWhyZXIgR29vZ2xlLUFubWVsZGVpbmZvcm1hdGlvbmVuIHp1IGVudHNwZXJyZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJNdXN0ZXIgdmVyZ2Vzc2VuPyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iQWxsZXMgYXVzd8OkaGxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iVGV4dCBhdXN3w6RobGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iVGV4dGF1c3dhaGwgYmVlbmRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJBdXNzY2huZWlkZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iQWxsZXMgYXVzc2NobmVpZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iQWxsZXMga29waWVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJFaW5mw7xnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCBrb3BpZXJlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJFaW5nYWJlbWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB6dW0gV8O2cnRlcmJ1Y2ggaGluenVmw7xnZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZXh0IGJlYXJiZWl0ZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkdlcmluZ2VyIFNwZWljaGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iS2F1bSBub2NoIGZyZWllciBUZWxlZm9uc3BlaWNoZXIgdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQWJicmVjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkFjaHR1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IldpcmQgZ2VsYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRUlOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVVTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBa3Rpb24gZHVyY2hmw7xocmVuIG1pdCI8L3N0cmluZz4KQEAgLTg1NSwxMyArODYyLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYy1WUE4gbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJaZXJ0aWZpa2F0IG1pdCB2b3JpbnN0YWxsaWVydGVtIFNjaGzDvHNzZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEYXRlaSBhdXN3w6RobGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iS2VpbmUgRGF0ZWkgYXVzZ2V3w6RobHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJadXLDvGNrc2V0emVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iRmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBha3RpdmllcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iWnVtIEJlZW5kZW4gZGVzIEF1dG9tb2R1cyBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvZGVyIEhvdHNwb3QgYWt0aXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJadW0gS29uZmlndXJpZXJlbiBiZXLDvGhyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJadXLDvGNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iV2VpdGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSG9oZSBNb2JpbGRhdGVubnV0enVuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iV2VpdGVyZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGRpZSBNb2JpbGRhdGVubnV0enVuZyBkdXJjaCBCZXLDvGhyZW4gYXVmcnVmZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsZGF0ZW5saW1pdCDDvGJlcnNjaHJpdHRlbiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmluZGV4IDJjNjFlMWYuLmMwOGUxZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4izpXOu86tzrPPh861zrkgz4DPjM+EzrUgzrrOu861zrnOtM+Ozr3Otc65IM63IM+Dz4XPg866zrXPhc6uLCDOsc+AzrHOuc+Ez47Ovc+EzrHPgiDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIM6zzrnOsSDOtc+AzrHOvc61zq/Pg86/zrTOvy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4izpTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLOoM+BzrHOs868zrHPhM6/z4DOv865zrXOr8+EzrHOuSDOtc+AzrHOvc6xz4bOv8+BzqwgzrXPgc6zzr/Pg8+EzrHPg865zrHOus+Ozr0gz4HPhc64zrzOr8+DzrXPic69LCDOvM61IM+EzrcgzrTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM+DzrHPgiDPh8+Jz4HOr8+CIM61z4DOuc6yzrXOss6xzq/Pic+DzrcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4izp/Ouc66zq/OsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Is6azrnOvc63z4TPjCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4izpXPgc6zzrHPg86vzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4izobOu867zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4izqDPgc6/z4POsc+BzrzOv8+DzrzOrc69zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4izrzOrc+Dz4kgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDOvM6tz4PPiSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+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+CIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Is6Vz4DOuc+Dz4TPgc6/z4bOriDPg8+EzrfOvSDOus67zq7Pg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4izqPPic+Dz4TPjCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOsc+BzrPPjM+EzrXPgc6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6xz4HOs8+Mz4TOtc+BzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLOps+Mz4HPhM65z4POtyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4izqbOv8+Bz4TOr8+Dz4TOt866zrUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Is6XIM66zqzPgc+EzrEgU0lNIM61zq/Ovc6xzrkgzrrOu861zrnOtM+JzrzOrc69zrcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4izp7Otc66zrvOtc6vzrTPic68zrEgzrrOrM+Bz4TOsc+CIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Is6jz4fOtc60zrnOrM+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/Pgjx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+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+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLOo8+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/OyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4izpXPgM65zrvOv86zzq4gz4zOu8+Jzr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+Is6Vz4DOuc67zr/Os86uIM66zrXOuc68zq3Ovc6/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiLOlM65zrHOus6/z4DOriDOtc+AzrnOu86/zrPOrs+CIM66zrXOuc68zq3Ovc6/z4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4izpHPgM6/zrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4izpHPgM6/zrrOv8+Azq4gz4zOu8+Jzr0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+Is6Rzr3PhM65zrPPgc6xz4bOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4izpHOvc+EzrnOs8+BzrHPhs6uIM+MzrvPic69Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4izpXPgM65zrrPjM67zrvOt8+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+Is6Rzr3PhM65zrPPgc6xz4bOriDOtM65zrXPjc64z4XOvc+DzrfPgiBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4izpzOrc64zr/OtM6/z4IgzrXOuc+Dz4zOtM6/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4izqDPgc6/z4POuM6uzrrOtyDPhM63z4IgzrvOrc6+zrfPgiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDPg8+Ezr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4izpXPgM61zr7Otc+BzrPOsc+Dzq/OsSDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLOkc+Azr/OvM6tzr3Otc65IM67zq/Os86/z4IgzrXOu861z43OuM61z4HOv8+CIM+Hz47Pgc6/z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLOiM+HzrXOuSDOsc+Azr/OvM61zq/Ovc61zrkgzrvOr86zzr/PgiDOtc67zrXPjc64zrXPgc6/z4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+Mz4Igz4fPjs+Bzr/PgiDPg8+Ezr8gz4TOt867zq3Phs+Jzr3Ovy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4izpHOus+Nz4HPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4izqDPgc6/z4POv8+Hzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLOlc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4izp/Ou86/zrrOu86uz4HPic+DzrcgzrXOvc6tz4HOs861zrnOsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863Ijwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLOms67zrXOuc60zq8gcHJlLXNoYXJlZCDOss6sz4POtc65IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+Is6gzrnPg8+Ezr/PgM6/zrnOt8+EzrnOus+MIM6yzqzPg861zrkgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vzr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Is6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Is6Vz4DOsc69zrHPhs6/z4HOrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLOpc+Azr/Oss6/zrvOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4izrHOs86xz4DOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4izpcgzrvOtc65z4TOv8+Fz4HOs86vzrEgzrHPhc+Ezr/Ous65zr3Ors+Ezr/PhSDOtc6vzr3Osc65IM61zr3Otc+BzrPOv8+Azr/Ouc63zrzOrc69zrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4izpXPgM65zrvOrc6+z4TOtSDOs865zrEgzq3Ovs6/zrTOvyDOsc+Az4wgz4TOtyDOu861zrnPhM6/z4XPgc6zzq/OsSDOsc+Fz4TOv866zrnOvc6uz4TOv8+FLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLOo8+Nzr3OtM61z4POtyDOvM6tz4PPiSDOus65zr3Ot8+Ezq7PgiDPg8+Fz4POus61z4XOrs+CIM6uIM+DzrfOvM61zq/Ov8+FIM+Az4HPjM+DzrLOsc+DzrfPgiDOtc69zrXPgc6zzq4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLOkc6zzrPOr86+z4TOtSDOs865zrEgzr3OsSDOs86vzr3Otc65IM60zrnOsc68z4zPgc+Gz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4izqDOr8+Dz4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLOlc+Az4zOvM61zr3OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Is6lz4jOt867zq4gz4fPgc6uz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM68zqzOuM61z4TOtSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Dz4fOtc+EzrnOus6sIM68zrUgz4TOtyDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4izp7Otc+AzrXPgc6sz4PPhM63zrrOtSDPhM6/IM+Mz4HOuc6/IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggYWZjMjg2Mi4uMjZkMzI5ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhciBjdWFuZG8gc2UgYmxvcXVlZSBlbCBkaXNwb3NpdGl2bywgcmVxdWllcmUgcXVlIHZ1ZWx2YXMgYSBpbmdyZXNhciB0dSBjb250cmFzZcOxYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQm9ycmFyIHRvZG9zIGxvcyBkYXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUmVhbGl6YXIgdW4gcmVlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgeSBib3JyYXIgdG9kb3MgdHVzIGRhdG9zIHNpbiBuaW5ndW5hIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlRyYWJham8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3RybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+ImEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkluZ3Jlc2FyIGVsIGPDs2RpZ28gZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmdyZXNhciBsYSBjb250cmFzZcOxYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbmdyZXNhIGVsIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iwqFDw7NkaWdvIGRlIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzaW9uYSBlbCBtZW7DuiB5IGx1ZWdvIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNhciBhIGxsYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMbyBzZW50aW1vcywgdnVlbHZlIGEgaW50ZW50YXJsbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyZ2FkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iU2VnbWVudG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgdGFyamV0YSBTSU0gZXN0w6EgYmxvcXVlYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gdGFyamV0YSBTSU3igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGluZ3Jlc2FkbyB0dSBjb250cmFzZcOxYSBkZSBtYW5lcmEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGluZ3Jlc2FkbyB0dSBQSU4gZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuIEx1ZWdvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGluY29ycmVjdG9zLCBzZSB0ZSBzb2xpY2l0YXLDoSBxdWUgZGVzYmxvcXVlZXMgdHUgdGVsw6lmb25vIGFsIGluaWNpYXIgc2VzacOzbiBlbiBHb29nbGUuICJcblxuIiBWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/T2x2aWRhc3RlIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iU2VsZWNjaW9uYXIgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJEZXRlbmVyIGxhIHNlbGVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IkNvcnRhciBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IkNvcGlhciB0b2RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFncmVnYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkhheSBwb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MjEsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRW5jZW5kaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVBBR0FETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGxhIGFjY2nDs24gbWVkaWFudGUiPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkNsYXZlIHByZXZpYW1lbnRlIGNvbXBhcnRpZGEgc2Vnw7puIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmljYWRvIHNlZ8O6biBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVsZWdpciBhcmNoaXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTm8gc2Ugc2VsZWNjaW9uw7MgdW4gYXJjaGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXN0YWJsZWNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvIGhhYmlsaXRhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYXIgcGFyYSBzYWxpciBkZWwgbW9kbyBhdXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgbyB6b25hIGFjdGl2YSBjb25lY3RhZG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYXIgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQXRyw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2lndWllbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iQW1wbGlhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9jYSBwYXJhIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGUgZGF0b3MgbcOzdmlsZXMgZXhjZWRpZG8gIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggMDQ1YjZhMS4uODU2ODIxMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJQZXJtaXRlIGNvbnRyb2xhciBlbCBtb21lbnRvIGRlIGJsb3F1ZW8gZGVsIGRpc3Bvc2l0aXZvIHNvbGljaXRhbmRvIGFsIHVzdWFyaW8gcXVlIHZ1ZWx2YSBhIGludHJvZHVjaXIgbGEgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlBlcm1pdGUgcmVhbGl6YXIgdW4gcmVzdGFibGVjaW1pZW50byBkZSBmw6FicmljYSBlbGltaW5hbmRvIHRvZG9zIGxvcyBkYXRvcyBzaW4gY29uZmlybWFjacOzbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHVjaXIgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdWNpciBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkVsIGPDs2RpZ28gUElOIGVzIGluY29ycmVjdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIgZWwgdGVsw6lmb25vLCBwdWxzYSBsYSB0ZWNsYSBkZSBtZW7DuiB5LCBhIGNvbnRpbnVhY2nDs24sIHB1bHNhIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJWb2x2ZXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcmdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJnYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyB0YXJqZXRhIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlIHVuIHBhdHLDs24gZGUgZGVzYmxvcXVlby4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGludHJvZHVjaWRvIHVuYSBjb250cmFzZcOxYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGludHJvZHVjaWRvIHVuIFBJTiBpbmNvcnJlY3RvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlbCBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uIFNpIHJlYWxpemFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIG3DoXMsIHNlIHRlIHBlZGlyw6EgcXVlIGRlc2Jsb3F1ZWVzIGVsIHRlbMOpZm9ubyBjb24gdHVzIGNyZWRlbmNpYWxlcyBkZSBhY2Nlc28gZGUgR29vZ2xlLiJcblxuIiBFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MgZSBpbnTDqW50YWxvIGRlIG51ZXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIHkgdnVlbHZlIGEgaW50ZW50YXJsby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/SGFzIG9sdmlkYWRvIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJTZWxlY2Npb25hciB0ZXh0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IkRldGVuZXIgc2VsZWNjacOzbiBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iQ29ydGFyIHRvZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iQ29waWFyIHRvZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQZWdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGludHJvZHVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQcOxYWRpciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iUG9jbyBlc3BhY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iU2UgZXN0w6EgYWdvdGFuZG8gZWwgZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBkZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MjEsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kb+KApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJEZXNjb25lY3RhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhciBhY2Npw7NuIHV0aWxpemFuZG8iPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlJlZCBwcml2YWRhIHZpcnR1YWwgTDJUUC9JUFNlYyBiYXNhZGEgZW4gY2xhdmUgY29tcGFydGlkYSBwcmV2aWFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU2VsZWNjaW9uYXIgYXJjaGl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkFyY2hpdm8gbm8gc2VsZWNjaW9uYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzdGFibGVjZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJTZSBoYSBoYWJpbGl0YWRvIGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmEgZXN0YSBvcGNpw7NuIHBhcmEgc2FsaXIgZGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgYWN0aXZvIG8gem9uYSBXaS1GaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2EgcGFyYSBpbmljaWFyIGxhIGNvbmZpZ3VyYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkF0csOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNpZ3VpZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlVzbyBlbGV2YWRvIGRhdG9zIG3Ds3ZpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJNw6FzIGluZm9ybWFjacOzbiBzb2JyZSB1c28gZGUgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGF0b3Mgc3VwZXJhZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCAzYWI3ODE0Li4wNGI2YWRkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkVmZmFjZXIgdG91dGVzIGxlcyBkb25uw6llcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUsOpdGFibGl0IGxlcyBwYXJhbcOodHJlcyBkXCd1c2luZSwgc3VwcHJpbWFudCB0b3V0ZXMgdm9zIGRvbm7DqWVzIHNhbnMgZGVtYW5kZSBkZSBjb25maXJtYXRpb24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9taWNpbGUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJQb3J0YWJsZSI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQnVyZWF1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkF1dHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbm5hbGlzw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iU2Fpc2lzc2V6IGxlIGNvZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTYWlzaXNzZXogbGUgbW90IGRlIHBhc3NlIHBvdXIgcHJvY8OpZGVyIGF1IGTDqXZlcnJvdWlsbGFnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlNhaXNpc3NleiBsZSBjb2RlIFBJTiBwb3VyIHByb2PDqWRlciBhdSBkw6l2ZXJyb3VpbGxhZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTGUgY29kZSBQSU4gZXN0IGluY29ycmVjdMKgISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQb3VyIGTDqWJsb3F1ZXIgbGUgY2xhdmllciwgYXBwdXlleiBzdXIgXCJNZW51XCIgcHVpcyBzdXIgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtw6lybyBkXCd1cmdlbmNlIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG91ciDDoCBsXCdhcHBlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvbWJpbmFpc29uIGNvcnJlY3RlwqAhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDaGFyZ2VtZW50ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNoYXJnw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJMYSBjYXJ0ZSBTSU0gZXN0IHZlcnJvdWlsbMOpZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEw6libG9jYWdlIGRlIGxhIGNhcnRlIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlZvdXMgYXZleiBtYWwgcmVwcm9kdWl0IGxlIHNjaMOpbWEgZGUgZMOpdmVycm91aWxsYWdlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGZvaXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWb3VzIGF2ZXogc2Fpc2kgdW4gbW90IGRlIHBhc3NlIGluY29ycmVjdCDDoCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPsKgcmVwcmlzZXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlZvdXMgYXZleiBzYWlzaSB1biBjb2RlIFBJTiBpbmNvcnJlY3Qgw6AgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7CoHJlcHJpc2VzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVm91cyBhdmV6IG1hbCBzYWlzaSBsZSBzY2jDqW1hIGRlIGTDqXZlcnJvdWlsbGFnZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBmb2lzLiBBdSBib3V0IGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2ZXMgc3VwcGzDqW1lbnRhaXJlcywgdm91cyBkZXZyZXogZMOpYmxvcXVlciB2b3RyZSB0w6lsw6lwaG9uZSDDoCBsXCdhaWRlIGRlIHZvdHJlIGlkZW50aWZpYW50IEdvb2dsZS4iXG5cbiJNZXJjaSBkZSByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlLDqWVzc2F5ZXogZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iU2Now6ltYSBvdWJsacOpID8iPC9zdHJpbmc+CkBAIC03MDMsMTcgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlRvdXQgc8OpbGVjdGlvbm5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iU8OpbGVjdGlvbm5lciBsZSB0ZXh0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IkFycsOqdGVyIHPDqWxlY3Rpb24gZGUgdGV4dGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ291cGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IlRvdXQgY291cGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IlRvdXQgY29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkVzcGFjZSBkaXNwb25pYmxlIGZhaWJsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGNvbW1lbmNlIMOgIMOqdHJlIHBsZWluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNoYXJnZW1lbnQgZW4gY291cnMuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb250aW51ZXIgYXZlYyI8L3N0cmluZz4KQEAgLTg1NSwxMyArODYyLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzw6kgc3VyIHVuZSBjbMOpIHByw6ktcGFydGFnw6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1biBjZXJ0aWZpY2F0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU8OpbGVjdGlvbm5lciB1biBmaWNoaWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iQXVjdW4gZmljaGllciBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUsOpaW5pdGlhbGlzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52b3llciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kZSBWb2l0dXJlIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU8OpbGVjdGlvbm5leiBjZXR0ZSBvcHRpb24gcG91ciBxdWl0dGVyIGxlIG1vZGUgVm9pdHVyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iUGFydGFnZSBkZSBjb25uZXhpb24gb3UgcG9pbnQgZFwnYWNjw6hzIHNhbnMgZmlsIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3VjaGVyIHBvdXIgY29uZmlndXJlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlJldG91ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlN1aXZhbnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXNhdGlvbiDDqWxldsOpZSBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG91Y2hleiBwb3VyIGVuIHNhdm9pciBwbHVzIHN1ciBsXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUXVvdGEgZFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMgZMOpcGFzc8OpIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKaW5kZXggNmU1MGQyMS4uNzg3MGNjZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sbGEgcXVhbmRvIGlsIGRpc3Bvc2l0aXZvIHNpIGJsb2NjYSwgY2hpZWRlbmRvdGkgZGkgcmVpbnNlcmlyZSBsYSBwYXNzd29yZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQ2FuY2VsbGEgdHV0dGkgaSBkYXRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFc2VndWkgdW4gcmlwcmlzdGlubyBkaSBmYWJicmljYSwgZWxpbWluYW5kbyB0dXR0aSBpIHR1b2kgZGF0aSBzZW56YSBjb25mZXJtYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsbHVsYXJlIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJVZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFsdHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXp6YXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InRyYW1pdGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0cmFtaXRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5zZXJpc2NpIGlsIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5zZXJpc2NpIHBhc3N3b3JkIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ikluc2VyaXNjaSBQSU4gcGVyIHNibG9jY2FyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkNvZGljZSBQSU4gZXJyYXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQZXIgc2Jsb2NjYXJlLCBwcmVtaSBNZW51LCBwb2kgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXJvIGRpIGVtZXJnZW56YSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUb3JuYSBhIGNoaWFtYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0dGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlJpcHJvdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlJpcHJvdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJJbiBjYXJpY2EgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmljby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgU0lNIMOoIGJsb2NjYXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNibG9jY28gU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uICJcblxuIlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWxsYSBwYXNzd29yZC4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWwgUElOLiAiXG5cbiJSaXByb3ZhIHRyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uIERvcG8gYWx0cmkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGZhbGxpdGksIHRpIHZlcnLDoCBjaGllc3RvIGRpIHNibG9jY2FyZSBpbCB0ZWxlZm9ubyB0cmFtaXRlIGkgZGF0aSBkaSBhY2Nlc3NvIGRpIEdvb2dsZS4iXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhaSBkaW1lbnRpY2F0byBsYSBzZXF1ZW56YT8iPC9zdHJpbmc+CkBAIC03MDMsMTcgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGV6aW9uYSB0dXR0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iU2VsZXppb25hIHRlc3RvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iVGVybWluYSBzZWxlemlvbmUgdGVzdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iVGFnbGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IlRhZ2xpYSB0dXR0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IkNvcGlhIHR1dHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5jb2xsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWEgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kbyBpbnNlcmltZW50byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ2dpdW5naSBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaXppb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpY2EgdGVzdG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlNwYXppbyBpbiBlc2F1cmltZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNwYXppbyBkaSBhcmNoaXZpYXppb25lIGRlbCB0ZWxlZm9ubyBpbiBlc2F1cmltZW50by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnppb25lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJpY2FtZW50byBpbiBjb3Jzby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhIGxcJ2F6aW9uZSBjb24iPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjaGlhdmUgcHJlY29uZGl2aXNhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjZXJ0aWZpY2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNjZWdsaSBmaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVzc3VuIGZpbGUgw6ggc3RhdG8gc2NlbHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVpbXBvc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkludmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJwcmVmZXJpdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RhbGl0w6AgYXV0b21vYmlsZSBhdHRpdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlemlvbmEgcGVyIHVzY2lyZSBkYWxsYSBtb2RhbGl0w6AgYXV0b21vYmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9wcHVyZSBob3RzcG90IGF0dGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2NhIHBlciBjb25maWd1cmFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkluZGlldHJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbnRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVXRpbGl6em8gZGF0aSBjZWxsLiBlbGV2YXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb2NjYSBwZXIgaW5mb3JtYXppb25pIHN1bGxcJ3V0aWxpenpvIGRhdGkgY2VsbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkxpbWl0ZSBkYXRpIGNlbGwuIHN1cGVyYXRvIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggZjFlOThkYS4uYTBiN2UwZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLmkLrluK/pm7voqbHjga7jg63jg4Pjgq/mmYLjgpLnrqHnkIbjgZfjgb7jgZnjgILjg5Hjgrnjg6/jg7zjg4njga7lho3lhaXlipvjgYzlv4XopoHjgajjgarjgorjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i44GZ44G544Gm44Gu44OH44O844K/44KS5raI5Y67Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLlh7rojbfmmYLoqK3lrprjgavjg6rjgrvjg4Pjg4jjgZfjgb7jgZnjgILnorroqo3jgarjgZfjgafjg4fjg7zjgr/jgYzjgZnjgbnjgabliYrpmaTjgZXjgozjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLoh6rlroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmkLrluK8iPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuWLpOWLmeWFiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLjgZ3jga7ku5YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i44Kr44K544K/44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+57WM55SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7jgIHmm7TmlrDlhYM6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElO44Kz44O844OJ44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLjg63jg4Pjgq/jgpLop6PpmaTjgZnjgovjgavjga/jg5Hjgrnjg6/jg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr1BJTuOCkuWFpeWKmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTuOCs+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJNRU5V44CBMOOCreODvOOBp+ODreODg+OCr+ino+mZpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpgJrloLHnlarlj7ciPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6YCa6Kmx44Gr5oi744KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5LiA6Ie044GX44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuOChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5YWF6Zu75Lit77yIPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPu+8iSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozkuobjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lN44Kr44O844OJ44Gv44Ot44OD44Kv44GV44KM44Gm44GE44G+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+Y44KM44Gf5aC05ZCIIjwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLjgZnjgbnjgabpgbjmip4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IuODhuOCreOCueODiOOCkumBuOaKniI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IuODhuOCreOCueODiOOBrumBuOaKnuOCkue1guS6hiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliIfjgorlj5bjgooiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4i44GZ44G544Gm5YiH44KK5Y+W44KKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLjgrPjg5Tjg7wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IuOBmeOBueOBpuOCs+ODlOODvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOOCiuS7mOOBkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJM44KS44Kz44OU44O8Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuWFpeWKm+aWueazlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLovp7mm7jjgavjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN44KS6L+95YqgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i44OG44Kt44K544OI44KS57eo6ZuGIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLnqbrjgY3lrrnph4/kvY7kuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmkLrluK/pm7voqbHjga7nqbrjgY3lrrnph4/jgYzlsJHjgarjgY/jgarjgaPjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i6Kqt44G/6L6844G/5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44KS6YG45oqeIjwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruS6i+WJjeWFseaciemNtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruiovOaYjuabuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IuODleOCoeOCpOODq+OCkumBuOaKniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuODleOCoeOCpOODq+OBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IuODquOCu+ODg+ODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLpgIHkv6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuOBiuawl+OBq+WFpeOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IumBi+i7ouODouODvOODieOCkuacieWKueOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgYvou6Ljg6Ljg7zjg4njgpLntYLkuobjgZnjgovjgavjga/pgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i44OG44K244Oq44Oz44Kw44G+44Gf44Gv44Ki44Kv44K744K544Od44Kk44Oz44OI44GM5pyJ5Yq544Gn44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i44K/44OD44OX44GX44Gm6Kit5a6a44GZ44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5oi744KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5qyh44G4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i44Oi44OQ44Kk44Or44OH44O844K/44Gu5L2/55So6YeP44GM5aKX44GI44Gm44GE44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruWItumZkOOCkui2heOBiOOBvuOBl+OBnyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmluZGV4IDcxMjEwMGUuLmJmZmIwMzQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i6riw6riw6rCAIOyeoOqyqCDsnojsnYQg65WMIOyekeuPme2VmOugpOuptCDruYTrsIDrsojtmLjrpbwg64uk7IucIOyeheugpe2VtOyVvCDtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IuuqqOuToCDrjbDsnbTthLAg7IKt7KCcIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLstIjquLDtmZTrpbwg7IiY7ZaJ7ZWY7JesIOuqqOuToCDrjbDsnbTthLDrpbwg7ZmV7J247ZWY7KeAIOyViuqzoCDsgq3soJztlanri4jri6QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i7KeRIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i66qo67CU7J28IjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLsp4HsnqUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i6riw7YOAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+Iuunnuy2pOyEpOyglSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPuydhCjrpbwpIO2Gte2VtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+KDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+IOyCrOyaqSkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4g7L2U65OcIOyeheugpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i7J6g6riI7J2EIO2VtOygnO2VmOugpOuptCDruYTrsIDrsojtmLgg7J6F66ClIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLsnqDquIjsnYQg7ZW07KCc7ZWY66Ck66m0IFBJTiDsnoXroKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g7L2U65Oc6rCAIOyemOuqu+uQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i7J6g6riI7ZW07KCc7ZWY66Ck66m0IOuplOuJtOulvCDriITrpbgg64uk7J2MIDDsnYQg64iE66aF64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLruYTsg4Eg7KCE7ZmU67KI7Zi4Ijwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iu2Gte2ZlOuhnCDrj4zslYTqsIDquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLrp57sirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i7Lap7KCEIOykkSg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLstqnsoITrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g7Lm065Oc6rCAIOyeoOqyqCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNIOy5tOuTnCDsnqDquIjtlbTsoJwg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLruYTrsIDrsojtmLjrpbwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU7snYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPu2ajCDrjZQg7Iuk7Yyo7ZWY66m0IEdvb2dsZSDroZzqt7jsnbjsnYQg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsnqDquIjtlbTsoJztlZjrj4TroZ0g7JqU7LKt65Cp64uI64ukLiAiXG5cbiIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Iu2MqO2EtOydhCDsnorsnLzshajrgpjsmpQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLrqqjrkZAg7ISg7YOdIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLthY3siqTtirgg7ISg7YOdIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4i7YWN7Iqk7Yq4IOyEoO2DnSDspJHsp4AiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i7J6Y652864K06riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IuuqqOuRkCDsnpjrnbzrgrTquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuuzteyCrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4i66qo65GQIOuzteyCrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+Iuu2meyXrOuEo+q4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIOuzteyCrCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLsnoXroKUg67Cp67KVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuyCrOyghOyXkCBcJzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cJyDstpTqsIAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLthY3siqTtirgg7IiY7KCVIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLsoIDsnqXqs7XqsIQg67aA7KGxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i7Zy064yA7KCE7ZmUIOyggOyepeqzteqwhOydtCDrtoDsobHtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i7ZmV7J24Ijwvc3RyaW5nPgpAQCAtNzIxLDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i7ZmV7J24Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i7Leo7IaMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuyjvOydmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i66Gc65OcIOykkS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i7IKs7JqpIOyViO2VqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i7J6R7JeF7J2EIOyImO2Wie2VoCDrlYwg7IKs7Jqp7ZWY64qUIOyVoO2UjOumrOy8gOydtOyFmCI8L3N0cmluZz4KQEAgLTg1NSwxMyArODYyLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i7IKs7KCEIOqzteycoCDtgqQg6riw67CYIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuyduOymneyEnCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLtjIzsnbwg7ISg7YOdIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i7YyM7J287J2EIOyEoO2Dne2VmOyngCDslYrslZjsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i7J6s7ISk7KCVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuygnOy2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i7KaQ6rKo7LC+6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i7Jq07KCE66qo65OcIOyCrOyaqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLsmrTsoITrqqjrk5zrpbwg7KKF66OM7ZWY66Ck66m0IOyEoO2Dne2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i7YWM642U66eBIOuYkOuKlCDtlavsiqTtjJ8g7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6rWs7ISx7ZWY66Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLrkqTroZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLri6TsnYwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLrhpLsnYAg66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnrn4kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IuuqqOuwlOydvCDrjbDsnbTthLAg7IKs7Jqp7JeQIOuMgO2VtCDsnpDshLjtnogg7JWM7JWE67O066Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuuqqOuwlOydvCDrjbDsnbTthLAg7KCc7ZWc7J2EIOy0iOqzvO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCBmMDkwMzlkLi4wNTJlYjA4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2xsZXJlciBuw6VyIGVuaGV0ZW4gbMOlc2VzLiBEdSBtw6Ugc2tyaXZlIGlubiBwYXNzb3JkZXQgcMOlIG55dHQgZm9yIMOlIGzDpXNlIGRlbiBvcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXR0IGFsbGUgZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVXRmw7hyZXIgdGlsYmFrZXN0aWxsaW5nIHRpbCBmYWJyaWtrc3RhbmRhcmQuIEFsbGUgZGF0YSBzbGV0dGVzIHV0ZW4gdmFyc2VsLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkhqZW1tZW51bW1lciI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlaWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iRWdlbmRlZmluZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlNrcml2IGlubiBQSU4ta29kZToiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlNrcml2IGlubiBwYXNzb3JkIGZvciDDpSBsw6VzZSBvcHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlNrcml2IGlubiBwZXJzb25saWcga29kZSBmb3Igw6UgbMOlc2Ugb3BwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iR2FsIFBJTi1rb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJGb3Igw6UgbMOlc2Ugb3BwLCB0cnlrayBww6UgbWVueWtuYXBwZW4gb2cgZGVyZXR0ZXIgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO4ZG51bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUaWxiYWtlIHRpbCBzYW10YWxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iUmlrdGlnISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJCZWtsYWdlciwgcHLDuHYgaWdqZW46Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcsO4diBpZ2plbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGVyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJGdWxsdCBsYWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IGVyIGzDpXN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkzDpXNlciBvcHAgU0lNLWtvcnTigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRpbWVzLiAiXG5cbiJQbGVhc2UgdHJ5IGFnYWluIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iRHUgaGFyIG9wcGdpdHQgZmVpbCBwYXNzb3JkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlci4gIlxuXG4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBvcHBnaXR0IGZlaWwgcGVyc29ubGlnIGtvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2VyLiAiXG5cbiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IllvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGltZXMuIEFmdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IG1vcmUgdW5zdWNjZXNzZnVsIGF0dGVtcHRzLCB5b3Ugd2lsbCBiZSBhc2tlZCB0byB1bmxvY2sgeW91ciBwaG9uZSB1c2luZyB5b3VyIEdvb2dsZSBzaWduLWluLiJcblxuIiBQbGVhc2UgdHJ5IGFnYWluIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkdsZW10IG3DuG5zdGVyZXQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJNZXJrIGFsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iTWVyayB0ZWtzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IlNsdXR0IMOlIG1lcmtlIHRla3N0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IktsaXBwIHV0IGFsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29weUFsbCIgbXNnaWQ9IjI1OTA4MjkwNjgxMDAxMTMwNTciPiJLb3BpZXIgYWx0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iTGltIGlubiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbm5kYXRhbWV0b2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkxlZ2cgwqs8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+wrsgdGlsIG9yZGxpc3RlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkxpdGUgcGxhc3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXQgYmVneW5uZXIgw6UgYmxpIGxpdGUgbGFncmluZ3NwbGFzcyBww6UgdGVsZWZvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzIxLDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBdmJyeXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTWVyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTGFzdGVyIGlubiAuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkF2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJGdWxsZsO4ciBtZWQiPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlBhc3NvcmRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iU2VydGlmaWthdGJhc2VydCBMMlRQL0lQU2VjLVZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlZlbGcgZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGVyIHZhbGd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iVGlsYmFrZXN0aWxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmQgaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbG1vZHVzIGVyIGFrdGl2ZXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlZlbGcgZm9yIMOlIGF2c2x1dHRlIGJpbG1vZHVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRpbGtueXRuaW5nIGVsbGVyIHRyw6VkbMO4cyBzb25lIGVyIGFrdGl2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5a2sgZm9yIMOlIGtvbmZpZ3VyZXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVGlsYmFrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Ik5lc3RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSMO4eSBtb2JpbGRhdGFicnVrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJCZXLDuHIgZm9yIMOlIGxlc2UgbWVyIG9tIGJydWsgYXYgbW9iaWxkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcmVuc2VuIGZvciBtb2JpbGRhdGFicnVrIGVyIG92ZXJza3JlZGV0Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggMTdhMmZlNC4uMTBlYmM0ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJCZWhlcmVuIHdhbm5lZXIgaGV0IGFwcGFyYWF0IHdvcmR0IHZlcmdyZW5kZWxkLCB3YXQgdmVyZWlzdCBkYXQgdSBoZXQgd2FjaHR3b29yZCBvcG5pZXV3IGludm9lcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFsbGUgZ2VnZXZlbnMgd2lzc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJEZSBmYWJyaWVrc2luc3RlbGxpbmdlbiBoZXJzdGVsbGVuLCB3YWFyYmlqIGFsbGUgZ2VnZXZlbnMgd29yZGVuIHZlcndpamRlcmQgem9uZGVyIGJldmVzdGlnaW5nLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlRodWlzIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWVsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJXZXJrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik92ZXJpZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJBYW5nZXBhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLWNvZGUgaW52b2VyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlZvZXIgaGV0IHdhY2h0d29vcmQgaW4gb20gdGUgb250Z3JlbmRlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJWb2VyIGRlIFBJTi1jb2RlIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Ik9uanVpc3RlIFBJTi1jb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcnVrIG9wIFwnTWVudVwnIGVuIHZlcnZvbGdlbnMgb3AgMCBvbSB0ZSBvbnRncmVuZGVsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IkFsYXJtbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRlcnVnIG5hYXIgZ2VzcHJlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Ikp1aXN0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iT3BsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iT3BnZWxhZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta2FhcnQgaXMgdmVyZ3JlbmRlbGQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLWthYXJ0IG9udGdyZW5kZWxlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlUgaGVlZnQgdXcgd2FjaHR3b29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgaW5nZXZvZXJkLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlUgaGVlZnQgdXcgUElOLWNvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVSBoZWVmdCB1dyBvbnRncmVuZGVsaW5nc3BhdHJvb24gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGdldGVrZW5kLiBOYSBub2cgZWVucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtaXNsdWt0ZSBwb2dpbmdlbiwgd29yZHQgdSBnZXZyYWFnZCBvbSB1dyB0ZWxlZm9vbiB0ZSBvbnRncmVuZGVsZW4gbWV0IHV3IEdvb2dsZSBhYW5tZWxkaW5nLiJcblxuIiBQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJQYXRyb29uIHZlcmdldGVuPyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iQWxsZXMgc2VsZWN0ZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iVGVrc3Qgc2VsZWN0ZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IlN0b3BwZW4gbWV0IHRla3N0IHNlbGVjdGVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS25pcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImN1dEFsbCIgbXNnaWQ9IjI0MzYzODMyNzAwMjQ5MzE2MzkiPiJBbGxlcyBrbmlwcGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3Bpw6tyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IkFsbGVzIGtvcGnDq3JlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBsYWtrZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCBrb3Bpw6tyZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW52b2VybWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcJzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cJyB0b2V2b2VnZW4gYWFuIHdvb3JkZW5ib2VrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iVGVrc3QgYmV3ZXJrZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IldlaW5pZyBydWltdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPcHNsYWdydWltdGUgdmFuIHRlbGVmb29uIHJhYWt0IG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzIxLDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTGV0IG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQUFOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVUlUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBY3RpZSB2b2x0b29pZW4gbWV0Ijwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWb29yYWYgZ2VkZWVsZGUgc2xldXRlbCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWNhYXQgb3AgYmFzaXMgdmFuIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iQmVzdGFuZCBraWV6ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJHZWVuIGJlc3RhbmQgZ2VzZWxlY3RlZXJkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iT3BuaWV1dyBpbnN0ZWxsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iVmVyemVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcmlldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBpbmdlc2NoYWtlbGQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWN0ZWVyIGRpdCBvbSBkZSBhdXRvbW9kdXMgYWYgdGUgc2x1aXRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9mIGhvdHNwb3QgYWN0aWVmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iQWFucmFrZW4gb20gdGUgY29uZmlndXJlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVm9yaWdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iVm9sZ2VuZGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIb29nIG1vYmllbCBnZWdldmVuc2dlYnJ1aWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlJhYWsgYWFuIHZvb3IgbWVlciBpbmZvcm1hdGllIG92ZXIgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTW9iaWVsZSBnZWdldmVuc2xpbWlldCBvdmVyc2NocmVkZW4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA4N2UwNDVkZjMuLjA3OTQ2YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbHVqZSwga2llZHkgdXJ6xIVkemVuaWUgamVzdCBibG9rb3dhbmUsIHd5bWFnYWrEhWMgcG9ub3duZWdvIHdwcm93YWR6ZW5pYSBoYXPFgmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlVzdcWEIHdzenlzdGtpZSBkYW5lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJXeWtvbnVqZSByZXNldCBmYWJyeWN6bnksIHVzdXdhasSFYyB3c3p5c3RraWUgZGFuZSB1xbx5dGtvd25pa2EgYmV6IMW8YWRuZWdvIHBvdHdpZXJkemVuaWEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9tIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iS29tw7Nya2EiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlPFgnXFvGJvd3kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSW5ueSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJOaWVzdGFuZGFyZG93eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHByemV6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iV3Byb3dhZMW6IGtvZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Ildwcm93YWTFuiBoYXPFgm8sIGFieSBvZGJsb2tvd2HEhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iV3Byb3dhZMW6IGtvZCBQSU4sIGFieSBvZGJsb2tvd2HEhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkLFgsSZZG55IGtvZCBQSU4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkFieSBvZGJsb2tvd2HEhywgbmFjacWbbmlqIE1lbnUsIGEgbmFzdMSZcG5pZSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOdW1lciBhbGFybW93eSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJQb3dyw7N0IGRvIHBvxYLEhWN6ZW5pYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlBvcHJhd25pZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTmllc3RldHksIHNwcsOzYnVqIHBvbm93bmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJTcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IsWBYWRvd2FuaWUgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik5hxYJhZG93YW55LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJLYXJ0YSBTSU0gamVzdCB6YWJsb2tvd2FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvd3l3YW5pZSBrYXJ0eSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuaWVwcmF3aWTFgm93byBuYXJ5c293YW55IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJIYXPFgm8gem9zdGHFgm8gbmllcHJhd2lkxYJvd28gd3Byb3dhZHpvbmUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gIlxuXG4iU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iTmllcG9wcmF3bmllIHdwcm93YWR6b25vIGtvZCBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gIlxuXG4iU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Ild6w7NyIG9kYmxva293YW5pYSB6b3N0YcWCIG5hcnlzb3dhbnkgbmllcHJhd2lkxYJvd28gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gUG8ga29sZWpueWNoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IG5pZXVkYW55Y2ggcHLDs2JhY2ggdGVsZWZvbiB0cnplYmEgYsSZZHppZSBvZGJsb2tvd2HEhyBwcnpleiB6YWxvZ293YW5pZSBuYSBrb25jaWUgR29vZ2xlLiJcblxuIiBTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJaYXBvbW5pYcWCZcWbIHd6b3J1PyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iWmF6bmFjeiB3c3p5c3RrbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iWmF6bmFjeiB0ZWtzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IlphdHJ6eW1haiB3eWJpZXJhbmllIHRla3N0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJXeXRuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iV3l0bmlqIHdzenlzdGtvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpdWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IktvcGl1aiB3c3p5c3RrbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IldrbGVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpdWogYWRyZXMgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB3cHJvd2FkemFuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRG9kYWogdGVybWluIOKAnjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ0gZG8gc8WCb3duaWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWR5dHVqIHRla3N0Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNYcWCbyBtaWVqc2NhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTWFsZWplIGlsb8WbxIcgZG9zdMSZcG5laiBwYW1pxJljaSB0ZWxlZm9udS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW51bHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlV3YWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJXY3p5dHl3YW5pZS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iV8WCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ild5xYLEhWN6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJaYWtvxYRjeiBjenlubm/Fm8SHIGtvcnp5c3RhasSFYyB6Ijwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGtsdWN6ZW0gUFNLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNpZcSHIFZQTiBMMlRQL0lQU2VjIHogY2VydHlmaWthdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iV3liaWVyeiBwbGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmllIHd5YnJhbm8gcGxpa3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlByemXFm2xpaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4idWx1YmlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJUcnliIHNhbW9jaG9kb3d5IHfFgsSFY3pvbnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iV3liaWVyeiwgYWJ5IHpha2/FhGN6ecSHIHRyeWIgc2Ftb2Nob2Rvd3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Ikplc3QgYWt0eXduZSBwb3dpxIV6YW5pZSBsdWIgcHVua3QgZG9zdMSZcHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3RrbmlqLCBhYnkgc2tvbmZpZ3Vyb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJXcsOzxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWxlaiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ild5c29raSBwb3ppb20gdcW8eWNpYSBkYW55Y2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJQcnpla3JvY3pvbm8gbGltaXQgZGFueWNoIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCAzZmI4ZDU1Li5kNDRhODBkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGUgcXVhbmRvIG8gZGlzcG9zaXRpdm8gw6kgYmxvcXVlYWRvLCBzZW5kbyBuZWNlc3PDoXJpbyByZWludHJvZHV6aXIgYSByZXNwZWN0aXZhIHBhbGF2cmEtcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWTDqm5jaWEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2ZWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkVtcHJlZ28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3V0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhdHJhdsOpcyBkbyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGF0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdXppciBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW50cm9kdXphIGEgcGFsYXZyYS1wYXNzZSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnRyb2R1emEgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmVjdG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByaW1hIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNzYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxhbWVudGFtb3MsIHRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkEgY2FycmVnYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iQSBkZXNibG9xdWVhciBjYXJ0w6NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkVmZWN0dW91IGluY29ycmVjdGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIGEgcGFsYXZyYS1wYXNzZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSW50cm9kdXppdSBpbmNvcnJlY3RhbWVudGUgbyBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gQXDDs3Mgb3V0cmFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgc2VtIHN1Y2Vzc28sIHNlci1saGUtw6EgcGVkaWRvIHBhcmEgZGVzYmxvcXVlYXIgbyB0ZWxlZm9uZSB1dGlsaXphbmRvIG8gc2V1IGluw61jaW8gZGUgc2Vzc8OjbyBubyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUtc2UgZG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC03MDMsMTcgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iUGFyYXIgc2VsZWPDp8OjbyBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iQ29ydGFyIHR1ZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iQ29waWFyIHR1ZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIGxpdnJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgYSBmaWNhciByZWR1emlkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJBIGNhcnJlZ2FyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkRlc2FjdGl2YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbmNsdWlyIGFjw6fDo28gdXRpbGl6YW5kbyI8L3N0cmluZz4KQEAgLTg1NSwxMyArODYyLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzZWFkYSBlbSBjaGF2ZSBwcsOpLSBwYXJ0aWxoYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2VhZGEgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBmaWNoZWlybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik7Do28gZm9pIHNlbGVjY2lvbmFkbyBuZW5odW0gZmljaGVpcm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXBvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvbcOzdmVsIGFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmFyIHBhcmEgc2FpciBkbyBtb2RvIGF1dG9tw7N2ZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkxpZ2HDp8OjbyBwb250byBhIHBvbnRvIG91IGhvdHNwb3QgYWN0aXZvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2FyIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkFudGVyaW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2VndWludGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXphw6fDo28gZWxldmFkYSBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIG3Ds3ZlaXMgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCA4MWNlYWYzLi5hNmM0OWQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhIG8gYmxvcXVlaW8gZG8gYXBhcmVsaG8sIGV4aWdpbmRvIHF1ZSBhIHNlbmhhIHNlamEgZGlnaXRhZGEgbm92YW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkV4ZWN1dGUgdW1hIHJlZGVmaW5pw6fDo28gZGUgZsOhYnJpY2EsIGV4Y2x1aW5kbyB0b2RvcyBvcyBzZXVzIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkZW5jaWFsIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsdWxhciI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQ29tZXJjaWFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik91dHJvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InBvciBtZWlvIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iRGlnaXRlIG8gY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkRpZ2l0ZSBhIHNlbmhhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkRpZ2l0ZSBvIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iQ8OzZGlnbyBQSU4gaW5jb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzc2lvbmUgTWVudSBlLCBlbSBzZWd1aWRhLCAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnw6puY2lhIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG9ybmFyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJUZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcnJlZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyBvIGNhcnTDo28gU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVm9jw6ogZGVzZW5ob3UgaW5jb3JyZXRhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlZvY8OqIGluc2VyaXUgaW5jb3JyZXRhbWVudGUgYSBzdWEgc2VuaGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVm9jw6ogZGlnaXRvdSBpbmNvcnJldGFtZW50ZSBvIHNldSBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlZvY8OqIGRlc2VuaG91IG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gaW5jb3JyZXRhbWVudGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIE1haXMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZhcyBpbmNvcnJldGFzIGUgdm9jw6ogcmVjZWJlcsOhIHVtYSBzb2xpY2l0YcOnw6NvIHBhcmEgZGVzYmxvcXVlYXIgbyBzZXUgdGVsZWZvbmUgdXNhbmRvIG8gc2V1IGxvZ2luIGRvIEdvb2dsZS4iXG5cbiIgVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUgbyBwYWRyw6NvPyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNpb25hciB0dWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJTZWxlY2lvbmFyIHRleHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iUGFyYXIgc2VsZcOnw6NvIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlJlY29ydGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+IlJlY29ydGFyIHR1ZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iQ29waWFyIHR1ZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgZmljYW5kbyBiYWl4by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJyZWdhbmRvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iREVTQVRJVkFETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGUgYSBhw6fDo28gdXNhbmRvIjwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBjb20gYmFzZSBlbSBjaGF2ZSBwcsOpLWNvbXBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBhcnF1aXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuaHVtIGFycXVpdm8gZXNjb2xoaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVkZWZpbmlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGRlIGNhcnJvIGF0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNpb25lIHBhcmEgc2FpciBkbyBtb2RvIGRlIGNhcnJvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJWw61uY3VsbyBvdSBwb250byBkZSBhY2Vzc28gYXRpdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3F1ZSBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb2x0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJBdmFuw6dhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkFsdG8gdXNvIGRlIGRhZG9zIGRvIGNlbHVsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIGRvIGNlbHVsYXIgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAppbmRleCA0MTc2ODg2Li4yMWU4YWQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+ItCj0L/RgNCw0LLQu9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC+0Lkg0YPRgdGC0YDQvtC50YHRgtCy0LAsINGC0YDQtdCx0YPRjtGJ0LXQuSDQstCy0L7QtNCwINC/0LDRgNC+0LvRjy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i0KPQtNCw0LvQuNGC0Ywg0LLRgdC1INC00LDQvdC90YvQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i0JLRi9C/0L7Qu9C90LjRgtGMINGB0LHRgNC+0YEg0Log0L3QsNGH0LDQu9GM0L3Ri9C8INC90LDRgdGC0YDQvtC50LrQsNC8INGBINGD0LTQsNC70LXQvdC40LXQvCDQstGB0LXRhSDQtNCw0L3QvdGL0YUg0LHQtdC3INC30LDQv9GA0L7RgdCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+ItCU0L7QvNCw0YjQvdC40LkiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLQnNC+0LHQuNC70YzQvdGL0LkiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+ItCg0LDQsdC+0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLQlNGA0YPQs9C+0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i0KHQvtC30LTQsNGC0Ywg0YHQstC+0Lkg0Y/RgNC70YvQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+INGBINC/0L7QvNC+0YnRjNGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i0JLQstC10LTQuNGC0LUg0L/QsNGA0L7Qu9GMINC00LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCDQtNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLQndC10LLQtdGA0L3Ri9C5IFBJTi3QutC+0LQhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+ItCU0LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCDQvdCw0LbQvNC40YLQtSBcItCc0LXQvdGOXCIsINCwINC30LDRgtC10LwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i0K3QutGB0YLRgNC10L3QvdCw0Y8g0YHQu9GD0LbQsdCwIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+ItCS0LXRgNC90YPRgtGM0YHRjyDQuiDQstGL0LfQvtCy0YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLQn9GA0LDQstC40LvRjNC90L4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i0JjQtNC10YIg0LfQsNGA0Y/QtNC60LAgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+ItCX0LDRgNGP0LbQtdC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS3QutCw0YDRgtCwINC30LDQsdC70L7QutC40YDQvtCy0LDQvdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+ItCg0LDQt9Cx0LvQvtC60LjRgNC+0LLQutCwIFNJTS3QutCw0YDRgtGL4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0LPRgNCw0YTQuNGH0LXRgdC60L7Qs9C+INC60LvRjtGH0LAg0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lg6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y86IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAgUElOLdC60L7QtNCwOiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uINCf0L7RgdC70LUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LDQvCDQsdGD0LTQtdGCINC/0YDQtdC00LvQvtC20LXQvdC+INGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0YLQtdC70LXRhNC+0L0g0YEg0L/QvtC80L7RidGM0Y4g0YPRh9C10YLQvdGL0YUg0LTQsNC90L3Ri9GFIEdvb2dsZS5cbiAiXG5cbiIg0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+ItCX0LDQsdGL0LvQuCDQs9GA0LDRhNC40YfQtdGB0LrQuNC5INC60LvRjtGHPyI8L3N0cmluZz4KQEAgLTcwMywxNyArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i0JLRi9Cx0YDQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLQktGL0LHRgNCw0YLRjCDRgtC10LrRgdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4i0J7RgdGC0LDQvdC+0LLQuNGC0Ywg0LLRi9C00LXQu9C10L3QuNC1INGC0LXQutGB0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLQktGL0YDQtdC30LDRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY3V0QWxsIiBtc2dpZD0iMjQzNjM4MzI3MDAyNDkzMTYzOSI+ItCS0YvRgNC10LfQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLQmtC+0L/QuNGA0L7QstCw0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4i0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i0JLRgdGC0LDQstC40YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i0JrQvtC/0LjRgNC+0LLQsNGC0YwgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+ItCh0L/QvtGB0L7QsSDQstCy0L7QtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+ItCU0L7QsdCw0LLQuNGC0YwgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIg0LIg0YHQu9C+0LLQsNGA0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLQmNC30LzQtdC90LjRgtGMINGC0LXQutGB0YIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+ItCd0LXQtNC+0YHRgtCw0YLQvtGH0L3QviDQvNC10YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i0JfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0LzQtdGB0YLQviDQsiDQv9Cw0LzRj9GC0Lgg0YLQtdC70LXRhNC+0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLQntCaIjwvc3RyaW5nPgpAQCAtNzIxLDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i0J7QmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+ItCe0YLQvNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLQktC90LjQvNCw0L3QuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLQktCa0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLQktCr0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i0KfRgtC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjD8iPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDQv9GA0LXQtNCyLiDQvtCx0YkuINC60LvRjtGH0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDRgdC10YDRgtC40YTQuNC60LDRgtCwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+ItCS0YvQsdGA0LDRgtGMINGE0LDQudC7Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i0J3QtSDQstGL0LHRgNCw0L0g0YTQsNC50LsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLQodCx0YDQvtGB0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+ItCe0YLQv9GA0LDQstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i0LjQt9Cx0YDQsNC90L3QvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i0KDQtdC20LjQvCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4INCy0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+ItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINCy0YvRhdC+0LTQsCDQuNC3INGA0LXQttC40LzQsCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0It0LzQvtC00LXQvCDQuNC70Lgg0YLQvtGH0LrQsCDQtNC+0YHRgtGD0L/QsCBXaS1GaSDQsNC60YLQuNCy0L3RiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+ItCd0LDQttC80LjRgtC1INC00LvRjyDQvdCw0YHRgtGA0L7QudC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLQndCw0LfQsNC0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i0JTQsNC70LXQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+ItCQ0LrRgtC40LLQvdCw0Y8g0L/QtdGA0LXQtNCw0YfQsCDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+ItCd0LDQttC80LjRgtC1LCDRh9GC0L7QsdGLINGD0LfQvdCw0YLRjCDQsdC+0LvRjNGI0LUg0L4g0LzQvtCx0LjQu9GM0L3QvtC5INC/0LXRgNC10LTQsNGH0LUg0LTQsNC90L3Ri9GFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLQn9GA0LXQstGL0YjQtdC9INC70LjQvNC40YIg0L3QsCDQvNC+0LHQuNC70YzQvdGL0LUg0LTQsNC90L3Ri9C1Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKaW5kZXggNGM3OGY0Zi4uZThmNWEyMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJLb250cm9sbGVyYSBuw6RyIGVuaGV0ZW4gbMOlc2VzLCB2aWxrZXQga3LDpHZlciBhdHQgZHUgYW5nZXIgbMO2c2Vub3JkZXQgaWdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iUmFkZXJhIGFsbGEgZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iw4V0ZXJzdMOkbGwgZmFicmlrc2luc3TDpGxsbmluZ2FybmEgb2NoIHRhIGJvcnQgYWxsYSBkYXRhIHV0YW4gbsOlZ29uIGJla3LDpGZ0ZWxzZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJIZW0iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQXJiZXRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IsOWdnJpZ3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iQW5wYXNzYWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iQW5nZSBQSU4ta29kIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJBbmdlIGzDtnNlbm9yZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkFuZ2UgUElOLWtvZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGZWwgUElOLWtvZCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iVHJ5Y2sgcMOlIE1lbnUgb2NoIHNlZGFuIHDDpSAwIG9tIGR1IHZpbGwgbMOlc2EgdXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7Zkc2FtdGFsc251bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDhXRlcmfDpSB0aWxsIHNhbXRhbGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGRhciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTGFkZGFkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IMOkciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgdXBwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBhbmdldHQgZmVsIGzDtnNlbm9yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgYW5nZXR0IGRpbiBQSU4ta29kIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiBFZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBmw7Zyc8O2ayB0aWxsIGtvbW1lciBkdSBhdHQgdXBwbWFuYXMgYXR0IGzDpXNhIHVwcCB0ZWxlZm9uZW4gbWVkIGRpbiBHb29nbGUtaW5sb2dnbmluZy4iXG5cbiIgRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbMO2bXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6RsaiBhbGxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJNYXJrZXJhIHRleHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJTbHV0YSB2w6RsamEgdGV4dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbGlwcCB1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImN1dEFsbCIgbXNnaWQ9IjI0MzYzODMyNzAwMjQ5MzE2MzkiPiJLbGlwcCB1dCBhbGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29weUFsbCIgbXNnaWQ9IjI1OTA4MjkwNjgxMDAxMTMwNTciPiJLb3BpZXJhIGFsbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJLbGlzdHJhIGluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXJhIHdlYmJhZHJlc3MiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5kYXRhbWV0b2QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTMOkZ2cgdGlsbCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBpIG9yZGxpc3RhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXJhIHRleHQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkTDpWxpZ3QgbWVkIHV0cnltbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9uZW5zIGxhZ3JpbmdzdXRyeW1tZSBow6VsbGVyIHDDpSBhdHQgdGEgc2x1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQXZicnl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Ik9icyEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkzDpHNlciBpbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iUMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IlNsdXRmw7ZyIMOldGfDpHJkIGdlbm9tIGF0dCBhbnbDpG5kYSI8L3N0cmluZz4KQEAgLTg1NSwxMyArODYyLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSMO2ZyBtb2JpbGRhdGFhbnbDpG5kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVHJ5Y2sgb20gZHUgdmlsbCB2ZXRhIG1lciBvbSBtb2JpbGRhdGFhbnbDpG5kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3LDpG5zZW4gZsO2ciBtb2JpbGRhdGEgaGFyIMO2dmVyc2tyaWRpdHMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAppbmRleCBmMmZkNzM0Li5hOWRkODg3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJUw7xtIHZlcmlsZXJpIHNpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVMO8bSB2ZXJpbGVyaW5pemkgb25heSBvbG1hZGFuIHNpbG1layBpw6dpbiBmYWJyaWthIGF5YXJsYXLEsW5hIHPEsWbEsXJsYXnEsW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRXYiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4ixLDFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJEacSfZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iw5Z6ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4gYXJhY8SxbMSxxJ/EsXlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4gaWxlIDx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0YXJpaGluZGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4ga29kdW51IGdpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDFn2lmcmV5aSBnaXJpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiBQSU5cJ2kgZ2lyaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJZYW5sxLHFnyBQSU4ga29kdSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDDtm5jZSBNZW7DvFwneWUsIHNvbnJhIDBcJ2EgYmFzxLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBY2lsIGR1cnVtIG51bWFyYXPEsSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDh2HEn3LEsXlhIGTDtm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJEb8SfcnUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IsOcemfDvG7DvHosIGzDvHRmZW4geWVuaWRlbiBkZW5leWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJNYWFsZXNlZiwgdGVrcmFyIGRlbmV5aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFnmFyaiBvbHV5b3IgKDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IsWeYXJqIG9sZHUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ga2FydCBraWxpdGxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSBrYXJ0IGtpbGlkaSBhw6fEsWzEsXlvcuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4ixZ5pZnJlbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU5cJ2luaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGJhxZ9hcsSxc8SxeiBkZW5lbWVkZW4gc29ucmEgdGVsZWZvbnVudXp1IEdvb2dsZSBvdHVydW0gYcOnbWEgYmlsZ2lsZXJpbml6aSBrdWxsYW5hcmFrIGHDp21hbsSxeiBpc3RlbmlyLiJcblxuIiBMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkRlc2VuaSB1bnV0dHVudXogbXU/Ijwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJUw7xtw7xuw7wgc2XDpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iTWV0aW4gc2XDpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+Ik1ldGluIHNlw6dtZXlpIGR1cmR1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4iVMO8bcO8bsO8IGtlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29weWFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiIG1zZ2lkPSIyNTkwODI5MDY4MTAwMTEzMDU3Ij4iVMO8bcO8bsO8IGtvcHlhbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJZYXDEscWfdMSxciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMXCd5aSBrb3B5YWxhIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkdpcmnFnyB5w7ZudGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBrZWxpbWVzaW5pIHPDtnpsw7zEn2UgZWtsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1ldGluIGTDvHplbmxlIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJZZXIgYXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9udW4gZGVwb2xhbWEgYWxhbsSxIGF6YWzEsXlvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJUYW1hbSI8L3N0cmluZz4KQEAgLTcyMSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IlRhbWFtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4ixLBwdGFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkRpa2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkHDh0lLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iS0FQQUxJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLEsMWfbGVtaSDFn3VudSBrdWxsYW5hcmFrIHRhbWFtbGEiPC9zdHJpbmc+CkBAIC04NTUsMTMgKzg2MiwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIHRlbWVsbGkgw7ZuY2VkZW4gcGF5bGHFn8SxbG3EscWfIGFuYWh0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE4gdGVtZWxsaSBzZXJ0aWZpa2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEb3N5YSBzZcOnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iU2XDp2lsaSBkb3N5YSB5b2siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJTxLFmxLFybGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iR8O2bmRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXJhYmEgbW9kdSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJBcmFiYSBtb2R1bmRhbiDDp8Sxa21hayBpw6dpbiBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkRvxJ9ydWRhbiBiYcSfbGFudMSxIHZleWEgb3J0YWsgZXJpxZ9pbSBub2t0YXPEsSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IllhcMSxbGFuZMSxcm1hayBpw6dpbiBkb2t1bnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iR2VyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IsSwbGVyaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlnDvGtzZWsgZMO8emV5ZGUgbW9iaWwgdmVyaSBrdWxsYW7EsW3EsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTW9iaWwgdmVyaSBrdWxsYW7EsW3EsSBoYWtrxLFuZGEgZGFoYSBmYXpsYSBiaWxnaSBlZGlubWVrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsIHZlcmkgbGltaXRpIGHFn8SxbGTEsSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTUzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKKyAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+ZmFsc2U8L2Jvb2w+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmZGY0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L2RpbWVucy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjUwZGlwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjUwZGlwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIwYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L3N0cmluZ3MueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorCisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2RmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU3RhdHVzIEJhciBTdHlsZXMgLS0+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAppbmRleCBhMGZiNzIxLi4wOTQ5NTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i5o6n5Yi25L2V5pe26ZSB5a6a6K6+5aSH77yM6L+Z6ZyA6KaB5oKo6YeN5paw6L6T5YWl5a+G56CB44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+Iua4hemZpOaJgOacieaVsOaNriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i5oGi5aSN5Ye65Y6C6K6+572u77yM6L+Z5Lya5Zyo5LiN5o+Q56S656Gu6K6k55qE5oOF5Ya15LiL5Yig6Zmk5oKo55qE5omA5pyJ5pWw5o2u44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i5L2P5a6FIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i5omL5py6IjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLlhazlj7giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i5YW25LuWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IuiHquWumuS5iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLpgJrov4cgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+IuaXtumXtO+8mjx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPu+8jOaWueW8j++8mjx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i6L6T5YWlIFBJTiDnoIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Iui+k+WFpeWvhueggei/m+ihjOino+mUgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i6L6T5YWlIFBJTiDov5vooYzop6PplIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g56CB5LiN5q2j56Gu77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+Iuimgeino+mUge+8jOivt+WFiOaMiSBNRU5VIOWGjeaMiSAw44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IuaApeaVkeaIluaKpeitpueUteivnSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLov5Tlm57pgJror50iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLmraPnoa7vvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i5b6I5oqx5q2J77yM6K+36YeN6K+VIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLlvojmirHmrYnvvIzor7fph43or5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLmraPlnKjlhYXnlLUgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuW3suWFhea7oeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g5Y2h6KKr6ZSB5a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i5q2j5Zyo6Kej6ZSBIFNJTSDljaEuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh57uY6ZSZ5LqG6Ieq5bex55qE6Kej6ZSB5Zu+5qGI44CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHplJnor6/lnLDovpPlhaXkuoblr4bnoIHjgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHplJnor6/lnLDovpPlhaXkuoYgUElO44CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoee7mOmUmeS6huiHquW3seeahOino+mUgeWbvuahiOOAguWmguaenOWGjeWwneivlSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDmrKHlkI7ku43kuI3miJDlip/vvIzns7vnu5/kvJropoHmsYLmgqjkvb/nlKjoh6rlt7HnmoQgR29vZ2xlIOeZu+W9leS/oeaBr+ino+mUgeaJi+acuuOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i5b+Y6K6w5LqG5Zu+5qGI77yfIjwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLlhajpgIkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IumAieaLqeaWh+WtlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IuWBnOatoumAieaLqeaWh+WtlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliarliIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4i5YWo6YOo5Ymq5YiHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLlpI3liLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IuWFqOmDqOWkjeWItiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IueymOi0tCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i5aSN5Yi2572R5Z2AIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Iui+k+WFpeazlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLlsIbigJw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCd5re75Yqg5Yiw6K+N5YW4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i57yW6L6R5paH5a2XIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLlrZjlgqjnqbrpl7TkuI3otrMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmiYvmnLrlhoXlrZjnqbrpl7TmiYDliankuI3lpJrkuobjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLnoa7lrpoiPC9zdHJpbmc+CkBAIC03MjEsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLnoa7lrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLlj5bmtogiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLmraPlnKjovb3lhaUuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IuaJk+W8gCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IuWFs+mXrSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i5L2/55So5Lul5LiL5pa55byP5Y+R6YCBIjwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLln7rkuo7pooTlhbHkuqvlr4bpkqXnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i5Z+65LqO6K+B5Lmm55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i6YCJ5oup5paH5Lu2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i5pyq6YCJ5a6a5Lu75L2V5paH5Lu2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i6YeN572uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuaPkOS6pCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i5pS26JePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i5bey5ZCv55So6L2m6L295qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IumAieaLqemAgOWHuui9pui9veaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0Ig57uR5a6a5oiW54Ot54K55bey5ZCv55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6Kem5pG45Y+v6L+b6KGM6YWN572uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5LiK5LiA5q2lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5LiL5LiA5q2lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i5omL5py65rWB6YeP6L+H5aSaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovbvop6bku6Xkuobop6PmnInlhbPmiYvmnLrmtYHph4/or6bmg4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sui2heWHuuaJi+acuuaVsOaNruS4iumZkCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggZDVkZDg1Ny4uMmYwYTQ5YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuijnee9rumOluWumuaZguWPr+WPluW+l+aOp+WItu+8jOS9huW/hemgiOmHjeaWsOi8uOWFpeWvhueivOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInos4fmlpkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IumHjeioreeCuuWOn+W7oOioreWumiAo57O757Wx5pyD5Yiq6Zmk5omA5pyJ6LOH5paZ77yM5LiU5LiN5pyD5ZCR5oKo6YCy6KGM56K66KqNKeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuS9j+Wutumbu+ipsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuihjOWLlembu+ipsSI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6roqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCP6YGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7pgI/pgY7jgIw8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPuOAjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui8uOWFpSBQSU4g56K8Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovLjlhaXlr4bnorzljbPlj6/op6PpjpYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui8uOWFpSBQSU4g6YCy6KGM6Kej6Y6WIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeivOmMr+iqpO+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLlpoLopoHop6PpjpbvvIzoq4vmjIkgTWVudSDpjbXvvIznhLblvozmjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpm7voqbHomZ/norwiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6KmxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56K677yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOiri+WGjeippuS4gOasoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF6Zu7ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozmiJDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeW3sumOluWumuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Iuino+mOliBTSU0g5Y2h5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i55Wr5Ye66Kej6Y6W5ZyW5b2i5bey6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoeOAgiJcblxuIiDoq4vlnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN5ZiX6Kmm44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahOWvhueivOOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahCBQSU7jgIIiXG5cbiLoq4vmlrwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CC5YaN6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOasoeW+jO+8jOezu+e1seacg+imgeaxguS9v+eUqCBHb29nbGUg55m75YWl5L6G6Kej6Y6W44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i5b+Y6KiY6Kej6Y6W5ZyW5b2i77yfIjwvc3RyaW5nPgpAQCAtNzAzLDE3ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLlhajpg6jpgbjlj5YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IumBuOWPluaWh+WtlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IuWBnOatoumBuOWPluaWh+WtlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliarkuIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjdXRBbGwiIG1zZ2lkPSIyNDM2MzgzMjcwMDI0OTMxNjM5Ij4i5YWo6YOo5Ymq5LiLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLopIfoo70iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb3B5QWxsIiBtc2dpZD0iMjU5MDgyOTA2ODEwMDExMzA1NyI+IuWFqOmDqOikh+ijvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOS4iiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i6KSH6KO957ay5Z2AIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Iui8uOWFpeaWueW8jyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLlsIfjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN5paw5aKe6Iez5a2X5YW4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i57eo6Lyv5paH5a2XIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLlhLLlrZjnqbrplpPljbPlsIfkuI3otrMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmiYvmqZ/lhLLlrZjnqbrplpPljbPlsIfkuI3otrPjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLnorrlrpoiPC9zdHJpbmc+CkBAIC03MjEsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLnorrlrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLlj5bmtogiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLovInlhaXkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IumWi+WVnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IumXnOmWiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i5a6M5oiQ5pON5L2c6ZyA5L2/55SoIjwvc3RyaW5nPgpAQCAtODU1LDEzICs4NjIsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLmjqHnlKjpoJDlhYjlhbHnlKjph5HpkbDnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i5o6h55So5oaR6K2J55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i6YG45pOH5qqU5qGIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i5pyq6YG45pOH5Lu75L2V5qqU5qGIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i6YeN6KitIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuaPkOS6pCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i5oiR55qE5pyA5oSbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i5bey5ZWf55So6LuK55So5qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IumBuOWPlue1kOadn+i7iueUqOaooeW8j+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLmlbjmk5rpgKPnt5rmiJbnhKHnt5rln7rlnLDlj7Dlt7LllZ/nlKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLovJXop7jku6XoqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLkuIrkuIDpoIEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLkuIvkuIDpoIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLpq5jooYzli5Xos4fmlpnnlKjph48iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Iui8leinuOWNs+WPr+eereino+abtOWkmuaciemXnOihjOWLleizh+aWmeeUqOmHj+eahOips+e0sOizh+ioiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6YGU6KGM5YuV6LOH5paZ5LiK6ZmQIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCBkMTZiOTFjLi45N2M1ODIyIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMTQsOCArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZyAKLSAgICAgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LiBUbyBzdXBwcmVzcyBjb21tZW50IGxpbmVzIGZyb20gdGhlIGRvY3VtZW50YXRpb24gCis8IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZworICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbgogICAgICBvdXRwdXQsIGluc2VydCBhbiBlYXQtY29tbWVudCBlbGVtZW50IGFmdGVyIHRoZSBjb21tZW50IGxpbmVzLgogLS0+CiAKQEAgLTI0NCw2ICsyNDQsMTcgQEAKICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNXaW5kb3dBbmltYXRpb259LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGhhdmUgYW4gQWN0aW9uIEJhcgorICAgICAgICAgICAgIGluIHBsYWNlIG9mIHRoZSB1c3VhbCB0aXRsZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIHN0eWxlIGZvciB0aGUgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWN0aW9uIG1vZGVzIHNob3VsZCBvdmVybGF5IHdpbmRvdyBjb250ZW50CisgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBub3QgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZWlyIFVJIChzdWNoIGFzIGFuIEFjdGlvbiBCYXIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgICAgICA8IS0tIERlZmluZXMgdGhlIGRlZmF1bHQgc29mdCBpbnB1dCBzdGF0ZSB0aGF0IHRoaXMgd2luZG93IHdvdWxkCiAgICAgICAgICAgICAgbGlrZSB3aGVuIGl0IGlzIGRpc3BsYXllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiPgpAQCAtMzkwLDYgKzQwMSwxMiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFNwaW5uZXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgZHJvcGRvd24gU3Bpbm5lciBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IEFjdGlvbkJhciBkcm9wZG93biBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYWN0aW9uIGJ1dHRvbiBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFN0YXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERlZmF1bHQgVGFiV2lkZ2V0IHN0eWxlLiAtLT4KQEAgLTQyNiw2ICs0NDMsMjIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gYWN0aW9uIGJ1dHRvbnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIG1vZGUgc3R5bGVzICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgYWN0aW9uIG1vZGUgVUkgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBjbG9zZSBhY3Rpb24gbW9kZSBidXR0b24gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgICAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTk2Myw2ICs5OTYsOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3IiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1FbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltQW1vdW50IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBhIEFsZXJ0RGlhbG9nJ3MgdGhlbWUuIC0tPgpAQCAtOTg5LDcgKzEwMjUsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTaG93QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBhIHdpbmRvdyBpcyBnb2luZyBmcm9tIFZJU0lCTEUgdG8gSU5WSVNJQkxFLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93SGlkZUFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQgaXMKICAgICAgICAgICAgICAgcnVuIG9uIHRoZSBuZXh0IGFjdGl2aXR5ICh3aGljaCBpcyBlbnRlcmluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFjdGl2aXR5T3BlbkVudGVyQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KQEAgLTEwMzAsNyArMTA2Niw3IEBACiAgICAgICAgICAgICAgIGFuaW1hdGlvbiB0aGF0IGlzIHJ1biBvbiB0aGUgdG9wIGFjdGl2aXR5IG9mIHRoZSBjdXJyZW50IHRhc2sKICAgICAgICAgICAgICAgKHdoaWNoIGlzIGV4aXRpbmcgdGhlIHNjcmVlbikuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0YXNrVG9CYWNrRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSB0aGF0IHNob3dzIHRoZSB3YWxscGFwZXIsIHdoaWxlCiAgICAgICAgICAgICAgIGN1cnJlbnRseSBub3Qgc2hvd2luZyB0aGUgd2FsbHBhcGVyLCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdAogICAgICAgICAgICAgICBpcyBydW4gb24gdGhlIG5ldyB3YWxscGFwZXIgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KQEAgLTEwNDcsNyArMTA4Myw3IEBACiAgICAgICAgICAgICAgIGN1cnJlbnRseSBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgb2xkIHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndhbGxwYXBlckNsb3NlRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSB0aGF0IGlzIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyCiAgICAgICAgICAgICAgIHdoZW4gdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMgYWxzbyBvbiB0b3Agb2YgdGhlIHdhbGxwYXBlciwKICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSBuZXcgYWN0aXZpdHkKQEAgLTE1MzUsNiArMTU3MSw4IEBACiAgICAgICAgICAgICAgd2lsbCB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhZGFwdGVyIGFuZCB0aGUgbnVtYmVyIG9mIGl0ZW1zIHZpc2libGUKICAgICAgICAgICAgICBvbiBzY3JlZW4gdG8gZGV0ZXJtaW5lIHRoZSBzY3JvbGxiYXIncyBwcm9wZXJ0aWVzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic21vb3RoU2Nyb2xsYmFyIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gQSByZWZlcmVuY2UgdG8gYW4gWE1MIGRlc2NyaXB0aW9uIG9mIHRoZSBhZGFwdGVyIHRvIGF0dGFjaCB0byB0aGUgbGlzdC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFkYXB0ZXIiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFic1NwaW5uZXIiPgogICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhbiBhcnJheSByZXNvdXJjZSB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIFNwaW5uZXIuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzMwLDcgKzE3NjgsNyBAQAogICAgICAgICA8IS0tIFdoZW4gc2V0IHRvIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKICAgICAgICAgICAgICB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQogICAgICAgICAgICAgIG1lYXN1cmVkIG5vcm1hbGx5LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0idXNlTGFyZ2VzdENoaWxkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTGlzdFZpZXciPgogICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhbiBhcnJheSByZXNvdXJjZSB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIExpc3RWaWV3LiAgRm9yIHN0YXRpYyBjb250ZW50LApAQCAtMTc1Miw2ICsxNzkwLDggQEAKICAgICAgICAgICAgIDxlbnVtIG5hbWU9InNpbmdsZUNob2ljZSIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzLiAtLT4KICAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMgaW4gYSBjdXN0b20gc2VsZWN0aW9uIG1vZGUuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibXVsdGlwbGVDaG9pY2VNb2RhbCIgdmFsdWU9IjMiIC8+CiAgICAgICAgIDwvYXR0cj4KICAgICAgICAgPCEtLSBXaGVuIHNldCB0byBmYWxzZSwgdGhlIExpc3RWaWV3IHdpbGwgbm90IGRyYXcgdGhlIGRpdmlkZXIgYWZ0ZXIgZWFjaCBoZWFkZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KQEAgLTIxNTQsNyArMjE5NCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duQW5jaG9yIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGJhc2ljIHdpZHRoIG9mIHRoZSBkcm9wZG93bi4gSXRzIHZhbHVlIG1heQogICAgICAgICAgICAgIGJlIGEgZGltZW5zaW9uIChzdWNoIGFzICIxMmRpcCIpIGZvciBhIGNvbnN0YW50IHdpZHRoLAotICAgICAgICAgICAgIGZpbGxfcGFyZW50IG9yIG1hdGNoX3BhcmVudCB0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIAorICAgICAgICAgICAgIGZpbGxfcGFyZW50IG9yIG1hdGNoX3BhcmVudCB0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlCiAgICAgICAgICAgICAgc2NyZWVuLCBvciB3cmFwX2NvbnRlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mCiAgICAgICAgICAgICAgdGhlIGFuY2hvcmVkIHZpZXcuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bldpZHRoIiBmb3JtYXQ9ImRpbWVuc2lvbiI+CkBAIC0yMTkwLDE0ICsyMjMwLDMzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3RmxpcHBlciI+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZsaXBJbnRlcnZhbCIgZm9ybWF0PSJpbnRlZ2VyIiBtaW49IjAiIC8+CiAgICAgICAgIDwhLS0gV2hlbiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFuaW1hdGluZyAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYXV0b1N0YXJ0IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciI+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgc2hvd24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbkFuaW1hdGlvbiIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgICAgICAgaXMgZmlyc3QgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiPgorICAgICAgICA8YXR0ciBuYW1lPSJmbGlwSW50ZXJ2YWwiIC8+CisgICAgICAgIDwhLS0gV2hlbiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFuaW1hdGluZyAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYXV0b1N0YXJ0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdTd2l0Y2hlciI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU2Nyb2xsVmlldyI+CkBAIC0yMjExLDYgKzIyNzAsMzAgQEAKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIHNwaW5uZXIncyBkaWFsb2cgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9tcHQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERpc3BsYXkgbW9kZSBmb3Igc3Bpbm5lciBvcHRpb25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lck1vZGUiIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhIGRpYWxvZyB3aW5kb3cuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZGlhbG9nIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gU3Bpbm5lciBvcHRpb25zIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIGFuIGlubGluZSBkcm9wZG93bgorICAgICAgICAgICAgICAgICBhbmNob3JlZCB0byB0aGUgc3Bpbm5lciB3aWRnZXQgaXRzZWxmLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIExpc3Qgc2VsZWN0b3IgdG8gdXNlIGZvciBzcGlubmVyTW9kZT0iZHJvcGRvd24iIGRpc3BsYXkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNlbGVjdG9yIiAvPgorICAgICAgICA8IS0tIEJhY2tncm91bmQgZHJhd2FibGUgdG8gdXNlIGZvciB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBWZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgc3Bpbm5lciB3aWRnZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcm9wZG93biBpbgorICAgICAgICAgICAgIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIEhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24KKyAgICAgICAgICAgICBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIFdpZHRoIG9mIHRoZSBkcm9wZG93biBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgLz4KKyAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBsYXlvdXQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IGluIHRoZSBkcm9wZG93biBmb3IKKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiBUaGlzIGxheW91dCBtdXN0IGNvbnRhaW4gYSBUZXh0VmlldyB3aXRoIHRoZSBpZAorICAgICAgICAgICAgIEBhbmRyb2lkOmlkL3RleHQxIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9tcHQgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwUHJvbXB0VmlldyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRGF0ZVBpY2tlciI+CiAgICAgICAgIDwhLS0gVGhlIGZpcnN0IHllYXIgKGluY2x1c2l2ZSksIGZvciBleGFtcGxlICIxOTQwIi4gLS0+CkBAIC0yNTIxLDYgKzI2MDQsMTAgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNaXBtYXBEcmF3YWJsZUl0ZW0iPgorICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJvdGF0ZURyYXdhYmxlIj4KICAgICAgICAgPGF0dHIgbmFtZT0idmlzaWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZnJvbURlZ3JlZXMiIGZvcm1hdD0iZmxvYXQiIC8+CkBAIC0yODQ0LDYgKzI5MzEsNjkgQEAKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBbmltYXRvciI+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgaW50ZXJwb2xhdG9yIHVzZWQgdG8gc21vb3RoIHRoZSBhbmltYXRpb24gbW92ZW1lbnQgaW4gdGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImludGVycG9sYXRvciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHNldCB0byB0cnVlLCBmaWxsQWZ0ZXIgaXMgdGFrZW4gaW50byBhY2NvdW50LiAtLT4KKyAgICAgICAgPCEtLSBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgdGhlIGFuaW1hdGlvbiB0byBydW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkdXJhdGlvbiIgLz4KKyAgICAgICAgPCEtLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhbmltYXRpb24gcnVucywgb25jZSBzdGFydCB0aW1lIGlzIHJlYWNoZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGFydE9mZnNldCIvPgorICAgICAgICA8IS0tIERlZmluZXMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icmVwZWF0Q291bnQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBhbmltYXRpb24gYmVoYXZpb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgYW5kIHRoZSByZXBlYXQgY291bnQgaXMKKyAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMCBvciBpbmZpbml0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmVzdGFydC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdE1vZGUiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBmcm9tLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVGcm9tIiBmb3JtYXQ9ImZsb2F0fGludGVnZXIiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIGFuaW1hdGVzIHRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUbyIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgdmFsdWVGcm9tIGFuZCB2YWx1ZVRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUeXBlIj4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBmbG9hdHMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZmxvYXRUeXBlIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBpbnRlZ2Vycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpbnRUeXBlIiAgIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGRvdWJsZXMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZG91YmxlVHlwZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgY29sb3JzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImNvbG9yVHlwZSIgdmFsdWU9IjMiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgYSBjdXN0b20gdHlwZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjdXN0b21UeXBlIiB2YWx1ZT0iNCIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gUHJvcGVydHlBbmltYXRvciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUHJvcGVydHlBbmltYXRvciI+CisgICAgICAgIDwhLS0gTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwcm9wZXJ0eU5hbWUiIGZvcm1hdD0ic3RyaW5nIi8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFNlcXVlbmNlciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU2VxdWVuY2VyIj4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nIj4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHRvZ2V0aGVyLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRvZ2V0aGVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHNlcXVlbnRpYWxseSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHhtbC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzZXF1ZW50aWFsbHkiIHZhbHVlPSIxIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBTdGF0ZSBhdHRyaWJ1dGVzICAgICAgICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgpAQCAtMzI1Miw2ICszNDAyLDE3IEBACiAgICAgICAgIDwhLS0gV2hldGhlciB0aGUgaXRlbSBpcyBlbmFibGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZW5hYmxlZCIgLz4KIAorICAgICAgICA8IS0tIE5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIENvbnRleHQgdXNlZCB0byBpbmZsYXRlIHRoZSBtZW51IHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgIGNhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIGNsaWNrZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvbkNsaWNrIiAvPgorCisgICAgICAgIDwhLS0gSG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNob3dBc0FjdGlvbiIgZm9ybWF0PSJlbnVtIj4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5ldmVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImlmUm9vbSIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJhbHdheXMiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgpAQCAtMzI2Nyw2ICszNDI4LDE5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEF0dHJpYnV0ZSBmb3IgYSBoZWFkZXIgZGVzY3JpYmluZyB0aGUgaXRlbSBzaG93biBpbiB0aGUgdG9wLWxldmVsIGxpc3QKKyAgICAgICAgIGZyb20gd2hpY2ggdGhlIHNlbGVjdHMgdGhlIHNldCBvZiBwcmVmZXJlbmNlIHRvIGRpZyBpbiB0by4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByZWZlcmVuY2VIZWFkZXIiPgorICAgICAgICA8IS0tIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CisgICAgICAgIDwhLS0gVGhlIHN1bW1hcnkgZm9yIHRoZSBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gQW4gaWNvbiBmb3IgdGhlIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8IS0tIFRoZSBmcmFnbWVudCB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnQiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFdBUk5JTkc6ICBJZiBhZGRpbmcgYXR0cmlidXRlcyB0byBQcmVmZXJlbmNlLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY29uZmxpY3QKICAgICAgICAgICAgICAgICAgICB3aXRoIGEgVmlldydzIGF0dHJpYnV0ZXMuICBTb21lIHN1YmNsYXNzZXMgKGUuZy4sIEVkaXRUZXh0UHJlZmVyZW5jZSkKICAgICAgICAgICAgICAgICAgICBwcm94eSBhbGwgYXR0cmlidXRlcyB0byBpdHMgRWRpdFRleHQgd2lkZ2V0LiAtLT4KQEAgLTMyNzksMTAgKzM0NTMsMTMgQEAKICAgICAgICAgPCEtLSBUaGUgdGl0bGUgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgogICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgLz4KICAgICAgICAgPCEtLSBUaGUgb3JkZXIgZm9yIHRoZSBQcmVmZXJlbmNlIChsb3dlciB2YWx1ZXMgYXJlIHRvIGJlIG9yZGVyZWQgZmlyc3QpLiBJZiB0aGlzIGlzIG5vdAogICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3JkZXJpbiB3aWxsIGJlIGFscGhhYmV0aWMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvcmRlciIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIFdoZW4gdXNlZCBpbnNpZGUgb2YgYSBtb2Rlcm4gUHJlZmVyZW5jZUFjdGl2aXR5LCB0aGlzIGRlY2xhcmVzCisgICAgICAgICAgICAgYSBuZXcgUHJlZmVyZW5jZUZyYWdtZW50IHRvIGJlIHNob3duIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGlzIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudCIgLz4KICAgICAgICAgPCEtLSBUaGUgbGF5b3V0IGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIFRoaXMgc2hvdWxkCiAgICAgICAgICAgICAgcmFyZWx5IG5lZWQgdG8gYmUgY2hhbmdlZCwgbG9vayBhdCB3aWRnZXRMYXlvdXQgaW5zdGVhZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dCIgLz4KQEAgLTMzNTQsNiArMzUzMSwxNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIj4KKyAgICAgICAgPCEtLSBUaGUgaHVtYW4tcmVhZGFibGUgYXJyYXkgdG8gcHJlc2VudCBhcyBhIGxpc3QuIEVhY2ggZW50cnkgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZworICAgICAgICAgICAgIGluZGV4IGluIGVudHJ5VmFsdWVzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZW50cmllcyIgLz4KKyAgICAgICAgPCEtLSBUaGUgYXJyYXkgdG8gZmluZCB0aGUgdmFsdWUgdG8gc2F2ZSBmb3IgYSBwcmVmZXJlbmNlIHdoZW4gYW4gZW50cnkgZnJvbQorICAgICAgICAgICAgIGVudHJpZXMgaXMgc2VsZWN0ZWQuIElmIGEgdXNlciBjbGlja3MgdGhlIHNlY29uZCBpdGVtIGluIGVudHJpZXMsIHRoZQorICAgICAgICAgICAgIHNlY29uZCBpdGVtIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBzYXZlZCB0byB0aGUgcHJlZmVyZW5jZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJ5VmFsdWVzIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIEJhc2UgYXR0cmlidXRlcyBhdmFpbGFibGUgdG8gUmluZ3RvbmVQcmVmZXJlbmNlLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUmluZ3RvbmVQcmVmZXJlbmNlIj4KICAgICAgICAgPCEtLSBXaGljaCByaW5ndG9uZSB0eXBlKHMpIHRvIHNob3cgaW4gdGhlIHBpY2tlci4gLS0+CkBAIC0zNTA1LDcgKzM2OTIsNyBAQAogICAgIDwhLS0gQXBwV2lkZ2V0IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hcHB3aWRnZXQtcHJvdmlkZXI8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBBcHBXaWRnZXQgcHJvdmlkZXIuICBTZWUge0BsaW5rIGFuZHJvaWQuYXBwd2lkZ2V0IGFuZHJvaWQuYXBwd2lkZ2V0fQogICAgICAgICAgcGFja2FnZSBmb3IgbW9yZSBpbmZvLgpAQCAtMzUyMiwxMyArMzcwOSw0OSBAQAogICAgICAgICA8IS0tIEEgY2xhc3MgbmFtZSBpbiB0aGUgQXBwV2lkZ2V0J3MgcGFja2FnZSB0byBiZSBsYXVuY2hlZCB0byBjb25maWd1cmUuCiAgICAgICAgICAgICAgSWYgbm90IHN1cHBsaWVkLCB0aGVuIG5vIGFjdGl2aXR5IHdpbGwgYmUgbGF1bmNoZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJjb25maWd1cmUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAgIAkgICAgIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icHJldmlld0ltYWdlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gQXBwIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmlldyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggPGNvZGU+Jmx0O2ZyYWdtZW50Jmd0OzwvY29kZT4KKyAgICAgICAgIHRhZ3MgaW5zaWRlIG9mIHRoZSBsYXlvdXQgb2YgYW4gQWN0aXZpdHkuICBUaGlzIGluc3RhbnRpYXRlcworICAgICAgICAgdGhlIGdpdmVuIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIGluc2VydHMgaXRzIGNvbnRlbnQKKyAgICAgICAgIHZpZXcgaW50byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnQiPgorICAgICAgICA8IS0tIFN1cHBseSB0aGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGFuIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3LCB0byBsYXRlciByZXRyaWV2ZSBpdAorICAgICAgICAgICAgIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZCBWaWV3LmZpbmRWaWV3QnlJZCgpfSBvcgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5kVmlld0J5SWQgQWN0aXZpdHkuZmluZFZpZXdCeUlkKCl9LgorICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcmVmZXJlbmNlOyB0eXBpY2FsbHkgeW91IHNldCB0aGlzIHVzaW5nIHRoZQorICAgICAgICAgICAgIDxjb2RlPkArPC9jb2RlPiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IElEIHJlc291cmNlcy4KKyAgICAgICAgICAgICBGb3IgZXhhbXBsZTogPGNvZGU+YW5kcm9pZDppZD0iQCtpZC9teV9pZCI8L2NvZGU+IHdoaWNoCisgICAgICAgICAgICAgYWxsb3dzIHlvdSB0byBsYXRlciByZXRyaWV2ZSB0aGUgdmlldworICAgICAgICAgICAgIHdpdGggPGNvZGU+ZmluZFZpZXdCeUlkKFIuaWQubXlfaWQpPC9jb2RlPi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImlkIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGEgdGFnIGZvciB0aGUgdG9wLWxldmVsIHZpZXcgY29udGFpbmluZyBhIFN0cmluZywgdG8gYmUgcmV0cmlldmVkCisgICAgICAgICAgICAgbGF0ZXIgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VGFnIFZpZXcuZ2V0VGFnKCl9IG9yCisgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3V2l0aFRhZworICAgICAgICAgICAgIFZpZXcuZmluZFZpZXdXaXRoVGFnKCl9LiAgSXQgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlCisgICAgICAgICAgICAgSURzICh0aHJvdWdoIHRoZSBhbmRyb2lkOmlkIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZiB0YWdzIGJlY2F1c2UKKyAgICAgICAgICAgICB0aGV5IGFyZSBmYXN0ZXIgYW5kIGFsbG93IGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRhZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBVc2UgPGNvZGU+ZGV2aWNlLWFkbWluPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXJ9LCB3aGljaCBpcwpAQCAtMzU2OCw3ICszNzkxLDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU4OSw3ICszODEyLDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzYwNSw3ICszODI4LDcgQEAKICAgICA8IS0tIENvbnRhY3RzIG1ldGEtZGF0YSBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVE9ETzogcmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBzdHlsZWFibGUuIC0tPgogICAgIDxlYXQtY29tbWVudCAvPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJY29uIj4KQEAgLTM2MzEsNiArMzg1NCw5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbENvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgZGV0YWlsIHNob3VsZCBiZSBidWlsdCBmcm9tIFNvY2lhbFByb3ZpZGVyLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsU29jaWFsU3VtbWFyeSIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgdGVybSAiQWxsIENvbnRhY3RzIiAoZS5nLiAiQWxsIEZyaWVuZHMiIG9yCisgICAgICAgICJBbGwgY29ubmVjdGlvbnMiKS4gT3B0aW9uYWwgKERlZmF1bHQgaXMgIkFsbCBDb250YWN0cyIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMzY2Miw0ICszODg4LDEwNSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBZGFwdGVycyBhdHRyaWJ1dGVzICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQWRhcHRlciB1c2VkIHRvIGJpbmQgY3Vyc29ycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXIiPgorICAgICAgICA8IS0tIFVSSSB0byBnZXQgdGhlIGN1cnNvciBmcm9tLiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InVyaSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU2VsZWN0aW9uIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNlbGVjdGlvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU29ydCBvcmRlciBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzb3J0T3JkZXIiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIExheW91dCByZXNvdXJjZSB1c2VkIHRvIGRpc3BsYXkgZWFjaCByb3cgZnJvbSB0aGUgY3Vyc29yLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIGJpbmQgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX0JpbmRJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHJlc291cmNlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBiaW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0eXBlIHdpbGwgYmUKKyAgICAgICAgICAgICBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSAidG8iIHRhcmdldCB2aWV3LiBNYW5kYXRvcnkuCisKKyAgICAgICAgICAgICBUaGUgdHlwZSBjYW4gYmUgb25lIG9mOgorICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICA8bGk+c3RyaW5nLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLXVyaSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5kcmF3YWJsZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEgZHJhd2FibGUuPC9saT4KKyAgICAgICAgICAgICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSwgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIuPC9saT4KKyAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gc2VsZWN0IGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdC4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX01hcEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb21WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIE1hbmRhdG9yeSBpZiAid2l0aENsYXNzIiBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aEV4cHJlc3Npb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBjbGFzcywgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbi4gTWFuZGF0b3J5IGlmICJ3aXRoRXhwcmVzc2lvbiIKKyAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aENsYXNzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gc3R5bGUgdGhlIEFjdGlvbiBCYXIuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIG5hdmlnYXRpb24gdG8gdXNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiPgorICAgICAgICAgICAgPCEtLSBOb3JtYWwgc3RhdGljIHRpdGxlIHRleHQgLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJub3JtYWwiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIGRyb3AtZG93biBzZWxlY3Rpb24gaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93bkxpc3QiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIHNlcmllcyBvZiBob3Jpem9udGFsIHRhYnMgaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0YWJCYXIiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gT3B0aW9ucyBhZmZlY3RpbmcgaG93IHRoZSBhY3Rpb24gYmFyIGlzIGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpc3BsYXlPcHRpb25zIj4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InVzZUxvZ28iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iaGlkZUhvbWUiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBjb2xvciB1c2VkIHRvIHN0eWxlIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sb3JGaWx0ZXIiIGZvcm1hdD0iY29sb3IiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBzdWJ0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBpY29uLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBsb2dvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIGl0ZW0gZGl2aWRlcnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXZpZGVyIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBsYXlvdXQgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLiBPdmVycmlkZXMgbmF2aWdhdGlvbk1vZGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKaW5kZXggZjE4ZDE0ZS4uYmMxMzBmMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKQEAgLTIzNSw2ICsyMzUsMTAgQEAKICAgICAgICAgIHRoZSBzYWZlIG1vZGUuICAtLT4KICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAKKyAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQgYmUgaGFyZHdhcmUKKyAgICAgICAgIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLiAgLS0+CisgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorCiAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gY29tcG9uZW50IGlzIGF2YWlsYWJsZQogICAgICAgICAgdG8gb3RoZXIgYXBwbGljYXRpb25zLiAgSWYgZmFsc2UsIGl0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5CiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBpdHMgc2FtZSB1c2VyIGlkICh3aGljaCB1c3VhbGx5IG1lYW5zIG9ubHkgYnkKQEAgLTczNCw2ICs3MzgsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZWJ1Z2dhYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgICAgICA8IS0tIE5hbWUgb2YgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgZm9yIG1hbmFnaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNwYWNlIG9uIHRoZSBkZXZpY2UuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJtYW5hZ2VTcGFjZUFjdGl2aXR5IiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJhbGxvd0NsZWFyVXNlckRhdGEiIC8+CkBAIC0xMjA1LDYgKzEyMTAsNyBAQAogICAgICAgICAgICAgIGFueSB2YWx1ZSBpbiB0aGUgdGhlbWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTb2Z0SW5wdXRNb2RlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpbW1lcnNpdmUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICAKICAgICA8IS0tIFRoZSA8Y29kZT5hY3Rpdml0eS1hbGlhczwvY29kZT4gdGFnIGRlY2xhcmVzIGEgbmV3CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggZDU2NWM2OC4uY2YyYjQyMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjIsNyArMjIsOCBAQAogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKICAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj50cnVlPC9ib29sPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiBEZWZpbmVzIHRoZSBzbG90cyBmb3IgdGhlIHJpZ2h0LWhhbmQgc2lkZSBpY29ucy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKICAgICAgICAgIGljb25zIGluIHRoZSBzdGF0dXMgYmFyIHRoYXQgYXJlIG5vdCBub3RpZmljYXRpb25zLiAtLT4KQEAgLTcyLDYgKzczLDEzIEBACiAgICAgICAgICB3aGVuIHRoZXJlJ3Mgbm8gbmV0d29yayBjb25uZWN0aW9uLiBJZiB0aGUgc2NhbiBkb2Vzbid0IHRpbWVvdXQsIHVzZSB6ZXJvIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19yYWRpb1NjYW5uaW5nVGltZW91dCI+MDwvaW50ZWdlcj4KIAorICAgIDwhLS0gU2V0IHRvIHRydWUgaWYgdGhlIGxvY2F0aW9uIHJldHVybmVkIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpCisgICAgICAgICBpcyBhY3R1YWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgIElmIHRoaXMgaXMgc2V0IHRoZW4gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgICAgIE1FRElBX01PVU5URUQgYW5kIEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCB3aWxsIGJlIGJyb2FkY2FzdCBhdCBib290IHRpbWUKKyAgICAgICAgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggYXBwcyB0aGF0IHJlcXVpcmUgZXh0ZXJuYWwgc3RvcmFnZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBYWFhYWCBOT1RFIFRIRSBGT0xMT1dJTkcgUkVTT1VSQ0VTIFVTRSBUSEUgV1JPTkcgTkFNSU5HIENPTlZFTlRJT04uCiAgICAgICAgICBQbGVhc2UgZG9uJ3QgY29weSB0aGVtLCBjb3B5IGFueXRoaW5nIGVsc2UuIC0tPgogCkBAIC05OCw2ICsxMDYsOSBAQAogICAgICAgICA8aXRlbT4iMCwxIjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gVGhlIG1heGltdW0gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgd2UgZXhwZWN0IGEgbmV0d29yayB0cmFuc2l0aW9uIHRvIHRha2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCI+NjAwMDA8L2ludGVnZXI+CisKICAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKICAgICAgICAgIFVTQiBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoaW5nIG92ZXIgVVNCIHRoaXMgc2hvdWxkCiAgICAgICAgICBiZSBlbXB0eS4gIEFuIGV4YW1wbGUgd291bGQgYmUgInVzYi4qIiAtLT4KQEAgLTE5MSw2ICsyMDIsOSBAQAogICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgU0QgY2FyZCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19iYXR0ZXJ5U2RDYXJkQWNjZXNzaWJpbGl0eSI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgVVNCIGhvc3Qgc3VwcG9ydC4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0Ij5mYWxzZTwvYm9vbD4KKwogICAgIDwhLS0gVmlicmF0b3IgcGF0dGVybiBmb3IgZmVlZGJhY2sgYWJvdXQgYSBsb25nIHNjcmVlbi9rZXkgcHJlc3MgLS0+CiAgICAgPGludGVnZXItYXJyYXkgbmFtZT0iY29uZmlnX2xvbmdQcmVzc1ZpYmVQYXR0ZXJuIj4KICAgICAgICAgPGl0ZW0+MDwvaXRlbT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCAxMWYzZTUwLi42NzllNjQyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0yNSw2ICsyNSw5IEBACiAgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhcHBsaWNhdGlvbiBpY29uIHRoYXQKICAgICAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBhcHAgbGF1bmNoZXIgYW5kIGVsc2V3aGVyZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFwcF9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFjdGlvbiBpY29uIHRoYXQgd2lsbAorICAgICAgICAgYmUgZGlzcGxheWVkIGluIGFwcGxpY2F0aW9uIGFjdGlvbiBiYXJzLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iYWN0aW9uX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJ0b2FzdF95X29mZnNldCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+MjVkaXA8L2RpbWVuPgpAQCAtNDIsNCArNDUsNiBAQAogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0Ij41NmRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGNvcnJlY3Rpb24gZm9yIHRoZSBzcGFjZSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9zcGFjZWJhcl92ZXJ0aWNhbF9jb3JyZWN0aW9uIj40ZGlwPC9kaW1lbj4KKyAgICA8IS0tIERpc3RhbmNlIGJldHdlZW4gdGhlIHRleHQgYmFzZSBsaW5lIGFuZCB2aXJ0dWFsIGZpbmdlciBwb3NpdGlvbiB1c2VkIHRvIHBvc2l0aW9uIGN1cnNvciAtLT4KKyAgICA8ZGltZW4gbmFtZT0iY3Vyc29yX2NvbnRyb2xsZXJfdmVydGljYWxfb2Zmc2V0Ij4xMmRwPC9kaW1lbj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCmluZGV4IDhiNmFmNzEuLjMzY2QxMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKQEAgLTU5LDYgKzU5LDcgQEAKICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHkiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJwYXN0ZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHlVcmwiIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InN3aXRjaElucHV0TWV0aG9kIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ia2V5Ym9hcmRWaWV3IiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY2xvc2VCdXR0b24iIC8+CkBAIC02OCw0ICs2OSw1IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJhY2NvdW50UHJlZmVyZW5jZXMiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzbWFsbEljb24iIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggYmQ2NWZlZS4uOTkyNjNkNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTE4Myw3ICsxMTgzLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2xvckJhY2tncm91bmRDYWNoZUhpbnQiIGlkPSIweDAxMDEwMmFiIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWMiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWQiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlciIgaWQ9IjB4MDEwMzAwNWUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyIiBpZD0iMHgwMTAzMDA1ZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIgaWQ9IjB4MDEwMzAwNjAiIC8+CkBAIC0xMTkxLDcgKzExOTEsNyBAQAogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5XYWxscGFwZXJTZXR0aW5ncyIgaWQ9IjB4MDEwMzAwNjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5UaXRsZSIgaWQ9IjB4MDEwMzAwNjMiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAwNjQiIC8+Ci0gIAorCiAgIDwhLS0gU2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBwbGFjaW5nIGEgZGFyawogICAgICAgIHRoZW1lZCBVSSBvbiB0b3Agb2Ygc29tZSBhcmJpdHJhcnkgYmFja2dyb3VuZCAoc3VjaCBhcyB0aGUKICAgICAgICB3YWxscGFwZXIpLiAgVGhpcyBkYXJrZW5zIHRoZSBiYWNrZ3JvdW5kIHN1ZmZpY2llbnRseSB0aGF0IHRoZSBVSQpAQCAtMTE5OSw3ICsxMTk5LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFya190cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYTkiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0X3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhYSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9ub3RpZnlfc2RjYXJkX3ByZXBhcmUiIGlkPSIweDAxMDgwMGFiIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNiBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciAyLjAuMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMTEsNyArMTIxMSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiIGlkPSIweDAxMDEwMmIxIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSIgaWQ9IjB4MDEwMTAyYjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGlkPSIweDAxMDEwMmIzIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNyBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dGhvciIgaWQ9IjB4MDEwMTAyYjQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0b1N0YXJ0IiBpZD0iMHgwMTAxMDJiNSIgLz4KIAotICAgIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA4IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMikuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyNDEsMTkgKzEyNDEsMTkgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0YWJTdHJpcEVuYWJsZWQiIGlkPSIweDAxMDEwMmJkIiAvPgogCiAgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgaWQ9IjB4MDEwMjAwMmIiIC8+Ci0gICAgCisKICAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJjeWNsZV9pbnRlcnBvbGF0b3IiIGlkPSIweDAxMGEwMDBjIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXNvdXJjZXMgaW50cm9kdWNlZCBpbiBrcmFrZW4uCisgICAgIFJlc291cmNlcyBpbnRyb2R1Y2VkIGluIEdpbmdlcmJyZWFkLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgIAorICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb2dvIiBpZD0iMHgwMTAxMDJiZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ4bGFyZ2VTY3JlZW5zIiBpZD0iMHgwMTAxMDJiZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoZWF2eVdlaWdodCIgaWQ9IjB4MDEwMTAyYzAiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1tZXJzaXZlIiBpZD0iMHgwMTAxMDJjMSIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImF0dHIiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTAxMDMwMCIgLz4KLSAgCisKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImlkIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMjAwNDAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhbmltIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwYTAwMjAiIC8+CiAKQEAgLTEyNjMsOSArMTI2Myw5IEBACiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX3ZpZGVvX29ubGluZSIgaWQ9IjB4MDEwODAwYWUiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX2F3YXkiIGlkPSIweDAxMDgwMGFmIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19idXN5IiBpZD0iMHgwMTA4MDBiMCIgLz4KLSAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fb25saW5lIiBpZD0iMHgwMTA4MDBiMSIgLz4gIAorICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19vbmxpbmUiIGlkPSIweDAxMDgwMGIxIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iZHJhd2FibGUiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA4MDEwMCIgLz4KLSAgCisKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9InN0eWxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMzAwOTAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJzdHJpbmciIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA0MDAyMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImludGVnZXIiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTBlMDAxMCIgLz4KQEAgLTEyNzQsNCArMTI3NCw2NSBAQAogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iY29sb3IiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA2MDAyMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFycmF5IiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNzAwMTAiIC8+CiAKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlc291cmNlcyBwcm9wb3NlZCBmb3IgSG9uZXljb21iLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxlYXQtY29tbWVudCAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFkYXB0ZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2VsZWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNvcnRPcmRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ1cmkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0byIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG9WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW4iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aEV4cHJlc3Npb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aENsYXNzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZGlzcGxheU9wdGlvbnMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzaG93QXNBY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwcmV2aWV3SW1hZ2UiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVGcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlVG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUeXBlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByb3BlcnR5TmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvcmRlcmluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudCIgLz4KKworICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgorICA8IS0tIENvbnRleHQgbWVudSBJRCBmb3IgdGhlICJTZWxlY3QgdGV4dC4uLiIgbWVudSBpdGVtIHRvIHN3aXRjaCB0byB0ZXh0CisgICAgICAgc2VsZWN0aW9uIGNvbnRleHQgbW9kZSBpbiB0ZXh0IHZpZXdzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkRpYWxvZy5Ob0ZyYW1lIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ob1RpdGxlQmFyLk92ZXJsYXlBY3Rpb25Nb2RlcyIgLz4KKworICA8IS0tIFN0YW5kYXJkIGNvbnRlbnQgdmlldyBmb3IgYSB7QGxpbmsgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50fS4KKyAgICAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIHN1YmNsYXNzIG9mIExpc3RGcmFnbWVudCB3aXRoIHlvdXIKKyAgICAgICBvd24gY3VzdG9taXplZCBjb250ZW50LCB5b3UgY2FuIGluY2x1ZGUgdGhpcyBsYXlvdXQgaW4gdGhhdAorICAgICAgIGNvbnRlbnQgdG8gc3RpbGwgcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZSBiYXNlIGNsYXNzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9Imxpc3RfY29udGVudCIgLz4KKworICA8cHVibGljIHR5cGU9InN0cmluZyIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIGlkPSIweDAxMDQwMDMwIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA2MmZkMTY5Li4wMGViZTJiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTEyNTIsNiArMTI1MiwxMSBAQAogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPlBlcmZvcm0gYSBmYWN0b3J5IHJlc2V0LCBkZWxldGluZwogICAgICAgICBhbGwgb2YgeW91ciBkYXRhIHdpdGhvdXQgYW55IGNvbmZpcm1hdGlvbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5PC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5CisgICAgICAgIHRvIGJlIHVzZWQgd2hpbGUgcG9saWN5IGlzIGVuYWJsZWQuIE9ubHkgdGhlIGZpcnN0IGRldmljZSBhZG1pbgorICAgICAgICBzZXRzIHRoZSBlZmZlY3RpdmUgZ2xvYmFsIHByb3h5Ljwvc3RyaW5nPgogCiAgICAgPCEtLSBUaGUgb3JkZXIgb2YgdGhlc2UgaXMgaW1wb3J0YW50LCBkb24ndCByZW9yZGVyIHdpdGhvdXQgY2hhbmdpbmcgQ29udGFjdHMuamF2YSAtLT4gPHNraXAgLz4KICAgICA8IS0tIFBob25lIG51bWJlciB0eXBlcyBmcm9tIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuIFRoaXMgY291bGQgYmUgdXNlZCB3aGVuIGFkZGluZyBhIG5ldyBwaG9uZSBudW1iZXIgZm9yIGEgY29udGFjdCwgZm9yIGV4YW1wbGUuIC0tPgpAQCAtMTQyMSwyMCArMTQyNiwxOCBAQAogICAgIDwhLS0gQ3VzdG9tIG9yZ2FuaXphdGlvbiB0eXBlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSI+Q3VzdG9tPC9zdHJpbmc+CiAKLSAgICA8IS0tIEF0dGJ1dGlvbiBvZiBhIGNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSwgd2hlbiB0aGUgdGltZSBvZiB1cGRhdGUgaXMgdW5rbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiI+dmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgotCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIGtub3duIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSI+PHhsaWZmOmcgaWQ9ImRhdGUiIGV4YW1wbGU9IjMgaG91cnMgYWdvIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9InNvdXJjZSIgZXhhbXBsZT0iR29vZ2xlIFRhbGsiPiUyJHM8L3hsaWZmOmc+PC9zdHJpbmc+Ci0KICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIFNJTSBQSU4gdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIj5FbnRlciBQSU4gY29kZTwvc3RyaW5nPgogCi0gICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIHRleHQgcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiPkVudGVyIHBhc3N3b3JkIHRvIHVubG9jazwvc3RyaW5nPgogCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIj5FbnRlciBQSU4gdG8gdW5sb2NrPC9zdHJpbmc+CisKICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRoYXQgdGhleSBlbnRlcmVkIHRoZSB3cm9uZyBwaW4gd2hpbGUgdHJ5aW5nCiAgICAgICAgICB0byB1bmxvY2sgdGhlIGtleWd1YXJkLiAgRGlzcGxheWVkIGluIG9uZSBsaW5lIGluIGEgbGFyZ2UgZm9udC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiPkluY29ycmVjdCBQSU4gY29kZSE8L3N0cmluZz4KQEAgLTE0NzEsNiArMTQ3NCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCI+Q29ycmVjdCE8L3N0cmluZz4KICAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGF0dGVybiBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhdHRlcm4gYW5kIG11c3QgdHJ5IGFnYWluLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgorICAgIDwhLS0gT24gdGhlIHVubG9jayBwYXNzd29yZCBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhc3N3b3JkIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIj5Tb3JyeSwgdHJ5IGFnYWluPC9zdHJpbmc+CiAKICAgICA8IS0tIFdoZW4gdGhlIGxvY2sgc2NyZWVuIGlzIHNob3dpbmcgYW5kIHRoZSBwaG9uZSBwbHVnZ2VkIGluLCBhbmQgdGhlIGJhdHRlcnkKICAgICAgICAgIGlzIG5vdCBmdWxseSBjaGFyZ2VkLCBzaG93IHRoZSBjdXJyZW50IGNoYXJnZSAlLiAgLS0+CkBAIC0xNTE0LDEyICsxNTE5LDI3IEBACiAgICAgICAgICBwcm9ncmVzcyBkaWFsb2cgaW4gdGhlIG1lYW50aW1lLiAgdGhpcyBpcyB0aGUgZW1zc2FnZS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiPlVubG9ja2luZyBTSU0gY2FyZFx1MjAyNjwvc3RyaW5nPgogCi0gICAgPCEtLSBGb3IgdGhlIHVubG9jayBzY3JlZW4sIEluZm9ybWF0aW9uIG1lc3NhZ2Ugc2hvd24gaW4gZGlhbG9nIHdoZW4gdXNlciBoYXMgdG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzIC0tPgorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZHJhd2luZyB0aGUgdW5sb2NrIHBhdHRlcm4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CiAgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgogICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KICAgICA8L3N0cmluZz4KIAorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIHBhc3N3b3JkIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgcGFzc3dvcmQgPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIFBJTiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CisgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGVudGVyZWQgeW91ciBQSU4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKwogICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaXMgYWxtb3N0IGF0IHRoZSBsaW1pdAogICAgICAgICAgd2hlcmUgdGhleSB3aWxsIGJlIGxvY2tlZCBvdXQgYW5kIG1heSBoYXZlIHRvIGVudGVyIGFuIGFsdGVybmF0ZSB1c2VybmFtZS9wYXNzd29yZCB0byB1bmxvY2sgdGhlIHBob25lIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiI+CkBAIC0xNTg5LDggKzE2MDksMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X3JlYm9vdCI+UmVib290PC9zdHJpbmc+CiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgotICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjx4bGlmZjpnIGlkPSJ4Ij5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgJXMpCi0gICAgICAgIEFwcGxlV2ViS2l0LzUzMy4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzMuMTwveGxpZmY6Zz48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IDx4bGlmZjpnIGlkPSJ4Ij5BbmRyb2lkICVzPC94bGlmZjpnPikKKyAgICAgICAgQXBwbGVXZWJLaXQvNTM0LjUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCA8eGxpZmY6ZyBpZD0ibW9iaWxlIj4lczwveGxpZmY6Zz5TYWZhcmkvNTM0LjU8L3N0cmluZz4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgZm9yIGEgSmF2YVNjcmlwdCBkaWFsb2cuICJUaGUgcGFnZSBhdCA8dXJsIG9mIGN1cnJlbnQgcGFnZT4gc2F5czoiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX3RpdGxlIj5UaGUgcGFnZSBhdCBcJzx4bGlmZjpnIGlkPSJ0aXRsZSI+JXM8L3hsaWZmOmc+XCcgc2F5czo8L3N0cmluZz4KQEAgLTE4NTMsMzkgKzE4NzUsMjkgQEAKICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhbGwgdGV4dCBpbiB0aGUgZWRpdCBmaWVsZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiPlNlbGVjdCBhbGw8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW5nIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCI+U2VsZWN0IHRleHQ8L3N0cmluZz4KLQotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW5nIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiPlN0b3Agc2VsZWN0aW5nIHRleHQ8L3N0cmluZz4KLQogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuICBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIGN1dCBzZWxlY3RlZCB0aGUgdGV4dCBpbnRvIHRoZSBjbGlwYm9hcmQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCI+Q3V0PC9zdHJpbmc+CiAKLSAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIGN1dCBhbGwgdGhlIHRleHQgaW50byB0aGUgY2xpcGJvYXJkLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImN1dEFsbCI+Q3V0IGFsbDwvc3RyaW5nPgotCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBjdXQgc2VsZWN0ZWQgdGhlIHRleHQgaW50byB0aGUgY2xpcGJvYXJkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiPkNvcHk8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY29weSBhbGwgdGhlIHRleHQgaW50byB0aGUgY2xpcGJvYXJkLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvcHlBbGwiPkNvcHkgYWxsPC9zdHJpbmc+Ci0KICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHQgbyBwYXN0ZSBmcm9tIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgZWlkdCBmaWVsZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIj5QYXN0ZTwvc3RyaW5nPgogCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBjb3B5IGEgVVJMIGZyb20gdGhlIGVkaXQgZmllbGQgaW50byB0aGUgY2xpcGJvYXJkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiPkNvcHkgVVJMPC9zdHJpbmc+CiAKKyAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBBZGRlZCBvbmx5IHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBub3QgZW1wdHksIGl0IGVuYWJsZSBzZWxlY3Rpb24gY29udGV4dCBtb2RlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIj5TZWxlY3QgdGV4dC4uLjwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHNlbGVjdGlvbiBjb250ZXh0dWFsIG1vZGUgdGl0bGUsIGRpc3BsYXllZCBpbiB0aGUgQ0FCLi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiPlRleHQgc2VsZWN0aW9uPC9zdHJpbmc+CisKICAgICA8IS0tIEVkaXRUZXh0IGNvbnRleHQgbWVudSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIj5JbnB1dCBtZXRob2Q8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUsIHVzZWQgdG8gYWRkIGEgd29yZCB0byB0aGUKLSAgICAgICAgIGlucHV0IG1ldGhvZCBkaWN0aW9uYXJ5LiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSI+IkFkZCBcIjx4bGlmZjpnIGlkPSJ3b3JkIiBleGFtcGxlPSJyaWNrcm9sbCI+JXM8L3hsaWZmOmc+XCIgdG8gZGljdGlvbmFyeTwvc3RyaW5nPgotCiAgICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiPkVkaXQgdGV4dDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiPlRleHQgYWN0aW9uczwvc3RyaW5nPgogCiAgICAgPCEtLSBJZiB0aGUgZGV2aWNlIGlzIGdldHRpbmcgbG93IG9uIGludGVybmFsIHN0b3JhZ2UsIGEgbm90aWZpY2F0aW9uIGlzIHNob3duIHRvIHRoZSB1c2VyLiAgVGhpcyBpcyB0aGUgdGl0bGUgb2YgdGhhdCBub3RpZmljYXRpb24uIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSI+TG93IG9uIHNwYWNlPC9zdHJpbmc+CkBAIC0xOTA0LDYgKzE5MTYsOSBAQAogICAgICAgICAgY29tYmluZWQgd2l0aCBzZXRJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19kaWFsb2dfYWxlcnQpIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIj5BdHRlbnRpb248L3N0cmluZz4KIAorICAgIDwhLS0gVGV4dCBzaG93biBieSBsaXN0IGZyYWdtZW50IHdoZW4gd2FpdGluZyBmb3IgZGF0YSB0byBkaXNwbGF5LiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciPkxvYWRpbmcuLi48L3N0cmluZz4KKyAgICAKICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iPk9OPC9zdHJpbmc+CiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CkBAIC0yMjQyLDE3ICsyMjU3LDEzIEBACiAgICAgPCEtLSBMb2NhbGl6ZWQgc3RyaW5ncyBmb3IgV2ViVmlldyAtLT4KICAgICA8IS0tIExhYmVsIGZvciBidXR0b24gaW4gYSBXZWJWaWV3IHRoYXQgd2lsbCBvcGVuIGEgY2hvb3NlciB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIj5DaG9vc2UgZmlsZTwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBjb250cm9sIHdoZW4gbm8gZmlsZSBoYXMgYmVlbiBjaG9zZW4geWV0IC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iPk5vIGZpbGUgY2hvc2VuPC9zdHJpbmc+CiAgICAgPCEtLSBMYWJlbCBmb3IgPGlucHV0IHR5cGU9InJlc2V0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCI+UmVzZXQ8L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0ic3VibWl0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiPlN1Ym1pdDwvc3RyaW5nPgogCi0gICAgPCEtLSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgU3Rhci9GYXZvcml0ZSBjaGVja2JveAotCi0gICAgICAgICBVc2VkIGJ5IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHRvIGFubm91bmNlIHRoZSBwdXJwb3NlIG9mIHRoZSB2aWV3LgotICAgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciI+ZmF2b3JpdGU8L3N0cmluZz4KLQogICAgIDwhLS0gU3RyaW5ncyBmb3IgY2FyIG1vZGUgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiBjYXIgbW9kZSBpcyBlbmFibGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiPkNhciBtb2RlIGVuYWJsZWQ8L3N0cmluZz4KQEAgLTIyNjMsNiArMjI3NCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIj5UZXRoZXJpbmcgb3IgaG90c3BvdCBhY3RpdmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5Ub3VjaCB0byBjb25maWd1cmU8L3N0cmluZz4KIAorICAgIDwhLS0gIFN0cmluZ3MgZm9yIHBvc3NpYmxlIFByZWZlcmVuY2VBY3Rpdml0eSBCYWNrL05leHQgYnV0dG9ucyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIj5CYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCI+TmV4dDwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciB0aHJvdHRsaW5nIG5vdGlmaWNhdGlvbiAtLT4KICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXIgaXMgaW4gZGFuZ2VyIG9mIGJlaW5nIHRocm90dGxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIj5IaWdoIG1vYmlsZSBkYXRhIHVzZTwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IDAyYTYwMWEuLmUwZGMzYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTI3OSwxMSArMjc5LDIxIEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uQ2hlY2tCb3guSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2xhYmVsX2JhY2tncm91bmRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2tfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19sYWJlbF9iYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uLkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19sYWJlbF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9zdGFyX2xhYmVsX2JhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fc3RhcjwvaXRlbT4KQEAgLTQ1OCw2ICs0NjgsMTggQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kcm9wZG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRpYWxvZzwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4tMTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZHJvcGRvd248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KQEAgLTU3NCw2ICs1OTYsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3F1aWNrY29udGFjdF9iYWRnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRDZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19jb250YWN0X3BpY3R1cmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwiPgpAQCAtNjEzLDcgKzYzNiw3IEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4jRkZGRjkyMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4jRDA3N0ExNEI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+IzVDNUNGRjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTZzcDwvaXRlbT4KQEAgLTg2MSw0ICs4ODQsMTQgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nQm90dG9tIj4xZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXI8L2l0ZW0+CiAgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXNwbGF5T3B0aW9ucyI+dXNlTG9nbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXI8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggZDU4NWQ5ZS4uMzM0OGI0ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtODQsOSArODQsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvcjwvaXRlbT4gICAKLSAgICAgICAgCi0JCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KLSAgICAJPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+ICAgIAorCisJCSAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPgogCiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ij40MGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ij4KQEAgLTExNSw2ICsxMTUsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGVCYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uQWN0aXZpdHk8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZSI+c3RhdGVVbnNwZWNpZmllZHxhZGp1c3RVbnNwZWNpZmllZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWN0aW9uQmFyPC9pdGVtPgogCiAgICAgICAgIDwhLS0gRGlhbG9nIGF0dHJpYnV0ZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FsZXJ0RGlhbG9nPC9pdGVtPgpAQCAtMTU3LDggKzE2MCw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbFRpdGxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgotCSAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4gCisJCSAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KKwkgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2Vla0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Vla0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlSW5kaWNhdG9yIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUmF0aW5nQmFyLkluZGljYXRvcjwvaXRlbT4KQEAgLTE2Nyw2ICsxNzAsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQnV0dG9uPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0YWJXaWRnZXRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3PC9pdGVtPgpAQCAtMTk4LDYgKzIwNCwxMSBAQAogCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfd2lkZ2V0X2NvcnB1c19pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBkZWZhdWx0IChkYXJrKSB0aGVtZSB3aXRoIG5vIHRpdGxlIGJhciAtLT4KQEAgLTI0MiwxOCArMjUzLDI0IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrSW52ZXJzZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfZGFyazwvaXRlbT4KIAorICAgICAgICA8IS0tIExpc3QgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19saWdodDwvaXRlbT4KKworICAgICAgICA8IS0tIFdpZGdldCBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNoZWNrYm94U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5DaGVja0JveC5JbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlT3ZlcmxheVZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkdlc3R1cmVPdmVybGF5Vmlldy5XaGl0ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXcuV2hpdGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5MaXN0Vmlldy5XaGl0ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXIiPkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3IuV2hpdGU8L2l0ZW0+Ci0gICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0JhcjwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+IAorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+CisJCSAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhZGlvQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5SYWRpb0J1dHRvbi5JbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBsaWdodCB0aGVtZSB3aXRoIG5vIHRpdGxlIGJhciAtLT4KQEAgLTQxNiwxMyArNDMzLDI1IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8IS0tIFZhcmlhdGlvbiBvZiBUaGVtZS5EaWFsb2cgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgZnJhbWUgKG9yIGJhY2tncm91bmQpLgorICAgICAgICAgVGhlIHZpZXcgaGllcmFyY2h5IG9mIHRoZSBkaWFsb2cgaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgYWxsIG9mCisgICAgICAgICBpdHMgcGl4ZWxzLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0lzVHJhbnNsdWNlbnQiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPCEtLSBEZWZhdWx0IHRoZW1lIGZvciBhbGVydCBkaWFsb2cgd2luZG93cywgd2hpY2ggaXMgdXNlZCBieSB0aGUKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BbGVydERpYWxvZ30gY2xhc3MuICBUaGlzIGlzIGJhc2ljYWxseSBhIGRpYWxvZwogICAgICAgICAgYnV0IHNldHMgdGhlIGJhY2tncm91bmQgdG8gZW1wdHkgc28gaXQgY2FuIGRvIHR3by10b25lIGJhY2tncm91bmRzLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLkFsZXJ0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0RpYWxvZ1dpbmRvd1RpdGxlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dJc0Zsb2F0aW5nIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTUyMSw1ICs1NTAsMTUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlJlY2VudEFwcGxpY2F0aW9uczwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZm9jdXM8L2l0ZW0+CiAgICAgPC9zdHlsZT4KLSAgICAKKworICAgIDwhLS0gRGVmYXVsdCB0aGVtZSB3aXRoIGFuIEFjdGlvbiBCYXIuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTm8gdGl0bGUgYmFyLCBidXQgQWN0aW9uIE1vZGUgYmFycyB3aWxsIG92ZXJsYXkgYXBwbGljYXRpb24gY29udGVudAorICAgICAgICAgaW5zdGVhZCBvZiBwdXNoaW5nIGl0IGRvd24gdG8gbWFrZSByb29tLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTm9UaXRsZUJhci5PdmVybGF5QWN0aW9uTW9kZXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKaW5kZXggZTNmMTYxMi4uYmRkOGFmYiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKQEAgLTI0LDMwICsyNCwzNyBAQAogICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKICAgICA+CiAKLSAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ5IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ5IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMSIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMiIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUxIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUxIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMyIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW00IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNCIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUzIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNSIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU0IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU0IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNiIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW03IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU1IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNyIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU2IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOCIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU3IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU3IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOSIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTBfbm9fcGx1cyIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgotICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCi0gICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiA8L0tleWJvYXJkPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAppbmRleCAxNGE3ZWM4Li45OTAxNTI2IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbApAQCAtMjUsNyArMjUsNyBAQAogICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIyIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMyIvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAppbmRleCA0Yjg0ZjRiLi41YjczOTE0IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbApAQCAtMjUsNyArMjUsNyBAQAogICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifiIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJgIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifCIvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzAwMmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46O0FcO0JcXDtDXFxcOztEO1w6RTtcXFxcOw0KLUZOOkE7QlxDXDtEOkVcXA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNGUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46R3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1Rhbw0KLUZOOkpvZSBEdWUNCi1PUkc6R3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuXDtNYW5hZ2VyO0Zpc2gga2VlcGVyDQotUk9MRTpGaXNoIENha2UgS2VlcGVyIQ0KLVgtQ0xBU1M6UFVCTElDDQotVElUTEU6U2hyaW1wIE1hbg0KLVRFTDtXT1JLO1ZPSUNFOigxMTEpIDU1NS0xMjEyDQotVEVMO0hPTUU7Vk9JQ0U6KDQwNCkgNTU1LTEyMTINCi1URUw7Q0VMTDowMzExMTExMTExDQotVEVMO1ZJREVPOjAzMjIyMjIyMjINCi1URUw7Vk9JQ0U6MDMzMzMzMzMzMw0KLUFEUjtXT1JLOjs7MTAwIFdhdGVycyBFZGdlO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7V09SSztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjEwMCBXYXRlcnMgRWRnZT0wRD0wQUJheXRvd24sIExBIDMwMzE0PTBEPTBBVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUFEUjtIT01FOjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtIT01FO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6NDIgUGxhbnRhdGlvbiBTdC49MEQ9MEE9DQotQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEE9DQotVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUVNQUlMO1BSRUY7SU5URVJORVQ6Zm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20NCi1FTUFJTDtDRUxMOmNlbGxAZXhhbXBsZS5jb20NCi1OT1RFOlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1Lg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpOb3cncyB0aGUgdGltZSA9DQotZm9yIGFsbCBmb2xrIHRvIGNvbWU9DQotIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4NCi0NCi1QSE9UTztFTkNPRElORz1CQVNFNjQ7VFlQRT1KUEVHOg0KLSAvOWovNFFvUFJYaHBaZ0FBVFUwQUtnQUFBQWdBRFFFT0FBSUFBQUFQQUFBQXFnRVBBQUlBQUFBSEFBQUF1Z0VRQUFJQUFBQUcNCi0gQUFBQXdnRVNBQU1BQUFBQkFBRUFBQUVhQUFVQUFBQUJBQUFBeUFFYkFBVUFBQUFCQUFBQTBBRW9BQU1BQUFBQkFBSUFBQUV4DQotIEFBSUFBQUFPQUFBQTJBRXlBQUlBQUFBVUFBQUE1Z0lUQUFNQUFBQUJBQUVBQUlLWUFBSUFBQUFPQUFBQStvZHBBQVFBQUFBQg0KLSBBQUFCaE1TbEFBY0FBQUI4QUFBQkNBQUFCQjR5TURBNE1UQXlPVEV6TlRVek1RQUFSRzlEYjAxdkFBQkVPVEExYVFBQUFBQkkNCi0gQUFBQUFRQUFBRWdBQUFBQlJEa3dOV2tnVm1WeU1TNHdNQUF5TURBNE9qRXdPakk1SURFek9qVTFPalEzQUNBZ0lDQWdJQ0FnDQotIElDQWdJQ0FBVUhKcGJuUkpUUUF3TXpBd0FBQUFCZ0FCQUJRQUZBQUNBUUFBQUFBREFBQUFOQUVBQlFBQUFBRUJBUUFBQUFFUQ0KLSBnQUFBQUFBQUVRa0FBQ2NRQUFBUEN3QUFKeEFBQUFXWEFBQW5FQUFBQ0xBQUFDY1FBQUFjQVFBQUp4QUFBQUplQUFBbkVBQUENCi0gQUlzQUFDY1FBQUFEeXdBQUp4QUFBQnZsQUFBbkVBQW9ncG9BQlFBQUFBRUFBQU5xZ3AwQUJRQUFBQUVBQUFOeWlDSUFBd0FBDQotIEFBRUFBZ0FBa0FBQUJ3QUFBQVF3TWpJd2tBTUFBZ0FBQUJRQUFBTjZrQVFBQWdBQUFCUUFBQU9Pa1FFQUJ3QUFBQVFCQWdNQQ0KLSBrUUlBQlFBQUFBRUFBQU9pa2dFQUNnQUFBQUVBQUFPcWtnSUFCUUFBQUFFQUFBT3lrZ1FBQ2dBQUFBRUFBQU82a2dVQUJRQUENCi0gQUFFQUFBUENrZ2NBQXdBQUFBRUFBZ0FBa2dnQUF3QUFBQUVBQUFBQWtna0FBd0FBQUFFQUFBQUFrZ29BQlFBQUFBRUFBQVBLDQotIGtud0FCd0FBQUFFQUFBQUFrb1lBQndBQUFCWUFBQVBTb0FBQUJ3QUFBQVF3TVRBd29BRUFBd0FBQUFFQUFRQUFvQUlBQXdBQQ0KLSBBQUVBWUFBQW9BTUFBd0FBQUFFQVNBQUFvQVVBQkFBQUFBRUFBQVFBb2c0QUJRQUFBQUVBQUFQb29nOEFCUUFBQUFFQUFBUHcNCi0gb2hBQUF3QUFBQUVBQWdBQW9oY0FBd0FBQUFFQUFnQUFvd0FBQndBQUFBRURBQUFBb3dFQUJ3QUFBQUVCQUFBQXBBRUFBd0FBDQotIEFBRUFBQUFBcEFJQUF3QUFBQUVBQUFBQXBBTUFBd0FBQUFFQUFBQUFwQVFBQlFBQUFBRUFBQVA0cEFVQUF3QUFBQUVBSFFBQQ0KLSBwQVlBQXdBQUFBRUFBQUFBcEFjQUF3QUFBQUVBQUFBQXBBZ0FBd0FBQUFFQUFBQUFwQWtBQXdBQUFBRUFBQUFBcEFvQUF3QUENCi0gQUFFQUFBQUFwQXdBQXdBQUFBRUFBZ0FBQUFBQUFBQUFBRk1BQUNjUUFBQUJYZ0FBQUdReU1EQTRPakV3T2pJNUlERXpPalUxDQotIE9qTXhBREl3TURnNk1UQTZNamtnTVRNNk5UVTZORGNBQUFBcGlBQUFHd0FBQUFLeUFBQUFaQUFBQVY0QUFBQmtBQUFBQUFBQQ0KLSBBR1FBQUFBbEFBQUFDZ0FBRHBJQUFBUG9BQUFBQUFBQUFBQXlNREE0TVRBeU9URXpOVFV6TVFBQUlDb0FBQUFLQUFBcTRnQUENCi0gQUFvQUFBQUFBQUFBQVFBQ0FBRUFBZ0FBQUFSU09UZ0FBQUlBQndBQUFBUXdNVEF3QUFBQUFBQUdBUU1BQXdBQUFBRUFCZ0FBDQotIEFSb0FCUUFBQUFFQUFBUnNBUnNBQlFBQUFBRUFBQVIwQVNnQUF3QUFBQUVBQWdBQUFnRUFCQUFBQUFFQUFBUjhBZ0lBQkFBQQ0KLSBBQUVBQUFXTEFBQUFBQUFBQUVnQUFBQUJBQUFBU0FBQUFBSC8yUC9iQUlRQUlCWVlIQmdVSUJ3YUhDUWlJQ1l3VURRd0xDd3cNCi0gWWtaS09sQjBabnA0Y21ad2JvQ1F1SnlBaUs2S2JuQ2cycUt1dnNUTzBNNThtdUx5NE1qd3VNck94Z0VpSkNRd0tqQmVORFJlDQotIHhvUndoTWJHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiRw0KLSAvOEFBRVFnQWVBQ2dBd0VoQUFJUkFRTVJBZi9FQWFJQUFBRUZBUUVCQVFFQkFBQUFBQUFBQUFBQkFnTUVCUVlIQ0FrS0N4QUENCi0gQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLDQotIEZoY1lHUm9sSmljb0tTbzBOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDRlWHFEaElXRw0KLSBoNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGwNCi0gNXVmbzZlcng4dlAwOWZiMytQbjZBUUFEQVFFQkFRRUJBUUVCQUFBQUFBQUFBUUlEQkFVR0J3Z0pDZ3NSQUFJQkFnUUVBd1FIDQotIEJRUUVBQUVDZHdBQkFnTVJCQVVoTVFZU1FWRUhZWEVUSWpLQkNCUkNrYUd4d1Frak0xTHdGV0p5MFFvV0pEVGhKZkVYR0JrYQ0KLSBKaWNvS1NvMU5qYzRPVHBEUkVWR1IwaEpTbE5VVlZaWFdGbGFZMlJsWm1kb2FXcHpkSFYyZDNoNWVvS0RoSVdHaDRpSmlwS1QNCi0gbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUxqNU9YbTUranA2dkx6DQotIDlQWDI5L2o1K3YvYUFBd0RBUUFDRVFNUkFEOEFGRlNxS2taSW9xUlZwZ1NLS2VCVEVPQXB3RkFEc1VZcGdJUlNFVUFOSXBwRg0KLSBJQ05oVVRDZ0NNaW8yRklDSmhVTENnQzBvcVZhQUpGRlNxS0JrZ0ZPQXBpSENuQ2dCMktNVUNFTkpRQTBpbUVVREdNS2lZVUENCi0gUnRVYlVnSVdxSmhRQlpTcEZvQWxXcFZvR1BGUEZNUTd0U0syT0RRQTR5S085SG1LZTlGeEF6REhGSU9sQUFhWWFBR05VVFVEDQotIEltcU5xUUVUVkUxQUU2VktLQUpGTlNxYUFIZzA4R21BTklGRlFNNVk1cUpNQnVUNjBaTlFJY3JrVllTUU1LdUxHS2FhYXNReA0KLSBxaWFnWkUxUnRTQWphb21vQWtRMUtwb0FsVTFJcG9Ba1UwN09CVEFyTys1cWtWMTJZNzFsZlVCbWFLa0NSU3V6bnJURmJhMmENCi0gb0N3R3lNMEUxcUlqWTFHeG9HUk5VWk5JQ05xaWFnQnlHcGxOQUVpbXBGTk1CNFlEdlN1Y3B4U1lFSVUwNEthenNBdTFxQXJVDQotIFdFTHRQcFRTcG9zQk5FVHQ1cHhOYW9DTmpVYkdnQ05qVVpvR1J0VVRVZ0ZVMUtwb0FrQnFRSGlnQ0ZuTzdyVXFPZGxacDZnQQ0KLSBjK3RPRG4xcFhBWHpENjBlWWZXbmNRdm1OU0dRMDdnT01oQ1ZFSkd6MXB0Z1M1eUtZeHF3R0UxR3hvQWlhbUdrTWFwcVZUUUINCi0gS3BwK2VLQUlDZm1xV00vS2F6NmdBTk9CcVFGelJtbUF1YVROQUNzZmtxTUhtbTl3SnM4VTBtdFJER05Sc2FBSTJwaHBESTFODQotIFNxYUFKRk5TQThVQ0lTZm1xU00vS2F6NmpBSG1uQTFJQ2cwdWFBRnpTWnBnS3grU21EclRlNEUyZUthVFdvaU1tbU1hQUl6VA0KLSBEU0dSS2FrVTBBU0thZURURVJzZWFralB5bXMrb3hBYWNEVWdPQnBjMGdGelNacGdPWS9LS1l2M3FycUlscHByUUJqR295YUENCi0gR0dtbWtNZ1UxSXBwZ1BCcVFHZ1F1MEduNHd2Rkt3RVFwd05aREhacGMwQUxtaWdSS0JsZWFRS0JXdGdBMDAxUURHcU0wZ0dtDQotIG1Ha01ycWFrQm9BZXBwNE5NUklEVHdhQUUyQTAwOEdva2dIeGpkMXB6S0ZwVzB1QWc1TlNCQlRpcmdPcERXZ0RUVFRRQXcwdw0KLSAwZ0dHbW1nWldCcDRwQVNLYWVEVEVPQnA0TkFEd2FqYnJVeUJFa1hXblNVZEFHcjFxZWlBTVNrTldBaHBob0FhYVlhUUREVFQNCi0gU0dWUlR3YVlEeFR3YUJEd2FlRFFBNEdsSzVvYXVJZW8yMHBHYUxhQUtxZ1U2aEt3QlNHbUFocGhvQWFhWWFReGhwcHBES2dODQotIFBGTUI0cDRvRVBGT0JwZ1BCcDROQWh3cHdvQVdsb0FLU2dCRFRUUU1ZYVlhUURUVFRTR0EvOW4vMndDRUFBb0hCd2dIQmdvSQ0KLSBDQWdMQ2dvTERoZ1FEZzBORGgwVkZoRVlJeDhsSkNJZklpRW1LemN2SmlrMEtTRWlNRUV4TkRrN1BqNCtKUzVFU1VNOFNEYzkNCi0gUGpzQkNnc0xEZzBPSEJBUUhEc29JaWc3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3DQotIE96czdPenM3T3pzN096czdPLy9BQUJFSUFFZ0FZQU1CSVFBQ0VRRURFUUgveEFHaUFBQUJCUUVCQVFFQkFRQUFBQUFBQUFBQQ0KLSBBUUlEQkFVR0J3Z0pDZ3NRQUFJQkF3TUNCQU1GQlFRRUFBQUJmUUVDQXdBRUVRVVNJVEZCQmhOUllRY2ljUlF5Z1pHaENDTkMNCi0gc2NFVlV0SHdKRE5pY29JSkNoWVhHQmthSlNZbktDa3FORFUyTnpnNU9rTkVSVVpIU0VsS1UxUlZWbGRZV1ZwalpHVm1aMmhwDQotIGFuTjBkWFozZUhsNmc0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUw0KLSAwOVRWMXRmWTJkcmg0dVBrNWVibjZPbnE4Zkx6OVBYMjkvajUrZ0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0kNCi0gQ1FvTEVRQUNBUUlFQkFNRUJ3VUVCQUFCQW5jQUFRSURFUVFGSVRFR0VrRlJCMkZ4RXlJeWdRZ1VRcEdoc2NFSkl6TlM4QlZpDQotIGN0RUtGaVEwNFNYeEZ4Z1pHaVluS0NrcU5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNA0KLSBlWHFDZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTMDlUVjF0ZlkNCi0gMmRyaTQrVGw1dWZvNmVyeTgvVDE5dmY0K2ZyLzJnQU1Bd0VBQWhFREVRQS9BSjdTTGdjVnIyMEk0ck5GR3ZiUUFBSEZhRVVYDQotIFNyUWk1SENNZEtrOG9ZNlZTSll4NGhqcFZhV01lbEFGQzRpR0R4V1BkUjhta3htUmR4akJyRXZJK3Raak4yMHh0SE5iTnFBYw0KLSBVSURYZzZDcjBXS3RDWThYS1FPeXpPQjNGS05Xc3ljZVorbFM2c1k2TmtqdlBTZHdJbUJIVW1teTRxMDc2b0NqT09EV1BkZ2MNCi0gME1wR1BkQVlOWWw0bzVyTmpOS3preW9yWnRYeGloQWExdklEaXA3bTlGcmI3LzRqd0tjbnl4YkV6TjNpZUpwcFpzeVo0VTFIDQotIHVyelphdTRtV1ZsTnJHazBVdVdQVmExWXJvWEVJa0hmclhaaDVXOTBSV25jQUhtc2k2YkpOZFEwWk53M0JyR3VpTUdzMk1rcw0KLSBwdUJ6V3piemRPYUVCZU9wUjJvVXRrazloVHJ1N2l1bzRtOHdnZW1LeXFUaTA0c0JzZmtFZjY4ajhLbFVRWno5by9TdVpSajMNCi0gSllyaUFqaTQvU3A3VzZodGJWMmFYY3U3MHJhbW94bGU0Z043SGNJWGpiaXMrNGs1TmRhYWF1aG1WY3Yxckh1VzYxREdpRzFtDQotIDZjMXMyMC9UbWdBdjV2bWo1N1ZLazMraXhuUGMxeFZWNzBoOUNWSnVPdFNyTDcxaEZneHpTY1Vra24raVkvMnExaTl4RHJHVA0KLSA5eTMxcEo1T3RkMUwrR2hNeTdtVHJXWE8yU2FwalJuMjh2VG10YTNueGptZ0dPdkpkMncxS2t2K2lwei9BQkd1T292ZVlkQ2UNCi0gT2JqclU2eTVybHNBOHljVWtzbitpai9lTmF3NmlKTE5zVzU5elRKbjY4MTZGUDRFSm1iTytTYXo1bTYwMlVqSWdrNEhOYWR2DQotIEx3S2FCbCtNcElNT01pcHA0OTBTQ0plRjdDb3FRdkYySnVScVdRNFlFR3JTaVFKdUtuSHJYQnlNcGtpNzNHRkJOWElvaDluMg0KLSBTcm5uT0s2TVBUYmQzc1N3SVZGMnFNQ3FrekhtdXkxbFlSblRIclZHV3BaYU1LQitCV2xieWNZb1FNMElaRHh6VitHVThjMWENCi0gSVl5NVkrZG5IYXRBc2ZzQUhmQXJtUzFtUG9oMWdUOHg5cXRrMXJRWDd0Q2U1RElhcHpHdEdCUW03MVNscUdXam5JSDZWb3d0DQotIHptaEF5L0UzdlY2RjZ0RU11eGxXSXlBZnJWeENDQU8xVlpFRXlZQTRBQXB4Tkd3eUorbFZKUlVzYUtNdzYxU2xGUXpSQVAvWg0KLQ0KLVgtQVRUUklCVVRFOlNvbWUgU3RyaW5nDQotQkRBWToxOTgwMDEwMQ0KLUdFTzozNS42NTYzODU0LDEzOS42OTk0MjMzDQotVVJMOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vDQotUkVWOjIwMDgwNDI0VDE5NTI0M1oNCi1FTkQ6VkNBUkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTA3MTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46dkNhcmQNCi1WRVJTSU9OOjIuMQ0KLVVJRDozNTcNCi1OOjtDb25mZXJlbmNlIENhbGwNCi1GTjpDb25mZXJlbmNlIENhbGwNCi0jIFRoaXMgbGluZSBtdXN0IGJlIGlnbm9yZWQuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOlRoaXMgaXMgYW4gKHNoYXJwIC0+PQ0KLSM8LSBzaGFycCkgZXhhbXBsZS4gVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkIHRvby4NCi1FTkQ6dkNhcmQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVlMmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3js7OzsNCi1URUw7UFJFRjtWT0lDRTowMzAwMDAwMDAwDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NGFjYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhIIONg0ODaCAxDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhO4ONg0ODaDE7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTeszvbssTeMTs7Ow0KLUFEUjtIT01FO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Oz05Mz04Qz04Qj05RT05Mz03Mz0NCi09OEY9NjE9OTI9NEE9OEI9RTY9OEQ9Rjc9OEI9NzU9OTI9QUMyNi0xPTgzPTVBPTgzPThCPTgzPThBPTgzPTQxPTgzPTkzPQ0KLT04Mz01RT04Mz04Rj04MT01QjY9OEE9NEI7Ozs7MTUwLTg1MTI7DQotTk9URTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOj04Mz04MT04Mz04Mg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYjE5YS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoMzs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN4zOzs7Ow0KLVRFTDtYLU5FQy1TRUNSRVQ6OQ0KLVRFTDtYLU5FQy1IT1RFTDoxMA0KLVRFTDtYLU5FQy1TQ0hPT0w6MTENCi1URUw7SE9NRTtGQVg6MTINCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN40Ozs7Ow0KLVRFTDtNT0RFTToxMw0KLVRFTDtQQUdFUjoxNA0KLVRFTDtYLU5FQy1GQU1JTFk6MTUNCi1URUw7WC1ORUMtR0lSTDoxNg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g1Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jU7Ozs7DQotVEVMO1gtTkVDLUJPWToxNw0KLVRFTDtYLU5FQy1GUklFTkQ6MTgNCi1URUw7WC1ORUMtUEhTOjE5DQotVEVMO1gtTkVDLVJFU1RBVVJBTlQ6MjANCi1FTkQ6VkNBUkQNCi0NCi0NCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmYxMTkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46Tm9ybWFsIEd1eQ0KLU9SRzpDb21wYW55O09yZ2FuaXphdGlvbjtEZXZpc2lvbjtSb29tO1NoZWV0IE5vLg0KLVRJVExFOkV4Y2VsbGVudCBKYW5pdG9yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNTMxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotRk46U21pdGgKLVRFTDtIT01FOjEKLVRFTDtXT1JLO1BSRUY6MgotVEVMO0lTRE46MwotRU1BSUw7UFJFRjtIT01FOnRlc3RAZXhhbXBsZS5jb20KLUVNQUlMO0NFTEw7UFJFRjp0ZXN0MkBleGFtaW5hdGlvbi5jb20KLU9SRzpDb21wYW55Ci1USVRMRTpFbmdpbmVlcgotT1JHOk15c3RlcnkKLVRJVExFOkJsb2dnZXIKLU9SRzpQb2V0cnkKLVRJVExFOlBvZXQKLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFiYjRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDVhYjUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZGFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYzczOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5pY2UgR3V5DQotVElUTEU6Q29vbCBUaXRsZQ0KLU9SRzpNYXJ2ZXJvdXM7UGVyZmVjdDtHcmVhdDtHb29kO0JhZDtQb29yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzgwZDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkV4YW1wbGU7Ozs7DQotRk46RXhhbXBsZQ0KLUFOTklWRVJTQVJZO1ZBTFVFPURBVEU6MjAwOTEwMTANCi1BR0VOVDpJbnZhbGlkIGxpbmUgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseS4NCi1YLUNMQVNTOlBVQkxJQw0KLVgtUkVEVUNUSU9OOg0KLVgtTk86DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTdmMjAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPVBBR0VSLFdPUkssTVNHOjYxMDEyMzEyMzRAcGFnZXJzYW1wbGUuY29tDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODY2MWYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1GTjpBbmQgUm9pZA0KLU46QW5kO1JvaWQ7OzsNCi1PUkc6T3BlbjtIYW5kc2V0OyBBbGxpYW5jZQ0KLVNPUlQtU1RSSU5HOmFuZHJvaWQNCi1URUw7VFlQRT1QUkVGO1RZUEU9Vk9JQ0U6MDMwMDAwMDAwMA0KLUNMQVNTOlBVQkxJQw0KLVgtR05POjANCi1YLUdOOmdyb3VwMA0KLVgtUkVEVUNUSU9OOjANCi1SRVY6MjAwODEwMzFUMDY1ODU0Wg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTFlZWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZTsKLQotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlRpbWVyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB0ZXh0IHRoZSBhY2Nlc3NpYmlsaXR5IGZyYW1ld29yayBlbmQgdG8gZW5kLgotICogPHA+Ci0gKiBOb3RlOiBTaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIHByb3ZpZGVkIGJ5IHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdlIGNyZWF0ZSBvbmUsCi0gKiBhbmQgaXQgZ2VuZXJhdGVzIGFuIGV2ZW50IGFuZCBhbiBpbnRlcnJ1cHRpb24gZGlzcGF0Y2hpbmcgdGhlbSB0aHJvdWdoIHRoZQotICoge0BsaW5rIEFjY2Vzc2liaWxpdHlNYW5hZ2VyfS4gV2UgdmVyaWZ5IHRoZSByZWNlaXZlZCByZXN1bHQuIFRvIHRyaWdnZXIgdGhlIHRlc3QKLSAqIGdvIHRvIFNldHRpbmdzLT5BY2Nlc3NpYmlsaXR5IGFuZCBzZWxlY3QgdGhlIGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGNoZWNrIGFuZCB0aGVuCi0gKiBzZWxlY3QgdGhlIGNoZWNrIGZvciB0aGlzIHNlcnZpY2UgKHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImZvby5iYXIuYmF6LlRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiZm9vLmJhci5iYXoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gIlNvbWUgc3R1ZmYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfVEVYVCA9ICJTb21lIG90aGVyIHN0dWZmIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RFU0NSSVBUSU9OID0gIkNvbnRlbnQgZGVzY3JpcHRpb24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1fQ09VTlQgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9JVEVNX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRSA9IDB4MDAwMDAyMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJPTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEREVEX0NPVU5UID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRF9DT1VOVCA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTID0gODA7Ci0KLSAgICBwcml2YXRlIGludCBtUmVjZWl2ZWRSZXN1bHQ7Ci0KLSAgICBwcml2YXRlIFRpbWVyIG1UaW1lciA9IG5ldyBUaW1lcigpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKLSAgICAgICAgaW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVTX0FMTF9NQVNLOwotICAgICAgICBpbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOwotICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBOT1RJRklDQVRJT05fVElNRU9VVF9NSUxMSVM7Ci0gICAgICAgIGluZm8uZmxhZ3MgJj0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7Ci0gICAgICAgIHNldFNlcnZpY2VJbmZvKGluZm8pOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgc3lzdGVtIHBpY2tzIG91ciBjb25maWd1cmF0aW9uCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBub3RpZnkgdXMKLSAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEludGVycnVwdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciBpbiB0ZXN0aW5nIEFjY2Vzc2liaWxpdHkgZmVhdHVyZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaGVyZSBpZiB0aGUgZXZlbnQgd2UgcmVjZWl2ZWQgaXMgYWN0dWFsbHkgdGhlIG9uZSB3ZSBzZW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICBhc3NlcnQoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydChldmVudC5nZXRFdmVudFRpbWUoKSA+IDApOwotICAgICAgICBhc3NlcnQoQ0xBU1NfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KFBBQ0tBR0VfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UGFja2FnZU5hbWUoKSkpOwotICAgICAgICBhc3NlcnQoMSA9PSBldmVudC5nZXRUZXh0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0KFRFWFQuZXF1YWxzKGV2ZW50LmdldFRleHQoKS5nZXQoMCkpKTsKLSAgICAgICAgYXNzZXJ0KEJFRk9SRV9URVhULmVxdWFscyhldmVudC5nZXRCZWZvcmVUZXh0KCkpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgYXNzZXJ0KENPTlRFTlRfREVTQ1JJUFRJT04uZXF1YWxzKGV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgIGFzc2VydChJVEVNX0NPVU5UID09IGV2ZW50LmdldEl0ZW1Db3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KENVUlJFTlRfSVRFTV9JTkRFWCA9PSBldmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNFbmFibGVkKCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNQYXNzd29yZCgpKTsKLSAgICAgICAgYXNzZXJ0KEZST01fSU5ERVggPT0gZXZlbnQuZ2V0RnJvbUluZGV4KCkpOwotICAgICAgICBhc3NlcnQoQURERURfQ09VTlQgPT0gZXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KFJFTU9WRURfQ09VTlQgPT0gZXZlbnQuZ2V0UmVtb3ZlZENvdW50KCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gKChOb3RpZmljYXRpb24pIGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkpLmljb24pOwotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIGZsYWcgdGhhdCB3ZSByZWNlaXZlZCB0aGUgaW50ZXJydXB0IHJlcXVlc3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25JbnRlcnJ1cHQoKSB7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG9mIHRoZSByZWNldmVkIHJlcXVlc3QKLSAgICAgICAgbVJlY2VpdmVkUmVzdWx0ID0gSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSBpcyBzZW50IGFuZCByZWNlaXZlZCBjb3JyZWN0bHkuCi0gICAgICovCi0gICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPQotICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKLQotICAgICAgIGFzc2VydChldmVudCAhPSBudWxsKTsKLSAgICAgICBldmVudC5zZXRDbGFzc05hbWUoQ0xBU1NfTkFNRSk7Ci0gICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUoUEFDS0FHRV9OQU1FKTsKLSAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKFRFWFQpOwotICAgICAgIGV2ZW50LnNldEJlZm9yZVRleHQoQkVGT1JFX1RFWFQpOwotICAgICAgIGV2ZW50LnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKENPTlRFTlRfREVTQ1JJUFRJT04pOwotICAgICAgIGV2ZW50LnNldEl0ZW1Db3VudChJVEVNX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRDdXJyZW50SXRlbUluZGV4KENVUlJFTlRfSVRFTV9JTkRFWCk7Ci0gICAgICAgZXZlbnQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRQYXNzd29yZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRGcm9tSW5kZXgoRlJPTV9JTkRFWCk7Ci0gICAgICAgZXZlbnQuc2V0QWRkZWRDb3VudChBRERFRF9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0UmVtb3ZlZENvdW50KFJFTU9WRURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFBhcmNlbGFibGVEYXRhKG5ldyBOb3RpZmljYXRpb24oMSwgIkZvbyIsIDEyMzQpKTsKLQotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOwotCi0gICAgICAgYXNzZXJ0KG1SZWNlaXZlZFJlc3VsdCA9PSBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0KLSAgICAgICBMb2cuaShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlI3Rlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZzogU3VjY2VzcyIpOwotICAgfQotCi0gICAvKioKLSAgICAqIElmIGFjY2Vzc2liaWxpdHkgZmVlZGJhY2sgaW50ZXJydXB0aW9uIGlzIHRyaWdnZXJlZCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICovCi0gICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcykuaW50ZXJydXB0KCk7Ci0KLSAgICAgICBhc3NlcnQoSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRSA9PSBtUmVjZWl2ZWRSZXN1bHQpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0SW50ZXJydXB0OiBTdWNjZXNzIik7Ci0gICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKaW5kZXggZmI1YTM2Zi4uMDczMzIyOSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTQxLDggKzQwLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIHB1YmxpYyBjbGFzcyBEYXRhYmFzZUN1cnNvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgaW1wbGVtZW50cyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzU3RyaW5nMSA9ICJ0aGlzIGlzIGEgdGVzdCI7CkBAIC05Miw0MyArODksNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEN1cnNvclVwZGF0ZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCi0gICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkIElOVEVHRVIsIHMgSU5URUdFUik7Iik7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gdGVzdCAoZCwgcykgVkFMVUVTICgiICsgaSArIAotICAgICAgICAgICAgICAgICIsIiArIGklMiArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeSgidGVzdCIsIG51bGwsICJzID0gMCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBpbnQgZENvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkIik7Ci0gICAgICAgIGludCBzQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coInMiKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjLnVwZGF0ZUludChkQ29sLCAzKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgYy5nZXRJbnQoZENvbCkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5tb3ZlVG9GaXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmRlbGV0ZVJvdygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGMuZ2V0Q291bnQoKSk7Ci0gICAgICAgIGMuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjcmVhdGUgdGFibGUKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCkBAIC0xNjQsMjQgKzEyNCw3IEBACiAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhibG9iLCBjQmxvYikpOwogICAgICAgICBhc3NlcnRFcXVhbHMocywgYy5nZXRTdHJpbmcoc0NvbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGRvdWJsZSlkLCBjLmdldERvdWJsZShkQ29sKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbmV3IGJ5dGVbXQotICAgICAgICBieXRlW10gbmV3YmxvYiA9IG5ldyBieXRlWzEwMDBdOwotICAgICAgICB2YWx1ZSA9IDk4OwotICAgICAgICBBcnJheXMuZmlsbChibG9iLCB2YWx1ZSk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGMudXBkYXRlQmxvYihiQ29sLCBuZXdibG9iKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvbW1pdAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIGMubW92ZVRvTmV4dCgpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOyAgICAgICAgCi0gICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7ICAgICAgICAKICAgICB9CiAgICAgCiAgICAgQE1lZGl1bVRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jZDM4YmYwNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQpAQCAtMjEsMTggKzIxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTM4Miw1NCArMzg1LDI4IEBACiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFDaGFuZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1EYXRhYmFzZTsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZSwgbnVsbCk7Ci0gICAgICAgIEN1cnNvciBjdXJzb3I7Ci0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbURhdGFiYXNlLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldENvdW50KCkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAvLyB0aGlzIGNhdXNlIGV4Y2VwdGlvbiBiZWNhdXNlIHdlJ3JlIHN0aWxsIHVzaW5nIHNxbGl0ZV9wcmVwYXRlMTYgYW5kIG5vdAotICAgICAgICAvLyBzcWxpdGVfcHJlcGFyZTE2X3YyLiBUaGUgdjIgdmFyaWFudCBhZGRlZCB0aGUgYWJpbGl0eSB0byBjaGVjayB0aGUKLSAgICAgICAgLy8gc2NoZW1hIHZlcnNpb24gYW5kIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBzY2hlbWEgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gTWFyY28gTmVsaXNzZW4gY2xhaW0gaXQgd2FzIDJ4IHNsb3dlciB0byBjb21waWxlIFNRTCBzdGF0ZW1lbnRzIHNvCi0gICAgICAgIC8vIEkgcmV2ZXJ0ZWQgYmFjayB0byB0aGUgdjEgdmFyaWFudC4KLSAgICAgICAgLyogZGIyLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjIgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5jb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotICAgICAgICBkYjEuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7Ci0KLSAgICAgICAgY3Vyc29yID0gZGIxLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3Vyc29yLmZpcnN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coImRhdGEiKSkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAqLworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMSAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyBkYjEgKGRhdGEpIFZBTFVFUyAoJ3Rlc3QnKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkFMVEVSIFRBQkxFIGRiMSBBREQgQ09MVU1OIGJsYWggaW50OyIpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgYmxhaCBmcm9tIGRiMSIsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBDaGFuZ2VPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CkBAIC00NjcsNDUgKzQ0NCw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KE5vdGVzLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Tm90ZXMuX0lELCBOb3Rlcy5OT1RFfSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihuZXcgTXlDb250ZW50T2JzZXJ2ZXIodHJ1ZSkpOwotICAgICAgICBpbnQgY291bnQgPSBjLmNvdW50KCk7Ci0KLSAgICAgICAgTXlDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgTXlDb250ZW50T2JzZXJ2ZXIoZmFsc2UpOwotICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE5vdGVzLkNPTlRFTlRfVVJJLCB0cnVlLCBvYnNlcnZlcik7Ci0KLSAgICAgICAgVXJpIHVyaTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dChOb3Rlcy5OT1RFLCAidGVzdCBub3RlMSIpOwotICAgICAgICB1cmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChOb3Rlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIGMucmVxdWVyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgKyAxLCBjLmNvdW50KCkpOwotICAgICAgICBjLmZpcnN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCBub3RlMSIsIGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSkpKTsKLSAgICAgICAgYy51cGRhdGVTdHJpbmcoYy5nZXRDb2x1bW5JbmRleChOb3Rlcy5OT1RFKSwgInRlc3Qgbm90ZTIiKTsKLSAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQXJncygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwogICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwpAQCAtOTg5LDIxICs5MjcsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKwotICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpID4gMCk7Ci0gICAgICAgIGludCBuU3RhdGVtZW50ID0gc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA9PSBuU3RhdGVtZW50KTsKLSAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LiAKLSAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgotICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1pY29sb25zSW5TdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgcHJhZ21hX3Rlc3QgKCIgKwogICAgICAgICAgICAgICAgICJpIElOVEVHRVIgREVGQVVMVCAxMjM0LCAiICsKQEAgLTEwMjMsNiArOTQ2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMDU5LDExMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ZGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlVGVzdC5DbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05OID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUUwgPSAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSA/IEFORCBqID0gMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TUUxTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgVEVTVF9TUUwsIFRFU1RfU1FMICsgMSwgVEVTVF9TUUwgKyAyLCBURVNUX1NRTCArIDMsIFRFU1RfU1FMICsgNAorICAgIH07CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbVRlc3RQb29sOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbVRlc3RQb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wobURhdGFiYXNlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGVzdFBvb2wpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1UZXN0UG9vbC5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFJlbGVhc2UoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIC8vIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBsYXppbHkgY3JlYXRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICAvLyBNQVggcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8gTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCBiZSBvbmUgLSBzaW5jZSBvbmx5IG9uZSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWJvdmUgZ2V0KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIC8vIG5vIGZyZWUgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGF2YWlsYWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2FtZSBvYmplY3QgYWdhaW4gYW5kIGV4cGVjdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgICAgIGZhaWwoImlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBwb29sIGFuZCBhc2sgZm9yIG9uZSBtb3JlLgorICAgICAqIHNob3VsZCBnZXQgb25lIG9mIHRoZSBjb25uZWN0aW9ucyBhbHJlYWR5IGdvdCBzbyBmYXIuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQ29ubkFuZE9uZU1vcmUoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLmFkZChkYik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy5jb250YWlucyhkYjEpKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCByZW1haW4gYXQgTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgaXQgaXMgYWxsb2NhdGVkIDIgdGltZXMsIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbCBjb25uZWN0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiT2Jqcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSBleGNlcHQgdGhhdCBlYWNoIGNvbm5lY3Rpb24gaGFzIGRpZmZlcmVudCBTUUwgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4gCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uUmV0cmlldmFsRm9yUHJldmlvdXNseVNlZW5TcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIC8vIGRvIHRoZSBzYW1lIGFnYWluCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydEVxdWFscyhkYjIsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworCisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMyB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgZGIyIGJ1dCBzaW5jZSB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIGFsbG9jYXRlZCAyIHRpbWVzLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjIpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGJPYmpzLmdldCh0ZXN0U3FsKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KFRFU1RfU1FMU1tpXSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgIC8vIGdldCB0aGUgZ2l2ZW4gc3FsIGJlIGNvbXBpbGVkIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAgICAvLyB0aGlzIHdpbGwgaGVscCBEYXRhYmFzZUNvbmVuY3Rpb25Qb29sIGZpZ3VyZSBvdXQgaWYgYSBnaXZlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIC8vIGlzIGFscmVhZHkgY2FjaGVkIGJ5IGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGRiLCBzcWwpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgY29ubmVjdGlvbiBmb3IgYSBTUUwgc3RhdGVtZW50ICdibGFoJy4gKGNvbm5lY3Rpb25fcykKKyAgICAgKiBtYWtlIHN1cmUgdGhlIHBvb2wgaGFzIGF0IGxlYXN0IG9uZSBmcmVlIGNvbm5lY3Rpb24gZXZlbiBhZnRlciB0aGlzIGdldCgpLgorICAgICAqIGFuZCBnZXQgYSBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSBTUUwgYWdhaW4uCisgICAgICogICAgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBjb25uZWN0aW9uX3MuCisgICAgICogICAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQsIHNpbmNlIGlzIGl0IG5vdCBmcmVlCisgICAgICogICAgQU5EIHNpbmNlIHRoZSBwb29sIGhhcyBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgc2hvdWxkIGdldCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubkZvclRoZVNhbWVTcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiMS5lcXVhbHMoZGIpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgYW5kIHJlbGVhc2UgaXQgTiB0aW1lcy4KKyAgICAgKiB0aGlzIHRlc3RzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wuUG9vbE9iai5tTnVtSG9sZGVycworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2FtZUNvbm5OdGltZXNBbmRSZWxlYXNlSXROdGltZXMoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGV2ZXJ5IGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wgc2hvdWxkIGhhdmUgbnVtSG9sZGVycyA9IDEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSArKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGkpLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmogcG9vbE9iaiA9IG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGRiMS5tQ29ubmVjdGlvbk51bSAtIDEpOworICAgICAgICBpbnQgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtSG9sZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24gTiB0aW1lcyBtb3JlCisgICAgICAgIGludCBOID0gMTAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiMik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIyKSk7CisgICAgICAgICAgICAvLyBudW1Ib2xkZXJzIGZvciB0aGlzIG9iamVjdCBzaG91bGQgYmUgbm93IHVwIGJ5IDEKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2ICsgMSwgbnVtSG9sZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpdCBOIHRpbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICAgICAgaW50IHByZXYgPSBudW1Ib2xkZXJzOworICAgICAgICAgICAgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXYgLSAxLCBudW1Ib2xkZXJzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiBzaG91bGQgc3RpbGwgaGF2ZSAyIG1vcmUgaG9sZGVycworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSAyIG1vcmUgdGltZXMKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvb2xPYmouZ2V0TnVtSG9sZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVzc1Rlc3QoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+IGRiTWFwID0gbmV3IEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCAxKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGFzayBmb3IgbG90IG1vcmUgY29ubmVjdGlvbnMgYnV0IHNpbmNlIHRoZSBwb29sIGlzIG1heGVkIG91dCwgd2Ugc2hvdWxkIHN0YXJ0IHJlY2VpdmluZworICAgICAgICAvLyBjb25uZWN0aW9ucyB0aGF0IHdlIGFscmVhZHkgZ290IHNvIGZhcgorICAgICAgICBmb3IgKGludCBpID0gTUFYX0NPTk47IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCArIGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgaW50IGsgPSBkYk1hcC5nZXQoZGIpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCArK2spOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGVzIHJlY2VpdmVkLCBzaG91bGQgYmUgdW5pZm9ybS4KKyAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBkIDogZGJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNvbm5lY3Rpb24gIyAiICsgZC5tQ29ubmVjdGlvbk51bSArICIsIG51bUhvbGRlcnM6ICIgKyBkYk1hcC5nZXQoZCkpOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50IHRoZSBwb29sIGluZm8KKyAgICAgICAgTG9nLmkoVEFHLCBtVGVzdFBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgbnVtID0gZGJNYXAuZ2V0KGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZmYzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJ0ZXN0Q3Vyc29yIjsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAic3FsaXRlY3Vyc29yX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgdGFibGUKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEFCTEVfTkFNRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeU9ialJlYXNzaWdubWVudCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGhhdmUgYSBmZXcgY29ubmVjdGlvbnMgaW4gdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHBvb2wgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sOworICAgICAgICBwb29sLnNldE1heFBvb2xTaXplKDUpOworICAgICAgICBTUUxpdGVDdXJzb3IgY3Vyc29yID0KKyAgICAgICAgICAgICAgICAoU1FMaXRlQ3Vyc29yKSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gIiArIFRBQkxFX05BTUUsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnNvcik7CisgICAgICAgIC8vIGl0IHNob3VsZCB1c2UgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKHBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgLy8gZG8gYSByZXF1ZXJ5LiBjdXJzb3Igc2hvdWxkIGNvbnRpbnVlIHRvIHVzZSB0aGUgYWJvdmUgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJBZ2FpbiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIsIGRiQWdhaW4pOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBzbyB0aGF0IHRoZSBwb29sZWQgY29ubmVjdGlvbiBoZWxkIGJ5IHRoZSBhYm92ZSBjdXJzb3IgaXMgY2xvc2VkCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICAvLyByZXF1ZXJ5IC0gd2hpY2ggc2hvdWxkIG1ha2UgdGhlIGN1cnNvciB1c2UgbURhdGFiYXNlIGNvbm5lY3Rpb24gc2luY2UgdGhlIHBvb2xlZAorICAgICAgICAvLyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIxLm1Db25uZWN0aW9uTnVtID09IDApOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYjEpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRUcnVlKGRiMS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgLy8gZW5hYmxlIFdBTCBhbmQgcmVxdWVyeSAtIHRoaXMgdGltZSBhIHBvb2xlZCBjb25uZWN0aW9uIHNob3VsZCBiZSB1c2VkCisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1NjEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDkxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VHZW5lcmFsVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVEFCTEUgPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTiA9IDQyOworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxFVEUgPSAzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZGJTZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRiVGVhcmRvd24oKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGJUZWFyZG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGJTZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5zZXRWZXJzaW9uKENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTik7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIGdldCBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbigic2VsZWN0ICogZnJvbSB0ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JzV2l0aENsb3NlZERiQ29ubkFmdGVyRGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGN1cnNvciB3aGljaCBzaG91bGQgdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRlc3QiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgLSB3aGljaCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiBwb29sIGFuZCBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBjdXJzb3IgZGF0YSBzaG91bGQgc3RpbGwgYmUgYWNjZXNzaWJsZSBiZWNhdXNlIGl0IGlzIGZldGNoaW5nIGRhdGEgZnJvbSBDdXJzb3JXaW5kb3cKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldENvbm5lY3Rpb25Qb29sU2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGNhbid0IHNldCBwb29sIHNpemUgdG8gemVybworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgwKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgcG9vbCBzaXplIHRvIGEgdmFsaWQgdmFsdWUKKyAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byA8IHRoZSB2YWx1ZSBhYm92ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlIGEgc3RhbmRhbG9uZS11cGRhdGUvaW5zZXJ0L2RlbGV0ZSBzdGF0ZW1lbnQKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoSU5TRVJUKTsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChVUERBVEUpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKERFTEVURSk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKGludCBzdG10VHlwZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAvLyBtYWtlIHNvbWUgY2hhbmdlcyB0byBkYXRhIGluIFRFU1RfVEFCTEUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImkiLCBpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAiaSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KFRFU1RfVEFCTEUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0bXRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAidSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51cGRhdGUoVEVTVF9UQUJMRSwgdmFsdWVzLCAiaSA9ICIgKyBpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUoVEVTVF9UQUJMRSwgImkgPSAxIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRvIGEgcXVlcnkuIGV2ZW4gdGhvdWdoIHF1ZXJ5IHVzZXMgYSBkaWZmZXJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbiwKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHNlZSB0aGUgYWJvdmUgY2hhbmdlcyB0byBkYXRhIGJlY2F1c2UgdGhlIGFib3ZlIHN0YW5kYWxvbmUKKyAgICAgICAgLy8gaW5zZXJ0L3VwZGF0ZS9kZWxldGVzIGFyZSBkb25lIGluIHRyYW5zYWN0aW9ucyBhdXRvbWF0aWNhbGx5LgorICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHNxbCk7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFZhbHVlID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA0IDogNTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCkpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gNSBtb3JlIGNoYW5nZXMgaW4gYSB0cmFuc2FjdGlvbiBidXQgZG8gYSBxdWVyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21taXQKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpIDwgMTU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAvLyBkbyBhIHF1ZXJ5IGJlZm9yZSBjb21taXQgLSBzaG91bGQgc3RpbGwgaGF2ZSA1IHJvd3MKKyAgICAgICAgLy8gdGhpcyBxdWVyeSBzaG91bGQgcnVuIGluIGEgZGlmZmVyZW50IHRocmVhZCB0byBmb3JjZSBpdCB0byB1c2UgYSBkaWZmZXJlbnQgZGF0YWJhc2UKKyAgICAgICAgLy8gY29ubmVjdGlvbgorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBnZXREYigpLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIEN1cnNvciBjID0gZ2V0RGIoKS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgYWJvdmUgdGhyZWFkIGlzIGRvbmUKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIC8vIGNvbW1pdCBhbmQgdGhlbiBxdWVyeS4gc2hvdWxkIHNlZSBjaGFuZ2VzIGZyb20gdGhlIHRyYW5zYWN0aW9uCisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUyID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA5IDogMTA7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZTIsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0RGIoKSB7CisgICAgICAgIHJldHVybiBtRGF0YWJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkZXJzIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGRhdGEgKG9sZCB2ZXJzaW9ucykKKyAgICAgKiBFVkVOIFdIRU4gdGhlIHdyaXRlciBpcyBpbiBhIHRyYW5zYWN0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqPHA+CisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyAxIFdyaXRlciBhbmQgMiBSZWFkZXJzIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb24gcG9vbCBmb3IgcmVhZGVycworICAgICAqIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZCB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogV3JpdGVyIGRvZXMgdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBiZWdpbiB0cmFuc2FjdGlvbgorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8xCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzIKKyAgICAgKiAgICAgY29tbWl0CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogQXMgbG9uZyBhIHRoZSB3cml0ZXIgaXMgYWxpdmUsIFJlYWRlcnMgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AgYXQgdGhlIHNhbWUgdGltZQorICAgICAqIDxwcmU+CisgICAgICogICAgIFJlYWRlcl9LIGRvZXMgInNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYmxlX0siICB3aGVyZSBLID0gMSBvciAyCisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcnVuIGZvciBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1Igc2VjLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgY29ubmVjdGlvbi1wb29sLXNpemVzICgxLi4zKQorICAgICAqIDxwPgorICAgICAqIEFuZCBhdCB0aGUgZW5kIG9mIG9mIGVhY2ggdGVzdCwgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGFyZSBwcmludGVkCisgICAgICogPHVsPgorICAgICAqICAgIDxsaT5jb25uZWN0aW9uLXBvb2wtc2l6ZTwvbGk+CisgICAgICogICAgPGxpPm51bWJlci1vZi10cmFuc2FjdGlvbnMgYnkgd3JpdGVyPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyIG9mIHJlYWRzIGJ5IHJlYWRlcl9LIHdoaWxlIHRoZSB3cml0ZXIgaXMgSU4gb3IgTk9ULUlOIHhhY3Rpb248L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIEBTdXBwcmVzcyAvLyBydW4gdGhpcyB0ZXN0IG9ubHkgaWYgeW91IG5lZWQgdG8gY29sbGVjdCB0aGUgbnVtYmVycyBmcm9tIHRoaXMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKKworICAgICAgICAvLyBydW4gdGhlIHNhbWUgdGVzdCBXSVRIT1VUIHNxbGl0ZSBXQUwgZW5hYmxlZAorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db25uZWN0aW9uUG9vbFRlc3QoYm9vbGVhbiB1c2VXYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgTSA9IDM7CisgICAgICAgIFN0cmluZ0J1aWxkZXJbXSBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXJbTV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXNlV2FsKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRDb25uZWN0aW9uUG9vbFNpemUoaSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQxIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgYSB3cml0ZXIKKyAgICAgICAgICAgIFdyaXRlciB3ID0gbmV3IFdyaXRlcihtRGF0YWJhc2UpOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGFuIGFycmF5IG9mIGNvdW50ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgcmVhZGVycworICAgICAgICAgICAgUmVhZGVyIHIxID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MSIsIHcsIDApOworICAgICAgICAgICAgUmVhZGVyIHIyID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MiIsIHcsIDEpOworICAgICAgICAgICAgdy5zdGFydCgpOworICAgICAgICAgICAgcjEuc3RhcnQoKTsKKyAgICAgICAgICAgIHIyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIGFsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICAgICAgdy5qb2luKCk7CisgICAgICAgICAgICByMS5qb2luKCk7CisgICAgICAgICAgICByMi5qb2luKCk7CisKKyAgICAgICAgICAgIC8vIHByaW50IHRoZSBzdGF0cworICAgICAgICAgICAgaW50W11bXSBjb3VudHMgPSBnZXRDb3VudHMoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoImNvbm5wb29sLXNpemUgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGkgKyAxKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bSB4YWN0cyBieSB3cml0ZXIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGdldE51bVhhY3RzKCkpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtLXJlYWRzLWluLXhhY3QvTk9ULWluLXhhY3QgYnkgcmVhZGVyMSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzBdWzFdICsgIi8iICsgY291bnRzWzBdWzBdKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIGJ5IHJlYWRlcjIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1sxXVsxXSArICIvIiArIGNvdW50c1sxXVswXSk7CisKKyAgICAgICAgICAgIExvZy5pKFRBRywgImRvbmUgdGVzdGluZyBmb3IgY29ubi1wb29sLXNpemUgb2YgIiArIChpKzEpKTsKKworICAgICAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICAgICAgZGJTZXRVcCgpOworICAgICAgICB9CisgICAgICAgIExvZy5pKFRBRywgImR1cmF0aW9uIG9mIHRlc3QgIiArIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiArICIgc2VjIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIGJ1ZmZbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5YYWN0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbnVtWGFjdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiA9IDE1OyAvLyBudW0gc2VjIHRoaXMgdGVzdCBzaG91bGQgcnVuCisgICAgcHJpdmF0ZSBpbnRbXVtdIGNvdW50cyA9IG5ldyBpbnRbMl1bMl07CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGluWGFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGluWGFjdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEluWGFjdEZsYWcoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGluWGFjdCA9IGZsYWc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb3VudHMoaW50IHJlYWRlck51bSwgaW50W10gbnVtUmVhZHMpIHsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMF0gPSBudW1SZWFkc1swXTsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMV0gPSBudW1SZWFkc1sxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnRbXVtdIGdldENvdW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldE51bVhhY3RzKGludCBudW0pIHsKKyAgICAgICAgbnVtWGFjdHMgPSBudW07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldE51bVhhY3RzKCkgeworICAgICAgICByZXR1cm4gbnVtWGFjdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHVibGljIFdyaXRlcihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyBpbiBhIGxvb3AsIGZvciBOIHNlYywgZG8gdGhlIGZvbGxvd2luZworICAgICAgICAgICAgLy8gICAgQkVHSU4gdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIC8vICAgIGluc2VydCBpbnRvIHRhYmxlIHQxLCB0MgorICAgICAgICAgICAgLy8gICAgQ29tbWl0CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG5vdykgLyAxMDAwIDwgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TnVtWGFjdHMoayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJlYWRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyB0YWJsZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgV3JpdGVyIHcgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCByZWFkZXJOdW07CisgICAgICAgIHByaXZhdGUgaW50W10gbnVtUmVhZHMgPSBuZXcgaW50WzJdOworICAgICAgICBwdWJsaWMgUmVhZGVyKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgdGFibGUsIFdyaXRlciB3LCBpbnQgcmVhZGVyTnVtKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICAgICAgdGhpcy5yZWFkZXJOdW0gPSByZWFkZXJOdW07CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB3cml0ZSBpcyBhbGl2ZSwgaW4gYSBsb29wIGRvIHRoZSBxdWVyeSBvbiBhIHRhYmxlCisgICAgICAgICAgICB3aGlsZSAody5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgdGhpcy50YWJsZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb3VudCBvZiByZWFkcworICAgICAgICAgICAgICAgICAgICBudW1SZWFkc1tpblhhY3QoKSA/IDEgOiAwXSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldENvdW50cyhyZWFkZXJOdW0sIG51bVJlYWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhkYiwgc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExydUNhY2hpbmdPZlNxbGl0ZUNvbXBpbGVkU3FsT2JqcygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIGRvIE4rMSBxdWVyaWVzIC0gYW5kIHdoZW4gdGhlIDB0aCBlbnRyeSBpcyByZW1vdmVkIGZyb20gTFJVIGNhY2hlIGR1ZSB0byB0aGUKKyAgICAgICAgLy8gaW5zZXJ0aW9uIG9mIChOKzEpdGggZW50cnksIG1ha2Ugc3VyZSAwdGggZW50cnkgaXMgY2xvc2VkCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdG10T2JqcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3FsU3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnQgc3RtdDAgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9ICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsPyk7IjsKKyAgICAgICAgICAgIHNxbFN0cmluZ3MuYWRkKHMpOworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsIHMpOworICAgICAgICAgICAgaW50IG4gPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICBzdG10T2Jqcy5hZGQoaSwgbik7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgc3RhdGVtZW50SWQgb2YgdGhpcyBvYmouIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIHRocm93biBvdXQgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FjaGUgYXQgdGhlIGVuZCBvZiB0aGlzIHRlc3QuCisgICAgICAgICAgICAgICAgc3RtdDAgPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIC8vIGlzIDAndGggZW50cnkgb3V0IG9mIHRoZSBjYWNoZT8gaXQgc2hvdWxkIGJlIGluIHRoZSBsaXN0IG9mIHN0YXRlbWVudElkcworICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmUtY29tcGlsZWQgc3FsIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCkuY29udGFpbnMoc3RtdDApKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChzcWxTdHJpbmdzLmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBTcWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdG10T2Jqcy5jb250YWlucyhjb21wU3FsLm5TdGF0ZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKworICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudERvTm90Q2xvc2UuYmluZExvbmcoMSwgMSk7CisgICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4KKyAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgorICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgorICAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgVEVTVF9UQUJMRSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRFU1RfVEFCTEUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgLy8gZmx1c2ggdGhlIGFib3ZlIHN0YXRlbWVudCBmcm9tIGNhY2hlIGFuZCBjbG9zZSBhbGwgdGhlIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBtRGF0YWJhc2UuZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBzdGF0ZW1lbnQgZmluYWxpemF0aW9ucyBhcmUgbm90IGRvbmUgcmlnaHQgYXdheSBidXQKKyAgICAgKiBwaWdneS1iYWNrZWQgb250byB0aGUgbmV4dCBzcWwgc3RhdGVtZW50IGV4ZWN1dGlvbiBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgaW50IHN0bXQwSWQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkgKyspIHsKKyAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICBzdG10MS5jbG9zZSgpOworCisgICAgICAgIC8vIHRoZSBhYm92ZSBjbG9zZSgpIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiZGVsZXRlIGZyb20gdGVzdCB3aGVyZSBpID0gMTA7Iik7CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBzdGF0ZW1lbnQgdG8gYmUgZmluYWxpemVkIGlzIGZyb20gVGhyZWFkICMgMS4KKyAgICAgKiBhbmQgaXQgaXMgZXZlbnR1YWxseSBmaW5hbGl6ZWQgaW4gVGhyZWFkICMgMiB3aGVuIGl0IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZURpZmZUaHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGRuJ3QgaGF2ZSBhbnkgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RtdDBJZCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDMuc3RhcnQoKTsKKyAgICAgICAgdDMuam9pbigpOworCisgICAgICAgIC8vIGlzIHRoZSBzdGF0ZW1lbnQgZmluYWxpemVkPworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKGdldFN0bXQwSWQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN0bXQwSWQgPSAwOworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRTdG10MElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdG10MElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgcXVldWUgb2Ygc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYXJlIGZpbmFsaXplZAorICAgICAqIGJ5IGRhdGFiYXNlIGNsb3NlKCkgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VCeURiQ2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICAgICAgICAgIGdldERiKCkuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGV2ZXJ5dGhpbmcgZnJvbSBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZQorICAgICAgICAvLyBzaG91bGQgYmUgZmluYWxpemVkIGFuZCBjbGVhcmVkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gY2hlY2sgbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UuIGl0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCB0ZXN0cyB1c2FnZSBleGVjU1FMKCkgdG8gYmVnaW4gdHJhbnNhY3Rpb24gd29ya3MgaW4gdGhlIGZvbGxvd2luZyB3YXkKKyAgICAgKiAgIFRocmVhZCAjMSBkb2VzCisgICAgICogICAgICAgZXhlY1NRTCgiYmVnaW4gdHJhbnNhY3Rpb24iKTsKKyAgICAgKiAgICAgICBpbnNlcnQoKQorICAgICAqICAgVGhyZWFkICMgMgorICAgICAqICAgICAgIHF1ZXJ5KCkKKyAgICAgKiAgIFRocmVhZCMxICgiZW5kIHRyYW5zYWN0aW9uIikKKyAgICAgKiBUaHJlYWQgIyAyIHF1ZXJ5IHdpbGwgZXhlY3V0ZSAtIGJlY2F1c2UgamF2YSBsYXllciB3aWxsIG5vdCBoYXZlIGxvY2tlZCB0aGUgU1FMaXRlRGF0YWJhc2UKKyAgICAgKiBvYmplY3QgYW5kIHNxbGl0ZSB3aWxsIGNvbnNpZGVyIHRoaXMgcXVlcnkgdG8gYmUgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBidXQgaWYgdGhyZWFkICMgMSB1c2VzIGJlZ2luVHJhbnNhY3Rpb24oKSBpbnN0ZWFkIG9mIGV4ZWNTUUwoKSB0byBzdGFydCB0cmFuc2FjdGlvbiwKKyAgICAgKiB0aGVuIFRocmVhZCAjIDIncyBxdWVyeSB3aWxsIGhhdmUgYmVlbiBibG9ja2VkIGJ5IGphdmEgbGF5ZXIKKyAgICAgKiB1bnRpbCBUaHJlYWQjMSBlbmRzIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIkVORCIpOworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBpbnN0ZWFkIG5vdyBkbyAiQ09NTUlUIiBvciAiUk9MTEJBQ0siIGluc3RlYWQgb2YgIkVORCIgdHJhbnNhY3Rpb24KKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiQ09NTUlUIik7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIlJPTExCQUNLIik7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKFN0cmluZyBzdHIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBqdXN0IHNvIHF1ZXJpZXMgYW5kIHVwZGF0ZXMgdXNlIHRoZSBzYW1lIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgLy8gZXZlbiB0aG91Z2ggbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKSBpcyBub3QgY2FsbGVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAgICAvLyBtRGF0YWJhc2UgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGluIHRyYW5zYWN0aW9uIGFzIGEgcmVzdWx0IG9mCisgICAgICAgIC8vIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpCisgICAgICAgIC8vIGJ1dCBtRGF0YWJhc2UubUxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGJ5IGFueSB0aHJlYWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg5OTksIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGogZnJvbSAiICsgVEVTVF9UQUJMRSArICIgV0hFUkUgaSA9IDEwIiwgbnVsbCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RGIoKS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXREYigpLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHQuam9pbigpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3RyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBmb2xsb3dpbmcKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yODcxMDM3CisgICAgICogICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KC4uLik7CisgICAgICogICAgICAgICAgLy8gd2l0aCBXQUwgZW5hYmxlZCwgdGhlIGFib3ZlIHVzZXMgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKQorICAgICAqICAgICAgICAgIHRyeSB7CisgICAgICogICAgICAgICAgICBkYi5pbnNlcnQoLi4uLi4uKTsKKyAgICAgKiAgICAgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICogICAgICAgICAgICAvLyBzaW5jZSB0aGUgY3Vyc29yIHVzZXMgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHRoZSBhYm92ZSByZXF1ZXJ5CisgICAgICogICAgICAgICAgICAvLyB3aWxsIG5vdCByZXR1cm4gdGhlIHJlc3VsdHMgdGhhdCB3ZXJlIGluc2VydGVkIGFib3ZlIHNpbmNlIHRoZSBpbnNlcnQgaXMKKyAgICAgKiAgICAgICAgICAgIC8vIGRvbmUgdXNpbmcgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIEFORCB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGNvbW1pdHRlZCB5ZXQuCisgICAgICogICAgICAgICAgICAvLyBmaXggaXMgdG8gbWFrZSB0aGUgYWJvdmUgY3Vyc29yIHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIC0gYW5kIE5PVAorICAgICAqICAgICAgICAgICAgLy8gdGhlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKQorICAgICAqICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICogICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgfQorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiB0aGF0IGNhdXNlcyB0aGUgY3Vyc29yIHRvIHVzZSBhIHBvb2xlZCBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBhbmQgc2luY2UgdGhpcyB0aHJlYWQgaGFzbid0IGNvbW1pdHRlZCBpdHMgY2hhbmdlcywgdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgc2VlIG9ubHkKKyAgICAgICAgICAgIC8vIDEgcm93CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYzEucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDIgcm93cyBub3cgLSBpbmNsdWRpbmcgdGhlIHRoZSByb3cgaW5zZXJ0ZWQgYWJvdmUKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGlzIHNhbWUgYXMge0BsaW5rICN0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCl9IGV4Y2VwdCB0aGUgZm9sbG93aW5nOgorICAgICAqIGluc3RlYWQgb2YgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSwgdXNlIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgKiBhbmQgaW5zdGVhZCBvZiBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKSwgdXNlIGV4ZWNTUUwoIkVORCIpOworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNvbW1pdDsiKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGluIGEgZGlmZmVyZW50IHRocmVhZC4gYnV0IHNpbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIHVzaW5nCisgICAgICAgICAgICAvLyBleGVjU1EoKSBpbnN0ZWFkIG9mIGJlZ2luVHJhbnNhY3Rpb24oKSwgY3Vyc29yJ3MgcXVlcnkgaXMgY29uc2lkZXJlZCBwYXJ0IG9mCisgICAgICAgICAgICAvLyB0aGUgc2FtZSByYW5zYWN0aW9uIC0gYW5kIGhlbmNlIGl0IHNob3VsZCBzZWUgdGhlIGFib3ZlIGluc2VydGVkIHJvdworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGMxLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAyIHJvd3Mgbm93IC0gaW5jbHVkaW5nIHRoZSB0aGUgcm93IGluc2VydGVkIGFib3ZlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBjb21taXRpbmcgdGhlIGRhdGEsIGRvIHJvbGxiYWNrIGFuZCBtYWtlIHN1cmUgdGhlIGRhdGEgc2VlbiBieSB0aGUgcXVlcnkKKyAgICAgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGlzIG5vdyBnb25lLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcm9sbGJhY2sgdGhlIGNoYW5nZQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoInJvbGxiYWNrOyIpOworICAgICAgICB9CisgICAgICAgIC8vIHNpbmNlIHRoZSBjaGFuZ2UgaXMgcm9sbGVkIGJhY2ssIGRvIHRoZSBzYW1lIHF1ZXJ5IGFnYWluIGFuZCBzaG91bGQgbm93IGZpbmQgb25seSAxIHJvdworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjY2NlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuRmxha3lUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTUUxpdGVHZW5lcmFsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLSAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKLSAgICBCb29sZWFuIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKLSAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBzcWwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0Ci0gICAgICAgIC8vIHRoZWlyIG93biBjb3B5IGFuZAotICAgICAgICAvLyB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU1FMaXRlRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBGbGFreVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lUHJlcGFyZWRTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLSAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgcHJlcGFyZWQgc3RhdGVtZW50LAotICAgICAgICAvLyBzaG91bGQgc2VlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGl0Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImxpYnJhcnkgcm91dGluZSBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvblJlY3ZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGFib3ZlIFNRTCBzdGF0ZW1lbnQuCisgICAgICogRXZlbiB0aG91Z2ggMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgU1FMLCB0aGV5IGVhY2ggc2hvdWxkIGdldCB0aGVpciBvd24gY29weSBvZgorICAgICAqIHByZXBhcmVkIFNRTCBzdGF0ZW1lbnQgaWQgYW5kIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGUgb3IgYW5kcm9pZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHRlc3Q6IHN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0uCisgICAgICogVGhlIDIgdGhyZWFkcyB0YWtlIHR1cm5zIHRvIHVzZSB0aGUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH07IGkuZS4sIGl0IGlzIE5PVCBpbiB1c2UKKyAgICAgKiBieSBib3RoIHRoZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsaXRlU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIFNxbGl0ZVN0YXRlbWV0IGluIHRoZSBhYm92ZSAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmc6IGEge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gb2JqZWN0IHNob3VsZCBub3QgcmVmZXIgdG8gYQorICAgICAqIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IGlkIGV4Y2VwdCBpbiBkdXJpbmcgdGhlIHBlcmlvZCBvZiBiaW5kaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgKiBhbmQgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50LCBqIHRleHQpOyIpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisKKyAgICAgICAgLy8gYSBzbWFsbCBzdHJlc3MgdGVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyBvZgorICAgICAgICAvLyB0aGUgYWNxdWlyZSAmIHJlbGVhc2Ugb2YgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBpZCBieSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGJvb2xlYW4gd2FsKSB7CisgICAgICAgIGlmICh3YWwpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3Qgd2l0aCBJTlNFUlQgc3RhdGVtZW50IC0gZG9lc24ndCB1c2UgY29ubmVjdGlvbiBwb29sLCBpZiBXQUwgaXMgc2V0CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHQgdmFsdWVzKD8sPyk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgaW50IGNvbFZhbHVlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKKyAgICAgICAgc3RtdC5iaW5kTG9uZygxLCBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gc2hvdWxkIHN0aWxsIGJlIHVzaW5nIHRoZSBtRGF0YWJhc2UgY29ubmVjdGlvbiAtIHZlcmlmeQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDIsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKworICAgICAgICAvLyB0ZXN0IHdpdGggYSBTRUxFQ1Qgc3RhdGVtZW50IC0gdXNlcyBjb25uZWN0aW9uIHBvb2wgaWYgV0FMIGlzIHNldAorICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCBpIGZyb20gdCB3aGVyZSBqPT87Iik7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDEsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHN0YXRlbWVudAorICAgICAgICBMb25nIGwgPSBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sVmFsdWUsIGwuaW50VmFsdWUoKSk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgc3RhdGVtZW50CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzA3NzMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotCi0vKioKLSAqIENvbnRlbnRWYWx1ZXMtbGlrZSBjbGFzcyB3aGljaCBlbmFibGVzIHVzZXJzIHRvIGNoYWluIHB1dCgpIG1ldGhvZHMgYW5kIHJlc3RyaWN0cwotICogdGhlIG90aGVyIG1ldGhvZHMuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ29udGVudFZhbHVlc0J1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlcihmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBCeXRlIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBTaG9ydCB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgSW50ZWdlciB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgTG9uZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIERvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dE51bGwoU3RyaW5nIGtleSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXROdWxsKGtleSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllOTg3NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjIxOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwcml2YXRlIEFuZHJvaWRUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGltcG9ydFZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmFkZChpbXBvcnRWZXJpZmllcik7Ci0gICAgICAgIHJldHVybiBpbXBvcnRWZXJpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpOyAgLy8gdXNlIFN0cmljdFBhcnNpbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YyMSgpOwotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeShpcywgdkNhcmRUeXBlLCB2Q2FyZFBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgYnVpbGRlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG51bGwsIG51bGwsIGZhbHNlLCB2Q2FyZFR5cGUsIG51bGwpOwotICAgICAgICBidWlsZGVyLmFkZEVudHJ5SGFuZGxlcih0aGlzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdFbmQoKTsKLSAgICAgICAgICAgIGVsZW0udmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRiYjM2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb21taXR0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFZDYXJkRW50cnlIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1SZXNvbHZlciA9IG5ldyBJbXBvcnRUZXN0UmVzb2x2ZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgVkNhcmRFbnRyeUNvbW1pdHRlcihtUmVzb2x2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRFeHBlY3RlZChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtUmVzb2x2ZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIHVzZSBTdHJpY3RQYXJzaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihudWxsLCBudWxsLCBmYWxzZSwgdkNhcmRUeXBlLCBudWxsKTsKLSAgICAgICAgYnVpbGRlci5hZGRFbnRyeUhhbmRsZXIobUhhbmRsZXIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIucGFyc2UoaXMsIGJ1aWxkZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlSZXNvbHZlcigpIHsKLSAgICAgICAgbVJlc29sdmVyLnZlcmlmeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ1N0YXJ0KCkgewotICAgICAgICBtSGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoVkNhcmRFbnRyeSBlbnRyeSkgewotICAgICAgICBtSGFuZGxlci5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25QYXJzaW5nRW5kKCkgewotICAgICAgICBtSGFuZGxlci5vbkVuZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2OGU4My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ3Vyc29yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qIHBhY2thZ2UgKi8gcHVibGljIGNsYXNzIEV4cG9ydFRlc3RSZXNvbHZlciBleHRlbmRzIE1vY2tDb250ZW50UmVzb2x2ZXIgewotICAgIEV4cG9ydFRlc3RQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHVibGljIEV4cG9ydFRlc3RSZXNvbHZlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgRXhwb3J0VGVzdFByb3ZpZGVyKHRlc3RDYXNlKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoVkNhcmRDb21wb3Nlci5WQ0FSRF9URVNUX0FVVEhPUklUWSwgbVByb3ZpZGVyKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCksIG1Qcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dENvbnRhY3RFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5idWlsZElucHV0RW50cnkoKTsKLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgTW9ja0VudGl0eUl0ZXJhdG9yIGltcGxlbWVudHMgRW50aXR5SXRlcmF0b3IgewotICAgIExpc3Q8RW50aXR5PiBtRW50aXR5TGlzdDsKLSAgICBJdGVyYXRvcjxFbnRpdHk+IG1JdGVyYXRvcjsKLQotICAgIHB1YmxpYyBNb2NrRW50aXR5SXRlcmF0b3IoTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBtRW50aXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5PigpOwotICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShuZXcgQ29udGVudFZhbHVlcygpKTsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGVudGl0eS5hZGRTdWJWYWx1ZShEYXRhLkNPTlRFTlRfVVJJLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfQotICAgICAgICBtRW50aXR5TGlzdC5hZGQoZW50aXR5KTsKLSAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50aXR5IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBtSXRlcmF0b3IubmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBtSXRlcmF0b3IgPSBtRW50aXR5TGlzdC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIH0KLX0KLQotLyoqCi0gKiBSZXByZXNlbnRzIG9uZSBjb250YWN0LCB3aGljaCBzaG91bGQgY29udGFpbiBtdWx0aXBsZSBDb250ZW50VmFsdWVzIGxpa2UKLSAqIFN0cnVjdHVyZWROYW1lLCBFbWFpbCwgZXRjLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRhY3RFbnRyeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IG1Db250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRDb250ZW50VmFsdWVzKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzLnB1dChEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGVudFZhbHVlc0J1aWxkZXIoY29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29udGVudFZhbHVlcz4gZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzTGlzdDsKLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgRXhwb3J0VGVzdFByb3ZpZGVyIGV4dGVuZHMgTW9ja0NvbnRlbnRQcm92aWRlciB7Ci0gICAgZmluYWwgcHJpdmF0ZSBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgZmluYWwgcHJpdmF0ZSBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PiBtQ29udGFjdEVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PigpOwotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGFjdEVudHJ5IGJ1aWxkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgQ29udGFjdEVudHJ5IGNvbnRhY3RFbnRyeSA9IG5ldyBDb250YWN0RW50cnkoKTsKLSAgICAgICAgbUNvbnRhY3RFbnRyeUxpc3QuYWRkKGNvbnRhY3RFbnRyeSk7Ci0gICAgICAgIHJldHVybiBjb250YWN0RW50cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQW4gb2xkIG1ldGhvZCB3aGljaCBoYWQgZXhpc3RlZCBidXQgd2FzIHJlbW92ZWQgZnJvbSBDb250ZW50UmVzb2x2ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIHN0aWxsIGtlZXAgdXNpbmcgdGhpcyBtZXRob2Qgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHByb3BlZXIgd2F5IHRvIGtub3cKLSAgICAgKiB3aGljaCB2YWx1ZSBpbiB0aGUgQ29udGVudFZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBlbnRyeSBpbiBDb250YWN0cyBkYXRhYmFzZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIFRoZXJlJ3MgYW4gZWFzeSB3YXkgdG8ga25vdyB3aGljaCBpbmRleCAiZmFtaWx5IG5hbWUiIGNvcnJlc3BvbmRzIHRvLCB2aWEKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBGQU1JTFlfTkFNRSBlcXVhbHMgREFUQTMsIHNvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4Ci0gICAgICogZm9yICJmYW1pbHkgbmFtZSIgc2hvdWxkIGJlIDIgKG5vdGUgdGhhdCBpbmRleCBpcyAwLW9yaWdpbikuCi0gICAgICogSG93ZXZlciwgd2UgY2Fubm90IGtub3cgd2hhdCB0aGUgaW5kZXggMiBjb3JyZXNwb25kcyB0bzsgaXQgbWF5IGJlICJmYW1pbHkgbmFtZSIsCi0gICAgICogImxhYmVsIiBmb3Igbm93LCBidXQgbWF5IGJlIHRoZSBvdGhlciBzb21lIGNvbHVtbiBpbiB0aGUgZnV0dXJlLiBXZSBkb24ndCBoYXZlCi0gICAgICogY29udmVuaWVudCB3YXkgdG8ga25vdyB0aGUgb3JpZ2luYWwgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvciBxdWVyeUVudGl0aWVzKFVyaSB1cmksCi0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKHVyaSAhPSBudWxsKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml0eSA9IHVyaS5nZXRBdXRob3JpdHkoKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCkuZXF1YWxzKGF1dGhvcml0eSkpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSgoRGF0YS5DT05UQUNUX0lEICsgIj0/IikuZXF1YWxzKHNlbGVjdGlvbikpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDEsIHNlbGVjdGlvbkFyZ3MubGVuZ3RoKTsKLSAgICAgICAgZmluYWwgaW50IGlkID0gSW50ZWdlci5wYXJzZUludChzZWxlY3Rpb25BcmdzWzBdKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoaWQgPj0gMCAmJiBpZCA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrRW50aXR5SXRlcmF0b3IobUNvbnRhY3RFbnRyeUxpc3QuZ2V0KGlkKS5nZXRMaXN0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSxTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkuZXF1YWxzKHVyaSkpOwotICAgICAgICAvLyBJbiB0aGlzIHRlc3QsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbik7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzb3J0T3JkZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0N1cnNvcigpIHsKLSAgICAgICAgICAgIGludCBtQ3VycmVudFBvc2l0aW9uID0gLTE7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb05leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPCAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uID49IG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscyhDb250YWN0cy5fSUQsIGNvbHVtbk5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMCwgY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKG1DdXJyZW50UG9zaXRpb24gPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldEludChjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNmY3OS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIEltcG9ydFRlc3RSZXNvbHZlciBleHRlbmRzIE1vY2tDb250ZW50UmVzb2x2ZXIgewotICAgIGZpbmFsIEltcG9ydFRlc3RQcm92aWRlciBtUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgSW1wb3J0VGVzdFJlc29sdmVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBJbXBvcnRUZXN0UHJvdmlkZXIodGVzdENhc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGVxdWFsc1N0cmluZyhhdXRob3JpdHksIFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gbVByb3ZpZGVyLmFwcGx5QmF0Y2gob3BlcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Qcm92aWRlci5hZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoZXhwZWN0ZWRDb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIG1Qcm92aWRlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBhLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBiID09IG51bGwgfHwgYi5sZW5ndGgoKSA9PSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGEuZXF1YWxzKGIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIEltcG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93bk1pbWVUeXBlU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFbWFpbC5DT05URU5UX0lURU1fVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBJbS5DT05URU5UX0lURU1fVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBHcm91cE1lbWJlcnNoaXAuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLQotICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+IG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0KLSAgICBwdWJsaWMgSW1wb3J0VGVzdFByb3ZpZGVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjY2VwdGFuYmxlTWltZVR5cGUgOiBzS25vd25NaW1lVHlwZVNldCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBIYXNoU2V0IHNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdGhlIGNvbnRlbnQgb2YKLSAgICAgICAgICAgIC8vIENvbnRlbnRWYWx1ZXMgYWZ0ZXIgdGhlIGluc2VydGlvbiwgd2hpY2ggbWFrZSB0aGUgcmVzdWx0IG9mIGhhc2hDb2RlKCkKLSAgICAgICAgICAgIC8vIGNoYW5nZXMuLi4KLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5ibGVNaW1lVHlwZSwgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBleHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiVW5rbm93IE1pbWVUeXBlICVzIGluIHRoZSB0ZXN0IGNvZGUuIFRlc3QgY29kZSBzaG91bGQgYmUgYnJva2VuLiIsCi0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uID0KLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICBjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5hZGQoZXhwZWN0ZWRDb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaCgKLSAgICAgICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlRoZXJlIGlzIG5vIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGZha2VSZXN1bHRBcnJheSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHRbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBVcmkgdXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheVtpXSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHQodXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYWN0dWFsQ29udGVudFZhbHVlcyA9IG9wZXJhdGlvbi5yZXNvbHZlVmFsdWVCYWNrUmVmZXJlbmNlcygKLSAgICAgICAgICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5LCBpKTsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBvcGVyYXRpb24uZ2V0VXJpKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhSYXdDb250YWN0cy5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX1RZUEUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodXJpLmVxdWFscyhEYXRhLkNPTlRFTlRfVVJJKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzS25vd25NaW1lVHlwZVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBNaW1lVHlwZSAlcy4gUHJvYmFibHkgYWRkZWQgYWZ0ZXIgZGV2ZWxvcGluZyB0aGlzIHRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBkYXRhIG1lYW5pbmdsZXNzIGluIHRoaXMgdW5pdCB0ZXN0cy4KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIERhdGEuREFUQTEgLSBEQVRBNyBhcmUgc2V0IHRvIG51bGwgb3IgZW1wdHkgU3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQsIGJ1dCBpdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBob3cKLSAgICAgICAgICAgICAgICAvLyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyBpdC4KLSAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBpZ25vcmUgdGhlc2UgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHNwZWNzIGFuZAotICAgICAgICAgICAgICAgIC8vIGp1c3QgY2hlY2sgd2hldGhlciB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW5zZXJ0cyByZWxsZXZlbnQgZGF0YS4KLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBrZXlUb0JlUmVtb3ZlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGFjdHVhbENvbnRlbnRWYWx1ZXMudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5VG9CZVJlbW92ZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXk6IGtleVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJNaW1lVHlwZTogJXMsIGRhdGE6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsIGFjdHVhbENvbnRlbnRWYWx1ZXMudG9TdHJpbmcoKSkpOyAqLwotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBSQVdfQ09OVEFDVF9JRCBlbnRyeSBqdXN0IGZvciBzYWZldHksIHNpbmNlIHdlIGRvIG5vdCBjYXJlCi0gICAgICAgICAgICAgICAgLy8gaG93IHJlc29sdmVyLXJlbGF0ZWQgY29kZSBoYW5kbGVzIHRoZSBlbnRyeSBpbiB0aGlzIHVuaXQgdGVzdCwKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsQ29udGVudFZhbHVlcy5jb250YWluc0tleShEYXRhLlJBV19DT05UQUNUX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShEYXRhLlJBV19DT05UQUNUX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiQ29udGVudFZhbHVlcyBmb3IgTWltZVR5cGUgIiArIG1pbWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBleHBlY3RlZCBhdCBhbGwgKCIgKyBhY3R1YWxDb250ZW50VmFsdWVzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZm9yIHRlc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJleHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiYWN0dWFsICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWxzRm9yQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLnJlbW92ZShleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJVbmV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG5FeHBlY3RlZDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIFVyaSBoYXMgY29tZTogIiArIHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJldHVybiBmYWtlUmVzdWx0QXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gOgotICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhaWxNc2cgPQotICAgICAgICAgICAgICAgICJUaGVyZSBpcyhhcmUpIHJlbWFpbmluZyBleHBlY3RlZCBDb250ZW50VmFsdWVzIGluc3RhbmNlKHMpOiBcbiIKLSAgICAgICAgICAgICAgICAgICAgKyBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHByaW50IENvbnRlbnRWYWx1ZXMgd2hvc2UgY29udGVudCBpcyBwcmludGVkIHdpdGggc29ydGVkIGtleXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlVmFsdWUgPSAiIjsKLSAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzb3J0ZWRNYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgbWltZVR5cGVWYWx1ZSA9IHZhbHVlU3RyaW5nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChrZXkpOwotICAgICAgICAgICAgICAgIHNvcnRlZE1hcC5wdXQoa2V5LCB2YWx1ZVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlVmFsdWUpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHNvcnRlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGtleSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVwiIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNGb3JDb250ZW50VmFsdWVzKAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBleHBlY3RlZCwgQ29udGVudFZhbHVlcyBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCB8fCBleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBleHBlY3RlZC52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFhY3R1YWwuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKGJ5dGVbXSl2YWx1ZSwgKGJ5dGVbXSlhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlLmVxdWFscyhhY3R1YWwuZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjE1ZmQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1jbGFzcyBMaW5lVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TGluZVZlcmlmaWVyRWxlbT4gbUxpbmVWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyKFRlc3RDYXNlIHRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyRWxlbShtVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QuYWRkKGxpbmVWZXJpZmllcik7Ci0gICAgICAgIHJldHVybiBsaW5lVmVyaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFN0cmluZyB2Y2FyZCkgewotICAgICAgICBpZiAoaW5kZXggPj0gbUxpbmVWZXJpZmllckVsZW1MaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkluc3VmZmljaWVudCBudW1iZXIgb2YgTGluZVZlcmlmaWVyICgiICsgaW5kZXggKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBtTGluZVZlcmlmaWVyRWxlbUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgbGluZVZlcmlmaWVyLnZlcmlmeSh2Y2FyZCk7Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgdmVyaWZ5KHZjYXJkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzYjI5Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotY2xhc3MgTGluZVZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUV4cGVjdGVkTGluZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwOwotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0oVGVzdENhc2UgdGVzdENhc2UsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWQoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsaW5lKSkgewotICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZUFycmF5ID0gdmNhcmQuc3BsaXQoIlxccj9cXG4iKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7Ci0gICAgICAgIGJvb2xlYW4gYmVnaW5FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBlbmRFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB2ZXJzaW9uRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lQXJyYXlbaV07Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCJCRUdJTjpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJCRUdJTjpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZWdpbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkVORDpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFwiRU5EOlZDQVJEXCIgbGluZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1Jc1YzMCA/ICJWRVJTSU9OOjMuMCIgOiAiVkVSU0lPTjoyLjEiKS5lcXVhbHNJZ25vcmVDYXNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFZFUlNJT04gbGluZSArIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBvdGhlciB0aGFuIEJFR0lOIGNhbWUgYmVmb3JlIEJFR0lOIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBFTkQgY2FtZSBhZnRlciBFTkQgcHJvcGVydHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1FeHBlY3RlZExpbmVMaXN0LmluZGV4T2YobGluZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIGxpbmU6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGVjdGVkTGluZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRMaW5lIDogbUV4cGVjdGVkTGluZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGV4cGVjdGVkTGluZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIGxpbmUocykgbm90IGZvdW5kOiIgKyBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWY2ZDIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqCi0gKiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgdGVzdGluZyBwYXJzZXIgY29kZSAoVkNhcmRQYXJzZXIpLCBzaW5jZSBhbGwgcHJvcGVydGllcyBjYW4gYmUKLSAqIGNoZWNrZWQgdmlhIHRoaXMgY2xhc3MgdW5saWtlIHtAbGluayBWQ2FyZEVudHJ5fSwgd2hpY2ggb25seSBlbWl0cyB0aGUgcmVzdWx0IG9mCi0gKiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29udGVudCBvZiBlYWNoIHZDYXJkLiBXZSBjYW5ub3Qga25vdyB3aGV0aGVyIHZDYXJkIHBhcnNlciBvcgotICogQ29udGFjdFN0cnVjdCBpcyB3cm9uZyB3aXRob3V0aCB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BOYW1lOwotICAgIHB1YmxpYyBTdHJpbmcgcHJvcFZhbHVlOwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvcjsKLQotICAgIC8qKiBTdG9yZSB2YWx1ZSBhcyBieXRlW10sYWZ0ZXIgZGVjb2RlLgotICAgICAqIFVzZWQgd2hlbiBwcm9wVmFsdWUgaXMgZW5jb2RlZCBieSBzb21ldGhpbmcgbGlrZSBCQVNFNjQsIFFVT1RFRC1QUklOVEFCTEUsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlczsKLQotICAgIC8qKiBwYXJhbSBzdG9yZToga2V5PXBhcmFtVHlwZSwgdmFsdWU9cGFyYW1WYWx1ZQotICAgICAqIE5vdGUgdGhhdCBjdXJyZW50bHkgUHJvcGVydHlOb2RlIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgcGFyYW0tdmFsdWVzCi0gICAgICogZGVmaW5lZCBpbiB2Q2FyZCAzLjAgKFNlZSBhbHNvIFJGQyAyNDI2KS4gbXVsdGlwbGUtdmFsdWVzIGFyZSBzdG9yZWQgYXMKLSAgICAgKiBvbmUgU3RyaW5nIHZhbHVlIGxpa2UgIkEsQiIsIG5vdCBbIkEiLCAiQiJdLi4uCi0gICAgICogVE9ETzogZml4IHRoaXMuIAotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzIHBhcmFtTWFwOwotCi0gICAgLyoqIE9ubHkgZm9yIFRZUEU9Pz8/IHBhcmFtIHN0b3JlLiAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBwYXJhbU1hcF9UWVBFOwotCi0gICAgLyoqIFN0b3JlIGdyb3VwIHZhbHVlcy4gVXNlZCBvbmx5IGluIFZDYXJkLiAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQ7Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZSgpIHsKLSAgICAgICAgcHJvcE5hbWUgPSAiIjsKLSAgICAgICAgcHJvcFZhbHVlID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZV92ZWN0b3IgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcGFyYW1NYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBwYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBwcm9wR3JvdXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVfdmVjdG9yLAotICAgICAgICAgICAgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRSwKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wTmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfdmVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlX3ZlY3RvciA9IHByb3BWYWx1ZV92ZWN0b3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnByb3BWYWx1ZV9ieXRlcyA9IHByb3BWYWx1ZV9ieXRlczsKLSAgICAgICAgaWYgKHBhcmFtTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXAgPSBwYXJhbU1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbU1hcF9UWVBFICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXBfVFlQRSA9IHBhcmFtTWFwX1RZUEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BHcm91cFNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IHByb3BHcm91cFNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIC8vIHZDYXJkIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgc2FtZSBsaW5lIGluIG9uZSBlbnRyeSwgd2hpbGUgSGFzaFNldCBvciBhbnkgb3RoZXIKLSAgICAgICAgLy8gbGlicmFyeSB3aGljaCB1dGlsaXplIGhhc2hDb2RlKCkgZG9lcyBub3QgaG9ub3IgdGhhdCwgc28gaW50ZW50aW9uYWxseSB0aHJvdyBhbgotICAgICAgICAvLyBFeGNlcHRpb24uCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiUHJvcGVydHlOb2RlIGRvZXMgbm90IHByb3ZpZGUgaGFzaENvZGUoKSBpbXBsZW1lbnRhdGlvbiBpbnRlbnRpb25hbGx5LiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFByb3BlcnR5Tm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUHJvcGVydHlOb2RlIG5vZGUgPSAoUHJvcGVydHlOb2RlKW9iajsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wTmFtZSA9PSBudWxsIHx8ICFwcm9wTmFtZS5lcXVhbHMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwYXJhbU1hcF9UWVBFLmVxdWFscyhub2RlLnBhcmFtTWFwX1RZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXByb3BHcm91cFNldC5lcXVhbHMobm9kZS5wcm9wR3JvdXBTZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwgJiYgQXJyYXlzLmVxdWFscyhwcm9wVmFsdWVfYnl0ZXMsIG5vZGUucHJvcFZhbHVlX2J5dGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZS5lcXVhbHMobm9kZS5wcm9wVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgdmFsdWUgaW4gcHJvcFZhbHVlX3ZlY3RvciBpcyBub3QgZGVjb2RlZCBldmVuIGlmIGl0IHNob3VsZCBiZQotICAgICAgICAgICAgLy8gZGVjb2RlZCBieSBCQVNFNjQgb3IgUVVPVEVELVBSSU5UQUJMRS4gV2hlbiB0aGUgc2l6ZSBvZiBwcm9wVmFsdWVfdmVjdG9yCi0gICAgICAgICAgICAvLyBpcyAxLCB0aGUgZW5jb2RlZCB2YWx1ZSBpcyBzdG9yZWQgaW4gcHJvcFZhbHVlLCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgICAgICAgICAgLy8gY2hlY2sgaXQuCi0gICAgICAgICAgICByZXR1cm4gKHByb3BWYWx1ZV92ZWN0b3IuZXF1YWxzKG5vZGUucHJvcFZhbHVlX3ZlY3RvcikgfHwKLSAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPT0gMSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLnByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwcm9wTmFtZTogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BOYW1lKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcGFyYW1NYXA6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJhbU1hcC50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcGFyYW1NYXBfVFlQRTogWyIpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgZWxlbSA6IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOwotICAgICAgICBpZiAoIXByb3BHcm91cFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BHcm91cFNldDogWyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbSA6IHByb3BHcm91cFNldCkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfdmVjdG9yICE9IG51bGwgJiYgcHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWVfdmVjdG9yIHNpemU6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfYnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX2J5dGVzIHNpemU6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlX2J5dGVzLmxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlOiBcIiIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZGQwNzQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllciBleHRlbmRzIFZOb2RlQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLCB2Q2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpOyAgLy8gVXNlIFN0cmljdFBhcnNpbmcuCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICB2ZXJpZnkoaXMsIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCB0aGlzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIHN1cGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IHZOb2RlTGlzdC5zaXplKCkpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkudmVyaWZ5KHZOb2RlTGlzdC5nZXQobUluZGV4KSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLX0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIHZlcmlmaWVzIGlucHV0IFZOb2RlLgotICoKLSAqIFRoaXMgY2xhc3MgZmlyc3QgY2hlY2tzIHdoZXRoZXIgZWFjaCBwcm9wZXJ0eU5vZGUgaW4gdGhlIFZOb2RlIGlzIGluIHRoZQotICogIm9yZGVyZWQgZXhwZWN0ZWQgcHJvcGVydHkgbGlzdCIuCi0gKiBJZiB0aGUgbm9kZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgIm9yZGVyZWQgbGlzdCIsIHRoZSBjbGFzcyByZWZlcnMgdG8KLSAqICJ1bm9yZGVyZCBleHBlY3RlZCBwcm9wZXJ0eSBzZXQiIGFuZCBjaGVja3MgdGhlIG5vZGUgaXMgZXhwZWN0ZWQgc29tZXdoZXJlLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVNldCBleHRlbmRzIEhhc2hTZXQ8U3RyaW5nPiB7Ci0gICAgICAgIHB1YmxpYyBUeXBlU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgR3JvdXBTZXQoU3RyaW5nIC4uLiBhcnJheSkgewotICAgICAgICAgICAgc3VwZXIoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PiBtT3JkZXJlZE5vZGVNYXA7Ci0gICAgLy8gSW50ZW50aW9uYWxseSB1c2UgQXJyYXlMaXN0IGluc3RlYWQgb2YgU2V0LCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZQotICAgIC8vIGV4YWN0bHkgc2FtZSBvYmplY3RzLgotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gbVVub3JkZXJlZE5vZGVMaXN0OwotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbU9yZGVyZWROb2RlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Tm9kZT4+KCk7Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICAvLyBXaXRoT3JkZXIKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLnRvU3RyaW5nKCksIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlOb2RlIHByb3BlcnR5Tm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5wdXQocHJvcE5hbWUsIGV4cGVjdGVkTm9kZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGV4cGVjdGVkTm9kZUxpc3QuYWRkKHByb3BlcnR5Tm9kZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vIFdpdGhvdXRPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QuYWRkKG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFZOb2RlIHZub2RlKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUgOiB2bm9kZS5wcm9wTGlzdCkgewotICAgICAgICAgICAgdmVyaWZ5Tm9kZShhY3R1YWxOb2RlLnByb3BOYW1lLCBhY3R1YWxOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1PcmRlcmVkTm9kZU1hcC5pc0VtcHR5KCkgfHwgIW1Vbm9yZGVyZWROb2RlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZFByb3BzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8UHJvcGVydHlOb2RlPiBub2RlcyA6IG1PcmRlcmVkTm9kZU1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBub2RlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJvcHMuYWRkKG5vZGUucHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgbm9kZSA6IG1Vbm9yZGVyZWROb2RlTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRQcm9wcy5jb250YWlucyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiRXhwZWN0ZWQgcHJvcGVydHkgIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZFByb3BzLnRvQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShmaW5hbCBTdHJpbmcgcHJvcE5hbWUsIGZpbmFsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlKSB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gKGV4cGVjdGVkTm9kZUxpc3QgIT0gbnVsbCA/IGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpIDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlID0gZXhwZWN0ZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZS5wcm9wTmFtZS5lcXVhbHMocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5vZGVMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yZGVyZWROb2RlTWFwLnJlbW92ZShwcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQoZXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vICJhY3R1YWxOb2RlIiBpcyBub3QgaW4gb3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIC8vIFRyeSBsb29raW5nIG92ZXIgdW5vcmRlcmVkIGV4cGVjdGVkIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgcHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgZXhpc3RzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24oTGlzdDxTdHJpbmc+IGFycmF5KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBwcm9wVmFsdWVFbGVtIDogYXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcFZhbHVlRWxlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gYWN0dWFsTm9kZS5wcm9wTmFtZTsKLSAgICAgICAgaW50IHVub3JkZXJlZExpc3RTaXplID0gbVVub3JkZXJlZE5vZGVMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bm9yZGVyZWRMaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU5vZGUgdW5vcmRlcmVkRXhwZWN0ZWROb2RlID0gbVVub3JkZXJlZE5vZGVMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQodW5vcmRlcmVkRXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlIDogZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGV4cGVjdGVkTm9kZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBoYXMgd3JvbmcgdmFsdWUuXG4iCi0gICAgICAgICAgICAgICAgKyBidWlsZGVyLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIgIGFjdHVhbDogIiArIGFjdHVhbE5vZGUudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwNDY0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBjb2RlIHJlbGF0ZWQgdG8gdkNhcmQgZXhwb3J0ZXIsIGluY3VsZGluZyB2Q2FyZCBjb21wb3Nlci4KLSAqIFRoaXMgdGVzdCBjbGFzcyBkZXBlbmRzIG9uIHZDYXJkIGltcG9ydGVyIGNvZGUsIHNvIGlmIHRlc3RzIGZvciB2Q2FyZCBpbXBvcnRlciBmYWlsLAotICogdGhlIHJlc3VsdCBvZiB0aGlzIGNsYXNzIHdpbGwgbm90IGJlIHJlbGlhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFeHBvcnRlclRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXkgPQotICAgICAgICBWQ2FyZEltcG9ydGVyVGVzdHMuc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUm9pZCBBbmRvIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIkFuZG87Um9pZDs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBbmRvIiwgIlJvaWQiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIik7Ci0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIiwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVByZWZpeCBBcHByb3ByaWF0ZUdpdmVuTmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUgQXBwcm9wcmlhdGVGYW1pbHlOYW1lIEFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLQotICAgICAgICBpZiAoaXNWMzApIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5ICJwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLCBzbyB0aGF0IG91ciB2Q2FyZCBmaWxlCi0gICAgICogd2lsbCBub3QgY29uZnVzZSB0aGUgZXh0ZXJuYWwgaW1wb3J0ZXIsIGFzc3VtaW5nIHRoZXJlIG1heSBiZSBzb21lIGltcG9ydGVyCi0gICAgICogd2hpY2ggcHJlc3VtZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgcHJvcGVydHkgdG93YXJkIGVhY2ggb2YgICJOIiwgIkZOIiwgZXRjLgotICAgICAqIE5vdGUgdGhhdCBtb3JlIHRoYW4gb25lICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzIGFyZSBhY2NlcHRhYmxlIGluIHZDYXJkIHNwZWMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gKHZjYXJkVHlwZSA9PSBWMzApOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZSwgc2luY2UgdGhpcyBpcyBzZWNvbmQsIG5vdCBmaXJzdC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4yIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0KLSAgICAgICAgaWYgKGlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUgIgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYzMCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgb25seSAic3VwZXIgcHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZC4KLSAgICAgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiB7QGxpbmsgI3Rlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50KX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzAgPSAodmNhcmRUeXBlID09IFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19TVVBFUl9QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4zIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0KLSAgICAgICAgaWYgKGlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVYzMCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5JQ0tOQU1FIiwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZUJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVJlZnJhaW5Gb3JtYXR0aW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxIHwgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB2Q2FyZCBjb21wb3NlciBlbWl0cyBjb3JyZXNwb25kaW5nIHR5cGUgcGFyYW0gd2hpY2ggd2UgZXhwZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVJfRkFYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEzMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1RFTEVYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU1TKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMzAiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNTAiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2MCIsIG5ldyBUeXBlU2V0KCJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3MCIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4MCIsIG5ldyBUeXBlU2V0KCJDQVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEwMCIsIG5ldyBUeXBlU2V0KCJJU0ROIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjExMCIsIG5ldyBUeXBlU2V0KCJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMCIsIG5ldyBUeXBlU2V0KCJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTMwIiwgbmV3IFR5cGVTZXQoIlRMWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE1MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE2MCIsIG5ldyBUeXBlU2V0KCJNU0ciKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWMzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIlBSRUYicyBhcmUgZW1pdHRlZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTW9kZW0iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1TRyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiQkJTIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWSURFTyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJfQVVUT19DRUxMIik7ICAvLyBUaGUgb2xkIGluZGljYXRvciBmb3IgdGhlIHR5cGUgbW9iaWxlLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU2NDNBXHU1RTJGIik7ICAvLyBNb2JpbGUgcGhvbmUgaW4gSmFwYW5lc2UgS2FuamkKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjgiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgImludmFsaWQiKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNT0RFTSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIk1TRyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkJCUyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNiIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4IiwgbmV3IFR5cGVTZXQoIlgtaW52YWxpZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsQmFzaWNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfT1RIRVIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ub3R5cGVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlN0cmVldCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiUmVnaW9uIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiQ291bnRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLCAiRm9ybWF0dGVkIEFkZHJlc3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSyk7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvdW50cnkgTmFtZQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgTkVJR0hCT1JIT09EIGZpZWxkIGlzIGFwcGVuZGVkIGFmdGVyIHRoZSBDSVRZIGZpZWxkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiU3RyZWV0IiwgIkNpdHkgTmVpZ2hib3Job29kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiIsICIxMDAiLCAiQ291bnRyeSIpLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIkNpdHkiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09ELCAiTmVpZ2hib3Job29kIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIk5laWdoYm9yaG9vZCIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIiIpICAvLyBNdXN0IGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLCAiO0Zvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZTs7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIHZDYXJkIGNvbXBvc2VyIGhvbm9ycyBmb3JtYXR0ZWQgZGF0YSB3aGVuIGl0IGlzIGF2YWlsYWJsZQotICAgICAqIGV2ZW4gd2hlbiBpdCBpcyBwYXJ0aWFsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlBvYm94IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIlBvYm94Ozs7Ozs7Q291bnRyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkNvdW50cnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPcmdhbml6YXRpb25Db21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiRGVwYXJ0bWVudFkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVaIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5KT0JfREVTQ1JJUFRJT04sICJEZXNjcmlwdGlvbiBSYW1iZGEiKSAgLy8gSWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5PRkZJQ0VfTE9DQVRJT04sICJNb3VudGFpbiBWaWV3IikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uUEhPTkVUSUNfTkFNRSwgIlBob25ldGljTmFtZSEiKSAgLy8gSWdub3JlZAotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlNZTUJPTCwgIiheb14pL35+Iik7ICAvLyBJZ25vcmUgaGltIChoZXIpLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uQ09NUEFOWSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiRGVwYXJ0bWVudFhYIikKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueVhZWiIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJUaXRsZVhZWllYIik7Ci0gICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgdXNlIGdyb3VwIGJ1dCBkZXBlbmQgb24gdGhlIG9yZGVyLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WDtEZXBhcnRtZW50WSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJDb21wYW55WCIsICJEZXBhcnRtZW50WSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRJVExFIiwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRJVExFIiwgIlRpdGxlWFlaWVgiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTVNOKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm1zbiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1lBSE9PKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInlhaG9vIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfU0tZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAic2t5cGUiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9RUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJxcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImdvb2dsZSB0YWxrIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSUNRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImljcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0pBQkJFUikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJqYWJiZXIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ORVRNRUVUSU5HKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm5ldG1lZXRpbmciKTsKLQotICAgICAgICAvLyBObyBkZXRlcm1pbmVkIHdheSB0byBleHByZXNzIHVua25vd24gdHlwZS4uLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSkFCQkVSIiwgImphYmJlciIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1JQ1EiLCAiaWNxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUdPT0dMRS1UQUxLIiwgImdvb2dsZSB0YWxrIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVFRIiwgInFxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVNLWVBFLVVTRVJOQU1FIiwgInNreXBlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVlBSE9PIiwgInlhaG9vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU1TTiIsICJtc24iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTkVUTUVFVElORyIsICJuZXRtZWV0aW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpVjIxKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0xIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0yIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXZWJzaXRlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0JMT0cpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfRlRQKTsKLQotICAgICAgICAvLyBXZSBkcm9wIFRZUEUgaW5mb3JtYXRpb24gc2luY2UgdkNhcmQgKGVzcGVjaWFsbHkgMy4wKSBkb2VzIG5vdCBhbGxvdyB1cyB0byBlbWl0IGl0LgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMjEoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMzAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbmRyb2lkUHJvcFZhbHVlKG1pbWVUeXBlLCB2YWx1ZSwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgIEludGVnZXIgdHlwZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiAobWltZVR5cGUgKyAiOyIgKyB2YWx1ZSArICI7IgotICAgICAgICAgICAgICAgICsgKHR5cGUgIT0gbnVsbCA/IHR5cGUgOiAiIikgKyAiOyIKLSAgICAgICAgICAgICAgICArIChsYWJlbCAhPSBudWxsID8gbGFiZWwgOiAiIikgKyAiOzs7Ozs7Ozs7Ozs7Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFdmVudENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgyLTA2LTE2Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDgtMTAtMjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAxOC0wMy0xMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5MQUJFTCwgIlRoZSBsYXN0IGRheSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDktMDUtMTkiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkJEQVkiLCAiMjAwOC0xMC0yMiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjE5ODItMDYtMTYiLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMjAxOC0wMy0xMiIsIEV2ZW50LlRZUEVfT1RIRVIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5UWVBFX0NVU1RPTSwgIlRoZSBsYXN0IGRheSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYzMCgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROb3RlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIikKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuSVNfUFJJTUFSWSwgMSk7ICAvLyBKdXN0IGlnbm9yZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJub3RlMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJub3RlMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RlVjIxKCkgewotICAgICAgICB0ZXN0Tm90ZUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RlVjMwKCkgewotICAgICAgICB0ZXN0Tm90ZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvdG9Db21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gdmNhcmRUeXBlID09IFYzMDsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlBob3RvVGVzdCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheSk7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yUGhvdG8gPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8ucHV0KCJFTkNPRElORyIsIChpc1YzMCA/ICJiIiA6ICJCQVNFNjQiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJQaG90b1Rlc3QiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiUGhvdG9UZXN0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQaG90b1Rlc3QiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUEhPVE8iLCBudWxsLCBudWxsLCBzUGhvdG9CeXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8sIG5ldyBUeXBlU2V0KCJKUEVHIiksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YyMSgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjMwKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlbGF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdFJlbGF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMEhhbmRsZUVzY2FwZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIjsiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgLy8gVmVyaWZpZXMgdGhlIHZDYXJkIFN0cmluZyBjb3JyZWN0bHkgZXNjYXBlcyBlYWNoIGNoYXJhY3RlciB3aGljaCBtdXN0IGJlIGVzY2FwZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIk46XFxcXDtcXDs7XFwsO1xcbjsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46Wzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoIlxcIiwgIjsiLCAiLCIsICJcbiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlcmUncyBubyAiTklDS05BTUUiIHByb3BlcnR5IGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4gdkNhcmQgMy4wLgotICAgICAqIFdlIHVzZSBBbmRyb2lkLXNwZWNpZmljICJYLUFORFJPSUQtQ1VTVE9NIiBwcm9wZXJ0eS4KLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSArICI7Tmlja3k7Ozs7Ozs7Ozs7Ozs7OyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpLmFkZEV4cGVjdGVkKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvbGVyYXRlQnJva2VuUGhvbmVOdW1iZXJFbnRyeVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NTUtNjY2IChUb2t5byk7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiNzc3LTg4OC05OTk5IChDaGljYWdvKTsxMTEtMjIyLTMzMzMgKE1pYW1pKSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTEtMjIyLTMzMzMiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0NDQtNTU1LTU2NjYiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3NzctODg4LTk5OTkiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7ICAvLyBFbXB0eSBuYW1lLiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MSIpOyAgLy8gTm90IHByaW1hcnkuIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MiIpOyAgLy8gVGhpcyBlbnRyeSBpcyB3aGF0IHdlIHdhbnQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHkzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJmYW1pbHkyIiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgImZhbWlseTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjIxKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YzMCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMzApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMjI1NC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSW1wb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICAvLyBQdXNoIGRhdGEgaW50byBpbnQgYXJyYXkgYXQgZmlyc3Qgc2luY2UgdmFsdWVzIGxpa2UgMHg4MCBhcmUKLSAgICAvLyBpbnRlcnByZXRlZCBhcyBpbnQgYnkgdGhlIGNvbXBpbGVyIGFuZCBjYXN0aW5nIGFsbCBvZiB0aGVtIGlzCi0gICAgLy8gY3VtYmVyc29tZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gewotICAgICAgICAweGZmLCAweGQ4LCAweGZmLCAweGUxLCAweDBhLCAweDBmLCAweDQ1LCAweDc4LCAweDY5LCAweDY2LCAweDAwLAotICAgICAgICAweDAwLCAweDRkLCAweDRkLCAweDAwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBkLAotICAgICAgICAweDAxLCAweDBlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGFhLCAweDAxLCAweDBmLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGJhLCAweDAxLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGMyLCAweDAxLCAweDEyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGQwLCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDMxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDAxLCAweDMyLCAweDAwLAotICAgICAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweGU2LCAweDAyLCAweDEzLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDgyLAotICAgICAgICAweDk4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGZhLAotICAgICAgICAweDg3LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDg0LCAweGM0LCAweGE1LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDFlLCAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDMxLAotICAgICAgICAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLCAweDAwLCAweDAwLAotICAgICAgICAweDQ0LCAweDZmLCAweDQzLCAweDZmLCAweDRkLCAweDZmLCAweDAwLCAweDAwLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDIwLCAweDU2LCAweDY1LCAweDcyLCAweDMxLCAweDJlLCAweDMwLCAweDMwLCAweDAwLAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDIwLCAweDIwLAotICAgICAgICAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAotICAgICAgICAweDAwLCAweDUwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDQ5LCAweDRkLCAweDAwLCAweDMwLCAweDMzLAotICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDE0LCAweDAwLAotICAgICAgICAweDE0LCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDM0LCAweDAxLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDExLCAweDA5LCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDBmLCAweDBiLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDA1LCAweDk3LCAweDAwLCAweDAwLCAweDI3LCAweDEwLAotICAgICAgICAweDAwLCAweDAwLCAweDA4LCAweGIwLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFjLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAyLCAweDVlLCAweDAwLCAweDAwLAotICAgICAgICAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDhiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGNiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFiLCAweGU1LAotICAgICAgICAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDI4LCAweDgyLCAweDlhLCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDZhLCAweDgyLCAweDlkLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDcyLCAweDg4LCAweDIyLCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkwLCAweDAwLAotICAgICAgICAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLCAweDMyLCAweDMyLCAweDMwLCAweDkwLAotICAgICAgICAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLCAweDdhLAotICAgICAgICAweDkwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLAotICAgICAgICAweDhlLCAweDkxLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDAyLAotICAgICAgICAweDAzLCAweDAwLCAweDkxLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGEyLCAweDkyLCAweDAxLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAzLCAweGFhLCAweDkyLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGIyLCAweDkyLCAweDA0LCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGJhLCAweDkyLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGMyLCAweDkyLCAweDA3LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkyLCAweDA4LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDA5LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLAotICAgICAgICAweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGNhLAotICAgICAgICAweDkyLCAweDdjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDkyLCAweDg2LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLAotICAgICAgICAweDAzLCAweGQyLCAweGEwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLAotICAgICAgICAweDMxLCAweDMwLCAweDMwLCAweGEwLCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGEwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweGEwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweGEwLCAweDA1LCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweGEyLCAweDBlLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGU4LCAweGEyLCAweDBmLCAweDAwLAotICAgICAgICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGYwLCAweGEyLCAweDEwLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweGEyLAotICAgICAgICAweDE3LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLAotICAgICAgICAweGEzLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGEzLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGE0LCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA0LCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGY4LCAweGE0LCAweDA1LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDFkLCAweDAwLCAweDAwLCAweGE0LCAweDA2LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA3LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA4LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LAotICAgICAgICAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGE0LCAweDBhLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGE0LCAweDBjLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUzLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDMzLCAweDMxLCAweDAwLCAweDMyLCAweDMwLAotICAgICAgICAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLCAweDMxLCAweDMzLAotICAgICAgICAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDg4LAotICAgICAgICAweDAwLCAweDAwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweGIyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDY0LCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDBlLCAweDkyLCAweDAwLCAweDAwLCAweDAzLCAweGU4LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMyLCAweDMwLCAweDMwLAotICAgICAgICAweDM4LCAweDMxLCAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLAotICAgICAgICAweDAwLCAweDAwLCAweDIwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDJhLAotICAgICAgICAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA0LCAweDUyLCAweDM5LCAweDM4LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDMwLCAweDMxLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDZjLCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDA0LCAweDc0LCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDdjLCAweDAyLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA1LCAweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGQ4LCAweGZmLCAweGRiLCAweDAwLCAweDg0LAotICAgICAgICAweDAwLCAweDIwLCAweDE2LCAweDE4LCAweDFjLCAweDE4LCAweDE0LCAweDIwLCAweDFjLCAweDFhLCAweDFjLAotICAgICAgICAweDI0LCAweDIyLCAweDIwLCAweDI2LCAweDMwLCAweDUwLCAweDM0LCAweDMwLCAweDJjLCAweDJjLCAweDMwLAotICAgICAgICAweDYyLCAweDQ2LCAweDRhLCAweDNhLCAweDUwLCAweDc0LCAweDY2LCAweDdhLCAweDc4LCAweDcyLCAweDY2LAotICAgICAgICAweDcwLCAweDZlLCAweDgwLCAweDkwLCAweGI4LCAweDljLCAweDgwLCAweDg4LCAweGFlLCAweDhhLCAweDZlLAotICAgICAgICAweDcwLCAweGEwLCAweGRhLCAweGEyLCAweGFlLCAweGJlLCAweGM0LCAweGNlLCAweGQwLCAweGNlLCAweDdjLAotICAgICAgICAweDlhLCAweGUyLCAweGYyLCAweGUwLCAweGM4LCAweGYwLCAweGI4LCAweGNhLCAweGNlLCAweGM2LCAweDAxLAotICAgICAgICAweDIyLCAweDI0LCAweDI0LCAweDMwLCAweDJhLCAweDMwLCAweDVlLCAweDM0LCAweDM0LCAweDVlLCAweGM2LAotICAgICAgICAweDg0LCAweDcwLCAweDg0LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGZmLCAweGMwLAotICAgICAgICAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDc4LCAweDAwLCAweGEwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLAotICAgICAgICAweDAyLCAweDExLCAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAgICAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLAotICAgICAgICAweDAzLCAweDAyLCAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDdkLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLAotICAgICAgICAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLAotICAgICAgICAweDkxLCAweGExLCAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAotICAgICAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLAotICAgICAgICAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LAotICAgICAgICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAotICAgICAgICAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAotICAgICAgICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLAotICAgICAgICAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLAotICAgICAgICAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAotICAgICAgICAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LAotICAgICAgICAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LAotICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLAotICAgICAgICAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LAotICAgICAgICAweDQyLCAweDkxLCAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LAotICAgICAgICAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LAotICAgICAgICAweDE4LCAweDE5LCAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLAotICAgICAgICAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLAotICAgICAgICAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LAotICAgICAgICAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAotICAgICAgICAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LAotICAgICAgICAweGRhLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLAotICAgICAgICAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLAotICAgICAgICAweDBjLCAweDAzLCAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLAotICAgICAgICAweDE0LCAweDU0LCAweGFhLCAweDJhLCAweDQ2LCAweDQ4LCAweGEyLCAweGE0LCAweDU1LCAweGE2LCAweDA0LAotICAgICAgICAweDhhLCAweDI5LCAweGUwLCAweDUzLCAweDEwLCAweGUwLCAweDI5LCAweGMwLCAweDUwLCAweDAzLCAweGIxLAotICAgICAgICAweDQ2LCAweDI5LCAweDgwLCAweDg0LCAweDUyLCAweDExLCAweDQwLCAweDBkLCAweDIyLCAweDlhLCAweDQ1LAotICAgICAgICAweDIwLCAweDIzLCAweDYxLCAweDUxLCAweDMwLCAweGEwLCAweDA4LCAweGM4LCAweGE4LCAweGQ4LCAweDUyLAotICAgICAgICAweDAyLCAweDI2LCAweDE1LCAweDBiLCAweDBhLCAweDAwLCAweGI0LCAweGEyLCAweGE1LCAweDVhLCAweDAwLAotICAgICAgICAweDkxLCAweDQ1LCAweDRhLCAweGEyLCAweDgxLCAweDkyLCAweDAxLCAweDRlLCAweDAyLCAweDk4LCAweDg3LAotICAgICAgICAweDBhLCAweDcwLCAweGEwLCAweDA3LCAweDYyLCAweDhjLCAweDUwLCAweDIxLCAweDBkLCAweDI1LCAweDAwLAotICAgICAgICAweDM0LCAweDhhLCAweDYxLCAweDE0LCAweDBjLCAweDYzLCAweDBhLCAweDg5LCAweDg1LCAweDAwLCAweDQ2LAotICAgICAgICAweGQ1LCAweDFiLCAweDUyLCAweDAyLCAweDE2LCAweGE4LCAweDk4LCAweDUwLCAweDA1LCAweDk0LCAweGE5LAotICAgICAgICAweDE2LCAweDgwLCAweDI1LCAweDVhLCAweDk1LCAweDY4LCAweDE4LCAweGYxLCAweDRmLCAweDE0LCAweGM0LAotICAgICAgICAweDNiLCAweGI1LCAweDIyLCAweGI2LCAweDM4LCAweDM0LCAweDAwLCAweGUzLCAweDIyLCAweDhlLCAweGY0LAotICAgICAgICAweDc5LCAweDhhLCAweDdiLCAweGQxLCAweDcxLCAweDAzLCAweDMwLCAweGM3LCAweDE0LCAweDgzLCAweGE1LAotICAgICAgICAweDAwLCAweDA2LCAweDk4LCAweDY4LCAweDAxLCAweDhkLCAweDUxLCAweDM1LCAweDAzLCAweDIyLCAweDZhLAotICAgICAgICAweDhkLCAweGE5LCAweDAxLCAweDEzLCAweDU0LCAweDRkLCAweDQwLCAweDEzLCAweGE1LCAweDRhLCAweDI4LAotICAgICAgICAweDAyLCAweDQ1LCAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDc4LCAweDM0LCAweGYwLCAweDY5LCAweDgwLAotICAgICAgICAweDM0LCAweDgxLCAweDQ1LCAweDQwLCAweGNlLCAweDU4LCAweGU2LCAweGEyLCAweDRjLCAweDA2LCAweGU0LAotICAgICAgICAweGZhLCAweGQxLCAweDkzLCAweDUwLCAweDIxLCAweGNhLCAweGU0LCAweDU1LCAweDg0LCAweDkwLCAweDMwLAotICAgICAgICAweGFiLCAweDhiLCAweDE4LCAweGE2LCAweDlhLCAweDZhLCAweGM0LCAweDMxLCAweGFhLCAweDI2LCAweGEwLAotICAgICAgICAweDY0LCAweDRkLCAweDUxLCAweGI1LCAweDIwLCAweDIzLCAweDZhLCAweDg5LCAweGE4LCAweDAyLCAweDQ0LAotICAgICAgICAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDk1LCAweDRkLCAweDQ4LCAweGE2LCAweDgwLCAweDI0LCAweDUzLAotICAgICAgICAweDRlLCAweGNlLCAweDA1LCAweDMwLCAweDJiLCAweDNiLCAweGVlLCAweDZhLCAweDkxLCAweDVkLCAweDc2LAotICAgICAgICAweDYzLCAweGJkLCAweDY1LCAweDdkLCAweDQwLCAweDY2LCAweDY4LCAweGE5LCAweDAyLCAweDQ1LCAweDJiLAotICAgICAgICAweGIzLCAweDllLCAweGI0LCAweGM1LCAweDZkLCAweGFkLCAweDlhLCAweGEwLCAweDJjLCAweDA2LCAweGM4LAotICAgICAgICAweGNkLCAweDA0LCAweGQ2LCAweGEyLCAweDIzLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDY0LCAweDRkLAotICAgICAgICAweDUxLCAweDkzLCAweDQ4LCAweDA4LCAweGRhLCAweGEyLCAweDZhLCAweDAwLCAweDcyLCAweDFhLCAweDk5LAotICAgICAgICAweDRkLCAweDAwLCAweDQ4LCAweGE2LCAweGE0LCAweDUzLCAweDRjLCAweDA3LCAweDg2LCAweDAzLCAweGJkLAotICAgICAgICAweDJiLCAweDljLCAweGE3LCAweDE0LCAweDk4LCAweDEwLCAweDg1LCAweDM0LCAweGUwLCAweGE2LCAweGIzLAotICAgICAgICAweGIwLCAweDBiLCAweGI1LCAweGE4LCAweDBhLCAweGQ0LCAweDU4LCAweDQyLCAweGVkLCAweDNlLCAweDk0LAotICAgICAgICAweGQyLCAweGE2LCAweDhiLCAweDAxLCAweDM0LCAweDQ0LCAweGVkLCAweGU2LCAweDljLCAweDRkLCAweDZhLAotICAgICAgICAweDgwLCAweDhkLCAweDhkLCAweDQ2LCAweGM2LCAweDgwLCAweDIzLCAweDYzLCAweDUxLCAweDlhLCAweDA2LAotICAgICAgICAweDQ2LCAweGQ1LCAweDEzLCAweDUyLCAweDAxLCAweDU0LCAweGQ0LCAweGFhLCAweDY4LCAweDAyLCAweDQwLAotICAgICAgICAweDZhLCAweDQwLCAweDc4LCAweGEwLCAweDA4LCAweDU5LCAweGNlLCAweGVlLCAweGI1LCAweDJhLCAweDM5LAotICAgICAgICAweGQ5LCAweDU5LCAweGE3LCAweGE4LCAweDAwLCAweDczLCAweGViLCAweDRlLCAweDBlLCAweDdkLCAweDY5LAotICAgICAgICAweDVjLCAweDA1LCAweGYzLCAweDBmLCAweGFkLCAweDFlLCAweDYxLCAweGY1LCAweGE3LCAweDcxLCAweDBiLAotICAgICAgICAweGU2LCAweDM1LCAweDIxLCAweDkwLCAweGQzLCAweGI4LCAweDBlLCAweDMyLCAweDEwLCAweDk1LCAweDEwLAotICAgICAgICAweDkxLCAweGIzLCAweGQ2LCAweDliLCAweDYwLCAweDRiLCAweDljLCAweDhhLCAweDYzLCAweDFhLCAweGIwLAotICAgICAgICAweDE4LCAweDRkLCAweDQ2LCAweGM2LCAweDgwLCAweDIyLCAweDZhLCAweDYxLCAweGE0LCAweDMxLCAweGFhLAotICAgICAgICAweDZhLCAweDU1LCAweDM0LCAweDAxLCAweDJhLCAweDlhLCAweDdlLCAweDc4LCAweGEwLCAweDA4LCAweDA5LAotICAgICAgICAweGY5LCAweGFhLCAweDU4LCAweGNmLCAweGNhLCAweDZiLCAweDNlLCAweGEwLCAweDAwLCAweGQzLCAweDgxLAotICAgICAgICAweGE5LCAweDAxLCAweDczLCAweDQ2LCAweDY5LCAweDgwLCAweGI5LCAweGE0LCAweGNkLCAweDAwLCAweDJiLAotICAgICAgICAweDFmLCAweDkyLCAweGEzLCAweDA3LCAweDlhLCAweDZmLCAweDcwLCAweDI2LCAweGNmLCAweDE0LCAweGQyLAotICAgICAgICAweDZiLCAweDUxLCAweDBjLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDA4LCAweGRhLCAweDk4LCAweDY5LAotICAgICAgICAweDBjLCAweDhkLCAweDRkLCAweDRhLCAweGE2LCAweDgwLCAweDI0LCAweDUzLCAweDUyLCAweDAzLCAweGM1LAotICAgICAgICAweDAyLCAweDIxLCAweDI3LCAweGU2LCAweGE5LCAweDIzLCAweDNmLCAweDI5LCAweGFjLCAweGZhLCAweDhjLAotICAgICAgICAweDAxLCAweGU2LCAweDljLCAweDBkLCAweDQ4LCAweDBhLCAweDBkLCAweDJlLCAweDY4LCAweDAxLCAweDczLAotICAgICAgICAweDQ5LCAweDlhLCAweDYwLCAweDJiLCAweDFmLCAweDkyLCAweDk4LCAweDNhLCAweGQzLCAweDdiLCAweDgxLAotICAgICAgICAweDM2LCAweDc4LCAweGE2LCAweDkzLCAweDVhLCAweDg4LCAweDhjLCAweDlhLCAweDYzLCAweDFhLCAweDAwLAotICAgICAgICAweDhjLCAweGQzLCAweDBkLCAweDIxLCAweDkxLCAweDI5LCAweGE5LCAweDE0LCAweGQwLCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDExLCAweDFiLCAweDFlLCAweDZhLCAweDQ4LCAweGNmLCAweGNhLCAweDZiLAotICAgICAgICAweDNlLCAweGEzLCAweDEwLCAweDFhLCAweDcwLCAweDM1LCAweDIwLCAweDM4LCAweDFhLCAweDVjLCAweGQyLAotICAgICAgICAweDAxLCAweDczLCAweDQ5LCAweDlhLCAweDYwLCAweDM5LCAweDhmLCAweGNhLCAweDI5LCAweDhiLCAweGY3LAotICAgICAgICAweGFhLCAweGJhLCAweDg4LCAweDk2LCAweDlhLCAweDZiLCAweDQwLCAweDE4LCAweGM2LCAweGEzLCAweDI2LAotICAgICAgICAweDgwLCAweDE4LCAweDY5LCAweGE2LCAweDkwLCAweGM4LCAweDE0LCAweGQ0LCAweDhhLCAweDY5LCAweDgwLAotICAgICAgICAweGYwLCAweDZhLCAweDQwLCAweDY4LCAweDEwLCAweGJiLCAweDQxLCAweGE3LCAweGUzLCAweDBiLCAweGM1LAotICAgICAgICAweDJiLCAweDAxLCAweDEwLCAweGE3LCAweDAzLCAweDU5LCAweDBjLCAweDc2LCAweDY5LCAweDczLCAweDQwLAotICAgICAgICAweDBiLCAweDlhLCAweDI4LCAweDExLCAweDI4LCAweDE5LCAweDVlLCAweDY5LCAweDAyLCAweDgxLCAweDVhLAotICAgICAgICAweGQ4LCAweDAwLCAweGQzLCAweDRkLCAweDUwLCAweDBjLCAweDZhLCAweDhjLCAweGQyLCAweDAxLCAweGE2LAotICAgICAgICAweDk4LCAweDY5LCAweDBjLCAweGFlLCAweGE2LCAweGE0LCAweDA2LCAweDgwLCAweDFlLCAweGE2LCAweDllLAotICAgICAgICAweDBkLCAweDMxLCAweDEyLCAweDAzLCAweDRmLCAweDA2LCAweDgwLCAweDEzLCAweDYwLCAweDM0LCAweGQzLAotICAgICAgICAweGMxLCAweGE4LCAweDkyLCAweDAxLCAweGYxLCAweDhkLCAweGRkLCAweDY5LCAweGNjLCAweGExLCAweDY5LAotICAgICAgICAweDViLCAweDRiLCAweDgwLCAweDgzLCAweDkzLCAweDUyLCAweDA0LCAweDE0LCAweGUyLCAweGFlLCAweDAzLAotICAgICAgICAweGE5LCAweDBkLCAweDY4LCAweDAzLCAweDRkLCAweDM0LCAweGQwLCAweDAzLCAweDBkLCAweDMwLCAweGQyLAotICAgICAgICAweDAxLCAweDg2LCAweDlhLCAweDY4LCAweDE5LCAweDU4LCAweDFhLCAweDc4LCAweGE0LCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDEwLCAweGUwLCAweDY5LCAweGUwLCAweGQwLCAweDAzLCAweGMxLCAweGE4LAotICAgICAgICAweGRiLCAweGFkLCAweDRjLCAweDgxLCAweDEyLCAweDQ1LCAweGQ2LCAweDlkLCAweDI1LCAweDFkLCAweDAwLAotICAgICAgICAweDZhLCAweGY1LCAweGE5LCAweGU4LCAweDgwLCAweDMxLCAweDI5LCAweDBkLCAweDU4LCAweDA4LCAweDY5LAotICAgICAgICAweDg2LCAweDgwLCAweDFhLCAweDY5LCAweDg2LCAweDkwLCAweDBjLCAweDM0LCAweGQzLCAweDQ4LCAweDY1LAotICAgICAgICAweDUxLCAweDRmLCAweDA2LCAweDk4LCAweDBmLCAweDE0LCAweGYwLCAweDY4LCAweDEwLCAweGYwLCAweDY5LAotICAgICAgICAweGUwLCAweGQwLCAweDAzLCAweDgxLCAweGE1LCAweDJiLCAweDlhLCAweDFhLCAweGI4LCAweDg3LCAweGE4LAotICAgICAgICAweGRiLCAweDRhLCAweDQ2LCAweDY4LCAweGI2LCAweDgwLCAweDJhLCAweGE4LCAweDE0LCAweGVhLCAweDEyLAotICAgICAgICAweGIwLCAweDA1LCAweDIxLCAweGE2LCAweDAyLCAweDFhLCAweDYxLCAweGEwLCAweDA2LCAweDlhLCAweDYxLAotICAgICAgICAweGE0LCAweDMxLCAweDg2LCAweDlhLCAweDY5LCAweDBjLCAweGE4LCAweDBkLCAweDNjLCAweDUzLCAweDAxLAotICAgICAgICAweGUyLCAweDllLCAweDI4LCAweDEwLCAweGYxLCAweDRlLCAweDA2LCAweDk4LCAweDBmLCAweDA2LCAweDllLAotICAgICAgICAweDBkLCAweDAyLCAweDFjLCAweDI5LCAweGMyLCAweDgwLCAweDE2LCAweDk2LCAweDgwLCAweDBhLCAweDRhLAotICAgICAgICAweDAwLCAweDQzLCAweDRkLCAweDM0LCAweDBjLCAweDYxLCAweGE2LCAweDFhLCAweDQwLCAweDM0LCAweGQzLAotICAgICAgICAweDRkLCAweDIxLCAweDgwLCAweGZmLCAweGQ5LCAweGZmLCAweGRiLCAweDAwLCAweDg0LCAweDAwLCAweDBhLAotICAgICAgICAweDA3LCAweDA3LCAweDA4LCAweDA3LCAweDA2LCAweDBhLCAweDA4LCAweDA4LCAweDA4LCAweDBiLCAweDBhLAotICAgICAgICAweDBhLCAweDBiLCAweDBlLCAweDE4LCAweDEwLCAweDBlLCAweDBkLCAweDBkLCAweDBlLCAweDFkLCAweDE1LAotICAgICAgICAweDE2LCAweDExLCAweDE4LCAweDIzLCAweDFmLCAweDI1LCAweDI0LCAweDIyLCAweDFmLCAweDIyLCAweDIxLAotICAgICAgICAweDI2LCAweDJiLCAweDM3LCAweDJmLCAweDI2LCAweDI5LCAweDM0LCAweDI5LCAweDIxLCAweDIyLCAweDMwLAotICAgICAgICAweDQxLCAweDMxLCAweDM0LCAweDM5LCAweDNiLCAweDNlLCAweDNlLCAweDNlLCAweDI1LCAweDJlLCAweDQ0LAotICAgICAgICAweDQ5LCAweDQzLCAweDNjLCAweDQ4LCAweDM3LCAweDNkLCAweDNlLCAweDNiLCAweDAxLCAweDBhLCAweDBiLAotICAgICAgICAweDBiLCAweDBlLCAweDBkLCAweDBlLCAweDFjLCAweDEwLCAweDEwLCAweDFjLCAweDNiLCAweDI4LCAweDIyLAotICAgICAgICAweDI4LCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweGZmLCAweGMwLCAweDAwLCAweDExLAotICAgICAgICAweDA4LCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLCAweDAyLCAweDExLAotICAgICAgICAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLCAweDAzLCAweDAyLAotICAgICAgICAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDdkLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAotICAgICAgICAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLAotICAgICAgICAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLCAweDI0LCAweDMzLAotICAgICAgICAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LAotICAgICAgICAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LAotICAgICAgICAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LAotICAgICAgICAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LAotICAgICAgICAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLAotICAgICAgICAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLAotICAgICAgICAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLCAweDAzLCAweDAxLAotICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotICAgICAgICAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLAotICAgICAgICAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LCAweDAwLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLAotICAgICAgICAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LCAweDYyLCAweDcyLAotICAgICAgICAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLAotICAgICAgICAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAotICAgICAgICAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LAotICAgICAgICAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLCAweGYzLCAweGY0LAotICAgICAgICAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLCAweDBjLCAweDAzLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLCAweDllLCAweGQyLAotICAgICAgICAweDJlLCAweDA3LCAweDE1LCAweGFmLCAweDZkLCAweDA4LCAweGUyLCAweGIzLCAweDQ1LCAweDFhLCAweGY2LAotICAgICAgICAweGQwLCAweDAwLCAweDAxLCAweGM1LCAweDY4LCAweDQ1LCAweDE3LCAweDRhLCAweGI0LCAweDIyLCAweGU0LAotICAgICAgICAweDcwLCAweDhjLCAweDc0LCAweGE5LCAweDNjLCAweGExLCAweDhlLCAweDk1LCAweDQ4LCAweDk2LCAweDMxLAotICAgICAgICAweGUyLCAweDE4LCAweGU5LCAweDU1LCAweGE1LCAweDhjLCAweDdhLCAweDUwLCAweDA1LCAweDBiLCAweDg4LAotICAgICAgICAweDg2LCAweDBmLCAweDE1LCAweDhmLCAweDc1LCAweDFmLCAweDI2LCAweDkzLCAweDE5LCAweDkxLCAweDc3LAotICAgICAgICAweDE4LCAweGMxLCAweGFjLCAweDRiLCAweGM4LCAweGZhLCAweGQ2LCAweDYzLCAweDM3LCAweDZkLCAweDMxLAotICAgICAgICAweGI0LCAweDczLCAweDViLCAweDM2LCAweGEwLCAweDFjLCAweDUwLCAweDgwLCAweGQ3LCAweDgzLCAweGEwLAotICAgICAgICAweGFiLCAweGQxLCAweDYyLCAweGFkLCAweDA5LCAweDhmLCAweDE3LCAweDI5LCAweDAzLCAweGIyLCAweGNjLAotICAgICAgICAweGUwLCAweDc3LCAweDE0LCAweGEzLCAweDU2LCAweGIzLCAweDI3LCAweDFlLCAweDY3LCAweGU5LCAweDUyLAotICAgICAgICAweGVhLCAweGM2LCAweDNhLCAweDM2LCAweDQ4LCAweGVmLCAweDNkLCAweDI3LCAweDcwLCAweDIyLCAweDYwLAotICAgICAgICAweDQ3LCAweDUyLCAweDY5LCAweGIyLCAweGUyLCAweGFkLCAweDNiLCAweGVhLCAweDgwLCAweGEzLCAweDM4LAotICAgICAgICAweGUwLCAweGQ2LCAweDNkLCAweGQ4LCAweDFjLCAweGQwLCAweGNhLCAweDQ2LCAweDNkLCAweGQwLCAweDE4LAotICAgICAgICAweDM1LCAweDg5LCAweDc4LCAweGEzLCAweDlhLCAweGNkLCAweDhjLCAweGQyLCAweGIzLCAweDkzLCAweDJhLAotICAgICAgICAweDJiLCAweDY2LCAweGQ1LCAweGYxLCAweDhhLCAweDEwLCAweDFhLCAweGQ2LCAweGYyLCAweDAzLCAweDhhLAotICAgICAgICAweDllLCAweGU2LCAweGY0LCAweDVhLCAweGRiLCAweGVmLCAweGZlLCAweDIzLCAweGMwLCAweGE3LCAweDI3LAotICAgICAgICAweGNiLCAweDE2LCAweGM0LCAweGNjLCAweGRkLCAweGUyLCAweDc4LCAweDlhLCAweDY5LCAweDY2LCAweGNjLAotICAgICAgICAweDk5LCAweGUxLCAweDRkLCAweDQ3LCAweGJhLCAweGJjLCAweGQ5LCAweDZhLCAweGVlLCAweDI2LCAweDU5LAotICAgICAgICAweDU5LCAweDRkLCAweGFjLCAweDY5LCAweDM0LCAweDUyLCAweGU1LCAweDhmLCAweDU1LCAweGFkLCAweDU4LAotICAgICAgICAweGFlLCAweDg1LCAweGM0LCAweDIyLCAweDQxLCAweGRmLCAweGFkLCAweDc2LCAweDYxLCAweGU1LCAweDZmLAotICAgICAgICAweDc0LCAweDQ1LCAweDY5LCAweGRjLCAweDAwLCAweDc5LCAweGFjLCAweDhiLCAweGE2LCAweGM5LCAweDM1LAotICAgICAgICAweGQ0LCAweDM0LCAweDY0LCAweGRjLCAweDM3LCAweDA2LCAweGIxLCAweGFlLCAweDg4LCAweGMxLCAweGFjLAotICAgICAgICAweGQ4LCAweGM5LCAweDJjLCAweGE2LCAweGUwLCAweDczLCAweDViLCAweDM2LCAweGYzLCAweDc0LCAweGU2LAotICAgICAgICAweDg0LCAweDA1LCAweGUzLCAweGE5LCAweDQ3LCAweDZhLCAweDE0LCAweGI2LCAweDQ5LCAweDNkLCAweDg1LAotICAgICAgICAweDNhLCAweGVlLCAweGVlLCAweDJiLCAweGE4LCAweGUyLCAweDZmLCAweDMwLCAweDgxLCAweGU5LCAweDhhLAotICAgICAgICAweGNhLCAweGE0LCAweGUyLCAweGQzLCAweDhiLCAweDAxLCAweGIxLCAweGY5LCAweDA0LCAweDdmLCAweGFmLAotICAgICAgICAweDIzLCAweGYwLCAweGE5LCAweDU0LCAweDQxLCAweDljLCAweGZkLCAweGEzLCAweGY0LCAweGFlLCAweDY1LAotICAgICAgICAweDE4LCAweGY3LCAweDI1LCAweDhhLCAweGUyLCAweDAyLCAweDM4LCAweGI4LCAweGZkLCAweDJhLCAweDdiLAotICAgICAgICAweDViLCAweGE4LCAweDZkLCAweDZkLCAweDVkLCAweDlhLCAweDVkLCAweGNiLCAweGJiLCAweGQyLCAweGI2LAotICAgICAgICAweGE2LCAweGEzLCAweDE5LCAweDVlLCAweGUyLCAweDAzLCAweDdiLCAweDFkLCAweGMyLCAweDE3LCAweDhkLAotICAgICAgICAweGI4LCAweGFjLCAweGZiLCAweDg5LCAweDM5LCAweDM1LCAweGQ2LCAweDlhLCAweDZhLCAweGU4LCAweDY2LAotICAgICAgICAweDU1LCAweGNiLCAweGY1LCAweGFjLCAweDdiLCAweDk2LCAweGViLCAweDUwLCAweGM2LCAweDg4LCAweDZkLAotICAgICAgICAweDY2LCAweGU5LCAweGNkLCAweDZjLCAweGRiLCAweDRmLCAweGQzLCAweDlhLCAweDAwLCAweDJmLCAweGU2LAotICAgICAgICAweGY5LCAweGEzLCAweGU3LCAweGI1LCAweDRhLCAweDkzLCAweDdmLCAweGEyLCAweGM2LCAweDczLCAweGRjLAotICAgICAgICAweGQ3LCAweDE1LCAweDU1LCAweGVmLCAweDQ4LCAweDdkLCAweDA5LCAweDUyLCAweDZlLCAweDNhLCAweGQ0LAotICAgICAgICAweGFiLCAweDJmLCAweGJkLCAweDYxLCAweDE2LCAweDBjLCAweDczLCAweDQ5LCAweGM1LCAweDI0LCAweDkyLAotICAgICAgICAweDdmLCAweGEyLCAweDYzLCAweGZkLCAweGFhLCAweGQ2LCAweDJmLCAweDcxLCAweDBlLCAweGIxLCAweDkzLAotICAgICAgICAweGY3LCAweDJkLCAweGY1LCAweGE0LCAweDllLCAweDRlLCAweGI1LCAweGRkLCAweDRiLCAweGY4LCAweDY4LAotICAgICAgICAweDRjLCAweGNiLCAweGI5LCAweDkzLCAweGFkLCAweDY1LCAweGNlLCAweGQ5LCAweDI2LCAweGE5LCAweDhkLAotICAgICAgICAweDE5LCAweGY2LCAweGYyLCAweGY0LCAweGU2LCAweGI1LCAweGFkLCAweGU3LCAweGM2LCAweDM5LCAweGEwLAotICAgICAgICAweDE4LCAweGViLCAweGM5LCAweDc3LCAweDZjLCAweDM1LCAweDJhLCAweDRiLCAweGZlLCAweDhhLCAweDljLAotICAgICAgICAweGZmLCAweDAwLCAweDExLCAweGFlLCAweDNhLCAweDhiLCAweGRlLCAweDYxLCAweGQwLCAweDllLCAweDM5LAotICAgICAgICAweGI4LCAweGViLCAweDUzLCAweGFjLCAweGI5LCAweGFlLCAweDViLCAweDAwLCAweGYzLCAweDI3LCAweDE0LAotICAgICAgICAweDkyLCAweGM5LCAweGZlLCAweDhhLCAweDNmLCAweGRlLCAweDM1LCAweGFjLCAweDNhLCAweDg4LCAweDkyLAotICAgICAgICAweGNkLCAweGIxLCAweDZlLCAweDdkLCAweGNkLCAweDMyLCAweDY3LCAweGViLCAweGNkLCAweDdhLCAweDE0LAotICAgICAgICAweGZlLCAweDA0LCAweDI2LCAweDY2LCAweGNlLCAweGY5LCAweDI2LCAweGIzLCAweGU2LCAweDZlLCAweGI0LAotICAgICAgICAweGQ5LCAweDQ4LCAweGM4LCAweDgyLCAweDRlLCAweDA3LCAweDM1LCAweGE3LCAweDZmLCAweDJmLCAweDAyLAotICAgICAgICAweDlhLCAweDA2LCAweDVmLCAweDhjLCAweGE0LCAweDgzLCAweDBlLCAweDMyLCAweDJhLCAweDY5LCAweGUzLAotICAgICAgICAweGRkLCAweDEyLCAweDA4LCAweDk3LCAweDg1LCAweGVjLCAweDJhLCAweDJhLCAweDQyLCAweGYxLCAweDc2LAotICAgICAgICAweDI2LCAweGU0LCAweDZhLCAweDU5LCAweDBlLCAweDE4LCAweDEwLCAweDZhLCAweGQyLCAweDg5LCAweDAyLAotICAgICAgICAweDZlLCAweDJhLCAweDcxLCAweGViLCAweDVjLCAweDFjLCAweDhjLCAweGE2LCAweDQ4LCAweGJiLCAweGRjLAotICAgICAgICAweDYxLCAweDQxLCAweDM1LCAweDcyLCAweDI4LCAweDg3LCAweGQ5LCAweGY2LCAweDRhLCAweGI5LCAweGU3LAotICAgICAgICAweDM4LCAweGFlLCAweDhjLCAweDNkLCAweDM2LCAweGRkLCAweGRlLCAweGM0LCAweGIwLCAweDIxLCAweDUxLAotICAgICAgICAweDc2LCAweGE4LCAweGMwLCAweGFhLCAweDkzLCAweDMxLCAweGU2LCAweGJiLCAweDJkLCAweDY1LCAweDYxLAotICAgICAgICAweDE5LCAweGQzLCAweDFlLCAweGI1LCAweDQ2LCAweDVhLCAweDk2LCAweDVhLCAweDMwLCAweGEwLCAweDdlLAotICAgICAgICAweDA1LCAweDY5LCAweDViLCAweGM5LCAweGM2LCAweDI4LCAweDQwLCAweGNkLCAweDA4LCAweDY0LCAweDNjLAotICAgICAgICAweDczLCAweDU3LCAweGUxLCAweDk0LCAweGYxLCAweGNkLCAweDVhLCAweDIxLCAweDhjLCAweGI5LCAweDYzLAotICAgICAgICAweGU3LCAweDY3LCAweDFkLCAweGFiLCAweDQwLCAweGIxLCAweGZiLCAweDAwLCAweDFkLCAweGYwLCAweDJiLAotICAgICAgICAweDk5LCAweDJkLCAweDY2LCAweDNlLCAweDg4LCAweDc1LCAweDgxLCAweDNmLCAweDMxLCAweGY2LCAweGFiLAotICAgICAgICAweDY0LCAweGQ2LCAweGI0LCAweDE3LCAweGVlLCAweGQwLCAweDllLCAweGU0LCAweDMyLCAweDFhLCAweGE3LAotICAgICAgICAweDMxLCAweGFkLCAweDE4LCAweDE0LCAweDI2LCAweGVmLCAweDU0LCAweGE1LCAweGE4LCAweDY1LCAweGEzLAotICAgICAgICAweDljLCAweDgxLCAweGZhLCAweDU2LCAweDhjLCAweDJkLCAweGNlLCAweDY4LCAweDQwLCAweGNiLCAweGYxLAotICAgICAgICAweDM3LCAweGJkLCAweDVlLCAweDg1LCAweGVhLCAweGQxLCAweDBjLCAweGJiLCAweDE5LCAweDU2LCAweDIzLAotICAgICAgICAweDIwLCAweDFmLCAweGFkLCAweDVjLCAweDQyLCAweDA4LCAweDAzLCAweGI1LCAweDU1LCAweDkxLCAweDA0LAotICAgICAgICAweGM5LCAweDgwLCAweDM4LCAweDAwLCAweDBhLCAweDcxLCAweDM0LCAweDZjLCAweDMyLCAweDI3LCAweGU5LAotICAgICAgICAweDU1LCAweDI1LCAweDE1LCAweDJjLCAweDY4LCAweGEzLCAweDMwLCAweGViLCAweDU0LCAweGE1LCAweDE1LAotICAgICAgICAweDBjLCAweGQxLCAweDAwLCAweGZmLCAweGQ5fTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2U7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UubGVuZ3RoOwotICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV0gPSAoYnl0ZSlzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmRvO1JvaWQ7IiwgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfVHlwZV9HZW5lcmljKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4LCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0phcGFuZXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmFtZS1yZWxhdGVkIHN0cmluZ3Mgb25seSBjb250YWlucyBwcmludGFibGUgQXNjaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgaXMgcmVtYWluZWQgdG8gYmUgVVMnczoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJQcmVmaXggR2l2ZW4gTWlkZGxlIEZhbWlseSBTdWZmaXgiCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIFIucmF3LnYyMV9zaW1wbGVfMik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZG8gUm9pZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3NpbXBsZV8zKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIkZOIiBmaWVsZCBzaG91bGQgYmUgcHJlZmVyZWQgc2luY2UgaXQgc2hvdWxkIGNvbnRhaW4gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciBpbnRlbmRlZCBieSB0aGUgYXV0aG9yIG9mIHRoZSBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyAnOycgaXMgcHJvcGVybHkgaGFuZGxlZCBieSBWQ2FyZFBhcnNlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaWdub3JlcyByZWR1bmRhbnQgZmllbGRzIGluICJOIiBwcm9wZXJ0eSB2YWx1ZXMgYW5kCi0gICAgICogaW5zZXJ0cyBuYW1lIHJlbGF0ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGQU1JTFlfTkFNRSBpcyBlbXB0eSBhbmQgcmVtb3ZlZCBpbiB0aGlzIHRlc3QuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkE7QlxcIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIjpFIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdCZWZvclRpdGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfb3JnX2JlZm9yZV90aXRsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJOb3JtYWwgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiT3JnYW5pemF0aW9uIERldmlzaW9uIFJvb20gU2hlZXQgTm8uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkV4Y2VsbGVudCBKYW5pdG9yIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGl0bGVCZWZvck9yZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3RpdGxlX2JlZm9yZV9vcmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTmljZSBHdXkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk1hcnZlcm91cyIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlBlcmZlY3QgR3JlYXQgR29vZCBCYWQgUG9vciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJDb29sIFRpdGxlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHZDYXJkIGltcG9ydGVyIGNvcnJlY3RseSBpbnRlcnByZXQgIlBSRUYiIGF0dHJpYnV0ZSB0byBJU19QUklNQVJZLgotICAgICAqIFRoZSBkYXRhIGNvbnRhaW4gdGhyZWUgY2FzZXM6IG9uZSAiUFJFRiIsIG5vICJQUkVGIiBhbmQgbXVsdGlwbGUgIlBSRUYiLCBpbiBlYWNoIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVByZWZUb0lzUHJpbWFyeSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3ByZWZfaGFuZGxpbmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJTbWl0aCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0QGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInRlc3QyQGV4YW1pbmF0aW9uLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFbmdpbmVlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNeXN0ZXJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkJsb2dnZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiUG9ldHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlBvZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGFsbCB0aGUgcHJvcGVydGllcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGJ5IHRoZSBWQ2FyZFBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAiLCAiRm9ycmVzdCIsICJIb2dlIiwgIlBvcyIsICJUYW8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJKb2UgRHVlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiR3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuO01hbmFnZXI7RmlzaCBrZWVwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCBTaHJpbXAgQ28uIiwgIlNhbGVzIERlcHQuO01hbmFnZXIiLCAiRmlzaCBrZWVwZXIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJST0xFIiwgIkZpc2ggQ2FrZSBLZWVwZXIhIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJTaHJpbXAgTWFuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIigxMTEpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiKDQwNCkgNTU1LTEyMTIiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzExMTExMTExIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMyMjIyMjIyMiIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzMzMzMzMzMzIiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjEwMCBXYXRlcnMgRWRnZSIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2VcclxuQmF5dG93biwgTEEgMzAzMTRcclxuVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjQyIFBsYW50YXRpb24gU3QuIiwgIkJheXRvd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEEiLCAiMzAzMTQiLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTEFCRUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSU5URVJORVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJFTUFJTCIsICJjZWxsQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSwgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQVRUUklCVVRFIiwgIlNvbWUgU3RyaW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJCREFZIiwgIjE5ODAwMTAxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJHRU8iLCAiMzUuNjU2Mzg1NCwxMzkuNjk5NDIzMyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVVJMIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJSRVYiLCAiMjAwODA0MjRUMTk1MjQzWiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBDb250YWN0U3RydWN0IGNvcnJlY3RseSBpbnNlcnRzIHZhbHVlcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkCi0gICAgICogaW50byBDb250ZW50UmVzb2x2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2NvbXBsaWNhdGVkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiR3VtcCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRm9ycmVzdCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkhvZ2UiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiUG9zIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlRhbyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJKb2UgRHVlIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkd1bXAgU2hyaW1wIENvLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlNhbGVzIERlcHQuO01hbmFnZXIgRmlzaCBrZWVwZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiU2hyaW1wIE1hbiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC8vIFBob25lIG51bWJlciBpcyBleHBlY3RlZCB0byBiZSBmb3JtYXRlZCB3aXRoIE5BTVAgZm9ybWF0IGluIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQwNC01NTUtMTIxMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzEtMTExLTExMTEiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWSURFTyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzItMjIyLTIyMjIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzMtMzMzLTMzMzMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMzAzMTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJMQSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJCYXl0b3duIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiMTAwIFdhdGVycyBFZGdlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjQyIFBsYW50YXRpb24gU3QuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiNDIgUGxhbnRhdGlvbiBTdC4gQmF5dG93biBMQSAzMDMxNCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyAiVFlQRT1JTlRFUk5FVCIgLT4gVFlQRV9DVVNUT00gKyB0aGUgbGFiZWwgIklOVEVSTkVUIgotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5MQUJFTCwgIklOVEVSTkVUIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJmb3JyZXN0Z3VtcEB3YWxsYWRhbGxhLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgImNlbGxAZXhhbXBsZS5jb20iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOb3cncyB0aGUgdGltZSBmb3IgYWxsIGZvbGsgdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gTm8gaW5mb3JtYXRpb24gYWJvdXQgaXRzIGltYWdlIGZvcm1hdCBjYW4gYmUgaW5zZXJ0ZWQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG90by5QSE9UTywgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMFNpbXBsZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMy4wIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmQ7Um9pZDs7OyIsIEFycmF5cy5hc0xpc3QoIkFuZCIsICJSb2lkIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIk9wZW47SGFuZHNldDsgQWxsaWFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiT3BlbiIsICJIYW5kc2V0IiwgIiBBbGxpYW5jZSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPUlQtU1RSSU5HIiwgImFuZHJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzAwMDAwMDAwIiwgbmV3IFR5cGVTZXQoIlBSRUYiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJDTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR05PIiwgIjAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR04iLCAiZ3JvdXAwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJSRVYiLCAiMjAwODEwMzFUMDY1ODU0WiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9zaW1wbGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgImFuZHJvaWQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk9wZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJIYW5kc2V0ICBBbGxpYW5jZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMwLTAwMC0wMDAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfUGFyc2luZygpIHsKLSAgICAgICAgLy8gVGhvdWdoIEphcGFuZXNlIGNhcmVlcnMgYXBwZW5kICI7Ozs7IiBhdCB0aGUgZW5kIG9mIHRoZSB2YWx1ZSBvZiAiU09VTkQiLAotICAgICAgICAvLyB2Q2FyZCAyLjEvMy4wIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgdmFsdWVzLgotICAgICAgICAvLyBEbyBub3QgbmVlZCB0byBoYW5kbGUgaXQgYXMgbXVsdGlwbGUgdmFsdWVzLgotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzk7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiVk9JQ0UiLCAiUFJFRiIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFYyMUphcGFuZXNlMUNvbW1vbihpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUsIGJvb2xlYW4gamFwYW5lc2UpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KHZjYXJkVHlwZSwgcmVzSWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAvLyBXaGlsZSB2Q2FyZCBwYXJzZXIgZG9lcyBub3Qgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgLy8gQ29udGFjdFN0cnVjdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgZm9ybWF0dGluZyBpcyBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsIChqYXBhbmVzZSA/ICIwMy0wMDAwLTAwMDAiIDogIjAzMC0wMDAtMDAwMCIpKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjh9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9HZW5lcmljX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfU2ppcygpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjh9LgotICAgICAqIHNpbmNlIHZDYXJkIDIuMSBzcGVjaWZpZXMgdGhlIGNoYXJzZXQgb2YgZWFjaCBsaW5lIGlmIGl0IGNvbnRhaW5zIG5vbi1Bc2NpaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfVXRmOCgpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTQ7XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzM7XHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiO1x1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBFQlx1MzBFQVx1MzBBMlx1MzBGM1x1MzBCRlx1MzBFRlx1MzBGQ1x1MDAzNiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTY4RTs7OzsxNTAtODUxMjsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDAzNlx1OTY4RSIsICIiLCAiIiwgIiIsICIxNTAtODUxMiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAiXHUzMEUxXHUzMEUyIiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiKQotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3Qgc2hvdWxkIGNvcnJlY3RseSBzcGxpdCAiU09VTkQiIHByb3BlcnR5IGludG8gc2V2ZXJhbCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBWQ2FyZFBhcnNlciBzaWRlIGRvZXMgbm90IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxNTAtODUxMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUgMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlx1MzBFMVx1MzBFMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICI5IiwgbmV3IFR5cGVTZXQoIlgtTkVDLVNFQ1JFVCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1IT1RFTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TQ0hPT0wiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTIiLCBuZXcgVHlwZVNldCgiRkFYIiwgIkhPTUUiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQ7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTMiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTQiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTUiLCBuZXcgVHlwZVNldCgiWC1ORUMtRkFNSUxZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE2IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUdJUkwiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTciLCBuZXcgVHlwZVNldCgiWC1ORUMtQk9ZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE4IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZSSUVORCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1QSFMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMjAiLCBuZXcgVHlwZVNldCgiWC1ORUMtUkVTVEFVUkFOVCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9tdWx0aXBsZV9lbnRyeSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtU0VDUkVUIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtSE9URUwiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtU0NIT09MIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIiKTsKLQotICAgICAgICBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1PREVNIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtRkFNSUxZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE1Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUdJUkwiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTYiKTsKLQotICAgICAgICBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1CT1kiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTciKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtRlJJRU5EIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE4Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVBIUyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1SRVNUQVVSQU5UIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIwIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZS5wdXQoIlZBTFVFIiwgIkRBVEUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRXhhbXBsZSIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBTk5JVkVSU0FSWSIsICIyMDA5MTAxMCIsIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBR0VOVCIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtTk8iLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkV4YW1wbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRXhhbXBsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUludmFsaWRDb21tZW50TGlrZUxpbmVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbnZhbGlkX2NvbW1lbnRfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQ29uZmVyZW5jZSBDYWxsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGlzIGlzIGFuIChzaGFycCAtPiM8LSBzaGFycCkgZXhhbXBsZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfY29tbWFfc2VwYXJhdGVkKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMy4wIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiV09SSyIsICJNU0ciLCAiUEFHRVIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfY29tbWFfc2VwYXJhdGVkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYwMzQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSmFwYW5pemF0aW9uVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROYW1lVXRmOENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbnVsbCA6IG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVVdGY4VjIxKCkgewotICAgICAgICB0ZXN0TmFtZVV0ZjhDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVVdGY4VjMwKCkgewotICAgICAgICB0ZXN0TmFtZVV0ZjhDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVTaGlmdEppcygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiRHIuIFx1MzA3NVx1MzA4Qlx1MzA2OSBCIFx1MzA5MVx1MzA4QVx1MzA0QiBQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9Db01vIHBob25lcyByZXF1aXJlIGFsbCBuYW1lIGVsZW1lbnRzIHNob3VsZCBiZSBpbiAiZmFtaWx5IG5hbWUiIGZpZWxkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lRG9Db01vKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbE5hbWUgPSAiRHIuIFx1MzA3NVx1MzA4Qlx1MzA2OSBCIFx1MzA5MVx1MzA4QVx1MzA0QiBQaC5EIjsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBmdWxsTmFtZSArICI7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZnVsbE5hbWUsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsIGZ1bGxOYW1lLCBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiOzs7OyIsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JTSmlzIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcykgOgotICAgICAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG51bGwgOiBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCkpOwotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwgIlx1MzA4NFx1MzA3RVx1MzA2MCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJcdTMwNUZcdTMwOERcdTMwNDYiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCBcdTMwNUZcdTMwOERcdTMwNDYiLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFTamlzKCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwU0ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjkwXHVGRjg0XHVGRjlFXHVGRjk5XHVGRjg4XHVGRjcwXHVGRjkxICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlNPVU5EIiwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGODBcdUZGOUJcdUZGNzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGJ1aWxkZXIgPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgYnVpbGRlci5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzV2l0aEphcGFuZXNlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1M1x1MzA5M1x1MzA2QVx1MzA2OFx1MzA1M1x1MzA4RFx1MzA5Mlx1ODk4QiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlx1MzA4Qlx1MzA2QVx1MzA5M1x1MzA2Nlx1NjY4N1x1NEVCQVx1MzA2N1x1MzA1OVx1MzA0Qlx1RkYxRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiXHUzMDRBXHUzMDgyXHUzMDYxXHUzMDRCXHUzMDQ4XHUzMDhBIik7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gKFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyh2Y2FyZFR5cGUpID8KLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzKSA6Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclV0ZjggOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCkpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICAvLyBMQUJFTCBtdXN0IGJlIGlnbm9yZWQgaW4gdkNhcmQgMi4xLiBBcyBmb3IgdkNhcmQgMy4wLCB0aGUgY3VycmVudCBiZWhhdmlvciBpcwotICAgICAgICAvLyBzYW1lIGFzIHRoYXQgaW4gdkNhcmQgMy4wLCB3aGljaCBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiXHU3OUMxXHU2NkY4XHU3QkIxMDciLAotICAgICAgICAgICAgICAgICIiLCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIiwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIsICJcdTAwRDdcdTAwRDdcdTc3MEMiLAotICAgICAgICAgICAgICAgICI0OTQtMTMxMyIsICJcdTY1RTVcdTY3MkMiKSwKLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NUU1XHU2NzJDIDQ5NC0xMzEzIFx1MDBEN1x1MDBEN1x1NzcwQyBcdTlFN0ZcdTlBQThcdTVFMDIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxICIgKyAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzd2l0aEphcGFuZXNlVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IG9ubHkgb25lIGFkZHJlc3MgZmllbGQgaXMgZW1pdHRlZCB0b3dhcmQgRG9Db01vIHBob25lcy4KLSAgICAgKiBQcmVmZXJlZCB0eXBlIG11c3QgKHNob3VsZD8pIGJlOiBIT01FID4gV09SSyA+IE9USEVSID4gQ1VTVE9NCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjQiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjMiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb18zKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20yIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhlIHZDYXJkIGV4cG9ydGVyIHRvbGVyYXRlcyBudWxsIFRZUEUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fNCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI1Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJWMjFfMSgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJWMzAoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyRG9Db01vKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjAzLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjA5MC0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTMiKTsKLQotICAgICAgICAvLyBNb3JlIHRoYW4gb25lIG5vdGUgZmllbGRzIG11c3QgYmUgYWdncmVnYXRlZCBpbnRvIG9uZSBub3RlLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTk9URSIsICJub3RlMVxubm90ZTJcbm5vdGUzIiwgbUNvbnRlbnRWYWx1ZXNGb3JRUCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRDdXN0b21WMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RzQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU3ZTBjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RzQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBBbG1vc3QgYSBkZWFkIGNvcHkgb2YgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRQcm92aWRlciwgYnV0IGRpZmZlcmVudCBpbiB0aGF0IHRoaXMKLSAqIGNsYXNzIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyLCBub3QgaW1wbGVtZW50aW5nIElDb250ZW50UHJvdmlkZXIsCi0gKiBzbyB0aGF0IE1vY2tDb250ZW50UmVzb2x2ZXIgaXMgYWJsZSB0byBhY2NlcHQgdGhpcyBjbGFzcyA6KAotICovCi1jbGFzcyBNb2NrQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBidWxrSW5zZXJ0KFVyaSB1cmwsIENvbnRlbnRWYWx1ZXNbXSBpbml0aWFsVmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHB1YmxpYyBJQnVsa0N1cnNvciBidWxrUXVlcnkoVXJpIHVybCwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIsIElDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIsCi0gICAgICAgICAgICBDdXJzb3JXaW5kb3cgd2luZG93KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHVibGljIGludCBkZWxldGUoVXJpIHVybCwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5Bc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmwsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCi0gICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmwsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQmluZGVyIGFzQmluZGVyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci19Ci0KLS8qKgotICogQmFzZUNsYXNzIGZvciB2Q2FyZCB1bml0IHRlc3RzIHdpdGggdXRpbGl0eSBjbGFzc2VzLgotICogUGxlYXNlIGRvIG5vdCBhZGQgZWFjaCB1bml0IHRlc3QgaGVyZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFRlc3RzQmFzZSBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjIxID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYzMCA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGODsKLQotICAgIC8vIERvIG5vdCBtb2RpZnkgdGhlc2UgZHVyaW5nIHRlc3RzLgotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yUVA7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMDsKLQotICAgIHByb3RlY3RlZCBWQ2FyZFZlcmlmaWVyIG1WZXJpZmllcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNraXBWZXJpZmljYXRpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRUZXN0c0Jhc2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMucHV0KCJDSEFSU0VUIiwgIlNISUZUX0pJUyIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEucHV0KCJFTkNPRElORyIsICJCQVNFNjQiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMC5wdXQoIkVOQ09ESU5HIiwgImIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSgpIHsKLSAgICAgICAgc3VwZXIudGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKTsKLSAgICAgICAgbVNraXBWZXJpZmljYXRpb24gPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKCFtU2tpcFZlcmlmaWNhdGlvbikgewotICAgICAgICAgICAgbVZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHNUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI5OWY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcclxuIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMHgyMDsgaSA8IDB4N0Y7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDAxOSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXG4iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIwMTIzNDU2Nzg5LSIpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAweDMwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDB4MkQpIHsgIC8vIC0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDNBOyBpIDwgMHg0MTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHg1QjsgaSA8IDB4NjE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4N0I7IGkgPCAweDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmMzMTU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjIxOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKiBwYWNrYWdlICovIGNsYXNzIEN1c3RvbU1vY2tDb250ZXh0IGV4dGVuZHMgTW9ja0NvbnRleHQgewotICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHVibGljIEN1c3RvbU1vY2tDb250ZXh0KENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIG1SZXNvbHZlcjsKLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgVkNhcmRWZXJpZmllciB7Ci0gICAgcHJpdmF0ZSBjbGFzcyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCkgewotICAgICAgICAgICAgdmVyaWZ5T25lVkNhcmQodmNhcmQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWMzA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RvQ29NbzsKLQotICAgIC8vIE9ubHkgb25lIG9mIHRoZW0gbXVzdCBiZSBub24tZW1wdHkuCi0gICAgcHJpdmF0ZSBFeHBvcnRUZXN0UmVzb2x2ZXIgbUV4cG9ydFRlc3RSZXNvbHZlcjsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIG1JbnB1dFN0cmVhbTsKLQotICAgIC8vIFRvIGFsbG93IGR1cGxpY2F0aW9uLCB1c2UgbGlzdCBpbnN0ZWFkIG9mIHNldC4KLSAgICAvLyBXaGVuIG51bGwsIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIHZlcmlmaWNhdGlvbi4KLSAgICBwcml2YXRlIFByb3BlcnR5Tm9kZXNWZXJpZmllciBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgIHByaXZhdGUgTGluZVZlcmlmaWVyIG1MaW5lVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzVmVyaWZpZXIgbUNvbnRlbnRWYWx1ZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmVyaWZpZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBWQ2FyZFZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtVkNhcmRWZXJpZmllckludGVybmFsID0gbmV3IFZDYXJkVmVyaWZpZXJJbnRlcm5hbCgpOwotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgbUlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JFeHBvcnRUZXN0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbmV3IEV4cG9ydFRlc3RSZXNvbHZlcihtVGVzdENhc2UpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JJbXBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIGludCByZXNJZCkgewotICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIHNldElucHV0UmVzb3VyY2VJZChyZXNJZCk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElucHV0UmVzb3VyY2VJZChpbnQgcmVzSWQpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7Ci0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiV3JvbmcgcmVzSWQ6ICIgKyByZXNJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotICAgICAgICBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiYWRkSW5wdXRFbnRyeSgpIGlzIGNhbGxlZC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIklucHV0U3RyZWFtIGlzIGFscmVhZHkgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dEVudHJ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoInNldElucHV0U3RyZWFtIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VGVzdFJlc29sdmVyLmFkZElucHV0Q29udGFjdEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllcihtVGVzdENhc2UpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9Ci0gICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgKG1Jc1YzMCA/ICIzLjAiIDogIjIuMSIpKTsKLQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIiIpLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbSBhZGRMaW5lVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1MaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyKG1UZXN0Q2FzZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1MaW5lVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllciA9IG5ldyBDb250ZW50VmFsdWVzVmVyaWZpZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyLmFkZEVsZW0obVRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T25lVkNhcmQoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIC8vIExvZy5kKCJAQEAiLCB2Y2FyZCk7Ci0gICAgICAgIGZpbmFsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlcjsKLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVk5vZGVCdWlsZGVyIHZub2RlQnVpbGRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgdmNhcmREYXRhQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICB2Y2FyZERhdGFCdWlsZGVyLmFkZEVudHJ5SGFuZGxlcihtQ29udGVudFZhbHVlc1ZlcmlmaWVyKTsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLCB2Y2FyZERhdGFCdWlsZGVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSB2bm9kZUJ1aWxkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICAgICAgKG1Jc1YzMCA/IG5ldyBWQ2FyZFBhcnNlcl9WMzAodHJ1ZSkgOiBuZXcgVkNhcmRQYXJzZXJfVjIxKCkpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyhtVkNhcmRUeXBlKSA/ICJTSElGVF9KSVMiIDogIlVURi04Iik7Ci0gICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2Y2FyZC5nZXRCeXRlcyhjaGFyc2V0KSk7Ci0gICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHRydWUsIHBhcnNlci5wYXJzZShpcywgbnVsbCwgYnVpbGRlcikpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVkNhcmRFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WZXJpZmllZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoInZlcmlmeSgpIHdhcyBjYWxsZWQgdHdpY2UuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZlcmlmeUZvckltcG9ydFRlc3QoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiSU9FeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVkNhcmRFeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vIGlucHV0IGlzIGRldGVybWluZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtVmVyaWZpZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb3JJbXBvcnRUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyLnZlcmlmeShtSW5wdXRTdHJlYW0sIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgZmluYWwgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQotICAgICAgICAgICAgcmVzb2x2ZXIuYWNxdWlyZUNvbnRlbnRQcm92aWRlckNsaWVudCh1cmkpLmdldExvY2FsQ29udGVudFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiAoKEV4cG9ydFRlc3RQcm92aWRlcilwcm92aWRlcikucXVlcnlFbnRpdGllcygKLSAgICAgICAgICAgICAgICB1cmksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBnZXRNb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoKQotICAgICAgICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE1ldGhvZCgibW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kIiwKLSAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuY2xhc3MsIFVyaS5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmdbXS5jbGFzcywgU3RyaW5nLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpIHsKLSAgICAgICBmaW5hbCBWQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0KLSAgICAgICAgICAgIG5ldyBWQ2FyZENvbXBvc2VyKG5ldyBDdXN0b21Nb2NrQ29udGV4dChtRXhwb3J0VGVzdFJlc29sdmVyKSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobUxpbmVWZXJpZmllcik7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobVZDYXJkVmVyaWZpZXJJbnRlcm5hbCk7Ci0gICAgICAgIGlmICghY29tcG9zZXIuaW5pdChWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiaW5pdCgpIGZhaWxlZC4gUmVhc29uOiAiICsgY29tcG9zZXIuZ2V0RXJyb3JSZWFzb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydEZhbHNlKGNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCA9IGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3Nlci5jcmVhdGVPbmVFbnRyeShnZXRNb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoKSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWYxMGRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBWTmFtZTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPiBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotCi0gICAgLyoqIDA6cGFyc2Ugb3Zlci4gMTpwYXJzaW5nLiAqLwotICAgIHB1YmxpYyBpbnQgcGFyc2VTdGF0dXMgPSAxOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZjMzI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBTdG9yZSB0aGUgcGFyc2UgcmVzdWx0IHRvIGN1c3RvbSBkYXRhc3RydWN0OiBWTm9kZSwgUHJvcGVydHlOb2RlCi0gKiBNYXliZSBzZXZlcmFsIHZjYXJkIGluc3RhbmNlLCBzbyB1c2Ugdk5vZGVMaXN0IHRvIHN0b3JlLgotICogVk5vZGU6IHN0YW5keSBieSBhIHZjYXJkIGluc3RhbmNlLgotICogUHJvcGVydHlOb2RlOiBzdGFuZHkgYnkgYSBwcm9wZXJ0eSBsaW5lIG9mIGEgY2FyZC4KLSAqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZUJ1aWxkZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgTE9HX1RBRyA9ICJWTm9kZUJ1aWxkZXIiOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSdzIG5vIG90aGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB1c2VzIHRoaXMgY2hhcnNldCBmb3IgZW5jb2RpbmcKLSAgICAgKiBieXRlIGFycmF5cy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBUQVJHRVRfQ0hBUlNFVCA9ICJVVEYtOCI7IAotICAgIAotICAgIC8qKiB0eXBlPVZOb2RlICovCi0gICAgcHVibGljIExpc3Q8Vk5vZGU+IHZOb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vk5vZGU+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vZGVMaXN0UG9zID0gMDsKLSAgICBwcml2YXRlIFZOb2RlIG1DdXJyZW50Vk5vZGU7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGUgbUN1cnJlbnRQcm9wTm9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFBhcmFtVHlwZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB1c2luZyB3aGljaCBWUGFyc2VyIHBhcnNlcyB0aGUgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtU291cmNlQ2hhcnNldDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB3aXRoIHdoaWNoIGJ5dGUgYXJyYXkgaXMgZW5jb2RlZCB0byBTdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldENoYXJzZXQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIAotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VULCBUQVJHRVRfQ0hBUlNFVCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoU3RyaW5nIGNoYXJzZXQsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICB0aGlzKG51bGwsIGNoYXJzZXQsIHN0cmljdExpbmVCcmVha1BhcnNpbmcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAaGlkZSBzb3VyY2VDaGFyc2V0IGlzIHRlbXBvcmFsLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBpZiAoc291cmNlQ2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU291cmNlQ2hhcnNldCA9IHNvdXJjZUNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU291cmNlQ2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IHRhcmdldENoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IFRBUkdFVF9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nID0gc3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgLy8gTm90ZTogSSBndWVzcyB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIHRoZSBSZWNvcmQgbWF5IG5lc3QgbGlrZSB0aGlzOgotICAgIC8vIFNUQVJUOlZQT1MKLSAgICAvLyAuLi4KLSAgICAvLyBTVEFSVDpWUE9TMgotICAgIC8vIC4uLgotICAgIC8vIEVORDpWUE9TMgotICAgIC8vIC4uLgotICAgIC8vIEVORDpWUE9TCi0gICAgLy8KLSAgICAvLyBIb3dldmVyIHRoZSBmb2xsb3dpbmcgY29kZSBoYXMgYSBidWcuCi0gICAgLy8gV2hlbiBlcnJvciBvY2N1cnMgYWZ0ZXIgY2FsbGluZyBzdGFydFJlY29yZCgpLCB0aGUgZW50cnkgd2hpY2ggaXMgcHJvYmFibHkKLSAgICAvLyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIHJlbWFpbnMgdG8gYmUgaW4gdk5vZGVMaXN0LCB3aGlsZSBlbmRSZWNvcmQoKSBpcyBub3QgY2FsbGVkLgotICAgIC8vCi0gICAgLy8gSSBsZWF2ZSB0aGlzIGNvZGUgYXMgaXMgc2luY2UgSSdtIG5vdCBmYW1pbGlhciB3aXRoIHZjYWxlbmRhciBzcGVjaWZpY2F0aW9uLgotICAgIC8vIEJ1dCBJIGJlbGlldmUgd2Ugc2hvdWxkIHJlZmFjdG9yIHRoaXMgY29kZSBpbiB0aGUgZnV0dXJlLgotICAgIC8vIFVudGlsIHRoaXMsIHRoZSBsYXN0IGVudHJ5IGhhcyB0byBiZSByZW1vdmVkIHdoZW4gc29tZSBlcnJvciBvY2N1cnMuCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgVk5vZGUgdm5vZGUgPSBuZXcgVk5vZGUoKTsKLSAgICAgICAgdm5vZGUucGFyc2VTdGF0dXMgPSAxOwotICAgICAgICB2bm9kZS5WTmFtZSA9ICJWQ0FSRCI7Ci0gICAgICAgIC8vIEkgZmVlbCB0aGlzIHNob3VsZCBiZSBkb25lIGluIGVuZFJlY29yZCgpLCBidXQgaXQgY2Fubm90IGJlIGRvbmUgYmVjYXVzZSBvZgotICAgICAgICAvLyB0aGUgcmVhc29uIGFib3ZlLgotICAgICAgICB2Tm9kZUxpc3QuYWRkKHZub2RlKTsKLSAgICAgICAgbU5vZGVMaXN0UG9zID0gdk5vZGVMaXN0LnNpemUoKSAtIDE7Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIGVuZE5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgICAgIGVuZE5vZGUucGFyc2VTdGF0dXMgPSAwOwotICAgICAgICB3aGlsZShtTm9kZUxpc3RQb3MgPiAwKXsKLSAgICAgICAgICAgIG1Ob2RlTGlzdFBvcy0tOwotICAgICAgICAgICAgaWYoKHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKSkucGFyc2VTdGF0dXMgPT0gMSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUucHJvcExpc3QuYWRkKG1DdXJyZW50UHJvcE5vZGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLy8gVXNlZCBvbmx5IGluIFZDYXJkLgotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcEdyb3VwU2V0LmFkZChncm91cCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIG1DdXJyZW50UGFyYW1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudFBhcmFtVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiVFlQRSIpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwX1RZUEUuYWRkKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucGFyYW1NYXAucHV0KG1DdXJyZW50UGFyYW1UeXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBvcmlnaW5hbFN0cmluZywgU3RyaW5nIHRhcmdldENoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0Q2hhcnNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBCQVNFNjQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMS4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV9ieXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGVCYXNlNjQodmFsdWUuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZWRQcmludGFibGUgPSB2YWx1ZQotICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI9ICIsICIgIikucmVwbGFjZUFsbCgiPVx0IiwgIlx0Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGluZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gcXVvdGVkUHJpbnRhYmxlLnNwbGl0KCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHF1b3RlZFByaW50YWJsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbmFsTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlczsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcyhtU291cmNlQ2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgbVNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IFF1b3RlZFByaW50YWJsZUNvZGVjLmRlY29kZVF1b3RlZFByaW50YWJsZShieXRlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZGVjb2RlIHF1b3RlZC1wcmludGFibGU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVW5rbm93biBlbmNvZGluZy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSwgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IuYWRkKCIiKTsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAgPSBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRhcmdldENoYXJzZXQgPSBDaGFyc2V0VXRpbHMubmFtZUZvckRlZmF1bHRWZW5kb3IocGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkNIQVJTRVQiKSk7IAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBwYXJhbU1hcC5nZXRBc1N0cmluZygiRU5DT0RJTkciKTsgCi0gICAgICAgIAotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCA9PSBudWxsIHx8IHRhcmdldENoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGFyZ2V0Q2hhcnNldCA9IG1UYXJnZXRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25lVmFsdWUodmFsdWUsIHRhcmdldENoYXJzZXQsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlTGlzdEIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICB0eXBlTGlzdEIuYXBwZW5kKHR5cGUpLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHR5cGVMaXN0Qi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHR5cGVMaXN0Qi5jaGFyQXQobGVuIC0gMSkgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi5zdWJzdHJpbmcoMCwgbGVuIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUxpc3RCLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKXsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMzcwYWU3OC4uYjgyZTY5OCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0xNDQsNCArMTQ0LDUxIEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFNldHRpbmdzLkJvb2ttYXJrcy5nZXRJbnRlbnRGb3JTaG9ydGN1dChyLCAnKicpKTsKICAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVByb3ZpZGVyTGlzdCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHIgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBvdXQgd2hhdCB3ZSBwdXQgaW4uCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpLAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgIiIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgc2Vjb25kIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB0aGlyZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGZpcnN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBtaWRkbGUgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBsYXN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisgICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQppbmRleCA4ZTdlNjNlLi5mYjBmMGMxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKLSAqIFRlc3RzIFN0YXRpY0xheW91dCBiaWRpIGltcGxlbWVudGF0aW9uLgorICogUXVpY2sgY2hlY2sgb2YgbmF0aXZlIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXRCaWRpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKQEAgLTQxLDczICs0MSw0NyBAQAogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSQWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjIyMjIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Ukx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIyMjIxMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMQWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGV2ZWxzLCBpbnQgZXhwZWN0ZWREaXIpIHsKLSAgICAgICAgY2hhcltdIGNocyA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IG4gPSBjaHMubGVuZ3RoOwotICAgICAgICBieXRlW10gY2hJbmZvID0gbmV3IGJ5dGVbbl07Ci0gICAgICAgIAotICAgICAgICBpbnQgcmVzdWx0RGlyID0gU3RhdGljTGF5b3V0LmJpZGkoZGlyLCBjaHMsIGNoSW5mbywgbiwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJpbmZvOiIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoY2hJbmZvW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuaSgiQklESSIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gcmVzdWx0TGV2ZWxDaGFycyA9IG5ldyBjaGFyW25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcmVzdWx0TGV2ZWxDaGFyc1tpXSA9IChjaGFyKSgnMCcgKyBjaEluZm9baV0pOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByZXN1bHRMZXZlbHMgPSBuZXcgU3RyaW5nKHJlc3VsdExldmVsQ2hhcnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdGlvbiIsIGV4cGVjdGVkRGlyLCByZXN1bHREaXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxldmVscyIsIGV4cGVjdGVkTGV2ZWxzLCByZXN1bHRMZXZlbHMpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUJpZGkoKSB7Ci0gICAgICAgIC8vIG5hdGl2ZSBiaWRpIHJldHVybnMgbGV2ZWxzLCBub3Qgc2ltcGx5IGRpcmVjdGlvbnMKLSAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBleHBlY3ROYXRpdmVCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXRUZXN0LkxheW91dEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFMRUYgPSAnXHUwNWQwJzsKKworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnMgZGlycyhpbnQgLi4uIGRpcnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGRpcnMpOworICAgIH0KKworICAgIC8vIGNvbnN0YW50cyBmcm9tIExheW91dCB0aGF0IGFyZSBwYWNrYWdlLXByb3RlY3RlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVOR1RIX01BU0sgPSAweDAzZmZmZmZmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfU0hJRlQgPSAyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX01BU0sgPSAweDNmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fUlRMX0ZMQUcgPSAxIDw8IFJVTl9MRVZFTF9TSElGVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMV8xID0gMSB8ICgxIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMSA9IDEgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzIgPSAyIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRzID0geworICAgICAgICAiIiwKKyAgICAgICAgIiAiLAorICAgICAgICAiYSIsCisgICAgICAgICJhMSIsCisgICAgICAgICJhQSIsCisgICAgICAgICJhMWIiLAorICAgICAgICAiYTFBIiwKKyAgICAgICAgImFBMSIsCisgICAgICAgICJhQWIiLAorICAgICAgICAiYUExQiIsCisgICAgICAgICJhQTFCMiIsCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgICJBIiwKKyAgICAgICAgIkExIiwKKyAgICAgICAgIkFhIiwKKyAgICAgICAgIkExQiIsCisgICAgICAgICJBMWEiLAorICAgICAgICAiQWExIiwKKyAgICAgICAgIkFhQiIKKyAgICB9OworCisgICAgLy8gRXhwZWN0ZWQgZGlyZWN0aW9ucyBhcmUgYW4gYXJyYXkgb2Ygc3RhcnQvbGVuZ3RoK2xldmVsIHBhaXJzLAorICAgIC8vIGluIHZpc3VhbCBvcmRlciBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbi4KKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zW10gZXhwZWN0ZWQgPSB7CisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAyLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEsIDIsIDEpLAorICAgICAgICBkaXJzKDAsIDEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDQsIExWTDJfMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQsCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHNldWRvQmlkaVRvUmVhbChTdHJpbmcgc3JjKSB7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IHNyYy50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdEJykgeworICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gKGNoYXIpKEFMRUYgKyBjIC0gJ0EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOworICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigiXG4iKTsKKyAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKGJ1Zik7CisKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHRzW2ldKSk7CisgICAgICAgICAgICBjaGVja0RpcmVjdGlvbnMoYi5idWlsZCgpLCBpLCBiLnRleHQsIGV4cGVjdGVkLCBmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgZmFpbChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWlsaW5nV2hpdGVzcGFjZSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJBYiAgIGMiKSk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gYi5wYWludC5tZWFzdXJlVGV4dChiLnRleHQsIDAsIDUpOyAgLy8gZXhjbHVkZSAnYycKKyAgICAgICAgYi5zZXRXaWR0aChNYXRoLnJvdW5kKHdpZHRoKSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpZiAobC5nZXRMaW5lQ291bnQoKSAhPSAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQgMiBsaW5lcywgZ290OiAiICsgbC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgMyB8ICgxIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpKTsKKyAgICAgICAgZXhwZWN0RGlyZWN0aW9ucygic3BsaXQgbGluZSIsIGV4cGVjdGVkLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9SaWdodE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICAvLyB2aXN1YWwgYTJCMUEgcG9zaXRpb25zIDA0MzIxCisgICAgICAgIC8vIDA6IHxhMkIxQSwgc3Ryb25nIGlzIHNvbCwgYWZ0ZXIgLT4gMAorICAgICAgICAvLyAxOiBhfDJCMUEsIHN0cm9uZyBpcyBhLCBhZnRlciAtPiwgMQorICAgICAgICAvLyAyOiBhMnxCMUEsIHN0cm9uZyBpcyBCLCBhZnRlciAtPiA0CisgICAgICAgIC8vIDM6IGEyQnwxQSwgc3Ryb25nIGlzIEIsIGJlZm9yZSAtPiAzCisgICAgICAgIC8vIDQ6IGEyQjF8QSwgc3Ryb25nIGlzIEEsIGFmdGVyIC0+IDIKKyAgICAgICAgLy8gNTogYTJCMUF8LCBzdHJvbmcgaXMgZW9sLCBiZWZvcmUgLT4gNQorICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9SaWdodE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byByaWdodCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb0xlZnRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gNTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGV4cGVjdGVkLmxlbmd0aCAtIDE7IC0taSA+PSAwOykgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvTGVmdE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byBsZWZ0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5LCBub3QgcmVhbGx5IGEgdGVzdAorICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdE1lYXN1cmVUZXh0MSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkFCQyI7IC8vICJhYkFCIgorICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0KSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICAgICAgaW50IGRpciA9IC0xOyAvLyBMRUZUX1RPX1JJR0hUCisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSB0cnVlOworICAgICAgICBib29sZWFuIGFsdCA9IHRydWU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGRpciA9IC1kaXI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMCwgZW5kID0gYi50ZXh0Lmxlbmd0aCgpOyBvZmZzZXQgPD0gZW5kOyArK29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IExheW91dC5tZWFzdXJlVGV4dChiLnBhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgb2Zmc2V0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkJJREkiLCAiZGlyOiAiICsgZGlyICsgIiB0cmFpbDogIiArIHRyYWlsaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZnNldDogIiArIG9mZnNldCArICIgd2lkdGg6ICIgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIXRyYWlsaW5nKTsKKyAgICAgICAgfSB3aGlsZSAoZGlyID4gMCk7CisgICAgfQorICAgICovCisKKyAgICAvLyB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGFycmF5cyBpbiBoZXgKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGV4QXJyYXkoaW50W10gYXJyYXkpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgneycpOworICAgICAgICBmb3IgKGludCBpIDogYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RpcmVjdGlvbnMoTGF5b3V0IGwsIGludCBpLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIERpcmVjdGlvbnNbXSBleHBlY3RlZERpcnMsIEZvcm1hdHRlciBmKSB7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBleHBlY3RlZERpcnNbaV07CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmLmZvcm1hdCgiJW5bJTJkXSAnJXMnLCAlcyAhPSAlcyIsIGksIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RGlyZWN0aW9ucyhTdHJpbmcgbXNnLCBEaXJlY3Rpb25zIGV4cGVjdGVkLCBEaXJlY3Rpb25zIHJlc3VsdCkgeworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkOiAiICsgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpICsKKyAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICIgKyBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKaW5kZXggMWY1OGEyYy4uZDU1NGE1MCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKQEAgLTIyOCwxMSArMjI4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IExheW91dEJ1aWxkZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiVGhpcyBpcyBhIHRlc3QiOwogICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7IC8vIGRlZmF1bHQKICAgICAgICAgaW50IHdpZHRoID0gMTAwOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMmIwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogVXRpbGl0eSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB2YXJpb3VzIEV4cGFuZGFibGUgTGlzdCBzY2VuYXJpb3MuCi0gKiA8cD4KLSAqIFdBUk5JTkc6IEEgbG90IG9mIHRoZSBmZWF0dXJlcyBhcmUgbWl4ZWQgYmV0d2VlbiBMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uCi0gKiAoZmxhdCBsaXN0IHBvc2l0aW9uKSBhbmQgYW4gRXhwYW5kYWJsZUxpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24uICBZb3UgbXVzdCBhZGQvY2hhbmdlCi0gKiBmZWF0dXJlcyBhcyB5b3UgbmVlZCB0aGVtLgotICogCi0gKiBAc2VlIExpc3RTY2VuYXJpbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBleHRlbmRzIExpc3RTY2VuYXJpbyB7Ci0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsgCi0gICAgcHJvdGVjdGVkIExpc3Q8TXlHcm91cD4gbUdyb3VwczsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdFZpZXcgY3JlYXRlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZUxpc3RWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVQYXJhbXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyKExpc3RWaWV3IGxpc3RWaWV3KSB7Ci0gICAgICAgICgoRXhwYW5kYWJsZUxpc3RWaWV3KSBsaXN0Vmlldykuc2V0QWRhcHRlcihtQWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgY3JlYXRlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNeUFkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEFuZFZhbGlkYXRlUGFyYW1zKFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgRXhwYW5kYWJsZVBhcmFtcyBleHBhbmRhYmxlUGFyYW1zID0gKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgCi0gICAgICAgIGludFtdIG51bUNoaWxkcmVuID0gZXhwYW5kYWJsZVBhcmFtcy5tTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBtR3JvdXBzID0gbmV3IEFycmF5TGlzdDxNeUdyb3VwPihudW1DaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtR3JvdXBzLmFkZChuZXcgTXlHcm91cChudW1DaGlsZHJlbltpXSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHBhbmRhYmxlUGFyYW1zLnN1cGVyU2V0TnVtSXRlbXMoKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3IHdpZGdldC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYWluIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RWaWV3IGdldEV4cGFuZGFibGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlTGlzdFZpZXcpIHN1cGVyLmdldExpc3RWaWV3KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBhbmRhYmxlUGFyYW1zIGV4dGVuZHMgUGFyYW1zIHsKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW5QZXJHcm91cCBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE51bUNoaWxkcmVuKGludFtdIG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBtTnVtQ2hpbGRyZW4gPSBudW1DaGlsZHJlbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgc3VwZXJjbGFzcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAqIGdyb3VwcyBhbmQgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBFeHBhbmRhYmxlUGFyYW1zIHN1cGVyU2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgICAgICBpbnQgbnVtSXRlbXMgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobU51bUNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbU51bUNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zICs9IG1OdW1DaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyLnNldE51bUl0ZW1zKG51bUl0ZW1zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUGFyYW1zIHNldE51bUl0ZW1zKGludCBudW1JdGVtcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIHNldE51bUdyb3VwcyBhbmQgc2V0TnVtQ2hpbGRyZW4gaW5zdGVhZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcihpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbXNGb2N1c2FibGUoYm9vbGVhbiBpdGVtc0ZvY3VzYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtc0ZvY3VzYWJsZShpdGVtc0ZvY3VzYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TXVzdEZpbGxTY3JlZW4oYm9vbGVhbiBmaWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldE11c3RGaWxsU2NyZWVuKGZpbGxTY3JlZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKGludCBwb3NpdGlvbiwgZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKHBvc2l0aW9uLCBpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25VbnNlbGVjdGFibGUoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKHBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFja0Zyb21Cb3R0b20oYm9vbGVhbiBzdGFja0Zyb21Cb3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhY2tGcm9tQm90dG9tKHN0YWNrRnJvbUJvdHRvbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihpbnQgc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldENvbm5lY3RBZGFwdGVyKGJvb2xlYW4gY29ubmVjdEFkYXB0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0Q29ubmVjdEFkYXB0ZXIoY29ubmVjdEFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBmb3IgdGhlIHZhbHVlIG9mIHNvbWUgaXRlbS4KLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlQXRQb3NpdGlvbihsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbi5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24uCi0gICAgICogQHJldHVybiBXaGV0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRPZkJvdW5kcyhsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZ3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICBpZiAoZ3JvdXAgPj0gbUdyb3Vwcy5zaXplKCkgfHwgZ3JvdXAgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAgICAgaWYgKGNoaWxkID49IG1Hcm91cHMuZ2V0KGdyb3VwKS5jaGlsZHJlbi5zaXplKCkgfHwgY2hpbGQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgZm9yIHRoZSBwYWNrZWQgcG9zaXRpb24sIHBvc3NpYmx5IHJldXNpbmcgdGhlIGNvbnZlcnRWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gZ2V0IGEgdmlldyBmb3IuCi0gICAgICogQHBhcmFtIGNvbnZlcnRWaWV3IE9wdGlvbmFsIHZpZXcgdG8gY29udmVydC4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBmdXR1cmUgcGFyZW50LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXRWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzT3V0T2ZCb3VuZHMocGFja2VkUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UgZm9yIGFkYXB0ZXIhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZmluYWwgaW50IGZsUG9zID0gZWx2LmdldEZsYXRMaXN0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgCi0gICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKFRleHRWaWV3KSBjb252ZXJ0Vmlldykuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldElkKGZsUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gZ2V0SGVpZ2h0Rm9yUG9zaXRpb24oZmxQb3MpOwotICAgICAgICByZXR1cm4gY3JlYXRlVmlldyhwYWNrZWRQb3NpdGlvbiwgZmxQb3MsIHBhcmVudCwgZGVzaXJlZEhlaWdodCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHZpZXcgZm9yIGEgZ3JvdXAgb3IgY2hpbGQgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24gKGhhcyB0eXBlLCBncm91cCBwb3MsIGFuZCBvcHRpb25hbGx5IGNoaWxkIHBvcykuCi0gICAgICogQHBhcmFtIGZsUG9zIFRoZSBmbGF0IGxpc3QgcG9zaXRpb24gKHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBMaXN0VmlldyBnb2VzIGJ5KS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdmlldy4KLSAgICAgKiBAcGFyYW0gZGVzaXJlZEhlaWdodCBUaGUgZGVzaXJlZCBoZWlnaHQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXcgY3JlYXRlVmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBpbnQgZmxQb3MsIFZpZXdHcm91cCBwYXJlbnQsIGludCBkZXNpcmVkSGVpZ2h0KSB7Ci0gICAgICAgIFRleHRWaWV3IHJlc3VsdCA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEhlaWdodChkZXNpcmVkSGVpZ2h0KTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgcmVzdWx0LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgICAgIHJlc3VsdC5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgcmVzdWx0LnNldFBhZGRpbmcoMzYsIDAsIDAsIDApOwotICAgICAgICByZXN1bHQuc2V0SWQoZmxQb3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ3JvdXAgaW5kZXggY29udGFpbmluZyBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvciBhdAotICAgICAqIGxlYXN0IG9uZSBjaGlsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW4gVGhlIGdyb3VwIG11c3QgaGF2ZSB0aGlzIGFtb3VudCwgb3IgLTEgaWYgdXNpbmcKLSAgICAgKiAgICAgICAgICAgIGF0TGVhc3RPbmVDaGlsZC4KLSAgICAgKiBAcGFyYW0gYXRMZWFzdE9uZUNoaWxkIFRoZSBncm91cCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkLCBvciBmYWxzZQotICAgICAqICAgICAgICAgICAgaWYgdXNpbmcgbnVtQ2hpbGRyZW4uCi0gICAgICogQHJldHVybiBBIGdyb3VwIGluZGV4IHdpdGggdGhlIHJlcXVpcmVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gYWRhcHRlci5nZXRHcm91cENvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgaW50IGN1ck51bUNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVtQ2hpbGRyZW4gPT0gY3VyTnVtQ2hpbGRyZW4gfHwgYXRMZWFzdE9uZUNoaWxkICYmIGN1ck51bUNoaWxkcmVuID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PE15R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIG1Hcm91cHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BZGFwdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBleHBhbmRhYmxlIGxpc3QgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgTXlBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENoaWxkSWQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uZ2V0KGNoaWxkUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSwgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEdyb3VwKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldEdyb3VwVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgYm9vbGVhbiBpc0V4cGFuZGVkLCBWaWV3IGNvbnZlcnRWaWV3LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15R3JvdXAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAxMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIExpc3Q8TXlDaGlsZD4gY2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlHcm91cChpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAgIiArIGlkOwotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE15Q2hpbGQ+KG51bUNoaWxkcmVuKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTXlDaGlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2hpbGQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAyMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlDaGlsZCgpIHsKLSAgICAgICAgICAgIG5hbWUgPSAiQ2hpbGQgIiArIGlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBpbml0KChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgTGlzdFNjZW5hcmlvI2luaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5MzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwgdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmhhc05leHQoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogXCJhbmRyb2lkXCIsIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5hbmEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie30iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNraXBPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogeyBcImNcIjogW10sIFwiZFwiOiBbdHJ1ZSwgdHJ1ZSwge31dIH0sIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJ7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJoZWxsb1wiOiB0cnVlLFxuIiArCisgICAgICAgICAgICAgICAgIiAgIFwiZm9vXCI6IFtcIndvcmxkXCJdXG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Ub3BMZXZlbE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ0cnVlIikpLm5leHRCb29sZWFuKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyVW5lc2NhcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltcImFcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJhXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCI6XCIsIgorICAgICAgICAgICAgICAgICsgIlwiLFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcYlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcZlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcblwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcclwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdFwiLCIKKyAgICAgICAgICAgICAgICArICJcIiBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFxcXCIsIgorICAgICAgICAgICAgICAgICsgIlwie1wiLCIKKyAgICAgICAgICAgICAgICArICJcIn1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJbXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMDBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDE5XCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MjBBQ1wiIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXCIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjoiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXGIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcZiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInsiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ9IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIl0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcMCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAxOSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjBBQyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2Vyc1dpdGhGcmFjdGlvbmFsUGFydFNwZWNpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWzEuMCwxLjAsMS4wXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQuOUUtMzI0LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC41LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzkzLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNzE4MjgxODI4NDU5MDQ1LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltOYU5dIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0RG91YmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAsMCwwLCIKKyAgICAgICAgICAgICAgICArICIxLDEsMSwiCisgICAgICAgICAgICAgICAgKyAiLTEsLTEsLTEsIgorICAgICAgICAgICAgICAgICsgIi05MjIzMzcyMDM2ODU0Nzc1ODA4LCIKKyAgICAgICAgICAgICAgICArICI5MjIzMzcyMDM2ODU0Nzc1ODA3XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NSU5fVkFMVUUsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBmYWlscyBiZWNhdXNlIHRoZXJlJ3Mgbm8gZG91YmxlIGZvciA5MjIzMzcyMDM2ODU0Nzc1ODA2LCBhbmQKKyAgICAgKiBvdXIgbG9uZyBwYXJzaW5nIHVzZXMgRG91YmxlLnBhcnNlRG91YmxlKCkgZm9yIGZyYWN0aW9uYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIaWdoUHJlY2lzaW9uTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIls5MjIzMzcyMDM2ODU0Nzc1ODA2LjAwMF0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwNkwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bWJlcldpdGhPY3RhbFByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlswMV0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TG9uZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsZmFsc2VdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDYXNlTGl0ZXJhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltUcnVlLFRydUUsRmFsc2UsRkFMU0UsTlVMTCxudWxMXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZUVuZE9mSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlLCIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZWx5Q2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOltdfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgcmVhZGVyLnBlZWsoKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRGYWlsdXJlc0RvTm90QWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTnVsbElzTm90TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1wibnVsbFwiXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTGl0ZXJhbElzTm90QVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbbnVsbF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3ROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLy8gY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyMgY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8qIGNvbW1lbnQgKi8gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7YTp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigieydhJzp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW2FdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWydhJ10iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWROYW1lVmFsdWVQYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZTtcImJcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5uZWNlc3NhcnlBcnJheVNlcGFyYXRvcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyxdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25Xcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nVG9wTGV2ZWxUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVXaXRob3V0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRob3V0TmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVG9wTGV2ZWxWYWx1ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKS5lbmRBcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROZXN0aW5nQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyaW5nVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKG51bGwpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpudWxsfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTmFOKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDEuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1JTl9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMC41KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX05PUk1BTCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5QSSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5FKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWy0wLjAsIgorICAgICAgICAgICAgICAgICsgIjEuMCwiCisgICAgICAgICAgICAgICAgKyAiMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwiCisgICAgICAgICAgICAgICAgKyAiNC45RS0zMjQsIgorICAgICAgICAgICAgICAgICsgIjAuMCwiCisgICAgICAgICAgICAgICAgKyAiLTAuNSwiCisgICAgICAgICAgICAgICAgKyAiMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIgorICAgICAgICAgICAgICAgICsgIjMuMTQxNTkyNjUzNTg5NzkzLCIKKyAgICAgICAgICAgICAgICArICIyLjcxODI4MTgyODQ1OTA0NV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTEpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlswLCIKKyAgICAgICAgICAgICAgICArICIxLCIKKyAgICAgICAgICAgICAgICArICItMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt0cnVlLGZhbHNlXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltudWxsXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImFcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCI6Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIiwiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGYiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXG4iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHQiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiICIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcXCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJ7Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIn0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiWyIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJdIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwwIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlx1MDAxOSIpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIl0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0c0luQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImMiKS52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJkIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbe1wiYVwiOjUsXCJiXCI6ZmFsc2V9LCIKKyAgICAgICAgICAgICAgICArICJ7XCJjXCI6NixcImRcIjp0cnVlfV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5c0luT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6WzUsZmFsc2VdLCIKKyAgICAgICAgICAgICAgICArICJcImJcIjpbNix0cnVlXX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIltbW1tbW1tbW1tbW1tbW1tbW1tbXV1dXV1dXV1dXV1dXV1dXV1dXV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6IgorICAgICAgICAgICAgICAgICsgIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7IgorICAgICAgICAgICAgICAgICsgIn19fX19fX19fX19fX19fX19fX19fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAvLyBKc29uV3JpdGVyIGRvZXNuJ3QgYXR0ZW1wdCB0byBkZXRlY3QgZHVwbGljYXRlIG5hbWVzCisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOnRydWUsXCJhXCI6ZmFsc2V9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDUuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZSIpLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImYiKS5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNi4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZyIpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaCIpLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaSIpLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIntcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImFcIjogdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImJcIjogZmFsc2UsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJjXCI6IDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImVcIjogbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImZcIjogW1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICBdLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZ1wiOiB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJoXCI6IDguMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImlcIjogOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfVxuIgorICAgICAgICAgICAgICAgICsgIn0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg4LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICA1LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJhXCI6IDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImJcIjogNy4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDkuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF1cbiIKKyAgICAgICAgICAgICAgICArICJdIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKaW5kZXggYjkwYzk3Yi4uYWFkM2ZlMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCkBAIC02OCw2ICs2OCwxMyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJ4bi0tZnNxdTAwYS54bi0tMHp3bTU2ZCIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CiAKKyAgICAgICAgLy8gVXJsIGZvciB0ZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgLy8gICBodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweAorICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOworCiAgICAgICAgIC8vIEludGVybmF0aW9uYWxpemVkIFVSTC4KICAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiaHR0cDovL1x1RDYwNFx1QUUwOFx1QzYwMVx1QzIxOFx1Qzk5RC5rciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoIm1haWwuZXhhbXBsZS5jb20iKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogCi0gICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgZG9tYWlucy4KQEAgLTExOCw2ICsxMjUsMTQgQEAKIAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiX18rJjQyLnhlciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkludmFsaWQgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gT2Jzb2xldGUgZG9tYWluIC55dQorICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigidGVzdC55dSIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9ic29sZXRlIGNvdW50cnkgY29kZSB0b3AgbGV2ZWwgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gVGVzdGluZyB0b3AgbGV2ZWwgQXJhYmljIGNvdW50cnkgY29kZSBkb21haW4gaW4gUHVueWNvZGU6CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ4bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWm9vbU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcy5nZXRDb250ZXh0KCkpOworICAgICAgICBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eSh0aGlzLmdldENvbnRleHQoKSwgd2ViVmlldyk7CisgICAgICAgIHpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHdlYlZpZXcsIGNhbGxiYWNrUHJveHkpOworCisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoMS4wMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgeworICAgICAgICB0ZXN0SW5pdCgwLjAxZik7CisgICAgICAgIHRlc3RJbml0KDEuMDBmKTsKKyAgICAgICAgdGVzdEluaXQoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CisgICAgICAgIGFjdHVhbFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZW5zaXR5LCB6b29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGJhc2ljIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVxdWFsIHRvIHRoZSBkZWZhdWx0cworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDAuMDFmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjAwZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNjYWxlV2l0aExpbWl0cygpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4U2NhbGUgPSB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluU2NhbGUgPSB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXhTY2FsZSA+IG1pblNjYWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSArIC4wMWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSAtIC4wMWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWN0dWFsU2NhbGVUZXN0KGZsb2F0IGFjdHVhbFNjYWxlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZhdWx0U2NhbGVUZXN0KGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhEZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pbkRlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4RGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkRlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRjODUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCBiMjI1YzM3Li4zODE5MWIwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTEzMCw3ICsxMzAsMTEgQEAKICAgICAgICAgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IG5ldyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcigKICAgICAgICAgICAgICAgICBwa2dOYW1lLCBtRGV2aWNlKTsKICAgICAgICAgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyKCk7Ci0gICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZW5jb3VudGVyZWQgSU9FeGNlcHRpb24gIiArIGlvZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDczMjJlNmMuLjBlNWRmOGMgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIDxncm91cCBnaWQ9InNkY2FyZF9ydyIgLz4KICAgICA8L3Blcm1pc3Npb24+CiAKKyAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VTQiIgPgorICAgICAgICA8Z3JvdXAgZ2lkPSJ1c2IiIC8+CisgICAgPC9wZXJtaXNzaW9uPgorCiAgICAgPCEtLSBUaGUgZ3JvdXAgdGhhdCAvY2FjaGUgYmVsb25ncyB0bywgbGlua2VkIHRvIHRoZSBwZXJtaXNzaW9uCiAgICAgICAgICBzZXQgb24gdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBhY2Nlc3MgL2NhY2hlIC0tPgogICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ0FDSEVfRklMRVNZU1RFTSIgPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCmluZGV4IDgxYzVkNTUuLjJkYjM4ZjEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKQEAgLTEyLDggKzEyLDggQEAKICAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgcHJvdmlkZXMgYSBzaW5nbGUgc3RyaW5nLjwvZGQ+CiAgIDxkdD48YSBocmVmPSIjU3RyaW5nQXJyYXkiPlN0cmluZyBBcnJheTwvYT48L2R0PgogICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhbiBhcnJheSBvZiBzdHJpbmdzLjwvZGQ+Ci0gIDxkdD48YSBocmVmPSIjUGx1cmFscyI+UGx1cmFsczwvYT48L2R0PgotICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBjYXJyaWVzIGRpZmZlcmVudCBzdHJpbmdzIGZvciBkaWZmZXJlbnQgcGx1cmFsaXphdGlvbnMKKyAgPGR0PjxhIGhyZWY9IiNQbHVyYWxzIj5RdWFudGl0eSBTdHJpbmdzIChQbHVyYWxzKTwvYT48L2R0PgorICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBjYXJyaWVzIGRpZmZlcmVudCBzdHJpbmdzIGZvciBkaWZmZXJlbnQgcXVhbnRpdGllcwogICAgIG9mIHRoZSBzYW1lIHdvcmQgb3IgcGhyYXNlLjwvZGQ+CiA8L2RsPgogCkBAIC0yMTgsMTMgKzIxOCwzMCBAQAogCiAKIAotPGgyIGlkPSJQbHVyYWxzIj5QbHVyYWxzPC9oMj4KKzxoMiBpZD0iUGx1cmFscyI+UXVhbnRpdHkgU3RyaW5ncyAoUGx1cmFscyk8L2gyPgogCi08cD5BIHBhaXIgb2Ygc3RyaW5ncyB0aGF0IGVhY2ggcHJvdmlkZSBhIGRpZmZlcmVudCBwbHVyYWwgZm9ybSBvZiB0aGUgc2FtZSB3b3JkIG9yIHBocmFzZSwKLXdoaWNoIHlvdSBjYW4gY29sbGVjdGl2ZWx5IHJlZmVyZW5jZSBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gV2hlbiB5b3UgcmVxdWVzdCB0aGUgcGx1cmFscwotcmVzb3VyY2UgdXNpbmcgYSBtZXRob2Qgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMjZ2V0UXVhbnRpdHlTdHJpbmcoaW50LGludCkKLWdldFF1YW50aXR5U3RyaW5nKCl9LCB5b3UgbXVzdCBwYXNzIGEgImNvdW50Iiwgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIHBsdXJhbCBmb3JtIHlvdQotcmVxdWlyZSBhbmQgcmV0dXJuIHRoYXQgc3RyaW5nIHRvIHlvdS48L3A+Cis8cD5EaWZmZXJlbnQgbGFuZ3VhZ2VzIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBncmFtbWF0aWNhbCBhZ3JlZW1lbnQgd2l0aCBxdWFudGl0eS4gSW4gRW5nbGlzaCwKK2ZvciBleGFtcGxlLCB0aGUgcXVhbnRpdHkgMSBpcyBhIHNwZWNpYWwgY2FzZS4gV2Ugd3JpdGUgIjEgYm9vayIsIGJ1dCBmb3IgYW55IG90aGVyIHF1YW50aXR5IHdlJ2QKK3dyaXRlICI8aT5uPC9pPiBib29rcyIuIFRoaXMgZGlzdGluY3Rpb24gYmV0d2VlbiBzaW5ndWxhciBhbmQgcGx1cmFsIGlzIHZlcnkgY29tbW9uLCBidXQgb3RoZXIKK2xhbmd1YWdlcyBtYWtlIGZpbmVyIGRpc3RpbmN0aW9ucy4gVGhlIGZ1bGwgc2V0IHN1cHBvcnRlZCBieSBBbmRyb2lkIGlzIDxjb2RlPnplcm88L2NvZGU+LAorPGNvZGU+b25lPC9jb2RlPiwgPGNvZGU+dHdvPC9jb2RlPiwgPGNvZGU+ZmV3PC9jb2RlPiwgPGNvZGU+bWFueTwvY29kZT4sIGFuZCA8Y29kZT5vdGhlcjwvY29kZT4uCisKKzxwPlRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggY2FzZSB0byB1c2UgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UgYW5kIHF1YW50aXR5IGNhbiBiZSB2ZXJ5IGNvbXBsZXgsCitzbyBBbmRyb2lkIHByb3ZpZGVzIHlvdSB3aXRoIG1ldGhvZHMgc3VjaCBhcwore0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzI2dldFF1YW50aXR5U3RyaW5nKGludCxpbnQpIGdldFF1YW50aXR5U3RyaW5nKCl9IHRvIHNlbGVjdAordGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZvciB5b3UuCisKKzxwPk5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGlzIG1hZGUgYmFzZWQgb24gZ3JhbW1hdGljYWwgbmVjZXNzaXR5LiBBIHN0cmluZyBmb3IgPGNvZGU+emVybzwvY29kZT4KK2luIEVuZ2xpc2ggd2lsbCBiZSBpZ25vcmVkIGV2ZW4gaWYgdGhlIHF1YW50aXR5IGlzIDAsIGJlY2F1c2UgMCBpc24ndCBncmFtbWF0aWNhbGx5IGRpZmZlcmVudAorZnJvbSAyLCBvciBhbnkgb3RoZXIgbnVtYmVyIGV4Y2VwdCAxICgiemVybyBib29rcyIsICJvbmUgYm9vayIsICJ0d28gYm9va3MiLCBldCBjZXRlcmEpLgorRG9uJ3QgYmUgbWlzbGVkIGVpdGhlciBieSB0aGUgZmFjdCB0aGF0LCBzYXksIDxjb2RlPnR3bzwvY29kZT4gc291bmRzIGxpa2UgaXQgY291bGQgb25seSBhcHBseSB0bwordGhlIHF1YW50aXR5IDI6IGEgbGFuZ3VhZ2UgbWF5IHJlcXVpcmUgdGhhdCAyLCAxMiwgMTAyIChldCBjZXRlcmEpIGFyZSBhbGwgdHJlYXRlZCBsaWtlIG9uZQorYW5vdGhlciBidXQgZGlmZmVyZW50bHkgdG8gb3RoZXIgcXVhbnRpdGllcy4gUmVseSBvbiB5b3VyIHRyYW5zbGF0b3IgdG8ga25vdyB3aGF0IGRpc3RpbmN0aW9ucwordGhlaXIgbGFuZ3VhZ2UgYWN0dWFsbHkgaW5zaXN0cyB1cG9uLgorCis8cD5JdCdzIG9mdGVuIHBvc3NpYmxlIHRvIGF2b2lkIHF1YW50aXR5IHN0cmluZ3MgYnkgdXNpbmcgcXVhbnRpdHktbmV1dHJhbCBmb3JtdWxhdGlvbnMgc3VjaCBhcworIkJvb2tzOiAxIi4gVGhpcyB3aWxsIG1ha2UgeW91ciBsaWZlIGFuZCB5b3VyIHRyYW5zbGF0b3JzJyBsaXZlcyBlYXNpZXIsIGlmIGl0J3MgYSBzdHlsZSB0aGF0J3MKK2luIGtlZXBpbmcgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBIHBsdXJhbHMgY29sbGVjdGlvbiBpcyBhIHNpbXBsZSByZXNvdXJjZSB0aGF0IGlzCiByZWZlcmVuY2VkIHVzaW5nIHRoZSB2YWx1ZSBwcm92aWRlZCBpbiB0aGUge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZSAobm90IHRoZSBuYW1lIG9mIHRoZSBYTUwKQEAgLTI1MSw3ICsyNjgsNyBAQAogICAgICZsdDs8YSBocmVmPSIjcGx1cmFscy1lbGVtZW50Ij5wbHVyYWxzPC9hPgogICAgICAgICBuYW1lPSI8ZW0+cGx1cmFsX25hbWU8L2VtPiI+CiAgICAgICAgICZsdDs8YSBocmVmPSIjcGx1cmFscy1pdGVtLWVsZW1lbnQiPml0ZW08L2E+Ci0gICAgICAgICAgICBxdWFudGl0eT1bIm9uZSIgfCAib3RoZXIiXQorICAgICAgICAgICAgcXVhbnRpdHk9WyJ6ZXJvIiB8ICJvbmUiIHwgInR3byIgfCAiZmV3IiB8ICJtYW55IiB8ICJvdGhlciJdCiAgICAgICAgICAgICAmZ3Q7PGVtPnRleHRfc3RyaW5nPC9lbT4mbHQ7L2l0ZW0+CiAgICAgJmx0Oy9wbHVyYWxzPgogJmx0Oy9yZXNvdXJjZXM+CkBAIC0yODUsMTYgKzMwMiwyNyBAQAogICAgICAgPHAgY2xhc3M9ImNhcHMiPmF0dHJpYnV0ZXM6PC9wPgogICAgICAgPGRsIGNsYXNzPSJhdG4tbGlzdCI+CiAgICAgICAgIDxkdD48Y29kZT5xdWFudGl0eTwvY29kZT48L2R0PgotICAgICAgICA8ZGQ+PGVtPktleXdvcmQ8L2VtPi4gQSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBjYXNlIGluIHdoaWNoIHRoaXMgc3RyaW5nIHNob3VsZCBiZSB1c2VkLiBWYWxpZAotdmFsdWVzOgorICAgICAgICA8ZGQ+PGVtPktleXdvcmQ8L2VtPi4gQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZW4gdGhpcyBzdHJpbmcgc2hvdWxkIGJlIHVzZWQuIFZhbGlkCit2YWx1ZXMsIHdpdGggbm9uLWV4aGF1c3RpdmUgZXhhbXBsZXMgaW4gcGFyZW50aGVzZXM6CiAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgPHRyPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPgogICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG9uZX08L3RkPjx0ZD5XaGVuIHRoZXJlIGlzIG9uZSAoYSBzaW5ndWxhciBzdHJpbmcpLjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgemVyb308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgbnVtYmVyIDAgKGFzIGluIEFyYWJpYykuPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD57QGNvZGUgb3RoZXJ9PC90ZD48dGQ+V2hlbiB0aGUgcXVhbnRpdHkgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBvbmUgKGEgcGx1cmFsCi1zdHJpbmcsIGJ1dCBhbHNvIHVzZWQgd2hlbiB0aGUgY291bnQgaXMgemVybykuPC90ZD4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBvbmV9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgbnVtYmVycyBsaWtlIG9uZSAoYXMgd2l0aCB0aGUgbnVtYmVyIDEgaW4gRW5nbGlzaCBhbmQgbW9zdCBvdGhlciBsYW5ndWFnZXM7IGluIFJ1c3NpYW4sIGFueSBudW1iZXIgZW5kaW5nIGluIDEgYnV0IG5vdCBlbmRpbmcgaW4gMTEgaXMgaW4gdGhpcyBjbGFzcykuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgdHdvfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgbGlrZSB0d28gKGFzIGluIFdlbHNoKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBmZXd9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgInNtYWxsIiBudW1iZXJzIChhcyB3aXRoIDIsIDMsIGFuZCA0IGluIEN6ZWNoOyBvciBudW1iZXJzIGVuZGluZyAyLCAzLCBvciA0IGJ1dCBub3QgMTIsIDEzLCBvciAxNCBpbiBQb2xpc2gpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG1hbnl9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgImxhcmdlIiBudW1iZXJzIChhcyB3aXRoIG51bWJlcnMgZW5kaW5nIDExLTk5IGluIE1hbHRlc2UpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG90aGVyfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIGRvZXMgbm90IHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIGdpdmVuIHF1YW50aXR5LjwvdGQ+CiAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgIDwvZGQ+CkBAIC0zMTUsNiArMzQzLDE3IEBACiAgICAgJmx0Oy9wbHVyYWxzPgogJmx0Oy9yZXNvdXJjZXM+CiA8L3ByZT4KKyAgICA8cD5YTUwgZmlsZSBzYXZlZCBhdCB7QGNvZGUgcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbH06PC9wPgorPHByZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CismbHQ7cmVzb3VyY2VzPgorICAgICZsdDtwbHVyYWxzIG5hbWU9Im51bWJlck9mU29uZ3NBdmFpbGFibGUiPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0ib25lIj5abmFsZXppb25vIGplZG4mI3gwMTA1OyBwaW9zZW5rJiN4MDExOTsuJmx0Oy9pdGVtPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0iZmV3Ij5abmFsZXppb25vICVkIHBpb3NlbmtpLiZsdDsvaXRlbT4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9Im90aGVyIj5abmFsZXppb25vICVkIHBpb3NlbmVrLiZsdDsvaXRlbT4KKyAgICAmbHQ7L3BsdXJhbHM+CismbHQ7L3Jlc291cmNlcz4KKzwvcHJlPgogICAgIDxwPkphdmEgY29kZTo8L3A+CiA8cHJlPgogaW50IGNvdW50ID0gZ2V0TnVtYmVyT2Zzb25nc0F2YWlsYWJsZSgpOwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKaW5kZXggNDZiYTc2OS4uOWFjZTFjYiAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCkBAIC0yMyw5ICsyMyw5IEBACiAgICAgICAgIDxsaT4KICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvYT4KLSAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KQEAgLTY0LDcgKzY0LDggQEAKICAgPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsMTAgKzc0LDEyIEBACiAgIDxoMj5TZWUgQWxzbzwvaDI+CiAgICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICA8L2Rpdj4KQEAgLTExOCw0NSArMTIxLDU1IEBACiBpbiB0aGUgc2FtZSBwcm9jZXNzLiA8L3A+CiAKIDxwPllvdXIgdGVzdCBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgbWVhbnMgb2YgYW4KLTxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4KLWVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudAotc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIHRlbGwgQW5kcm9pZCBob3cKLXRvIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSW5zdHJ1bWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUKLXNlY3Rpb24gPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0Ci1SdW5uZXI8L2E+LjwvcD4KKyAgICA8YQorICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KKyAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIAorICAgICAgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIAorICAgICAgdGVsbCBBbmRyb2lkIGhvdyB0byBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24uIEluc3RydW1lbnRhdGlvbiBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgCisgICAgICBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPi4KKzwvcD4KIAogPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHN1bW1hcml6ZXMgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudDo8L3A+CiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmciLz4KIAotPHA+SW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQotd3JpdGUgdGhlbSBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLiBUaGUgU0RLCi10b29scyBoZWxwIHlvdSBjcmVhdGUgYSBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIGl0cyB0ZXN0IHByb2plY3QgYXQgdGhlIHNhbWUKLXRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAotbGluZS4gRWNsaXBzZSB3aXRoIEFEVCBwcm92aWRlcyBhbiBleHRlbnNpdmUgc2V0IG9mIHRvb2xzIGZvciBjcmVhdGluZyB0ZXN0cywKLXJ1bm5pbmcgdGhlbSwgYW5kIHZpZXdpbmcgdGhlaXIgcmVzdWx0cy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+YWRiPC9jb2RlPgotdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuPC9wPgorPHA+CisgICAgSW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQorICAgIHdyaXRlIHRoZW0gaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4gVGhlIFNESworICAgIHRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQorICAgIHRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAorICAgIGxpbmUuIEVjbGlwc2Ugd2l0aCBBRFQgcHJvdmlkZXMgYW4gZXh0ZW5zaXZlIHNldCBvZiB0b29scyBmb3IgY3JlYXRpbmcgdGVzdHMsCisgICAgcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+CisgICAgdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuCis8L3A+CiAKLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+CiAKLTxwPklmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSBvbmUgb2YgdGhlCi10ZXN0aW5nIHR1dG9yaWFsczo8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgogCiA8dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgogPC91bD4KIAogPGgyIGlkPSJUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2gyPgpAQCAtMTY2LDEyMCArMTc5LDE1NiBAQAogICAgIGEgcG93ZXJmdWwgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgeW91ciB0ZXN0cyBhY2Nlc3MgdGhlIHN0YXRlIGFuZCBydW50aW1lIG9iamVjdHMKICAgICBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdHMuCiA8L3A+Ci08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgdGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIHRlc3RpbmcgQVBJIGF2YWlsYWJsZSBpbiBBbmRyb2lkLjwvcD4KKzxwPgorICAgIFRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuCis8L3A+CiA8aDMgaWQ9IkV4dGVuc2lvbnMiPkpVbml0IHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICBTb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSB0ZXN0aW5nIEFQSSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGJ1dCBkbyBub3QgdXNlIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBUaGVzZSBjbGFzc2VzCi0gIGNvbnRhaW4gbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIHJlc291cmNlcywgZmlsZXMsIGRhdGFiYXNlcywKLSAgYW5kIHNvIGZvcnRoLiBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIGJ1dCB5b3UgdXN1YWxseSB1c2UgYSBzdWJjbGFzcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBvbmVudC4KKyAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSAKKyAgYnV0IGRvIG5vdCB1c2UgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFRoZXNlIGNsYXNzZXMgY29udGFpbiBtZXRob2RzIGZvciBhY2Nlc3Npbmcgc3lzdGVtIAorICBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIAorICByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LAorICBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCiA8cD4KICAgVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiAKKyAgICAgIEl0IGFsbG93cyB5b3UgdG8gaW5qZWN0IGEgbW9jayBDb250ZXh0IGludG8gdGhlIGFwcGxpY2F0aW9uLCBzZXQgdXAgaW5pdGlhbCB0ZXN0IHBhcmFtZXRlcnMgCisgICAgICBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgCisgICAgICBpcyBkZXN0cm95ZWQuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSAtIEEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgaXQgaW5qZWN0cyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0sIHlvdXIgcHJvdmlkZXIgdGVzdGluZyBpcyBpc29sYXRlZAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKKyAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4gCisgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gLSBhIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBZb3UgY2FuIGluamVjdCBhIG1vY2sgQ29udGV4dCBvciBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgCisgICAgICBsZXQgQW5kcm9pZCBwcm92aWRlIHlvdSBhIGZ1bGwgQ29udGV4dCBhbmQgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufS4KICAgICA8L2xpPgogICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbiB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+CiA8cD4KLSAgVGhlIEFQSSBmb3IgdGVzdGluZyBhY3Rpdml0aWVzIGV4dGVuZHMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLAotICBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSB0ZXN0aW5nIGJ5IHNlbmRpbmcgZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBwcmVjaXNlbHkgY29udHJvbCB0aGUgc3RhcnQgb2YgYW4gYWN0aXZpdHksIGFuZCBtb25pdG9yIHRoZSBzdGF0ZSBvZiB0aGUKLSAgYWN0aXZpdHkgZHVyaW5nIGl0cyBsaWZlIGN5Y2xlLgorICBUaGUgQVBJIGZvciB0ZXN0aW5nIGFjdGl2aXRpZXMgZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgCisgIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLCBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSAKKyAgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIAorICBhY3Rpdml0eSwgYW5kIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpdml0eSBkdXJpbmcgaXRzIGxpZmUgY3ljbGUuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfS4gQWxsIG9mIGl0cyBzdWJjbGFzc2VzIGhhdmUgCisgIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgorICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4gVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgogICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVRlc3RDYXNlfSAtIEEgYmFzZSBjbGFzcyBmb3IgYWN0aXZpdHkgdGVzdCBjbGFzc2VzLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfSAtIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuCi0gICAgICBJdCBpbnZva2VzIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBhbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkKLSAgICAgIG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgbWV0aG9kIGNhbGwuIFVzZSBpdCB3aGVuIGFsbCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBydW4gYWdhaW5zdCB0aGUgc2FtZSBhY3Rpdml0eS4KKyAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciAKKyAgICAgIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuIEl0IGludm9rZXMge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IGFuZCAKKyAgICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5IG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgCisgICAgICBtZXRob2QgY2FsbC4gVXNlIGl0IHdoZW4gYWxsIG9mIHlvdXIgdGVzdCBtZXRob2RzIHJ1biBhZ2FpbnN0IHRoZSBzYW1lIGFjdGl2aXR5LgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TeW5jQmFzZUluc3RydW1lbnRhdGlvbn0gLSBBIGNsYXNzIHRoYXQgdGVzdHMgc3luY2hyb25pemF0aW9uIG9mIGEgY29udGVudCBwcm92aWRlci4gSXQgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gY2FuY2VsIGFuZCBkaXNhYmxlCi0gICAgICBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdCBzeW5jaHJvbml6YXRpb24uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSAKKyAgICAgIGNvbnRlbnQgcHJvdmlkZXIuIEl0IHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIGNhbmNlbCBhbmQgZGlzYWJsZSBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIAorICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gLSBUaGlzIGNsYXNzIGRvZXMgYW4gaXNvbGF0ZWQgdGVzdCBvZiBhIHNpbmdsZSAKKyAgICAgIGFjdGl2aXR5LiBXaXRoIGl0LCB5b3UgY2FuIGluamVjdCBhIG1vY2sgY29udGV4dCBvciBhcHBsaWNhdGlvbiwgb3IgYm90aC4KKyAgICAgIEl0IGlzIGludGVuZGVkIGZvciBkb2luZyB1bml0IHRlc3RzIG9mIGFuIGFjdGl2aXR5LCBhbmQgaXMgdGhlIGFjdGl2aXR5IGVxdWl2YWxlbnQgb2YgdGhlIAorICAgICAgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgorICAgICAgPHA+CisgICAgICAgIFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuCisgICAgICA8L3A+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSAtIFRoaXMgY2xhc3MgdGVzdHMgYSBzaW5nbGUgYWN0aXZpdHkgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LgotICAgICAgWW91IGNhbm5vdCBpbmplY3QgYSBtb2NrIENvbnRleHQsIGJ1dCB5b3UgY2FuIGluamVjdCBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSwKLSAgICAgIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gVUkuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IC0gVGhpcyBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSAKKyAgICAgICAgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LiBZb3UgY2Fubm90IGluamVjdCBhIG1vY2sgQ29udGV4dCwgYnV0IHlvdSBjYW4gaW5qZWN0IAorICAgICAgICBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uIFVJLgogICAgIDwvbGk+CiAgIDwvdWw+CiA8aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICBBbmRyb2lkIGFsc28gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IGNsYXNzIHRoYXQgaXMgdGhlIGJhc2lzIG9mIAorICA8Y29kZT5hc3NlcnQoKTwvY29kZT4gY2FsbHMgaW4gdGVzdHMuIFRoZXJlIGFyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGlzIGNsYXNzLCAKKyAge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgogPC9wPgogPHVsPgogICA8bGk+Ci0gICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCisgICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCiAgIDwvbGk+CiAgIDxsaT4KLSAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSBwYXJ0aWN1bGFyIFggYW5kIFkKLSAgICBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZiBnZW9tZXRyeSBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgCisgICAgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSAKKyAgICBwYXJ0aWN1bGFyIFggYW5kIFkgcG9zaXRpb24gb24gdGhlIHZpc2libGUgc2NyZWVuLiBUaGVzZSBhc3NlcnRzIHNpbXBsaWZ5IHRlc3Rpbmcgb2YgZ2VvbWV0cnkgCisgICAgYW5kIGFsaWdubWVudCBpbiB0aGUgVUkuCiAgIDwvbGk+CiA8L3VsPgogPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+CiAgIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKKyAgICBBbmRyb2lkIGhhcyBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBjcmVhdGluZyBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgYXBwbGljYXRpb25zLCBjb250ZXh0cywKKyAgICBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgaW4gc29tZSB0ZXN0IGNsYXNzZXMgZm9yIAorICAgIGNyZWF0aW5nIG1vY2sgSW50ZW50cy4gVXNlIHRoZXNlIG1vY2tzIHRvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24sIHNpbmNlIHRoZXkgYXJlIAorICAgIGVhc2llciB0byB1c2UgdGhhbiBjcmVhdGluZyB0aGVpciByZWFsIGNvdW50ZXJwYXJ0cy4gVGhlc2UgY29udmVuaWVuY2UgY2xhc3NlcyBhcmUgZm91bmQgaW4gCisgICAge0BsaW5rIGFuZHJvaWQudGVzdH0gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9ja30uIFRoZXkgYXJlOgogICA8L3A+CiAgICAgPHVsPgogICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IC0gTW9ja3MgYSBDb250ZXh0IHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGl0IAorICAgICAgICBydW5zIGluIGlzb2xhdGlvbi4gQXQgdGhlIHNhbWUgdGltZSwgaXQgaGFzIGVub3VnaCBzdHViIGNvZGUgdG8gc2F0aXNmeSBPUyBjb2RlIHRoYXQgdHJpZXMgCisgICAgICAgIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KICAgICAgIDwvbGk+CiAgICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9IC0gRGVsZWdhdGVzIG1vc3QgY29udGV4dCBmdW5jdGlvbnMgdG8gYW4gCisgICAgICAgIGV4aXN0aW5nLCBub3JtYWwgY29udGV4dCB3aGlsZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBmaWxlIGFuZCBkYXRhYmFzZQorICAgICAgICBuYW1lcyBpbiB0aGUgY29udGV4dC4gVXNlIHRoaXMgdG8gdGVzdCBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHdpdGggYSBub3JtYWwgc3lzdGVtIAorICAgICAgICBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgogICAgICAgPC9saT4KICAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0RpYWxvZ0ludGVyZmFjZX0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gCisgICAgICAgIENsYXNzZXMgdGhhdCBjcmVhdGUgbW9jayBBbmRyb2lkIHN5c3RlbSBvYmplY3RzIGZvciB1c2UgaW4gdGVzdGluZy4gVGhleSBleHBvc2Ugb25seSB0aG9zZSAKKyAgICAgICAgbWV0aG9kcyB0aGF0IGFyZSB1c2VmdWwgaW4gbWFuYWdpbmcgdGhlIG9iamVjdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMKKyAgICAgICAgc2ltcGx5IHRocm93IGFuIEV4Y2VwdGlvbi4gWW91IGFyZSBleHBlY3RlZCB0byBleHRlbmQgdGhlIGNsYXNzZXMgYW5kIG92ZXJyaWRlIGFueSBtZXRob2RzICcKKyAgICAgICAgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogICAgICAgPC9saT4KICAgICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2gzPgogPHA+CiAgIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAogICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgCisgIHNhbWUgcHJvY2VzcywgYW5kIHJvdXRlcyB0ZXN0IG91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuIFVzaW5nIGluc3RydW1lbnRhdGlvbiBpcyBrZXkgdG8gdGhlCisgIGFiaWxpdHkgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gdG8gY29udHJvbCB0aGUgZW50aXJlIHRlc3QKKyAgZW52aXJvbm1lbnQgYXQgcnVudGltZS4gTm90aWNlIHRoYXQgeW91IHVzZSB0aGlzIHRlc3QgcnVubmVyIGV2ZW4gaWYgeW91ciB0ZXN0IGNsYXNzIGRvZXMgbm90IAorICBpdHNlbGYgdXNlIGluc3RydW1lbnRhdGlvbi4KIDwvcD4KIDxwPgotICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB5b3UgZmlyc3QgcnVuIGEgc3lzdGVtIHV0aWxpdHkgY2FsbGVkIEFjdGl2aXR5IE1hbmFnZXIuIEFjdGl2aXR5IE1hbmFnZXIgdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0byBzdGFydCBhbmQgY29udHJvbCB0aGUgdGVzdCBydW5uZXIsIHdoaWNoIGluIHR1cm4gdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcwotICBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBzdGFydHMgdGhlIG1haW4gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHRvIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiBhcHBsaWNhdGlvbi4KKyAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSAKKyAgTWFuYWdlciB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRvIHN0YXJ0IGFuZCBjb250cm9sIHRoZSB0ZXN0IHJ1bm5lciwgd2hpY2ggaW4gdHVybiAKKyAgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IAorICBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgCisgIGFzcGVjdHMgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uLgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSwgdGhlIEFEVCBwbHVnaW4gYXNzaXN0cyB5b3UgaW4gdGhlIHNldHVwIG9mIAorICA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBvdGhlciB0ZXN0IHJ1bm5lcnMuIFRoZSBwbHVnaW4gVUkgcHJvbXB0cyB5b3UgdG8gc3BlY2lmeSAKKyAgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgCisgIHRvIHRoZSBtYW5pZmVzdCBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBFY2xpcHNlIHdpdGggQURUIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGEgdGVzdCAKKyAgYXBwbGljYXRpb24gdW5kZXIgdGhlIGNvbnRyb2wgb2YgQWN0aXZpdHkgTWFuYWdlciB1c2luZyBpbnN0cnVtZW50YXRpb24sIGFuZCByZWRpcmVjdHMgdGhlIHRlc3QgCisgIG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgogPC9wPgogPHA+CiAgIElmIHlvdSBwcmVmZXIgd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gdXNlIEFudCBhbmQgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+CkBAIC0yODksNjggKzMzOCwxMDUgQEAKIDwvcD4KIDxoMiBpZD0iVGVzdEVudmlyb21lbnQiPldvcmtpbmcgaW4gdGhlIFRlc3QgRW52aXJvbm1lbnQ8L2gyPgogPHA+Ci0gICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCi0gICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cwotICAgIChrbm93biBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCkgYnkgaXRzIG1hbmlmZXN0IGZpbGUuCisgICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gCisgICAgQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCisgICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSAKKyAgICBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cyAoa25vd24gYXMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QpIGJ5IGl0cyBtYW5pZmVzdCBmaWxlLgogPC9wPgogPHA+CiAgICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIHBhcnRpY3VsYXIgdHlwZSBvZiBjb21wb25lbnQuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0aGF0IGRlZmluZSB0ZXN0cyBvbiBzb21lIAorICAgIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdoZW4geW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgQW5kcm9pZAorICAgIHN0YXJ0cyBpdCwgbG9hZHMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgdGhlbiBpbnZva2VzIGVhY2ggbWV0aG9kIAorICAgIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MuCiA8L3A+CiA8cD4KLSAgICBUaGUgdG9vbHMgYW5kIHByb2NlZHVyZXMgeW91IHVzZSB3aXRoIHRlc3RpbmcgZGVwZW5kIG9uIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgYXJlIHVzaW5nLiBJZiB5b3UgdXNlIEVjbGlwc2UsIHRoZW4gdGhlIEFEVCBwbHVnIGluIGZvciBFY2xpcHNlIHByb3ZpZGVzIHRvb2xzIHRoYXQKLSAgICBhbGxvdyB5b3UgdG8gZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgotICAgIElmIHlvdSB1c2UgYW5vdGhlciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgdGhlbiB5b3UgdXNlIEFuZHJvaWQncyBjb21tYW5kLWxpbmUgdG9vbHMsIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorICAgIFRoZSB0b29scyBhbmQgcHJvY2VkdXJlcyB5b3UgdXNlIHdpdGggdGVzdGluZyBkZXBlbmQgb24gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBhcmUgCisgICAgdXNpbmcuIElmIHlvdSB1c2UgRWNsaXBzZSwgdGhlbiB0aGUgQURUIHBsdWcgaW4gZm9yIEVjbGlwc2UgcHJvdmlkZXMgdG9vbHMgdGhhdCBhbGxvdyB5b3UgdG8gCisgICAgZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSAKKyAgICBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyAKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KIDwvcD4KIDxoMyBpZD0iVGVzdFByb2plY3RzIj5Xb3JraW5nIHdpdGggdGVzdCBwcm9qZWN0czwvaDM+CiA8cD4KLSAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KLSAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aAotICAgIEFEVCBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBUaGUgcHJvY2VkdXJlIGZvciBjcmVhdGluZyBhIHRlc3QgcHJvamVjdCBmb3IgdXNlIHdpdGggZGV2ZWxvcG1lbnQKLSAgICB0b29scyBvdGhlciB0aGFuIEVjbGlwc2UgaXMgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIAorICAgIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KKyAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIAorICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQgaXMgCisgICAgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgZm9yIHVzZSB3aXRoIAorICAgIGRldmVsb3BtZW50IHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBBIHRlc3QgYXBwbGljYXRpb24gY29udGFpbnMgb25lIG9yIG1vcmUgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQgYW4gQW5kcm9pZCB0ZXN0IGNhc2UgCisgICAgY2xhc3MuIFlvdSBjaG9vc2UgYSB0ZXN0IGNhc2UgY2xhc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgQW5kcm9pZCBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nIGFuZCAKKyAgICB0aGUgdGVzdHMgeW91IGFyZSBkb2luZy4gQSB0ZXN0IGFwcGxpY2F0aW9uIGNhbiB0ZXN0IGRpZmZlcmVudCBjb21wb25lbnRzLCBidXQgZWFjaCB0ZXN0IGNhc2UgCisgICAgY2xhc3MgaXMgZGVzaWduZWQgdG8gdGVzdCBhIHNpbmdsZSB0eXBlIG9mIGNvbXBvbmVudC4gVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIAorICAgIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgorICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIAorICAgIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsIGZvciAKKyAgICBleGFtcGxlLCB5b3UgaGF2ZSB0aGUgY2hvaWNlIG9mIGVpdGhlciB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSBvciAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfS4KIDxwPgotICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIAorICAgIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAogICAgIG1vY2tlZCBDb250ZXh0cy4gSW4gZ2VuZXJhbCwgeW91IGNhbid0IG1vY2sgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KIDwvcD4KIDxwPgotICAgIEluIGNvbXBhcmlzb24sIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiBpcyBkZXNpZ25lZCBmb3IgdW5pdCB0ZXN0aW5nLCBzbyBpdCB0ZXN0cyBhY3Rpdml0aWVzIGluIGFuIGlzb2xhdGVkIHN5c3RlbSBpbmZyYXN0cnVjdHVyZS4gWW91IGNhbiBpbmplY3QgbW9ja2VkIG9yIHdyYXBwZXJlZCBkZXBlbmRlbmNpZXMgZm9yCi0gICAgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QsIHBhcnRpY3VsYXJseSBtb2NrZWQgQ29udGV4dHMuIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHlvdSB1c2UgdGhpcyB0ZXN0IGNhc2UgY2xhc3MgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgcnVucyBpbiBpc29sYXRpb24gYW5kIGNhbid0IGludGVyYWN0IHdpdGggb3RoZXIgYWN0aXZpdGllcy4KKyAgICBJbiBjb21wYXJpc29uLCA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4gaXMgZGVzaWduZWQgZm9yIHVuaXQgdGVzdGluZywgc28gaXQgdGVzdHMgCisgICAgYWN0aXZpdGllcyBpbiBhbiBpc29sYXRlZCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBvciB3cmFwcGVyZWQgCisgICAgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIAorICAgIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3QgCisgICAgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgogPC9wPgogPHA+Ci0gICAgQXMgYSBydWxlIG9mIHRodW1iLCBpZiB5b3Ugd2FudGVkIHRvIHRlc3QgYW4gYWN0aXZpdHkncyBpbnRlcmFjdGlvbiB3aXRoIHRoZSByZXN0IG9mIEFuZHJvaWQsIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+LiBJZiB5b3Ugd2FudGVkIHRvIGRvIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KKyAgICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGlmIHlvdSB3YW50ZWQgdG8gdGVzdCBhbiBhY3Rpdml0eSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHJlc3Qgb2YgQW5kcm9pZCwgCisgICAgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvY29kZT4uIElmIHlvdSB3YW50ZWQgdG8gZG8gcmVncmVzc2lvbiAKKyAgICB0ZXN0aW5nIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KIDwvcD4KIDxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCisgICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIAorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBtZXRob2QgdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRvIHNldCB1cCAKKyAgICBmaXh0dXJlcy4gSW4gYWRkaXRpb24sIHlvdSBhZGQgbWV0aG9kcyB0byB0aGUgY2xhc3MgdG8gZGVmaW5lIGluZGl2aWR1YWwgdGVzdHMuIEVhY2ggbWV0aG9kIHlvdQorICAgIGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgorICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiAKKyAgICB5b3VyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3NlcyBnaXZlIHlvdSBzdWJzdGFudGlhbCBjb250cm9sIG92ZXIgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIGNvbXBvbmVudHMuIEZvciAKKyAgICB0aGlzIHJlYXNvbiwgeW91IGhhdmUgdG8gc3BlY2lmaWNhbGx5IHRlbGwgQW5kcm9pZCB0byBzdGFydCBhIGNvbXBvbmVudCBiZWZvcmUgeW91IHJ1biB0ZXN0cyAKKyAgICBhZ2FpbnN0IGl0LiBGb3IgZXhhbXBsZSwgeW91IHVzZSB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyI2dldEFjdGl2aXR5KCl9IG1ldGhvZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICB1bmRlciB0ZXN0LiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgb25jZSBkdXJpbmcgdGhlIGVudGlyZSB0ZXN0IGNhc2UsIG9yIG9uY2UgZm9yIGVhY2ggdGVzdCAKKyAgICBtZXRob2QuIFlvdSBjYW4gZXZlbiBkZXN0cm95IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0IGJ5IGNhbGxpbmcgaXRzIAorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2goKX0gbWV0aG9kIGFuZCB0aGVuIHJlc3RhcnQgaXQgd2l0aCAKKyAgICA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB3aXRoaW4gYSBzaW5nbGUgdGVzdCBtZXRob2QuCiA8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzIj5SdW5uaW5nIHRlc3RzIGFuZCBzZWVpbmcgdGhlIHJlc3VsdHM8L2gzPgogPHA+Ci0gICAgVG8gcnVuIHlvdXIgdGVzdHMsIHlvdSBidWlsZCB5b3VyIHRlc3QgcHJvamVjdCBhbmQgdGhlbiBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24gdXNpbmcgdGhlIHN5c3RlbSB1dGlsaXR5IEFjdGl2aXR5IE1hbmFnZXIgd2l0aCBpbnN0cnVtZW50YXRpb24uIFlvdSBwcm92aWRlIHRvIEFjdGl2aXR5IE1hbmFnZXIgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcnVubmVyICh1c3VhbGx5Ci0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91cgotICAgIHRlc3QgYXBwbGljYXRpb24sIGtpbGxzIGFueSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZQotICAgIGNsYXNzIGluIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcnVubmVyIHRoZW4gdGFrZXMgY29udHJvbCBvZiB0aGUgdGVzdHMsIHJ1bm5pbmcgZWFjaCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHVudGlsIGFsbCB0aGUgbWV0aG9kcyBpbiBhbGwgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuIHJ1bi4KKyAgICBUbyBydW4geW91ciB0ZXN0cywgeW91IGJ1aWxkIHlvdXIgdGVzdCBwcm9qZWN0IGFuZCB0aGVuIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgCisgICAgc3lzdGVtIHV0aWxpdHkgQWN0aXZpdHkgTWFuYWdlciB3aXRoIGluc3RydW1lbnRhdGlvbi4gWW91IHByb3ZpZGUgdG8gQWN0aXZpdHkgTWFuYWdlciB0aGUgbmFtZSAKKyAgICBvZiB0aGUgdGVzdCBydW5uZXIgKHVzdWFsbHkge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgCisgICAgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IAorICAgIHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91ciB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzCisgICAgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgCisgICAgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZSBjbGFzcyBpbiB5b3VyIAorICAgIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IAorICAgIG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiAKKyAgICBydW4uCiA8L3A+CiA8cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgorICAgIElmIHlvdSBydW4gYSB0ZXN0IHdpdGhpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gYSBuZXcgSlVuaXQgdmlldyBwYW5lLiBJZiB5b3UgCisgICAgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBvdXRwdXQgZ29lcyB0byBTVERPVVQuCiA8L3A+CiA8aDIgaWQ9IlRlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgpAQCAtMzU5LDU4ICs0NDUsNjQgQEAKIDwvcD4KICAgPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCisgICAgICBBY3Rpdml0eSBsaWZlY3ljbGUgZXZlbnRzOiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIGFjdGl2aXRpZXMgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgCisgICAgICBjb3JyZWN0bHkuIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIAorICAgICAgc3RhdGUuIFJlbWVtYmVyIHRoYXQgZXZlbiBhIGNoYW5nZSBpbiBzY3JlZW4gb3JpZW50YXRpb24gY2F1c2VzIHRoZSBjdXJyZW50IGFjdGl2aXR5IHRvIGJlIAorICAgICAgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCiAgICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3RhdGUuCi0gICAgICBUbyBkbyB0aGlzLCB1c2UgbW9jayBvYmplY3RzIGZyb20gdGhlIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KKyAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gCisgICAgICB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4gVG8gZG8gdGhpcywgdXNlIG1vY2sgb2JqZWN0cyBmcm9tIHRoZSBwYWNrYWdlIAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIAorICAgICAgICBhbGwgb2YgdGhlIHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIG9uIHdoaWNoIHlvdSB3YW50IGl0IHRvIHJ1bi4gWW91IGNhbiB0ZXN0IHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAgICAgZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgdG9waWMgCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uCiAgICAgPC9saT4KICAgPC91bD4KIDxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCiA8L3A+CiA8aDIgaWQ9IlVJVGVzdGluZyI+QXBwZW5kaXg6IFVJIFRlc3RpbmcgTm90ZXM8L2gyPgogPHA+Ci0gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaGF2ZSB0aXBzIGZvciB0ZXN0aW5nIHRoZSBVSSBvZiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHNwZWNpZmljYWxseQotICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKLSAgc2NyZWVuIHVubG9jayBkdXJpbmcgdGVzdGluZy4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgogPC9wPgogPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgogPHA+Ci0gIEFuIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBydW4gb24gdGhlIGFwcGxpY2F0aW9uJ3MgPHN0cm9uZz5VSSB0aHJlYWQ8L3N0cm9uZz4uIE9uY2UgdGhlCi0gIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAotICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKLSAgaGFzIGFjY2VzcyB0byB0aGUgdGhyZWFkIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KIDwvcD4KIDxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCisgICAgVGhpcyBjaGFuZ2VzIHdoZW4geW91IHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbi4gV2l0aCBpbnN0cnVtZW50YXRpb24tYmFzZWQgY2xhc3NlcywKKyAgICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIAorICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIAorICAgIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyAKKyAgICBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSSBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCiA8L3A+CiA8cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kIAorICAgIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhcyBhIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIAorICAgIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+LnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4sIHdoZXJlIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+PC9jb2RlPiBpcyAKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcCB5b3UgYXJlIHRlc3RpbmcuCiA8L3A+CiA8cD4KLSAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlIFNwaW5uZXIgZGlzcGxheWVkCi0gIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0byA8Y29kZT53YWl0Rm9ySWRsZVN5bmM8L2NvZGU+IGFuZCA8Y29kZT5zZW5kS2V5czwvY29kZT4KLSAgYXJlbid0IGFsbG93ZWQgdG8gcnVuIG9uIHRoZSBVSSB0aHJlYWQ6PC9wPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZSAKKyAgICBTcGlubmVyIGRpc3BsYXllZCBieSB0aGUgYWN0aXZpdHksIGFuZCB0aGVuIHNlbmRzIGEga2V5IHRvIGl0LiBOb3RpY2UgdGhhdCB0aGUgY2FsbHMgdG8gCisgICAgPGNvZGU+d2FpdEZvcklkbGVTeW5jPC9jb2RlPiBhbmQgPGNvZGU+c2VuZEtleXM8L2NvZGU+IGFyZW4ndCBhbGxvd2VkIHRvIHJ1biBvbiB0aGUgVUkgdGhyZWFkOgorPC9wPgogPHByZT4KICAgcHJpdmF0ZSBNeUFjdGl2aXR5IG1BY3Rpdml0eTsgLy8gTXlBY3Rpdml0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYXBwIHVuZGVyIHRlc3QKICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOwpAQCAtNDQ5LDMxICs1NDEsMzYgQEAKIAogPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+CiA8cD4KLSAgVG8gY29udHJvbCB0aGUgZW11bGF0b3Igb3IgYSBkZXZpY2Ugd2l0aCBrZXkgZXZlbnRzIHlvdSBzZW5kIGZyb20geW91ciB0ZXN0cywgeW91IG11c3QgdHVybiBvZmYKLSAgdG91Y2ggbW9kZS4gSWYgeW91IGRvIG5vdCBkbyB0aGlzLCB0aGUga2V5IGV2ZW50cyBhcmUgaWdub3JlZC4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCiA8L3A+CiA8cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlIAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyLnNldEFjdGl2aXR5VG91Y2hNb2RlKGZhbHNlKTwvY29kZT4KKyAgICA8ZW0+YmVmb3JlPC9lbT4geW91IGNhbGwgPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gdG8gc3RhcnQgdGhlIGFjdGl2aXR5LiBZb3UgbXVzdCBpbnZva2UgdGhlIAorICAgIG1ldGhvZCBpbiBhIHRlc3QgbWV0aG9kIHRoYXQgaXMgPGVtPm5vdDwvZW0+IHJ1bm5pbmcgb24gdGhlIFVJIHRocmVhZC4gRm9yIHRoaXMgcmVhc29uLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCAKKyAgICA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+LiBJbnN0ZWFkLCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gPGNvZGU+c2V0VXAoKTwvY29kZT4uCiA8L3A+CiA8aDMgaWQ9IlVubG9ja0RldmljZSI+VW5sb2NraW5nIHRoZSBlbXVsYXRvciBvciBkZXZpY2U8L2gzPgogPHA+Ci0gIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCB0aGUga2V5Z3VhcmQgcGF0dGVybi4KLSAgVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50IGJ5IDxjb2RlPnNlbmRLZXlzKCk8L2NvZGU+LiBUaGUgYmVzdAotICB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byBzdGFydCB5b3VyIGVtdWxhdG9yIG9yIGRldmljZSBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgorICAgIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCAKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50ICcKKyAgICBieSA8Y29kZT5zZW5kS2V5cygpPC9jb2RlPi4gVGhlIGJlc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gc3RhcnQgeW91ciBlbXVsYXRvciBvciBkZXZpY2UgCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KIDwvcD4KIDxwPgotICBZb3UgY2FuIGFsc28gZXhwbGljaXRseSBkaXNhYmxlIHRoZSBrZXlndWFyZC4gVG8gZG8gdGhpcywKLSAgeW91IG5lZWQgdG8gYWRkIGEgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIGFuZAotICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byByZW1vdmUgdGhpcyBiZWZvcmUKLSAgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIHRoZSBwdWJsaXNoZWQgYXBwLgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byAKKyAgICByZW1vdmUgdGhpcyBiZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIAorICAgIHRoZSBwdWJsaXNoZWQgYXBwLgogPC9wPgogPHA+Ci0gIFRvIGFkZCB0aGUgdGhlIHBlcm1pc3Npb24sIGFkZCB0aGUgZWxlbWVudCA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+Ci0gIGFzIGEgY2hpbGQgb2YgdGhlIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQuIFRvIGRpc2FibGUgdGhlIEtleUd1YXJkLCBhZGQgdGhlIGZvbGxvd2luZyBjb2RlCi0gIHRvIHRoZSA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgYWN0aXZpdGllcyB5b3UgaW50ZW5kIHRvIHRlc3Q6CisgICAgVG8gYWRkIHRoZSB0aGUgcGVybWlzc2lvbiwgYWRkIHRoZSBlbGVtZW50IAorICAgIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KKyAgICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSAKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgogPC9wPgogPHByZT4KICAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CkBAIC00ODMsNyArNTgwLDggQEAKIDxwPndoZXJlIDxjb2RlPjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPjwvY29kZT4gaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2aXR5LjwvcD4KIDxoMyBpZD0iVUlUZXN0VHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3RpbmcgVUkgdGVzdHM8L2gzPgogPHA+Ci0gIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgY2F1c2VzOgorICAgIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgCisgICAgY2F1c2VzOgogPC9wPgogPGRsPgogICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgpAQCAtNDkxLDI3ICs1ODksMzMgQEAKICAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CiAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgogICAgICAgPGNvZGU+Ci0gICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgICBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uOiBPbmx5IHRoZSBvcmlnaW5hbCB0aHJlYWQgdGhhdCBjcmVhdGVkIAorICAgICAgICBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCiAgICAgICA8L2NvZGU+CiAgICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkgCisgICAgICAgIHRocmVhZC4gVGhpcyBjb21tb25seSBoYXBwZW5zIGlmIHlvdSBzZW5kIFVJIGV2ZW50cyBmcm9tIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBidXQgeW91IGRvbid0CisgICAgICAgIHVzZSB0aGUgPGNvZGU+QFVJVGhyZWFkPC9jb2RlPiBhbm5vdGF0aW9uIG9yIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IG1ldGhvZC4gVGhlIAorICAgICAgICB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCiAgICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KKyAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CiAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgPC9kZD4KICAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KICAgICA8ZGQ+CiAgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgotICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKKyAgICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKICAgICAgIDxjb2RlPgogICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQKICAgICAgIDwvY29kZT4KICAgICAgIDxwPjxzdHJvbmc+UHJvYmFibGUgQ2F1c2U6PC9zdHJvbmc+PC9wPgotICAgICAgICBUaGlzIGVycm9yIGlzIGNvbW1vbiBpZiB5b3VyIHRlc3QgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGJ1dCB0aGVuIHRyaWVzIHRvCi0gICAgICAgIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4uCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IAorICAgICAgICB0aGVuIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIAorICAgICAgICA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LgogICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFJlbW92ZSB0aGUgPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYW5ub3RhdGlvbiwgcmVtb3ZlIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IGNhbGwsIG9yIHJlLWZhY3RvciB5b3VyIHRlc3RzLgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiAKKyAgICAgICAgY2FsbCwgb3IgcmUtZmFjdG9yIHlvdXIgdGVzdHMuCiAgICAgPC9kZD4KIDwvZGw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCkBAIC0wLDAgKzEsNDkgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAge0BsaXRlcmFsIEBpbXBvcnR9ICJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuY3NzIjsKKzwvc3R5bGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IntAZG9jUm9vdH1hc3NldHMvYW5kcm9pZC1kZXZlbG9wZXItcmVzb3VyY2UtYnJvd3Nlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL21pY3JvdGVtcGxhdGUuanMiPjwvc2NyaXB0PgorCis8ZGl2PgorICA8cCBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmxvYXQ6IHJpZ2h0Ij5GaWx0ZXI6IDxpbnB1dCBpZD0icmVzb3VyY2UtYnJvd3Nlci1rZXl3b3JkLWZpbHRlciIvPjwvcD4KKyAgPHAgaWQ9InJlc291cmNlLWJyb3dzZXItc2VhcmNoLXBhcmFtcyI+U2hvd2luZyBhbGwgdGVjaG5pY2FsIHJlc291cmNlczo8L3A+Cis8L2Rpdj4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPGRpdiBpZD0icmVzb3VyY2UtYnJvd3Nlci1yZXN1bHRzIj4KKyAgPGRpdiBjbGFzcz0ibm8tcmVzdWx0cyI+Tm8gcmVzdWx0cy48L2Rpdj4KKzwvZGl2PgorCis8c2NyaXB0IHR5cGU9InRleHQvaHRtbCIgaWQ9InRtcGxfcmVzb3VyY2VfYnJvd3Nlcl9yZXN1bHQiPgorPGRpdiBjbGFzcz0icmVzdWx0Ij4KKyAgPGgzPgorICAgIDwlIGlmICgnZXh0ZXJuYWwnIGluIHRhZ3NIYXNoKSB7ICU+PHN0cm9uZz5FeHRlcm5hbDogPC9zdHJvbmc+IDwlIH0gJT4KKyAgICA8YSBocmVmPSI8JT0gcGF0aCAlPiI+PCU9IHRpdGxlLmVuICU+PC9hPgorICAgIDwlIGlmICgnbmV3JyBpbiB0YWdzSGFzaCkgeyAlPjxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+IDwlIH0gJT4KKyAgPC9oMz4KKyAgPHAgY2xhc3M9InJlc291cmNlLW1ldGEiPjwlCisgICAgdmFyIF9fZyA9IFsnJywgJyddOworICAgIGlmICgnYXJ0aWNsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnQXJ0aWNsZScsICdhYm91dCddOworICAgIH0gZWxzZSBpZiAoJ3R1dG9yaWFsJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydUdXRvcmlhbCcsICdvbiddOworICAgIH0gZWxzZSBpZiAoJ3NhbXBsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnU2FtcGxlJywgJ2ZvciddOworICAgIH0gZWxzZSBpZiAoJ3ZpZGVvJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydWaWRlbycsICdhYm91dCddOworICAgIH0KKyAgJT4KKyAgPCU9IF9fZ1swXSAlPjwlIGlmICh0b3BpY3NIdG1sKSB7ICU+IDwlPSBfX2dbMV0gJT48JSB9ICU+IDwlPSB0b3BpY3NIdG1sICU+PC9wPgorICA8cD48JT0gZGVzY3JpcHRpb24uZW4gJT48L3A+Cis8L2Rpdj4KKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKaW5kZXggMTY2ODcyMS4uOTA1NTg2OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCkBAIC0xLDM4ICsxLDkwIEBACiBwYWdlLnRpdGxlPURldmVsb3BlciBSZXNvdXJjZXMKIEBqZDpib2R5CiAKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMCAyNHB4OworICAgIHdpZHRoOiAzMyU7CisgICAgbWF4LXdpZHRoOiAyNTBweDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworICB9CisKKyAgI3Jlc291cmNlLWxpc3QtdGFibGUgdGQubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwOworICAgIHBhZGRpbmctcmlnaHQ6IDA7CisgIH0KKzwvc3R5bGU+CisKIDxwPgotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRlY2huaWNhbCBhcnRpY2xlcywgdHV0b3JpYWxzLCBzYW1wbGUgY29kZSwgYW5kIG90aGVyCitUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgogaW5mb3JtYXRpb24gdG8gaGVscCB5b3UgcXVpY2tseSBpbXBsZW1lbnQgdGhlIGZlYXR1cmVzIHlvdSB3YW50IGluIHlvdXIKLWFwcGxpY2F0aW9uLgorYXBwbGljYXRpb24uIFRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiCit0YWIgd2hpbGUgYW55IFJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4KIDwvcD4KIAorPGgyPlRlY2huaWNhbCBSZXNvdXJjZXM8L2gyPgorCis8dGFibGUgaWQ9InJlc291cmNlLWxpc3QtdGFibGUiPgorPHRyPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgU2FtcGxlIENvZGUKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5GdWxseS1mdW5jdGlvbmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgeW91IGNhbiBidWlsZCBhbmQgcnVuCisgICAgdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKKyAgICB0ZWNobmlxdWVzIGluIHRoZSBzYW1wbGVzLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIEFydGljbGVzCisgICAgPC9hPjwvaDM+CisgICAgPHA+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKKyAgICBvcHRpbWl6YXRpb25zLCB0aXBzLCBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbnMsICJob3ctdG9zIiwKKyAgICBhbmQgc28gb24uPC9wPgorICA8L3RkPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgVHV0b3JpYWxzCisgICAgPC9hPjwvaDM+CisgICAgPHA+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCisgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmljIGZlYXR1cmVzIHlvdSB3YW50LjwvcD4KKyAgPC90ZD4KKyAgPCEtLSA8dGQgY2xhc3M9Imxhc3QiPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXZpZGVvIj4KKyAgICAgIFZpZGVvcyAmYW1wOyBTY3JlZW5jYXN0cworICAgIDwvYT48L2gzPgorICAgIDxwPlZpZGVvcyBhbmQgcHJlc2VudGF0aW9uIHNsaWRlcyBmcm9tIGRldmVsb3BlciBldmVudHMsIGFsb25nIHdpdGgKKyAgICBzY3JlZW5jYXN0cyB0byB3YWxrIHlvdSB0aHJvdWdoIGNvbW1vbiBBbmRyb2lkIGRldmVsb3BtZW50CisgICAgd29ya2Zsb3dzLjwvcD4KKyAgPC90ZD4gLS0+Cis8L3RyPgorPC90YWJsZT4KKworPGgyPk90aGVyIFJlc291cmNlczwvaDI+CisKIDxkbD4KLTxkdD48Yj5UZWNobmljYWwgQXJ0aWNsZXM8L2I+PC9kdD4KLTxkZD5Gb2N1c2VkIGRpc2N1c3Npb25zIGFib3V0IEFuZHJvaWQgZGV2ZWxvcG1lbnQgc3ViamVjdHMsIGluY2x1ZGluZwotb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLAotYW5kIHNvIG9uLiBNb3N0IG9mIHRoZSBhcnRpY2xlcyBwcm92aWRlICJob3ctdG8iIGluc3RydWN0aW9ucyBmb3IgYWRkaW5nCi1mZWF0dXJlcyBvciBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgYXBwLiBUaGUgYXJ0aWNsZXMgYXJlIGRyYXduIGZyb20gcG9zdHMgdG8gdGhlCi1BbmRyb2lkIERldmVsb3BlcnMgQmxvZy4KLTwvZGQ+Ci0KLTxkdD48Yj5UdXRvcmlhbHM8L2I+PC9kdD4KLTxkZD5TdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIGRlbW9uc3RyYXRpbmcgaG93IHRvIGJ1aWxkIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KLXRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC4gPC9kZD4KLQotPGR0PjxiPlNhbXBsZSBDb2RlPC9iPjwvZHQ+Ci08ZGQ+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gbG9vayBhdCBvciBidWlsZCBhbmQgcnVuLAotdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKLXRlY2huaXF1ZXMgdGhhdCB5b3UgZmluZCBpbiB0aGUgc2FtcGxlcyE8L2RkPgotCiA8ZHQ+PGI+Q29tbXVuaXR5PC9iPjwvZHQ+CiA8ZGQ+TGlua3MgdG8gdGhlIEFuZHJvaWQgZGlzY3Vzc2lvbiBncm91cHMgYW5kIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIHdheXMgdG8KIGNvbGxhYm9yYXRlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gPC9kZD4KIAorPGR0PjxiPkRldmljZSBEYXNoYm9hcmQ8L2I+PC9kdD4KKzxkZD5EZXZpY2UgZGlzdHJpYnV0aW9uIGRhdGEsIGdyb3VwZWQgYnkgdmFyaW91cyBkaW1lbnNpb25zIHN1Y2ggYXMgc2NyZWVuIHNpemUKK2FuZCBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb24uIDwvZGQ+CisKIDxkdD48Yj5Nb3JlPC9iPjwvZHQ+CiA8ZGQ+UXVpY2sgZGV2ZWxvcG1lbnQgdGlwcywgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uLCBhbmQgZnJlcXVlbnRseSBhc2tlZAogcXVlc3Rpb25zIChGQVFzKS4gPC9kZD4KIDwvZGw+Ci0KLTxwPlRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiIHRhYiB3aGlsZSBhbnkKLVJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4gPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmI2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCkBAIC0wLDAgKzEsNjMyIEBACit2YXIgQU5EUk9JRF9UQUdTID0geworICB0eXBlOiB7CisgICAgJ2FydGljbGUnOiAnQXJ0aWNsZScsCisgICAgJ3R1dG9yaWFsJzogJ1R1dG9yaWFsJywKKyAgICAnc2FtcGxlJzogJ1NhbXBsZScsCisgICAgJ3ZpZGVvJzogJ1ZpZGVvJywKKyAgICAnbGlicmFyeSc6ICdDb2RlIExpYnJhcnknCisgIH0sCisgIHRvcGljOiB7CisgICAgJ2FjY2Vzc2liaWxpdHknOiAnQWNjZXNzaWJpbGl0eScsCisgICAgJ2FjY291bnRzeW5jJzogJ0FjY291bnRzICZhbXA7IFN5bmMnLAorICAgICdiZXN0cHJhY3RpY2UnOiAnQmVzdCBQcmFjdGljZXMnLAorICAgICdjb21tdW5pY2F0aW9uJzogJ0NvbW11bmljYXRpb24nLAorICAgICdjb21wYXRpYmlsaXR5JzogJ0NvbXBhdGliaWxpdHknLAorICAgICdkYXRhJzogJ0RhdGEgQWNjZXNzJywKKyAgICAnZHJhd2luZyc6ICdDYW52YXMgRHJhd2luZycsCisgICAgJ2dhbWVkZXYnOiAnR2FtZSBEZXZlbG9wbWVudCcsCisgICAgJ2dsJzogJ09wZW5HTCBFUycsCisgICAgJ2lucHV0JzogJ0lucHV0IE1ldGhvZHMnLAorICAgICdpbnRlbnQnOiAnSW50ZW50cycsCisgICAgJ2xheW91dCc6ICdMYXlvdXRzL1ZpZXdzJywKKyAgICAnbWVkaWEnOiAnTXVsdGltZWRpYScsCisgICAgJ25ld2ZlYXR1cmUnOiAnTmV3IEZlYXR1cmVzJywKKyAgICAncGVyZm9ybWFuY2UnOiAnUGVyZm9ybWFuY2UnLAorICAgICdzZWFyY2gnOiAnU2VhcmNoJywKKyAgICAndGVzdGluZyc6ICdUZXN0aW5nJywKKyAgICAndWknOiAnVXNlciBJbnRlcmZhY2UnLAorICAgICd3ZWInOiAnV2ViIENvbnRlbnQnCisgIH0sCisgIG1pc2M6IHsKKyAgICAnZXh0ZXJuYWwnOiAnRXh0ZXJuYWwnLAorICAgICduZXcnOiAnTmV3JworICB9Cit9OworCit2YXIgQU5EUk9JRF9SRVNPVVJDRVMgPSBbCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVEVDSE5JQ0FMIEFSVElDTEVTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQXZvaWRpbmcgTWVtb3J5IExlYWtzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTW9iaWxlIGRldmljZXMgb2Z0ZW4gaGF2ZSBsaW1pdGVkIG1lbW9yeSwgYW5kIG1lbW9yeSBsZWFrcyBjYW4gY2F1c2UgeW91ciBhcHBsaWNhdGlvbiB0byB3YXN0ZSB0aGlzIHZhbHVhYmxlIHJlc291cmNlIHdpdGhvdXQgeW91ciBrbm93bGVkZ2UuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyB0aXBzIHRvIGhlbHAgeW91IGF2b2lkIGNvbW1vbiBjYXVzZXMgb2YgbWVtb3J5IGxlYWtzIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JhY2t3YXJkIENvbXBhdGliaWxpdHknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgQW5kcm9pZCBwbGF0Zm9ybSBzdHJpdmVzIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSG93ZXZlciwgc29tZXRpbWVzIHlvdSB3YW50IHRvIHVzZSBuZXcgZmVhdHVyZXMgd2hpY2ggYXJlblwndCBzdXBwb3J0ZWQgb24gb2xkZXIgcGxhdGZvcm1zLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIHN0cmF0ZWdpZXMgZm9yIHNlbGVjdGl2ZWx5IHVzaW5nIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIGF2YWlsYWJpbGl0eSwgYWxsb3dpbmcgeW91IHRvIGtlZXAgeW91ciBhcHBsaWNhdGlvbnMgcG9ydGFibGUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDYW4gSSBVc2UgdGhpcyBJbnRlbnQ/JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW5kcm9pZCBvZmZlcnMgYSB2ZXJ5IHBvd2VyZnVsIGFuZCB5ZXQgZWFzeS10by11c2UgbWVzc2FnZSB0eXBlIGNhbGxlZCBhbiBpbnRlbnQuIFlvdSBjYW4gdXNlIGludGVudHMgdG8gdHVybiBhcHBsaWNhdGlvbnMgaW50byBoaWdoLWxldmVsIGxpYnJhcmllcyBhbmQgbWFrZSBjb2RlIG1vZHVsYXIgYW5kIHJldXNhYmxlLiBXaGlsZSBpdCBpcyBuaWNlIHRvIGJlIGFibGUgdG8gbWFrZSB1c2Ugb2YgYSBsb29zZWx5IGNvdXBsZWQgQVBJLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgaW50ZW50IHlvdSBzZW5kIHdpbGwgYmUgcmVjZWl2ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBhIHRlY2huaXF1ZSB5b3UgY2FuIHVzZSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBzeXN0ZW0gY29udGFpbnMgYW55IGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgcmVzcG9uZGluZyB0byB0aGUgaW50ZW50IHlvdSB3YW50IHRvIHVzZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDcmVhdGluZyBhbiBJbnB1dCBNZXRob2QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbnB1dCBNZXRob2QgRWRpdG9ycyAoSU1FcykgcHJvdmlkZSB0aGUgbWVjaGFuaXNtIGZvciBlbnRlcmluZyB0ZXh0IGludG8gdGV4dCBmaWVsZHMgYW5kIG90aGVyIFZpZXdzLiBBbmRyb2lkIGRldmljZXMgY29tZSBidW5kbGVkIHdpdGggYXQgbGVhc3Qgb25lIElNRSwgYnV0IHVzZXJzIGNhbiBpbnN0YWxsIGFkZGl0aW9uYWwgSU1Fcy4gVGhpcyBhcnRpY2xlIGNvdmVycyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYW4gSU1FIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2RyYXdpbmcnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0RyYXdhYmxlIE11dGF0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RyYXdhYmxlcyBhcmUgcGx1Z2dhYmxlIGRyYXdpbmcgY29udGFpbmVycyB0aGF0IGFsbG93IGFwcGxpY2F0aW9ucyB0byBkaXNwbGF5IGdyYXBoaWNzLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgc29tZSBjb21tb24gcGl0ZmFsbHMgd2hlbiB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlIERyYXdhYmxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2Jlc3RwcmFjdGljZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdGYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1doZW4gYW4gQW5kcm9pZCBkZXZpY2UgY2hhbmdlcyBpdHMgb3JpZW50YXRpb24sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB0aGUgY3VycmVudCBhY3Rpdml0eSB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIHRoaXMgY2FuIGJlY29tZSBhIGJvdHRsZW5lY2sgaW4gYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIGEgbGFyZ2UgYW1vdW50IG9mIGV4dGVybmFsIGRhdGEuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXMgc2l0dWF0aW9uIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG1hbnVhbGx5IHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRnV0dXJlLVByb29maW5nIFlvdXIgQXBwcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgY29sbGVjdGlvbiBvZiBjb21tb24gc2Vuc2UgYWR2aWNlIHRvIGhlbHAgeW91IGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGRvblwndCBicmVhayB3aGVuIG5ldyB2ZXJzaW9ucyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhcmUgcmVsZWFzZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nZXN0dXJlcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdHZXN0dXJlcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RvdWNoIHNjcmVlbnMgYWxsb3cgdXNlcnMgdG8gcGVyZm9ybSBnZXN0dXJlcywgc3VjaCBhcyB0YXBwaW5nLCBkcmFnZ2luZywgZmxpbmdpbmcsIG9yIHNsaWRpbmcsIHRvIHBlcmZvcm0gdmFyaW91cyBhY3Rpb25zLiBUaGUgZ2VzdHVyZXMgQVBJIGVuYWJsZXMgeW91ciBhcHBsaWNhdGlvbiB0byByZWNvZ25pemUgZXZlbiBjb21wbGljYXRlZCBnZXN0dXJlcyB3aXRoIGVhc2UuIFRoaXMgYXJ0aWNsZSBleHBsYWlucyBob3cgdG8gaW50ZWdyYXRlIHRoaXMgQVBJIGludG8gYW4gYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdnYW1lZGV2JywgJ2dsJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBHTFN1cmZhY2VWaWV3LCBhIGNsYXNzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgMkQgb3IgM0QgT3BlbkdMIHJlbmRlcmluZyBpbnNpZGUgb2YgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIFJldXNhYmxlIFVJIENvbXBvbmVudHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gY29tYmluZSBtdWx0aXBsZSBzdGFuZGFyZCBVSSB3aWRnZXRzIGludG8gYSBzaW5nbGUgaGlnaC1sZXZlbCBjb21wb25lbnQsIHdoaWNoIGNhbiBiZSByZXVzZWQgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogQ3JlYXRpbmcgRWZmaWNpZW50IExheW91dHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gb3B0aW1pemUgYXBwbGljYXRpb24gbGF5b3V0cyBhcyB0aGlzIGFydGljbGUgd2Fsa3MgeW91IHRocm91Z2ggY29udmVydGluZyBhIExpbmVhckxheW91dCBpbnRvIGEgUmVsYXRpdmVMYXlvdXQsIGFuZCBhbmFseXplcyB0aGUgcmVzdWx0aW5nIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBVc2luZyBWaWV3U3R1YnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCB1c2luZyBWaWV3U3R1YnMgaW5zaWRlIGFuIGFwcGxpY2F0aW9uXCdzIGxheW91dCBpbiBvcmRlciB0byBpbmZsYXRlIHJhcmVseSB1c2VkIFVJIGVsZW1lbnRzLCB3aXRob3V0IHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiB0YWcuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogTWVyZ2luZyBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIHVzZSB0aGUgPGNvZGU+Jmx0O21lcmdlJmd0OzwvY29kZT4gdGFnIGluIHlvdXIgWE1MIGxheW91dHMgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbGV2ZWxzIG9mIGhpZXJhcmNoeSB3aXRoaW4gYW4gYXBwbGljYXRpb25cJ3MgdmlldyB0cmVlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGlzdFZpZXcgQmFja2dyb3VuZHM6IEFuIE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpc3RWaWV3cyBhcmUgdmVyeSBwb3B1bGFyIHdpZGdldHMgd2l0aGluIHRoZSBBbmRyb2lkIGZyYW1ld29yay4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBvcHRpbWl6YXRpb25zIHVzZWQgYnkgdGhlIExpc3RWaWV3IHdpZGdldCwgYW5kIGhvdyB0byBhdm9pZCBzb21lIGNvbW1vbiBpc3N1ZXMgdGhhdCB0aGlzIGNhdXNlcyB3aGVuIHRyeWluZyB0byB1c2UgYSBjdXN0b20gYmFja2dyb3VuZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycyBhbGxvdyB1c2VycyB0byBkaXNwbGF5IGFueSBzb3VyY2Ugb2YgZGF0YSBvbiB0aGVpciBob21lIHNjcmVlbiB3aXRob3V0IGxhdW5jaGluZyBhbiBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uXCdzIGRhdGEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRpc3BsYXkgaW5zaWRlIG9mIGEgbGl2ZSBmb2xkZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIHdhbGxwYXBlcnMgYXJlIHJpY2hlciwgYW5pbWF0ZWQsIGludGVyYWN0aXZlIGJhY2tncm91bmRzIHRoYXQgdXNlcnMgY2FuIGRpc3BsYXkgaW4gdGhlaXIgaG9tZSBzY3JlZW5zLiBMZWFybiBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ09uc2NyZWVuIElucHV0IE1ldGhvZHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgSW5wdXQgTWV0aG9kIEZyYW1ld29yayAoSU1GKSBhbGxvd3MgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb24tc2NyZWVuIGlucHV0IG1ldGhvZHMsIHN1Y2ggYXMgc29mdHdhcmUga2V5Ym9hcmRzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIGFuZCBob3cgYXBwbGljYXRpb25zIGludGVyYWN0IHdpdGggdGhlbS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUGFpbmxlc3MgVGhyZWFkaW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyB0aGUgdGhyZWFkaW5nIG1vZGVsIHVzZWQgYnkgQW5kcm9pZCBhcHBsaWNhdGlvbnMgYW5kIGhvdyBhcHBsaWNhdGlvbnMgY2FuIGVuc3VyZSBiZXN0IFVJIHBlcmZvcm1hbmNlIGJ5IHNwYXduaW5nIHdvcmtlciB0aHJlYWRzIHRvIGhhbmRsZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucywgcmF0aGVyIHRoYW4gaGFuZGxpbmcgdGhlbSBpbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBhcnRpY2xlIGFsc28gZXhwbGFpbnMgdGhlIEFQSSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIEFuZHJvaWQgVUkgdG9vbGtpdCBjb21wb25lbnRzIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBzcGF3biBtYW5hZ2VkIHdvcmtlciB0aHJlYWRzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnc2VhcmNoJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3FzYi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdRdWljayBTZWFyY2ggQm94JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCAoUVNCKSBpcyBhIHBvd2VyZnVsLCBzeXN0ZW0td2lkZSBzZWFyY2ggZnJhbWV3b3JrLiBRU0IgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzIHRvIHF1aWNrbHkgYW5kIGVhc2lseSBmaW5kIHdoYXQgdGhleVwncmUgbG9va2luZyBmb3IsIGJvdGggb24gdGhlaXIgZGV2aWNlcyBhbmQgb24gdGhlIHdlYi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gd29yayB3aXRoIHRoZSBRU0IgZnJhbWV3b3JrIHRvIGFkZCBuZXcgc2VhcmNoIHJlc3VsdHMgZm9yIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVG91Y2ggTW9kZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgdG91Y2ggbW9kZSwgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwcmluY2lwbGVzIG9mIEFuZHJvaWRcJ3MgVUkgdG9vbGtpdC4gV2hlbmV2ZXIgYSB1c2VyIGludGVyYWN0cyB3aXRoIGEgZGV2aWNlXCdzIHRvdWNoIHNjcmVlbiwgdGhlIHN5c3RlbSBlbnRlcnMgdG91Y2ggbW9kZS4gV2hpbGUgc2ltcGxlIGluIGNvbmNlcHQsIHRoZXJlIGFyZSBpbXBvcnRhbnQgaW1wbGljYXRpb25zIHRvdWNoIG1vZGUgdGhhdCBhcmUgb2Z0ZW4gb3Zlcmxvb2tlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90cmFjay1tZW0uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gdXNlIHRoZSBBbGxvY2F0aW9uIFRyYWNrZXIgdG9vbCB0byBvYnNlcnZlIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IGlnbm9yaW5nIHRoZSBlZmZlY3Qgb2YgRGFsdmlrXCdzIGdhcmJhZ2UgY29sbGVjdG9yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS41LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuMCBhbmQgMS4xLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjYuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjYnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS42LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuNS4gSW4gcGFydGljdWxhciwgdGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBjaGFuZ2VzIHRvIFJlbGF0aXZlTGF5b3V0cyBhbmQgY2xpY2sgbGlzdGVuZXJzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGFib3V0IGhvdyB0byB1c2UgSGFuZGxlcnMgYXMgYSBtb3JlIGVmZmljaWVudCByZXBsYWNlbWVudCBmb3IgamF2YS51dGlsLlRpbWVyIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYWNjZXNzaWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90dHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgVGV4dC10by1TcGVlY2gnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGV4dC10by1zcGVlY2ggQVBJIGxldHMgeW91ciBhcHBsaWNhdGlvbiAic3BlYWsiIHRvIHVzZXJzLCBpbiBhbnkgb2Ygc2V2ZXJhbCBsYW5ndWFnZXMuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgVFRTIEFQSSBhbmQgaG93IHlvdSB1c2UgdG8gYWRkIHNwZWVjaCBjYXBhYmlsaXRpZXMgdG8geW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3dlYiddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVc2luZyBXZWJWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1dlYlZpZXdzIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGR5bmFtaWNhbGx5IGRpc3BsYXkgSFRNTCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LCB3aXRob3V0IHJlbGlucXVpc2hpbmcgY29udHJvbCB0byBhIHNlcGFyYXRlIGJyb3dzZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIHRoZSBXZWJWaWV3IGNsYXNzZXMgYW5kIHByb3ZpZGVzIGEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0IScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIFdpa2lOb3RlcyBmb3IgQW5kcm9pZCwgcGFydCBvZiB0aGUgQXBwcyBmb3IgQW5kcm9pZCBwcm9qZWN0LiBJdCBjb3ZlcnMgdGhlIHVzZSBvZiBMaW5raWZ5IHRvIHR1cm4gb3JkaW5hcnkgdGV4dCB2aWV3cyBpbnRvIHJpY2hlciwgbGluay1vcmllbnRlZCBjb250ZW50IHRoYXQgY2F1c2VzIEFuZHJvaWQgaW50ZW50cyB0byBmaXJlIHdoZW4gYSBsaW5rIGlzIHNlbGVjdGVkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa2lOb3RlczogUm91dGluZyBJbnRlbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGlsbHVzdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiwgaW4gdGhpcyBjYXNlIHRoZSBXaWtpTm90ZXMgc2FtcGxlIGFwcCwgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIHZhcmlvdXMgdHlwZXMgb2YgbGlua2VkIHRleHQgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgaGFuZGxlcyB0aGF0IHR5cGUgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIGFuIGFwcCBjYW4gdXNlIGludGVudHMgdG8gcm91dGUgYSBsaW5rZWQgdGVsZXBob25lIG51bWJlciB0byBhIGRpYWxlciBhcHAgYW5kIGEgd2ViIFVSTCB0byBhIGJyb3dzZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdwZXJmb3JtYW5jZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2luZG93IEJhY2tncm91bmRzICYgVUkgU3BlZWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdTb21lIEFuZHJvaWQgYXBwbGljYXRpb25zIG5lZWQgdG8gc3F1ZWV6ZSBldmVyeSBiaXQgb2YgcGVyZm9ybWFuY2Ugb3V0IG9mIHRoZSBVSSB0b29sa2l0IGFuZCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIGRvIHNvLiBJbiB0aGlzIGFydGljbGUsIHlvdSB3aWxsIGRpc2NvdmVyIGhvdyB0byBzcGVlZCB1cCB0aGUgZHJhd2luZyBhbmQgdGhlIHBlcmNlaXZlZCBzdGFydHVwIHRpbWUgb2YgeW91ciBhY3Rpdml0aWVzLiBCb3RoIG9mIHRoZXNlIHRlY2huaXF1ZXMgcmVseSBvbiBhIHNpbmdsZSBmZWF0dXJlLCB0aGUgd2luZG93XCdzIGJhY2tncm91bmQgZHJhd2FibGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWmlwYWxpZ246IGFuIEVhc3kgT3B0aW1pemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgU0RLIGluY2x1ZGVzIGEgdG9vbCBjYWxsZWQgemlwYWxpZ24gdGhhdCBvcHRpbWl6ZXMgdGhlIHdheSBhbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZC4gUnVubmluZyB6aXBhbGlnbiBhZ2FpbnN0IHlvdXIgYXBwbGljYXRpb24gZW5hYmxlcyBBbmRyb2lkIHRvIGludGVyYWN0IHdpdGggaXQgbW9yZSBlZmZpY2llbnRseSBhdCBydW4gdGltZSBhbmQgdGh1cyBoYXMgdGhlIHBvdGVudGlhbCB0byBtYWtlIGl0IGFuZCB0aGUgb3ZlcmFsbCBzeXN0ZW0gcnVuIGZhc3Rlci4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgemlwYWxpZ24gdG9vbCBhbmQgaXRzIHVzZS4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gU0FNUExFIENPREUgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FQSSBEZW1vcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBmcmFtZXdvcmsgdG9waWNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJywgJ25ld2ZlYXR1cmUnLCAnYWNjb3VudHN5bmMnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrdXAgYW5kIFJlc3RvcmUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbGx1c3RyYXRlcyBhIGZldyBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGRldmVsb3BlciBjYW4gdGFrZSB3aGVuIGludGVncmF0aW5nIHdpdGggdGhlIEFuZHJvaWQgQmFja3VwIE1hbmFnZXIgdXNpbmcgdGhlIEJhY2t1cEFnZW50IEFQSSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdjb21tdW5pY2F0aW9uJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCbHVldG9vdGggQ2hhdCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciB0d28td2F5IHRleHQgbWVzc2FnaW5nIG92ZXIgQmx1ZXRvb3RoLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCdXNpbmVzc0NhcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gbGF1bmNoIHRoZSBidWlsdC1pbiBjb250YWN0IHBpY2tlciBmcm9tIHdpdGhpbiBhbiBhY3Rpdml0eS4gVGhpcyBzYW1wbGUgYWxzbyB1c2VzIHJlZmxlY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgY29udGFjdHMgQVBJIGlzIHVzZWQsIGRlcGVuZGluZyBvbiB3aGljaCBBUEkgbGV2ZWwgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ29udGFjdCBNYW5hZ2VyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHF1ZXJ5IHRoZSBzeXN0ZW0gY29udGFjdHMgcHJvdmlkZXIgIHVzaW5nIHRoZSA8Y29kZT5Db250YWN0c0NvbnRyYWN0PC9jb2RlPiBBUEksIGFzIHdlbGwgYXMgaW5zZXJ0IGNvbnRhY3RzIGludG8gYSBzcGVjaWZpYyBhY2NvdW50LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0hvbWUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSG9tZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgaG9tZSBzY3JlZW4gcmVwbGFjZW1lbnQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSmV0Qm95JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBnYW1lIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBTT05pVk9YIEpFVCBpbnRlcmFjdGl2ZSBtdXNpYyB0ZWNobm9sb2d5LCB3aXRoIDxjb2RlPjxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9KZXRQbGF5ZXIuaHRtbCI+SmV0UGxheWVyPC9hPjwvY29kZT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYSBsaXZlIHdhbGxwYXBlciBhbmQgIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMdW5hciBMYW5kZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNsYXNzaWMgTHVuYXIgTGFuZGVyIGdhbWUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTXVsdGlwbGUgUmVzb2x1dGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IHNob3dzIGhvdyB0byB1c2UgcmVzb3VyY2UgZGlyZWN0b3J5IHF1YWxpZmllcnMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVzb3VyY2VzIGZvciBkaWZmZXJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlIFBhZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciBzYXZpbmcgbm90ZXMuIFNpbWlsYXIgKGJ1dCBub3QgaWRlbnRpY2FsKSB0byB0aGUgPGEgaHJlZj0iL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj5Ob3RlcGFkIHR1dG9yaWFsPC9hPi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTYW1wbGVTeW5jQWRhcHRlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIGNvbW11bmljYXRlIHdpdGggYSBjbG91ZC1iYXNlZCBzZXJ2aWNlIGFuZCBzeW5jaHJvbml6ZSBpdHMgZGF0YSB3aXRoIGRhdGEgc3RvcmVkIGxvY2FsbHkgaW4gYSBjb250ZW50IHByb3ZpZGVyLiBUaGUgc2FtcGxlIHVzZXMgdHdvIHJlbGF0ZWQgcGFydHMgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrICZtZGFzaDsgdGhlIGFjY291bnQgbWFuYWdlciBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBtYW5hZ2VyICh0aHJvdWdoIGEgc3luYyBhZGFwdGVyKS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnc2VhcmNoJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NlYXJjaGFibGUgRGljdGlvbmFyeSB2MicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIEFuZHJvaWRcJ3Mgc2VhcmNoIGZyYW1ld29yaywgaW5jbHVkaW5nIGhvdyB0byBwcm92aWRlIHNlYXJjaCBzdWdnZXN0aW9ucyBmb3IgUXVpY2sgU2VhcmNoIEJveC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU25ha2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xhc3NpYyBnYW1lICJTbmFrZS4iJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTcGlubmVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgYW4gYXBwbGljYXRpb24gdW5kZXIgdGVzdCBmb3IgdGhlIFNwaW5uZXJUZXN0IGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lclRlc3QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IFRlc3RpbmcgdHV0b3JpYWwuIEl0IHRlc3RzIHRoZSBTcGlubmVyIGV4YW1wbGUgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RpY1RhY1RvZUxpYicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QsIGEgdHlwZSBvZiBwcm9qZWN0IHRoYXQgbGV0cyB5b3Ugc3RvcmUgYW5kIG1hbmFnZSBzaGFyZWQgY29kZSBhbmQgcmVzb3VyY2VzIGluIG9uZSBwbGFjZSwgdGhlbiBtYWtlIHRoZW0gYXZhaWxhYmxlIHRvIHlvdXIgb3RoZXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VNYWluJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRGVtb25zdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiBjYW4gbWFrZSB1c2Ugb2Ygc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBzdG9yZWQgaW4gYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NvZnQgS2V5Ym9hcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gaW5wdXQgbWV0aG9kIGZvciBhIHNvZnR3YXJlIGtleWJvYXJkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lrdGlvbmFyeScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgY3JlYXRpbmcgaW50ZXJhY3RpdmUgd2lkZ2V0cyBmb3IgZGlzcGxheSBvbiB0aGUgQW5kcm9pZCBob21lIHNjcmVlbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnkgKFNpbXBsaWZpZWQpJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgQW5kcm9pZCBob21lIHNjcmVlbiB3aWRnZXRzIGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9YbWxBZGFwdGVycy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdYTUwgQWRhcHRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCaW5kaW5nIGRhdGEgdG8gdmlld3MgdXNpbmcgWE1MIEFkYXB0ZXJzIGV4YW1wbGVzLicKKyAgICB9CisgIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVFVUT1JJQUxTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWyd0dXRvcmlhbCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gV29ybGQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCZWdpbm5pbmcgYmFzaWMgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgd2l0aCB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egd2Fsay10aHJvdWdoIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGxheW91dHMgYW5kIHZpZXdzIGF2YWlsYWJsZSBpbiB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gTG9jYWxpemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIGJhc2ljcyBvZiBsb2NhbGl6aW5nIHlvdXIgYXBwbGljYXRpb25zIGZvciBtdWx0aXBsZSBsYW5ndWFnZXMgYW5kIGxvY2FsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAnZGF0YSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlcGFkIFR1dG9yaWFsJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBtdWx0aS1wYXJ0IHR1dG9yaWFsIGRpc2N1c3NpbmcgaW50ZXJtZWRpYXRlLWxldmVsIGNvbmNlcHRzIHN1Y2ggYXMgZGF0YSBhY2Nlc3MuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgYmFzaWMgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQWN0aXZpdHkgVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbW9yZSBhZHZhbmNlZCBkZW1vbnN0cmF0aW9uIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCB0b29scy4nCisgICAgfQorICB9CitdOwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCmluZGV4IDUyNjg5YjYuLmExNzExYjUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcworKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKQEAgLTEsNSArMSw1NiBAQAogPHVsPgogICA8bGk+CisgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIFJlc291cmNlczwvc3Bhbj4KKyAgICA8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBDb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5CZWlzcGllbGNvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkPDs2RpZ28gZGUgZWplbXBsbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXhlbXBsZSBkZSBjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Db2RpY2UgZGkgZXNlbXBpbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44K144Oz44OX44OrIOOCs+ODvOODiTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtc2FtcGxlLWxpc3QiPgorICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXR0aW5nIHRoZSBTYW1wbGVzPC9zcGFuPgorICAgICAgICAgICAgICA8L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QXJ0aWNsZXM8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtYXJ0aWNsZS1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlR1dG9yaWFsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+TGVybnByb2dyYW1tZTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+VHV0b3JpYWxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RGlkYWN0aWNpZWxzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Fc2VyY2l0YXppb25pPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jg4Hjg6Xjg7zjg4jjg6rjgqLjg6s8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXR1dG9yaWFsLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90b3BpY3MuaHRtbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvcGljczwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10b3BpYy1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPkNvbW11bml0eTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImVzIj5Db211bmlkYWQ8L3NwYW4+CkBAIC0zNCwyNDEgKzg1LDYgQEAKICAgPC9saT48P2NzCiAgIC9pZgogPz4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIEFydGljbGVzPC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+Ci0gICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIEFydGljbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2F2b2lkaW5nLW1lbW9yeS1sZWFrcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkF2b2lkaW5nIE1lbW9yeSBMZWFrczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QmFja3dhcmQgQ29tcGF0aWJpbGl0eTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DYW4gSSBVc2UgdGhpcyBJbnRlbnQ/PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNyZWF0aW5nIGFuIElucHV0IE1ldGhvZDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9kcmF3YWJsZS1tdXRhdGlvbnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5EcmF3YWJsZSBNdXRhdGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GdXR1cmUtUHJvb2ZpbmcgWW91ciBBcHBzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dlc3R1cmVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2VzdHVyZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZ2xzdXJmYWNldmlldy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFJldXNpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtZWZmaWNpZW5jeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IEVmZmljaWVuY3k8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFZpZXdTdHVicyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1tZXJnZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IE1lcmdpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdFZpZXcgQmFja2dyb3VuZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBGb2xkZXJzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgV2FsbHBhcGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+T25zY3JlZW4gSW5wdXQgTWV0aG9kczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5QYWlubGVzcyBUaHJlYWRpbmc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcXNiLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UXVpY2sgU2VhcmNoIEJveDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGVlY2ggSW5wdXQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdG91Y2gtbW9kZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvdWNoIE1vZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VcGRhdGluZyB0aGUgVUkgZnJvbSBhIFRpbWVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3R0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFRleHQtdG8tU3BlZWNoPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgdGhlIENvbnRhY3RzIEFQSTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFdlYlZpZXdzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1saW5raWZ5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCE8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2lraW5vdGVzLWludGVudHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaW5kb3cgQmFja2dyb3VuZHMgJmFtcDsgVUkgU3BlZWQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5aaXBhbGlnbjogQW4gRWFzeSBPcHRpbWl6YXRpb248L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gICA8L2xpPgotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBXb3JsZDwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBWaWV3czwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2xvY2FsaXphdGlvbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gTG9jYWxpemF0aW9uPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVGVzdGluZzwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgotICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk5vdGVwYWQgVHV0b3JpYWw8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFjdGl2aXR5IFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2dldC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgPC9hPjwvZGl2PgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QVBJIERlbW9zPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t1cCBhbmQgUmVzdG9yZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CbHVldG9vdGggQ2hhdDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJ1c2luZXNzIENhcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Db250YWN0TWFuYWdlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRhY3QgTWFuYWdlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0hvbWUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ib21lPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SmV0Qm95PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MdW5hciBMYW5kZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5NdWx0aXBsZSBSZXNvbHV0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlIFBhZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIFN5bmMgQWRhcHRlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2VhcmNoYWJsZSBEaWN0aW9uYXJ5IHYyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TbmFrZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNvZnQgS2V5Ym9hcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGlubmVyVGVzdDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTGliPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VNYWluL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTWFpbjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lrdGlvbmFyeSAoU2ltcGxpZmllZCk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotCi0KLQogICA8bGk+CiAgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+TW9yZTwvc3Bhbj4KICAgICA8L2gyPgpAQCAtMjk3LDggKzExMyw2IEBACiAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KLQotCiA8L3VsPgogCiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE4ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmODQxYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTYwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApAQCAtMCwwICsxLDcyIEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZSBUb3BpY3MKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmctbGVmdDogMWVtOworICAgIHdpZHRoOiAxOGVtOworICB9CisKKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIHVsIHsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSBsaSB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgfQorPC9zdHlsZT4KKworPHA+CitZb3UgY2FuIGJyb3dzZSB0aGUgbGlzdCBvZiB0ZWNobmljYWwgcmVzb3VyY2VzIGJ5IHRvcGljIGJ5IGNsaWNraW5nIG9uIHRoZQorbGlua3MgYmVsb3cuIE92ZXIgdGltZSwgYXMgbW9yZSB0b3BpY3MgYXJlIGFkZGVkLCB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlCitsaXN0IGJlbG93LgorPC9wPgorCis8bm9zY3JpcHQ+CisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPkVycm9yOjwvc3Ryb25nPgorICAgIFlvdSBtdXN0IGhhdmUgSmF2YVNjcmlwdCBlbmFibGVkIHRvIHZpZXcgdGhpcyBwYWdlLiBSZXNvdXJjZXMgYXJlIGFsc28KKyAgICBhdmFpbGFibGUgb2ZmbGluZSBpbiB0aGUgU0RLLgorICA8L3A+Cis8L25vc2NyaXB0PgorCis8dGFibGUgaWQ9InJlc291cmNlLXRvcGljLXRhYmxlIj4KKyAgPHRyPjwvdHI+Cis8L3RhYmxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8IS0tIAorKGZ1bmN0aW9uKCkgeworICB2YXIgdG9waWNzID0gW107CisgIGZvciAodmFyIHRvcGljIGluIEFORFJPSURfVEFHU1sndG9waWMnXSkgeworICAgIHRvcGljcy5wdXNoKHtuYW1lOnRvcGljLHRpdGxlOkFORFJPSURfVEFHU1sndG9waWMnXVt0b3BpY119KTsKKyAgfQorICB0b3BpY3Muc29ydChmdW5jdGlvbih4LHkpeyByZXR1cm4gKHgudGl0bGUgPCB5LnRpdGxlKSA/IC0xIDogMTsgfSk7CisgIHZhciB0b3BpY1BhcmVudCA9IG51bGw7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9waWNzLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHRvcGljUGFyZW50ID09IG51bGwgfHwgaSAlIDEwID09IDApIHsKKyAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb2x1bW4KKyAgICAgIHRvcGljUGFyZW50ID0gJCgndWwnLCAkKCc8dGQ+PHVsPicpLmFwcGVuZFRvKCcjcmVzb3VyY2UtdG9waWMtdGFibGUgdHInKSk7CisgICAgfQorCisgICAgdG9waWNQYXJlbnQuYXBwZW5kKAorICAgICAgICAkKCc8bGk+JykuYXBwZW5kKAorICAgICAgICAgICQoJzxoMz4nKS5hcHBlbmQoCisgICAgICAgICAgICAkKCc8YT4nKQorICAgICAgICAgICAgICAuYXR0cignaHJlZicsIHRvUm9vdCArICJyZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz0iICsgdG9waWNzW2ldLm5hbWUpCisgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykKKyAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2VuJykKKyAgICAgICAgICAgICAgICAuaHRtbCh0b3BpY3NbaV0udGl0bGUpCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICApCisgICAgICAgICk7CisgIH0KK30pKCk7CisvLy0tPgorPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCmluZGV4IDdjYTM3NDEuLmQ5ZWUzZWMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKQEAgLTE5LDEyICsxOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKioKQEAgLTM1LDkgKzM5LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9OT05FID0gMDsKICAgICAKLSAgICAvLyBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgLy8gRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVCaXRtYXA7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzTXV0YWJsZTsKICAgICBwcml2YXRlIGJ5dGVbXSBtTmluZVBhdGNoQ2h1bms7ICAgLy8gbWF5IGJlIG51bGwKQEAgLTUxLDcgKzU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXRyaXggc1NjYWxlTWF0cml4OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgaW50IHNEZWZhdWx0RGVuc2l0eSA9IC0xOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGxvd3MgdGhlIGFwcCBsYXllciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgKiBkZW5zaXR5IHdoZW4gcnVubmluZyBvbGQgYXBwcy4KQEAgLTc3LDggKzg1LDcgQEAKIAogICAgICAgICBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBKTkkgY29kZS4KICAgICAqLwotICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssCi0gICAgICAgICAgICBpbnQgZGVuc2l0eSkgeworICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssIGludCBkZW5zaXR5KSB7CiAgICAgICAgIGlmIChuYXRpdmVCaXRtYXAgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludGVybmFsIGVycm9yOiBuYXRpdmUgYml0bWFwIGlzIDAiKTsKICAgICAgICAgfQpAQCAtOTAsNiArOTcsMTMgQEAKICAgICAgICAgaWYgKGRlbnNpdHkgPj0gMCkgewogICAgICAgICAgICAgbURlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGZpbmFsaXplcnMgcXVldWUgaXMgbnVsbCwgd2UgYXJlIHJ1bm5pbmcgaW4genlnb3RlIGFuZCB0aGUKKyAgICAgICAgLy8gYml0bWFwIHdpbGwgbmV2ZXIgYmUgcmVjbGFpbWVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJ1biBvdXIgbmF0aXZlCisgICAgICAgIC8vIGRlc3RydWN0b3IKKyAgICAgICAgaWYgKEZpbmFsaXplcnMuZ2V0UXVldWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXcgQml0bWFwRmluYWxpemVyKHRoaXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNiArMTg2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGlvbiBJRCBvZiB0aGlzIGJpdG1hcC4gVGhlIGdlbmVyYXRpb24gSUQgY2hhbmdlcworICAgICAqIHdoZW5ldmVyIHRoZSBiaXRtYXAgaXMgbW9kaWZpZWQuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gZWZmaWNpZW50IHdheSB0bworICAgICAqIGNoZWNrIGlmIGEgYml0bWFwIGhhcyBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBJRCBmb3IgdGhpcyBiaXRtYXAuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdlbmVyYXRpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdlbmVyYXRpb25JZChtTmF0aXZlQml0bWFwKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgbWV0aG9kcyB0aGF0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBiaXRtYXAKICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgogICAgICAqLwpAQCAtOTk5LDEyICsxMDI2LDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNDEsNiArMTA3OCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCAyMzEzZjRjLi4zMjBmYzRkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTY5LDggKzY5LDExIEBACiAgICAgICAgICAqIHRoZSBkZWNvZGVyIHdpbGwgdHJ5IHRvIHBpY2sgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGJhc2VkIG9uIHRoZQogICAgICAgICAgKiBzeXN0ZW0ncyBzY3JlZW4gZGVwdGgsIGFuZCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG9yaWdpbmFsIGltYWdlIHN1Y2gKICAgICAgICAgICogYXMgaWYgaXQgaGFzIHBlci1waXhlbCBhbHBoYSAocmVxdWlyaW5nIGEgY29uZmlnIHRoYXQgYWxzbyBkb2VzKS4KKyAgICAgICAgICogCisgICAgICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGlzIHNldCB0byB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnI0FSR0JfODg4OH0KKyAgICAgICAgICogYnkgZGVmYXVsdC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCaXRtYXAuQ29uZmlnIGluUHJlZmVycmVkQ29uZmlnOworICAgICAgICBwdWJsaWMgQml0bWFwLkNvbmZpZyBpblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJZiBkaXRoZXIgaXMgdHJ1ZSwgdGhlIGRlY29kZXIgd2lsbCBhdHRlbXB0IHRvIGRpdGhlciB0aGUgZGVjb2RlZApAQCAtODEsNyArODQsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBpeGVsIGRlbnNpdHkgdG8gdXNlIGZvciB0aGUgYml0bWFwLiAgVGhpcyB3aWxsIGFsd2F5cyByZXN1bHQKICAgICAgICAgICogaW4gdGhlIHJldHVybmVkIGJpdG1hcCBoYXZpbmcgYSBkZW5zaXR5IHNldCBmb3IgaXQgKHNlZQotICAgICAgICAgKiB7QGxpbmsgQml0bWFwI3NldERlbnNpdHkoaW50KSBCaXRtYXAuc2V0RGVuc2l0eShpbnQpKS4gIEluIGFkZGl0aW9uLAorICAgICAgICAgKiB7QGxpbmsgQml0bWFwI3NldERlbnNpdHkoaW50KSBCaXRtYXAuc2V0RGVuc2l0eShpbnQpKX0uICBJbiBhZGRpdGlvbiwKICAgICAgICAgICogaWYge0BsaW5rICNpblNjYWxlZH0gaXMgc2V0ICh3aGljaCBpdCBpcyBieSBkZWZhdWx0fSBhbmQgdGhpcwogICAgICAgICAgKiBkZW5zaXR5IGRvZXMgbm90IG1hdGNoIHtAbGluayAjaW5UYXJnZXREZW5zaXR5fSwgdGhlbiB0aGUgYml0bWFwCiAgICAgICAgICAqIHdpbGwgYmUgc2NhbGVkIHRvIHRoZSB0YXJnZXQgZGVuc2l0eSBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuCkBAIC01MDcsOSArNTEwLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBpcyBUaGUgaW5wdXQgc3RyZWFtIHRoYXQgaG9sZHMgdGhlIHJhdyBkYXRhIHRvIGJlIGRlY29kZWQgaW50byBhCiAgICAgICogICAgICAgICAgIGJpdG1hcC4KLSAgICAgKiBAcmV0dXJuIFRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgIGRlY29kZWQsIG9yLCBpZiBvcHRzIGlzIG5vbi1udWxsLCBpZiBvcHRzIHJlcXVlc3RlZCBvbmx5IHRoZQotICAgICAqICAgICAgICAgc2l6ZSBiZSByZXR1cm5lZCAoaW4gb3B0cy5vdXRXaWR0aCBhbmQgb3B0cy5vdXRIZWlnaHQpCisgICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGRlY29kZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgZGVjb2RlU3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CiAgICAgICAgIHJldHVybiBkZWNvZGVTdHJlYW0oaXMsIG51bGwsIG51bGwpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCmluZGV4IDYxMmIwYWIuLjRjOTI5NDIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKQEAgLTE2LDExICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKKy8qKgorICogU2hhZGVyIHVzZWQgdG8gZHJhdyBhIGJpdG1hcCBhcyBhIHRleHR1cmUuIFRoZSBiaXRtYXAgY2FuIGJlIHJlcGVhdGVkIG9yCisgKiBtaXJyb3JlZCBieSBzZXR0aW5nIHRoZSB0aWxpbmcgbW9kZS4KKyAqLwogcHVibGljIGNsYXNzIEJpdG1hcFNoYWRlciBleHRlbmRzIFNoYWRlciB7Ci0KLSAgICAvLyB3ZSBob2xkIG9uIGp1c3QgZm9yIHRoZSBHQywgc2luY2Ugb3VyIG5hdGl2ZSBjb3VudGVycGFydCBpcyB1c2luZyBpdAotICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXA7Ci0KICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgogICAgICAqCkBAIC0yOSwxMyArMjksMTMgQEAKICAgICAgKiBAcGFyYW0gdGlsZVkgICAgICAgICAgICAgVGhlIHRpbGluZyBtb2RlIGZvciB5IHRvIGRyYXcgdGhlIGJpdG1hcCBpbi4KICAgICAgKi8KICAgICBwdWJsaWMgQml0bWFwU2hhZGVyKEJpdG1hcCBiaXRtYXAsIFRpbGVNb2RlIHRpbGVYLCBUaWxlTW9kZSB0aWxlWSkgewotICAgICAgICBtQml0bWFwID0gYml0bWFwOwotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYml0bWFwLm5pKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlWC5uYXRpdmVJbnQsIHRpbGVZLm5hdGl2ZUludCk7CisgICAgICAgIGZpbmFsIGludCBiID0gYml0bWFwLm5pKCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZShiLCB0aWxlWC5uYXRpdmVJbnQsIHRpbGVZLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlKG5hdGl2ZV9pbnN0YW5jZSwgYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7ICAgIAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLCBpbnQgc2hhZGVyVGlsZU1vZGVYLAorICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX2JpdG1hcCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVgsIGludCBzaGFkZXJUaWxlTW9kZVkpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggNzZjZGU3My4uMzZhOGU1NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQpAQCAtMTYsMTEgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKIApAQCAtNDMsMjIgKzQyLDM5IEBACiAgICAgICAgIGZvciBib3RoIHRvIGJlIG51bGwuCiAgICAgKi8KICAgICBwcml2YXRlIEJpdG1hcCAgbUJpdG1hcDsgICAgLy8gaWYgbm90IG51bGwsIG1HTCBtdXN0IGJlIG51bGwKLSAgICBwcml2YXRlIEdMICAgICAgbUdMOyAgICAgICAgLy8gaWYgbm90IG51bGwsIG1CaXRtYXAgbXVzdCBiZSBudWxsCiAgICAgCiAgICAgLy8gb3B0aW9uYWwgZmllbGQgc2V0IGJ5IHRoZSBjYWxsZXIKLSAgICBwcml2YXRlIERyYXdGaWx0ZXIgIG1EcmF3RmlsdGVyOworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRHJhd0ZpbHRlcjsKIAotICAgIC8vIFBhY2thZ2Utc2NvcGVkIGZvciBxdWljayBhY2Nlc3MuCi0gICAgLypwYWNrYWdlKi8gaW50IG1EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbURlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOwogCi0gICAgLy8gVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBjb21wYXRpYmlsaXR5IHNjYWxpbmcgaXMgaW4gZWZmZWN0LgotICAgIHByaXZhdGUgaW50IG1TY3JlZW5EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGRldGVybWluZSB3aGVuIGNvbXBhdGliaWxpdHkgc2NhbGluZyBpcyBpbiBlZmZlY3QuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1TY3JlZW5EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKICAgICAKICAgICAvLyBVc2VkIGJ5IG5hdGl2ZSBjb2RlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogICAgIHByaXZhdGUgaW50ICAgICAgICAgbVN1cmZhY2VGb3JtYXQ7CiAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisgICAgCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGVtcHR5IHJhc3RlciBjYW52YXMuIFVzZSBzZXRCaXRtYXAoKSB0byBzcGVjaWZ5IGEgYml0bWFwIHRvCiAgICAgICogZHJhdyBpbnRvLiAgVGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgaXMge0BsaW5rIEJpdG1hcCNERU5TSVRZX05PTkV9OwogICAgICAqIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgcmVwbGFjZWQgd2hlbiBhIHRhcmdldCBiaXRtYXAgaXMgc2V0IGZvciB0aGUKQEAgLTg5LDQ3ICsxMDUsMzcgQEAKICAgICAgICAgbURlbnNpdHkgPSBiaXRtYXAubURlbnNpdHk7CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIENhbnZhcyhpbnQgbmF0aXZlQ2FudmFzKSB7CisgICAgQ2FudmFzKGludCBuYXRpdmVDYW52YXMpIHsKICAgICAgICAgaWYgKG5hdGl2ZUNhbnZhcyA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgbU5hdGl2ZUNhbnZhcyA9IG5hdGl2ZUNhbnZhczsKICAgICAgICAgbURlbnNpdHkgPSBCaXRtYXAuZ2V0RGVmYXVsdERlbnNpdHkoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBjYW52YXMgd2l0aCB0aGUgc3BlY2lmaWVkIGdsIGNvbnRleHQuIEFsbCBkcmF3aW5nIHRocm91Z2gKLSAgICAgKiB0aGlzIGNhbnZhcyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gT3BlbkdMLiBOb3RlOiBzb21lIGZlYXR1cmVzIG1heSBub3QKLSAgICAgKiBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBtb2RlIChlLmcuIHNvbWUgR0wgaW1wbGVtZW50YXRpb25zIG1heSBub3Qgc3VwcG9ydAotICAgICAqIGFudGlhbGlhc2luZyBvciBjZXJ0YWluIGVmZmVjdHMgbGlrZSBDb2xvck1hdHJpeCBvciBjZXJ0YWluIFhmZXJtb2RlcykuCi0gICAgICogSG93ZXZlciwgbm8gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGluIHRob3NlIGNhc2VzLgorICAgICAqIFJldHVybnMgbnVsbC4KICAgICAgKiAKLSAgICAgKiA8cD5UaGUgaW5pdGlhbCB0YXJnZXQgZGVuc2l0eSBvZiB0aGUgY2FudmFzIGlzIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsCi0gICAgICogZGVuc2l0eSBvZiBiaXRtYXBzIGFzIHBlciB7QGxpbmsgQml0bWFwI2dldERlbnNpdHkoKSBCaXRtYXAuZ2V0RGVuc2l0eSgpfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCi0gICAgcHVibGljIENhbnZhcyhHTCBnbCkgewotICAgICAgICBtTmF0aXZlQ2FudmFzID0gaW5pdEdMKCk7Ci0gICAgICAgIG1HTCA9IGdsOwotICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIEdMIGdldEdMKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEdMIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYW52YXMsIG9yIG51bGwgaWYgaXQgaXMgbm90Ci0gICAgICogYmFja2VkIGJ5IEdMLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgQ2FudmFzIHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgd2hhdCB0eXBlIG9mIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorICAgICAqIG1heSBvciBtYXkgbm90IGJlIHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGRyYXdpbmcgb3BlcmF0aW9ucyBhcmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIEdMIGdldEdMKCkgewotICAgICAgICByZXR1cm4gbUdMOworICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgdG8gZnJlZSB1cCBPcGVuR0wgcmVzb3VyY2VzIHRoYXQgbWF5IGJlIGNhY2hlZCBvciBhbGxvY2F0ZWQKLSAgICAgKiBvbiBiZWhhbGYgb2YgdGhlIENhbnZhcy4gQW55IHN1YnNlcXVlbnQgZHJhd2luZyB3aXRoIGEgR0wtYmFja2VkIENhbnZhcwotICAgICAqIHdpbGwgaGF2ZSB0byByZWNyZWF0ZSB0aG9zZSByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZyZWVHbENhY2hlcygpIHsKLSAgICAgICAgZnJlZUNhY2hlcygpOwotICAgIH0KLSAgICAgICAgCisKICAgICAvKioKICAgICAgKiBTcGVjaWZ5IGEgYml0bWFwIGZvciB0aGUgY2FudmFzIHRvIGRyYXcgaW50by4gIEFzIGEgc2lkZS1lZmZlY3QsIGFsc28KICAgICAgKiB1cGRhdGVzIHRoZSBjYW52YXMncyB0YXJnZXQgZGVuc2l0eSB0byBtYXRjaCB0aGF0IG9mIHRoZSBiaXRtYXAuCkBAIC0xNDMsNyArMTQ5LDcgQEAKICAgICAgICAgaWYgKCFiaXRtYXAuaXNNdXRhYmxlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUdMICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGEgYml0bWFwIGRldmljZSBvbiBhIEdMIGNhbnZhcyIpOwogICAgICAgICB9CiAgICAgICAgIHRocm93SWZSZWN5Y2xlZChiaXRtYXApOwpAQCAtMTU3LDEzICsxNjMsMTIgQEAKICAgICAgKiBTZXQgdGhlIHZpZXdwb3J0IGRpbWVuc2lvbnMgaWYgdGhpcyBjYW52YXMgaXMgR0wgYmFzZWQuIElmIGl0IGlzIG5vdCwKICAgICAgKiB0aGlzIG1ldGhvZCBpcyBpZ25vcmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqCi0gICAgICogIEBwYXJhbSB3aWR0aCAgICBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0Ci0gICAgICogIEBwYXJhbSBoZWlnaHQgICBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0CisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydAorICAgICAqIAorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtR0wgIT0gbnVsbCkgewotICAgICAgICAgICAgbmF0aXZlU2V0Vmlld3BvcnQobU5hdGl2ZUNhbnZhcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3Nyw4ICszODIsOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHN4IFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gWAogICAgICAqIEBwYXJhbSBzeSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIFkKLSAgICAgKiBAcGFyYW0gcHggVGhlIHgtY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSByb3RhdGlvbikKLSAgICAgKiBAcGFyYW0gcHkgVGhlIHktY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSByb3RhdGlvbikKKyAgICAgKiBAcGFyYW0gcHggVGhlIHgtY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSBzY2FsZSkKKyAgICAgKiBAcGFyYW0gcHkgVGhlIHktY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSBzY2FsZSkKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHB4LCBmbG9hdCBweSkgewogICAgICAgICB0cmFuc2xhdGUocHgsIHB5KTsKQEAgLTYyMSw3ICs2MjYsMTEgQEAKICAgICAgICAgRWRnZVR5cGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIAogICAgIC8qKgpAQCAtOTU4LDYgKzk2NywyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgYml0bWFwIGFzIGFuIE4tcGF0Y2ggKG1vc3Qgb2Z0ZW4sIGEgOS1wYXRjaGVzLikKKyAgICAgKgorICAgICAqIE5vdGU6IE9ubHkgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlIGFjY2VsZXJhdGVkIGNhbnZhcyBhdCB0aGUgbW9tZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGJpdG1hcCBUaGUgYml0bWFwIHRvIGRyYXcgYXMgYW4gTi1wYXRjaAorICAgICAqIEBwYXJhbSBjaHVua3MgVGhlIHBhdGNoZXMgaW5mb3JtYXRpb24gKG1hdGNoZXMgdGhlIG5hdGl2ZSBzdHJ1Y3QgUmVzX3BuZ185cGF0Y2gpCisgICAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZHJhdyB0aGUgYml0bWFwIHdpdGguIG1heSBiZSBudWxsCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgIH0gICAgCisgICAgCisgICAgLyoqCiAgICAgICogRHJhdyB0aGUgc3BlY2lmaWVkIGJpdG1hcCwgd2l0aCBpdHMgdG9wL2xlZnQgY29ybmVyIGF0ICh4LHkpLCB1c2luZwogICAgICAqIHRoZSBzcGVjaWZpZWQgcGFpbnQsIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IG1hdHJpeC4KICAgICAgKiAKQEAgLTEyNDYsOCArMTI3MCw4IEBACiAgICAgICAgICAgICAodGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjU5LDcgKzEyODMsMTAgQEAKICAgICAgKiBAcGFyYW0geSAgICAgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZXh0IGJlaW5nIGRyYXduCiAgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB1c2VkIGZvciB0aGUgdGV4dCAoZS5nLiBjb2xvciwgc2l6ZSwgc3R5bGUpCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCk7CisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRHJhdyB0aGUgdGV4dCwgd2l0aCBvcmlnaW4gYXQgKHgseSksIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFpbnQuCkBAIC0xMjc3LDggKzEzMDQsOCBAQAogICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyOTksMTYgKzEzMjYsMTA4IEBACiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CiAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CiAgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgewogICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0KHRoaXMsIHN0YXJ0LCBlbmQsIHgsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICAgICAgZHJhd1RleHQoYnVmLCAwLCBlbmQgLSBzdGFydCwgeCwgeSwgcGFpbnQpOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIAorICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvdW50IHRoZSBjb3VudCBvZiBjaGFycyB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gY29udGV4dEluZGV4IHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCBmb3Igc2hhcGluZy4gIE11c3QgYmUKKyAgICAgKiAgICAgICAgIG5vIGdyZWF0ZXIgdGhhbiBpbmRleC4KKyAgICAgKiBAcGFyYW0gY29udGV4dENvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgY29udGV4dCBmb3Igc2hhcGluZy4KKyAgICAgKiAgICAgICAgIENvbnRleEluZGV4ICsgY29udGV4dENvdW50IG11c3QgYmUgbm8gbGVzcyB0aGFuIGluZGV4CisgICAgICogICAgICAgICArIGNvdW50LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIHtAbGluayAjRElSRUNUSU9OX0xUUn0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayAjRElSRUNUSU9OX1JUTH0uCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwKKyAgICAgICAgICAgIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZXh0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYWludCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbmRleCB8IGNvdW50IHwgdGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpciAhPSBESVJFQ1RJT05fTFRSICYmIGRpciAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpcjogIiArIGRpcik7CisgICAgICAgIH0KKworICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCB4LCB5LCBkaXIsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgcnVuIG9mIGFsbCBMVFIgb3IgYWxsIFJUTCB0ZXh0LCB3aXRoIHNoYXBpbmcuIFRoaXMgZG9lcyBub3QgcnVuCisgICAgICogYmlkaSBvbiB0aGUgcHJvdmlkZWQgdGV4dCwgYnV0IHJlbmRlcnMgaXQgYXMgYSB1bmlmb3JtIHJpZ2h0LXRvLWxlZnQgb3IKKyAgICAgKiBsZWZ0LXRvLXJpZ2h0IHJ1biwgYXMgaW5kaWNhdGVkIGJ5IGRpci4gQWxpZ25tZW50IG9mIHRoZSB0ZXh0IGlzIGFzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgUGFpbnQncyBUZXh0QWxpZ24gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBiZWZvcmUgdGhpcyBwb3NpdGlvbgorICAgICAqICAgICAgICAgICAgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVuZGVyLiBEYXRhIGF0IG9yIGFmdGVyIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHBvc2l0aW9uIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBydW4gZGlyZWN0aW9uLCBlaXRoZXIgMCBmb3IgTFRSIG9yIDEgZm9yIFJUTC4KKyAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmbGFncyA9IGRpciA9PSAwID8gMCA6IDE7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgdGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dFJ1bih0aGlzLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzY4LDcgKzE0ODcsNyBAQAogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLm5pKCksIGhPZmZzZXQsIHZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzODgsNyArMTUwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgUGFpbnQgcGFpbnQpIHsKICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRPblBhdGgobU5hdGl2ZUNhbnZhcywgdGV4dCwgcGF0aC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsIHZPZmZzZXQsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwgdk9mZnNldCwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDMyLDI3ICsxNTUyLDI4IEBACiAgICAgICAgIHJlc3RvcmUoKTsKICAgICB9CiAgICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiBiZWZvcmUgc2V0dGluZyBtTmF0aXZlQ2FudmFzLCB0aGUgbmF0aXZlIGZpbmFsaXplcgotICAgICAgICAvLyBtdXN0IG5vdCBiZSBpbnZva2VkLgotICAgICAgICBpZiAobU5hdGl2ZUNhbnZhcyAhPSAwKSB7Ci0gICAgICAgICAgICBmaW5hbGl6ZXIobU5hdGl2ZUNhbnZhcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiBiZWZvcmUgc2V0dGluZyBtTmF0aXZlQ2FudmFzLAorICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBmaW5hbGl6ZXIgbXVzdCBub3QgYmUgaW52b2tlZC4KKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2FudmFzICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbGl6ZXIobU5hdGl2ZUNhbnZhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGcmVlIHVwIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlIGZyb20gcHJpdmF0ZSBjYWNoZXMgKGUuZy4gZm9udHMsCi0gICAgICogaW1hZ2VzKQorICAgICAqIEZyZWUgdXAgYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUgZnJvbSBwcml2YXRlIGNhY2hlcyAoZS5nLiBmb250cywgaW1hZ2VzKQogICAgICAqCi0gICAgICogQGhpZGUgLSBmb3Igbm93CisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGZyZWVDYWNoZXMoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdFJhc3RlcihpbnQgbmF0aXZlQml0bWFwT3JaZXJvKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXRHTCgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRCaXRtYXAoaW50IG5hdGl2ZUNhbnZhcywgaW50IGJpdG1hcCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0Vmlld3BvcnQoaW50IG5DYW52YXMsIGludCB3LCBpbnQgaCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfc2F2ZUxheWVyKGludCBuYXRpdmVDYW52YXMsIFJlY3RGIGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhaW50LCBpbnQgbGF5ZXJGbGFncyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfc2F2ZUxheWVyKGludCBuYXRpdmVDYW52YXMsIGZsb2F0IGwsCkBAIC0xNTU1LDEwICsxNjc2LDE5IEBACiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0KGludCBuYXRpdmVDYW52YXMsIGNoYXJbXSB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRSdW4oaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIGNoYXJbXSB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1Bvc1RleHQoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBmbG9hdFtdIHBvcywKQEAgLTE1NzAsMTEgKzE3MDAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRPblBhdGgoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1BpY3R1cmUoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hdGl2ZVBpY3R1cmUpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlQ2FudmFzKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKaW5kZXggNzZmMmM3Zi4uZTVjZjgzMCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKQEAgLTIzLDEyICsyMywyMCBAQAogCiAKIHB1YmxpYyBjbGFzcyBDb2xvckZpbHRlciB7CisgICAgaW50IG5hdGl2ZV9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVDb2xvckZpbHRlcjsKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZUNvbG9yRmlsdGVyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlKTsKLQotICAgIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UsIGludCBuYXRpdmVDb2xvckZpbHRlcik7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQppbmRleCA1ZDczY2ZmLi4yNDVjNjE1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKQEAgLTI1LDcgKzI1LDkgQEAKICAgICAgKiAgICAgICAgICAgICAgIGlzIGNvbnN0cnVjdGVkIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgZmlsdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKENvbG9yTWF0cml4IG1hdHJpeCkgewotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihtYXRyaXguZ2V0QXJyYXkoKSk7CisgICAgICAgIGZpbmFsIGZsb2F0W10gY29sb3JNYXRyaXggPSBtYXRyaXguZ2V0QXJyYXkoKTsKKyAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoY29sb3JNYXRyaXgpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5Db2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MCw3ICs0Miw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoYXJyYXkpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5Db2xvck1hdHJpeEZpbHRlcihhcnJheSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihmbG9hdFtdIGFycmF5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5Db2xvck1hdHJpeEZpbHRlcihmbG9hdFtdIGFycmF5KTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCmluZGV4IGEwNmQzMGIuLmU4ODIxMWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQpAQCAtMjAsNiArMjAsMTQgQEAKICAgICBhbiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5YZmVybW9kZX0gc3ViY2xhc3MuCiAqLwogcHVibGljIGNsYXNzIENvbXBvc2VTaGFkZXIgZXh0ZW5kcyBTaGFkZXIgeworICAgIC8qKgorICAgICAqIEhvbGQgb250byB0aGUgc2hhZGVycyB0byBhdm9pZCBHQy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBTaGFkZXIgbVNoYWRlckE7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgU2hhZGVyIG1TaGFkZXJCOworCiAgICAgLyoqIENyZWF0ZSBhIG5ldyBjb21wb3NlIHNoYWRlciwgZ2l2ZW4gc2hhZGVycyBBLCBCLCBhbmQgYSBjb21iaW5pbmcgbW9kZS4KICAgICAgICAgV2hlbiB0aGUgbW9kZSBpcyBhcHBsaWVkLCBpdCB3aWxsIGJlIGdpdmVuIHRoZSByZXN1bHQgZnJvbSBzaGFkZXIgQSBhcyBpdHMKICAgICAgICAgImRzdCIsIGFuZCB0aGUgcmVzdWx0IG9mIGZyb20gc2hhZGVyIEIgYXMgaXRzICJzcmMiLgpAQCAtMjksOCArMzcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG51bGwsIHRoZW4gU1JDX09WRVIgaXMgYXNzdW1lZC4KICAgICAqLwogICAgIHB1YmxpYyBDb21wb3NlU2hhZGVyKFNoYWRlciBzaGFkZXJBLCBTaGFkZXIgc2hhZGVyQiwgWGZlcm1vZGUgbW9kZSkgeworICAgICAgICBtU2hhZGVyQSA9IHNoYWRlckE7CisgICAgICAgIG1TaGFkZXJCID0gc2hhZGVyQjsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMShzaGFkZXJBLm5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQi5uYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgIT0gbnVsbCkgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICAgICAgICAgIChtb2RlICE9IG51bGwpID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgaWYgKG1vZGUgaW5zdGFuY2VvZiBQb3J0ZXJEdWZmWGZlcm1vZGUpIHsKKyAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZSBwZE1vZGUgPSAoKFBvcnRlckR1ZmZYZmVybW9kZSkgbW9kZSkubW9kZTsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBwZE1vZGUgIT0gbnVsbCA/IHBkTW9kZS5uYXRpdmVJbnQgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBtb2RlICE9IG51bGwgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhIG5ldyBjb21wb3NlIHNoYWRlciwgZ2l2ZW4gc2hhZGVycyBBLCBCLCBhbmQgYSBjb21iaW5pbmcgUG9ydGVyRHVmZiBtb2RlLgpAQCAtNDEsMTEgKzU5LDIwIEBACiAgICAgICAgIEBwYXJhbSBtb2RlICAgICBUaGUgUG9ydGVyRHVmZiBtb2RlIHRoYXQgY29tYmluZXMgdGhlIGNvbG9ycyBmcm9tIHRoZSB0d28gc2hhZGVycy4KICAgICAqLwogICAgIHB1YmxpYyBDb21wb3NlU2hhZGVyKFNoYWRlciBzaGFkZXJBLCBTaGFkZXIgc2hhZGVyQiwgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgbVNoYWRlckEgPSBzaGFkZXJBOworICAgICAgICBtU2hhZGVyQiA9IHNoYWRlckI7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoc2hhZGVyQS5uYXRpdmVfaW5zdGFuY2UsIHNoYWRlckIubmF0aXZlX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUubmF0aXZlSW50KTsKKyAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsIGludCBuYXRpdmVfbW9kZSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLCBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwKKyAgICAgICAgICAgIGludCBuYXRpdmVfbW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLAorICAgICAgICAgICAgaW50IHBvcnRlckR1ZmZNb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXJBLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyQiwgaW50IG5hdGl2ZV9tb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXJBLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyQiwgaW50IHBvcnRlckR1ZmZNb2RlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKaW5kZXggNTU2MjM4OS4uNzE1Y2U4NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCkBAIC0zMCw3ICszMCw5IEBACiAgICAgICovCiAgICAgcHVibGljIExpZ2h0aW5nQ29sb3JGaWx0ZXIoaW50IG11bCwgaW50IGFkZCkgewogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5DcmVhdGVMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoaW50IG11bCwgaW50IGFkZCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoaW50IG11bCwgaW50IGFkZCk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCmluZGV4IGUzZGIxMDUuLjgyZWQxOTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKIHB1YmxpYyBjbGFzcyBMaW5lYXJHcmFkaWVudCBleHRlbmRzIFNoYWRlciB7Ci0KIAkvKioJQ3JlYXRlIGEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQgYWxvbmcgYSBsaW5lLgogICAgICAgICBAcGFyYW0geDAgICAgICAgICAgIFRoZSB4LWNvb3JkaW5hdGUgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ3JhZGllbnQgbGluZQogICAgICAgICBAcGFyYW0geTAgICAgICAgICAgIFRoZSB5LWNvb3JkaW5hdGUgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ3JhZGllbnQgbGluZQpAQCAtMzgsNiArMzcsOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29sb3IgYW5kIHBvc2l0aW9uIGFycmF5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoeDAsIHkwLCB4MSwgeTEsIGNvbG9ycywgcG9zaXRpb25zLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHgwLCB5MCwgeDEsIHkxLCBjb2xvcnMsIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICB0aWxlLm5hdGl2ZUludCk7CiAgICAgfQogCiAJLyoqCUNyZWF0ZSBhIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50IGFsb25nIGEgbGluZS4KQEAgLTUyLDEyICs1MywxNiBAQAogCXB1YmxpYyBMaW5lYXJHcmFkaWVudChmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgVGlsZU1vZGUgdGlsZSkgewogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUyKHgwLCB5MCwgeDEsIHkxLCBjb2xvcjAsIGNvbG9yMSwgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCB4MCwgeTAsIHgxLCB5MSwgY29sb3IwLCBjb2xvcjEsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAotCi0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOwotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKwlwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisJcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKaW5kZXggZjU0OTkwMC4uYjMzNjk5NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQpAQCAtMzcsNyArMzcsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMSA9IDc7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzIgPSA4OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKaW5kZXggODhkZmQ2Ny4uZGY2ZmViYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQpAQCAtMzUsNiArMzUsMTIgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bms7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZworICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAKICAgICAvKiogCiAgICAgICogQ3JlYXRlIGEgZHJhd2FibGUgcHJvamVjdGlvbiBmcm9tIGEgYml0bWFwIHRvIG5pbmUgcGF0Y2hlcy4KICAgICAgKgpAQCAtNzQsMTAgKzgwLDE0IEBACiAgICAgICogQHBhcmFtIGxvY2F0aW9uICBXaGVyZSB0byBkcmF3IHRoZSBiaXRtYXAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0RiBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGNoKG1CaXRtYXAsIG1DaHVuaywgbG9jYXRpb24sIG51bGwpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKiAKQEAgLTg3LDEwICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiAKQEAgLTEwMSw5ICsxMTYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFpbnQgICAgIFRoZSBQYWludCB0byBkcmF3IHRocm91Z2guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0IGxvY2F0aW9uLCBQYWludCBwYWludCkgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCi0gICAgICAgICAgICAgICAgY2FudmFzLm1EZW5zaXR5LCBtQml0bWFwLm1EZW5zaXR5KTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLm1OYXRpdmVDYW52YXMsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBwYWludCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMywxMSArMTUzLDYgQEAKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoYnl0ZVtdIGNodW5rKTsKIAotICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOwotICAgIHByaXZhdGUgUGFpbnQgICAgICAgIG1QYWludDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtU3JjTmFtZTsgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCB2YWxpZGF0ZU5pbmVQYXRjaENodW5rKGludCBiaXRtYXAsIGJ5dGVbXSBjaHVuayk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdyhpbnQgY2FudmFzX2luc3RhbmNlLCBSZWN0RiBsb2MsIGludCBiaXRtYXBfaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYywgaW50IHBhaW50X2luc3RhbmNlX29yX251bGwsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjYzNDljYjMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDEwIEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICBtSGFzQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1Db21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUludkNvbXBhdFNjYWxpbmc7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgIGludCAgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICs4NCwxMTYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QQUlOVF9GTEFHUyA9IERFVl9LRVJOX1RFWFRfRkxBRzsKIAogICAgIC8qKgotICAgICAqIFRoZSBTdHlsZSBzcGVjaWZpZXMgaWYgdGhlIHByaW1pdGl2ZSBiZWluZyBkcmF3biBpcyBmaWxsZWQsCi0gICAgICogc3Ryb2tlZCwgb3IgYm90aCAoaW4gdGhlIHNhbWUgY29sb3IpLiBUaGUgZGVmYXVsdCBpcyBGSUxMLgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgTFRSIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0xUUiA9IDB4MDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgUlRMIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX1JUTCA9IDB4MTsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBkZXRlY3QgcGFyYWdyYXBoIGRpcmVjdGlvbiB2aWEgaGV1cmlzdGljcywgZGVmYXVsdGluZyB0bworICAgICAqIExUUi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfREVGQVVMVF9MVFIgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBSVEwuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfUlRMID0gMHgzOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIG92ZXJyaWRlIGRpcmVjdGlvbiB0byBhbGwgTFRSIChpZ25vcmUgYmlkaSkuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0ZPUkNFX0xUUiA9IDB4NDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIFJUTCAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9SVEwgPSAweDU7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIEJpZGkgZmxhZyB2YWx1ZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX01BWF9GTEFHX1ZBTFVFID0gQklESV9GT1JDRV9SVEw7CisKKyAgICAvKioKKyAgICAgKiBNYXNrIGZvciBiaWRpIGZsYWdzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJRElfRkxBR19NQVNLID0gMHg3OworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgbGVmdC10by1yaWdodCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0xUUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBnZXRUZXh0UnVuQWR2YW5jZXMgaW5kaWNhdGluZyByaWdodC10by1sZWZ0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUlRMID0gMTsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYWZ0ZXIKKyAgICAgKiBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BRlRFUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGFmdGVyCisgICAgICogdGhlIG9mZnNldCBvciB0aGUgbGltaXQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0FGVEVSID0gMTsKKworICAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0JFRk9SRSA9IDI7CisKKyAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYXQgb3IgYmVmb3JlCisgICAgICogb2Zmc2V0IG9yIHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVRfT1JfQkVGT1JFID0gMzsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byByZXR1cm4gb2Zmc2V0IGlmIHRoZSBjdXJzb3IgYXQgb2Zmc2V0CisgICAgICogaXMgdmFsaWQsIG9yIC0xIGlmIGl0IGlzbid0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUID0gNDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gY3Vyc29yIG9wdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX09QVF9NQVhfVkFMVUUgPSBDVVJTT1JfQVQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLCBzdHJva2VkLCBvcgorICAgICAqIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBTdHlsZSB7CiAgICAgICAgIC8qKgpAQCAtOTMsNyArMjA5LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdlb21ldHJ5IGFuZCB0ZXh0IGRyYXduIHdpdGggdGhpcyBzdHlsZSB3aWxsIGJlIGJvdGggZmlsbGVkIGFuZAogICAgICAgICAgKiBzdHJva2VkIGF0IHRoZSBzYW1lIHRpbWUsIHJlc3BlY3RpbmcgdGhlIHN0cm9rZS1yZWxhdGVkIGZpZWxkcyBvbgotICAgICAgICAgKiB0aGUgcGFpbnQuCisgICAgICAgICAqIHRoZSBwYWludC4gVGhpcyBtb2RlIGNhbiBnaXZlIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZiB0aGUgZ2VvbWV0cnkKKyAgICAgICAgICogaXMgb3JpZW50ZWQgY291bnRlci1jbG9ja3dpc2UuIFRoaXMgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8KKyAgICAgICAgICogZWl0aGVyIEZJTEwgb3IgU1RST0tFLgogICAgICAgICAgKi8KICAgICAgICAgRklMTF9BTkRfU1RST0tFICgyKTsKICAgICAgICAgCkBAIC0yMDgsNiArMzI2LDcgQEAKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBwYWludC5tSGFzQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBwYWludC5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSBwYWludC5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgbUJpZGlGbGFncyA9IHBhaW50Lm1CaWRpRmxhZ3M7CiAgICAgfQogCiAgICAgLyoqIFJlc3RvcmVzIHRoZSBwYWludCB0byBpdHMgZGVmYXVsdCBzZXR0aW5ncy4gKi8KQEAgLTIxNiw2ICszMzUsNyBAQAogICAgICAgICBzZXRGbGFncyhERUZBVUxUX1BBSU5UX0ZMQUdTKTsKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBmYWxzZTsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBtSW52Q29tcGF0U2NhbGluZyA9IDE7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTIzOCw2ICszNTgsNyBAQAogICAgICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBzcmMubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtQ29tcGF0U2NhbGluZyAgICA9IHNyYy5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gc3JjLm1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgbUJpZGlGbGFncyAgICAgID0gc3JjLm1CaWRpRmxhZ3M7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MiwxMCArMzczLDMzIEBACiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IDEuMGYvZmFjdG9yOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCaWRpRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtQmlkaUZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWRpRmxhZ3MoaW50IGZsYWdzKSB7CisgICAgICAgIC8vIG9ubHkgZmxhZyB2YWx1ZSBpcyB0aGUgMy1iaXQgQklESSBjb250cm9sIHNldHRpbmcKKyAgICAgICAgZmxhZ3MgJj0gQklESV9GTEFHX01BU0s7CisgICAgICAgIGlmIChmbGFncyA+IEJJRElfTUFYX0ZMQUdfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYmlkaSBmbGFnOiAiICsgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIG1CaWRpRmxhZ3MgPSBmbGFnczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhaW50J3MgZmxhZ3MuIFVzZSB0aGUgRmxhZyBlbnVtIHRvIHRlc3QgZmxhZyB2YWx1ZXMuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYWludCdzIGZsYWdzIChzZWUgZW51bXMgZW5kaW5nIGluIF9GbGFnIGZvciBiaXQgbWFza3MpCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0RmxhZ3MoKTsKQEAgLTc4NywxNSArOTMxLDE0IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIFRlbXBvcmFyeSBBUEkgdG8gZXhwb3NlIGxheWVyIGRyYXdpbmcuIFRoaXMgZHJhd3MgYSBzaGFkb3cgbGF5ZXIgYmVsb3cKLSAgICAgKiB0aGUgbWFpbiBsYXllciwgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgY29sb3IsIGFuZCBibHVyIHJhZGl1cy4KLSAgICAgKiBJZiByYWRpdXMgaXMgMCwgdGhlbiB0aGUgc2hhZG93IGxheWVyIGlzIHJlbW92ZWQuCisgICAgICogVGhpcyBkcmF3cyBhIHNoYWRvdyBsYXllciBiZWxvdyB0aGUgbWFpbiBsYXllciwgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogb2Zmc2V0IGFuZCBjb2xvciwgYW5kIGJsdXIgcmFkaXVzLiBJZiByYWRpdXMgaXMgMCwgdGhlbiB0aGUgc2hhZG93CisgICAgICogbGF5ZXIgaXMgcmVtb3ZlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIHZvaWQgc2V0U2hhZG93TGF5ZXIoZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcik7CisgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOwogCiAgICAgLyoqCi0gICAgICogVGVtcG9yYXJ5IEFQSSB0byBjbGVhciB0aGUgc2hhZG93IGxheWVyLgorICAgICAqIENsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJTaGFkb3dMYXllcigpIHsKICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7CkBAIC0xMjMyLDEwICsxMzc1LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgCVRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgIAlpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldFRleHRXaWR0aHMoYnVmLCAwLCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKLSAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTEyODIsNiArMTQyNSwyODQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBvdmVybG9hZCB0aGF0IHRha2VzIGEgY2hhciBhcnJheSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhjaGFyW10gY2hhcnMsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLAorICAgICAgICAgICAgaW50IGFkdmFuY2VzSW5kZXgpIHsKKworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCBjb250ZXh0SW5kZXggfCBjb250ZXh0Q291bnQgfCBhZHZhbmNlc0luZGV4CisgICAgICAgICAgICAgICAgfCAoaW5kZXggLSBjb250ZXh0SW5kZXgpCisgICAgICAgICAgICAgICAgfCAoKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkgLSAoaW5kZXggKyBjb3VudCkpCisgICAgICAgICAgICAgICAgfCAoY2hhcnMubGVuZ3RoIC0gKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkpCisgICAgICAgICAgICAgICAgfCAoYWR2YW5jZXMgPT0gbnVsbCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZXMubGVuZ3RoIC0gKGFkdmFuY2VzSW5kZXggKyBjb3VudCkpKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAhPSBESVJFQ1RJT05fTFRSICYmIGZsYWdzICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmxhZ3MgdmFsdWU6ICIgKyBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNDb21wYXRTY2FsaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHJlcyA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCBjaGFycywgaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgY291bnQ7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIG5vdCBzaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBhCisgICAgICogU3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGZsb2F0W10sIGludCkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkFkdmFuY2VzKChTdHJpbmcpIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXModGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZ2V0VGV4dFJ1bkFkdmFuY2VzKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgICAgIGZsb2F0IHJlc3VsdCA9IGdldFRleHRSdW5BZHZhbmNlcyhidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBhZHZhbmNlIHdpZHRoIGZvciB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcnVuCisgICAgICogYmV0d2VlbiBzdGFydCBhbmQgZW5kLCBhbmQgaWYgYWR2YW5jZXMgaXMgbm90IG51bGwsIHRoZSBhZHZhbmNlCisgICAgICogYXNzaWduZWQgdG8gZWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIChqYXZhIGNoYXJzKS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0cmFpbGluZyBzdXJyb2dhdGUgaW4gYSB2YWxpZCBzdXJyb2dhdGUgcGFpciBpcyBhc3NpZ25lZAorICAgICAqIGFuIGFkdmFuY2Ugb2YgMC4gIFRodXMgdGhlIG51bWJlciBvZiByZXR1cm5lZCBhZHZhbmNlcyBpcworICAgICAqIGFsd2F5cyBlcXVhbCB0byBjb3VudCwgbm90IHRvIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjb2RlcG9pbnRzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHJ1bi4KKyAgICAgKgorICAgICAqIDxwPkluIHRoZSBjYXNlIG9mIGNvbmp1bmN0cyBvciBjb21iaW5pbmcgbWFya3MsIHRoZSB0b3RhbAorICAgICAqIGFkdmFuY2UgaXMgYXNzaWduZWQgdG8gdGhlIGZpcnN0IGxvZ2ljYWwgY2hhcmFjdGVyLCBhbmQgdGhlCisgICAgICogZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFzc2lnbmVkIGFuIGFkdmFuY2Ugb2YgMC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZ2VuZXJhdGVzIHRoZSBzdW0gb2YgdGhlIGFkdmFuY2VzIG9mIGdseXBocyBmb3IKKyAgICAgKiBjaGFyYWN0ZXJzIGluIGEgcmVvcmRlcmVkIGNsdXN0ZXIgYXMgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdAorICAgICAqIGxvZ2ljYWwgY2hhcmFjdGVyIGluIHRoZSBjbHVzdGVyLCBhbmQgMCBmb3IgdGhlIHdpZHRocyBvZiBhbGwKKyAgICAgKiBvdGhlciBjaGFyYWN0ZXJzIGluIHRoZSBjbHVzdGVyLiAgSW4gZWZmZWN0LCBzdWNoIGNsdXN0ZXJzIGFyZQorICAgICAqIHRyZWF0ZWQgbGlrZSBjb25qdW5jdHMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2hhcGluZyBib3VuZHMgbGltaXQgdGhlIGFtb3VudCBvZiBjb250ZXh0IGF2YWlsYWJsZQorICAgICAqIG91dHNpZGUgc3RhcnQgYW5kIGVuZCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGFuYWx5c2lzLgorICAgICAqIFRoZXNlIGJvdW5kcyB0eXBpY2FsbHkgcmVmbGVjdCBjaGFuZ2VzIGluIGJpZGkgbGV2ZWwgb3IgZm9udAorICAgICAqIG1ldHJpY3MgYWNyb3NzIHdoaWNoIHNoYXBpbmcgZG9lcyBub3Qgb2NjdXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBpbmRleCBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byB1c2UgZm9yIHNoYXBpbmcgY29udGV4dCwKKyAgICAgKiBtdXN0IGJlIDw9IHN0YXJ0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPj0gZW5kCisgICAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjb250cm9sIHRoZSBhZHZhbmNlcywgZWl0aGVyIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBvciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9CisgICAgICogQHBhcmFtIGFkdmFuY2VzIGFycmF5IHRvIHJlY2VpdmUgdGhlIGFkdmFuY2VzLCBtdXN0IGhhdmUgcm9vbSBmb3IgYWxsIGFkdmFuY2VzLAorICAgICAqIGNhbiBiZSBudWxsIGlmIG9ubHkgdG90YWwgYWR2YW5jZSBpcyBuZWVkZWQKKyAgICAgKiBAcGFyYW0gYWR2YW5jZXNJbmRleCB0aGUgcG9zaXRpb24gaW4gYWR2YW5jZXMgYXQgd2hpY2ggdG8gcHV0IHRoZQorICAgICAqIGFkdmFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcmFjdGVyIGF0IHN0YXJ0CisgICAgICogQHJldHVybiB0aGUgdG90YWwgYWR2YW5jZQorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgYWR2YW5jZXNJbmRleCB8IChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgICAgICB8IChzdGFydCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIGVuZCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCgpIC0gY29udGV4dEVuZCkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSBhZHZhbmNlc0luZGV4IC0gKGVuZCAtIHN0YXJ0KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSk7CisKKyAgICAgICAgaWYgKGFkdmFuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBhZHZhbmNlc0luZGV4LCBlID0gaSArIChlbmQgLSBzdGFydCk7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIGluc2lnbmlmaWNhbnQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCBhbmQgb2Zmc2V0IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGV4dC4KKyAgICAgKiBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGNoYXJbXSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpbnQgY29udGV4dEVuZCA9IGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGg7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGggLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW5ndGgsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkN1cnNvcih0ZXh0LnRvU3RyaW5nKCksIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQ3Vyc29yKAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkN1cnNvcihidWYsIDAsIGNvbnRleHRMZW4sIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKFN0cmluZyB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpZiAoKChjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgb2Zmc2V0IHwgKGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQpCisgICAgICAgICAgICAgICAgfCAob2Zmc2V0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gb2Zmc2V0KQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYXRoIChvdXRsaW5lKSBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0LgogICAgICAqIE5vdGU6IGp1c3QgbGlrZSBDYW52YXMuZHJhd1RleHQsIHRoaXMgd2lsbCByZXNwZWN0IHRoZSBBbGlnbiBzZXR0aW5nIGluCiAgICAgICogdGhlIHBhaW50LgpAQCAtMTI5OSw3ICsxNzIwLDggQEAKICAgICAgICAgaWYgKChpbmRleCB8IGNvdW50KSA8IDAgfHwgaW5kZXggKyBjb3VudCA+IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYXRoLm5pKCkpOworICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCBtQmlkaUZsYWdzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIwLDcgKzE3NDIsOCBAQAogICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQwNCw5ICsxODI3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdFtdIHdpZHRocyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFdpZHRocyhpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMoaW50IG5hdGl2ZV9vYmplY3QsCisgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIGNoYXJbXSB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRMZW5ndGgsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKGludCBuYXRpdmVfb2JqZWN0LCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LCBpbnQgYmlkaUZsYWdzLAogICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldFN0cmluZ0JvdW5kcyhpbnQgbmF0aXZlUGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFJlY3QgYm91bmRzKTsKQEAgLTE0MTQsNCArMTg1MCwzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgUmVjdCBib3VuZHMpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlUGFpbnQpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQppbmRleCAyODE4MjNhLi5jMzQxNmEwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXI7CisKIC8qKgogICogVGhlIFBhdGggY2xhc3MgZW5jYXBzdWxhdGVzIGNvbXBvdW5kIChtdWx0aXBsZSBjb250b3VyKSBnZW9tZXRyaWMgcGF0aHMKICAqIGNvbnNpc3Rpbmcgb2Ygc3RyYWlnaHQgbGluZSBzZWdtZW50cywgcXVhZHJhdGljIGN1cnZlcywgYW5kIGN1YmljIGN1cnZlcy4KQEAgLTI0LDEyICsyNiwyNyBAQAogICogdGV4dCBvbiBhIHBhdGguCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXRoIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZVBhdGg7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnaW9uIHJlY3RzOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGV0ZWN0U2ltcGxlUGF0aHM7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gZW1wdHkgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyBQYXRoKCkgewogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQxKCk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzLDYgKzYwLDcgQEAKICAgICAgICAgICAgIHZhbE5hdGl2ZSA9IHNyYy5tTmF0aXZlUGF0aDsKICAgICAgICAgfQogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQyKHZhbE5hdGl2ZSk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC01MCw2ICs2OCwxMCBAQAogICAgICAqIFRoaXMgZG9lcyBOT1QgY2hhbmdlIHRoZSBmaWxsLXR5cGUgc2V0dGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzICE9IG51bGwpIHJlY3RzLnNldEVtcHR5KCk7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX3Jlc2V0KG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTU4LDYgKzgwLDEwIEBACiAgICAgICoga2VlcHMgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIGZvciBmYXN0ZXIgcmV1c2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmV3aW5kKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTY1LDYgKzkxLDcgQEAKICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChQYXRoIHNyYykgewogICAgICAgICBpZiAodGhpcyAhPSBzcmMpIHsKKyAgICAgICAgICAgIGlzU2ltcGxlUGF0aCA9IHNyYy5pc1NpbXBsZVBhdGg7CiAgICAgICAgICAgICBuYXRpdmVfc2V0KG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYwLDYgKzE4Nyw3IEBACiAgICAgICogQHBhcmFtIGJvdW5kcyBSZXR1cm5zIHRoZSBjb21wdXRlZCBib3VuZHMgb2YgdGhlIHBhdGgncyBjb250cm9sIHBvaW50cy4KICAgICAgKiBAcGFyYW0gZXhhY3QgVGhpcyBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVCb3VuZHMoUmVjdEYgYm91bmRzLCBib29sZWFuIGV4YWN0KSB7CiAgICAgICAgIG5hdGl2ZV9jb21wdXRlQm91bmRzKG1OYXRpdmVQYXRoLCBib3VuZHMpOwogICAgIH0KQEAgLTIzNiw2ICsyNjQsNyBAQAogICAgICAqIEBwYXJhbSB5MiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb24gYSBxdWFkcmF0aWMgY3VydmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWFkVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9xdWFkVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyKTsKICAgICB9CiAKQEAgLTI1NCw2ICsyODMsNyBAQAogICAgICAqICAgICAgICAgICAgdGhpcyBjb250b3VyLCBmb3IgdGhlIGVuZCBwb2ludCBvZiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJRdWFkVG8oZmxvYXQgZHgxLCBmbG9hdCBkeTEsIGZsb2F0IGR4MiwgZmxvYXQgZHkyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfclF1YWRUbyhtTmF0aXZlUGF0aCwgZHgxLCBkeTEsIGR4MiwgZHkyKTsKICAgICB9CiAKQEAgLTI3MSw2ICszMDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI4MSw2ICszMTIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJDdWJpY1RvKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3JDdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI5OSw2ICszMzEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZU1vdmVUbykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FyY1RvKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlLCBmb3JjZU1vdmVUbyk7CiAgICAgfQogICAgIApAQCAtMzE0LDYgKzM0Nyw3IEBACiAgICAgICogQHBhcmFtIHN3ZWVwQW5nbGUgIFN3ZWVwIGFuZ2xlIChpbiBkZWdyZWVzKSBtZWFzdXJlZCBjbG9ja3dpc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcmNUbyhSZWN0RiBvdmFsLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBzd2VlcEFuZ2xlKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZhbHNlKTsKICAgICB9CiAgICAgCkBAIC0zMjIsNiArMzU2LDcgQEAKICAgICAgKiBmaXJzdCBwb2ludCBvZiB0aGUgY29udG91ciwgYSBsaW5lIHNlZ21lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jbG9zZShtTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC0zNTEsNiArMzg2LDExIEBACiAgICAgICAgIGlmIChyZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCByZWN0IHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIHJlY3QubGVmdCwgKGludCkgcmVjdC50b3AsIChpbnQpIHJlY3QucmlnaHQsIChpbnQpIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICBSZWdpb24uT3AuVU5JT04pOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9hZGRSZWN0KG1OYXRpdmVQYXRoLCByZWN0LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM2Myw4ICs0MDMsMTEgQEAKICAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gb2YgYSByZWN0YW5nbGUgdG8gYWRkIHRvIHRoZSBwYXRoCiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIHJlY3RhbmdsZSdzIGNvbnRvdXIKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXIpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgPT0gbnVsbCkgcmVjdHMgPSBuZXcgUmVnaW9uKCk7CisgICAgICAgICAgICByZWN0cy5vcCgoaW50KSBsZWZ0LCAoaW50KSB0b3AsIChpbnQpIHJpZ2h0LCAoaW50KSBib3R0b20sIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogCkBAIC0zNzgsNiArNDIxLDcgQEAKICAgICAgICAgaWYgKG92YWwgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIG92YWwgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRPdmFsKG1OYXRpdmVQYXRoLCBvdmFsLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM5MCw2ICs0MzQsNyBAQAogICAgICAqIEBwYXJhbSBkaXIgICAgVGhlIGRpcmVjdGlvbiB0byB3aW5kIHRoZSBjaXJjbGUncyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2lyY2xlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZENpcmNsZShtTmF0aXZlUGF0aCwgeCwgeSwgcmFkaXVzLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTQwNCw2ICs0NDksNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZEFyYyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7CiAgICAgfQogCkBAIC00MTksNiArNDY1LDcgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJ4LCByeSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApAQCAtNDM4LDYgKzQ4NSw3IEBACiAgICAgICAgIGlmIChyYWRpaS5sZW5ndGggPCA4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJyYWRpaVtdIG5lZWRzIDggdmFsdWVzIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJhZGlpLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00NDgsNiArNDk2LDcgQEAKICAgICAgKiBAcGFyYW0gZHggIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIHRoZSBwYXRoIGluIFggYXMgaXQgaXMgYWRkZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQYXRoKFBhdGggc3JjLCBmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgsIGR4LCBkeSk7CiAgICAgfQogCkBAIC00NTcsNiArNTA2LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRoYXQgaXMgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNDY2LDYgKzUxNiw3IEBACiAgICAgICogQHBhcmFtIHNyYyBUaGUgcGF0aCB0byBhZGQgYXMgYSBuZXcgY29udG91cgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgaWYgKCFzcmMuaXNTaW1wbGVQYXRoKSBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCkBAIC01MDIsNiArNTUzLDcgQEAKICAgICAgKiBAcGFyYW0gZHkgVGhlIG5ldyBZIGNvb3JkaW5hdGUgZm9yIHRoZSBsYXN0IHBvaW50CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGFzdFBvaW50KGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3NldExhc3RQb2ludChtTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTUzNyw4ICs1ODksOCBAQAogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBpbnQgbmkoKSB7CisKKyAgICBmaW5hbCBpbnQgbmkoKSB7CiAgICAgICAgIHJldHVybiBtTmF0aXZlUGF0aDsKICAgICB9CiAKQEAgLTU5Miw2ICs2NDQsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfdHJhbnNmb3JtKGludCBuUGF0aCwgaW50IG1hdHJpeCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuUGF0aCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCmluZGV4IDM5MDQyMzQuLjJlZjE2NjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQpAQCAtNTMsMTEgKzUzLDE4IEBACiAgICAgICAgIC8qKiBbU2EgKiBEYSwgU2MgKiBEY10gKi8KICAgICAgICAgTVVMVElQTFkgICAgKDE0KSwKICAgICAgICAgLyoqIFtTYSArIERhIC0gU2EgKiBEYSwgU2MgKyBEYyAtIFNjICogRGNdICovCi0gICAgICAgIFNDUkVFTiAgICAgICgxNSk7CisgICAgICAgIFNDUkVFTiAgICAgICgxNSksCisgICAgICAgIC8qKiBTYXR1cmF0ZShTICsgRCkgKi8KKyAgICAgICAgQUREICAgICAgICAgKDE2KSwKKyAgICAgICAgT1ZFUkxBWSAgICAgKDE3KTsKIAogICAgICAgICBNb2RlKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKaW5kZXggMDY3MjRiZC4uYjAyZGFiMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQpAQCAtMjUsMTAgKzI1LDEwIEBACiAgICAgICogQHBhcmFtIG1vZGUgICAgICAgICAgIFRoZSBwb3J0ZXItZHVmZiBtb2RlIHRoYXQgaXMgYXBwbGllZAogICAgICAqLwogICAgIHB1YmxpYyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoaW50IHNyY0NvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgewotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX0NyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCmluZGV4IGNiMTI3ZmQuLjZiYTA2NGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKQEAgLTE4LDExICsxOCwxNyBAQAogCiBwdWJsaWMgY2xhc3MgUG9ydGVyRHVmZlhmZXJtb2RlIGV4dGVuZHMgWGZlcm1vZGUgewogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFBvcnRlckR1ZmYuTW9kZSBtb2RlOworCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIHhmZXJtb2RlIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIHBvcnRlci1kdWZmIG1vZGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGVYZmVybW9kZShtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlY3QuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWN0LmphdmEKaW5kZXggOThmZmI4Yi4uNzgzMDIyNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlY3QuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVjdC5qYXZhCkBAIC03NSw2ICs3NSw3IEBACiAgICAgICAgIGJvdHRvbSA9IHIuYm90dG9tOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIFJlY3QgciA9IChSZWN0KSBvYmo7CiAgICAgICAgIGlmIChyICE9IG51bGwpIHsKQEAgLTg0LDYgKzg1LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigzMik7CiAgICAgICAgIHNiLmFwcGVuZCgiUmVjdCgiKTsgc2IuYXBwZW5kKGxlZnQpOyBzYi5hcHBlbmQoIiwgIik7CkBAIC0zNTEsNyArMzUzLDcgQEAKICAgICAgKiByZWN0YW5nbGUsIHJldHVybiB0cnVlIGFuZCBzZXQgdGhpcyByZWN0YW5nbGUgdG8gdGhhdCBpbnRlcnNlY3Rpb24sCiAgICAgICogb3RoZXJ3aXNlIHJldHVybiBmYWxzZSBhbmQgZG8gbm90IGNoYW5nZSB0aGlzIHJlY3RhbmdsZS4gTm8gY2hlY2sgaXMKICAgICAgKiBwZXJmb3JtZWQgdG8gc2VlIGlmIGVpdGhlciByZWN0YW5nbGUgaXMgZW1wdHkuIE5vdGU6IFRvIGp1c3QgdGVzdCBmb3IKLSAgICAgKiBpbnRlcnNlY3Rpb24sIHVzZSBpbnRlcnNlY3RzKCkKKyAgICAgKiBpbnRlcnNlY3Rpb24sIHVzZSB7QGxpbmsgI2ludGVyc2VjdHMoUmVjdCwgUmVjdCl9LgogICAgICAqCiAgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIGJlaW5nIGludGVyc2VjdGVkIHdpdGggdGhpcwogICAgICAqICAgICAgICAgICAgIHJlY3RhbmdsZQpAQCAtNDQ1LDcgKzQ0Nyw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgdHdvIHNwZWNpZmllZCByZWN0YW5nbGVzIGludGVyc2VjdC4gSW4gbm8gZXZlbnQgYXJlCiAgICAgICogZWl0aGVyIG9mIHRoZSByZWN0YW5nbGVzIG1vZGlmaWVkLiBUbyByZWNvcmQgdGhlIGludGVyc2VjdGlvbiwKLSAgICAgKiB1c2UgaW50ZXJzZWN0KCkgb3Igc2V0SW50ZXJzZWN0KCkuCisgICAgICogdXNlIHtAbGluayAjaW50ZXJzZWN0KFJlY3QpfSBvciB7QGxpbmsgI3NldEludGVyc2VjdChSZWN0LCBSZWN0KX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gYSBUaGUgZmlyc3QgcmVjdGFuZ2xlIGJlaW5nIHRlc3RlZCBmb3IgaW50ZXJzZWN0aW9uCiAgICAgICogQHBhcmFtIGIgVGhlIHNlY29uZCByZWN0YW5nbGUgYmVpbmcgdGVzdGVkIGZvciBpbnRlcnNlY3Rpb24KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQppbmRleCAyYjA4MGFhLi5lNTQwODA2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCkBAIC0yMCw2ICsyMCwxMCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIAogcHVibGljIGNsYXNzIFJlZ2lvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBtTmF0aXZlUmVnaW9uOwogCiAgICAgLy8gdGhlIG5hdGl2ZSB2YWx1ZXMgZm9yIHRoZXNlIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZW51bSBpbiBTa1JlZ2lvbi5oCiAgICAgcHVibGljIGVudW0gT3AgewpAQCAtMzMsNyArMzcsMTEgQEAKICAgICAgICAgT3AoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIAogICAgIC8qKiBDcmVhdGUgYW4gZW1wdHkgcmVnaW9uCkBAIC0zMjUsMTAgKzMzMywxNCBAQAogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZVJlZ2lvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVEZXN0cnVjdG9yKG1OYXRpdmVSZWdpb24pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKLSAgICAvKnBhY2thZ2UqLyBSZWdpb24oaW50IG5pKSB7CisgICAgUmVnaW9uKGludCBuaSkgewogICAgICAgICBpZiAobmkgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtMzQxLDcgKzM1Myw3IEBACiAgICAgICAgIHRoaXMobmkpOwogICAgIH0KIAotICAgIC8qcGFja2FnZSovIGZpbmFsIGludCBuaSgpIHsKKyAgICBmaW5hbCBpbnQgbmkoKSB7CiAgICAgICAgIHJldHVybiBtTmF0aXZlUmVnaW9uOwogICAgIH0KIApAQCAtMzcwLDYgKzM4Miw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwgcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVFcXVhbHMoaW50IG5hdGl2ZV9yMSwgaW50IG5hdGl2ZV9yMik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlUmVnaW9uOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCmluZGV4IGFlMDMwNGUuLmIzOTc2NjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKQEAgLTIzLDkgKzIzLDE2IEBACiAgKiBkcmF3biB3aXRoIHRoYXQgcGFpbnQgd2lsbCBnZXQgaXRzIGNvbG9yKHMpIGZyb20gdGhlIHNoYWRlci4KICAqLwogcHVibGljIGNsYXNzIFNoYWRlciB7Ci0KLSAgICAvLyB0aGlzIGlzIHNldCBieSBzdWJjbGFzc2VzLCBidXQgZG9uJ3QgbWFrZSBpdCBwdWJsaWMKLSAgICAvKiBwYWNrYWdlICovIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogVGhpcyBpcyBzZXQgYnkgc3ViY2xhc3NlcywgYnV0IGRvbid0IG1ha2UgaXQgcHVibGljLgorICAgICAqIAorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfc2hhZGVyOwogCiAgICAgcHVibGljIGVudW0gVGlsZU1vZGUgewogICAgICAgICAvKioKQEAgLTY0LDE3ICs3MSwyMCBAQAogICAgICAqIEBwYXJhbSBsb2NhbE0gVGhlIHNoYWRlcidzIG5ldyBsb2NhbCBtYXRyaXgsIG9yIG51bGwgdG8gc3BlY2lmeSBpZGVudGl0eQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWF0cml4KE1hdHJpeCBsb2NhbE0pIHsKLSAgICAgICAgbmF0aXZlU2V0TG9jYWxNYXRyaXgobmF0aXZlX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE0gIT0gbnVsbCA/IGxvY2FsTS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgbmF0aXZlU2V0TG9jYWxNYXRyaXgobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVfc2hhZGVyLCBsb2NhbE0ubmF0aXZlX2luc3RhbmNlKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBuYXRpdmVEZXN0cnVjdG9yKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZV9zaGFkZXIpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcihpbnQgbmF0aXZlX3NoYWRlcik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcihpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9za2lhU2hhZGVyKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVHZXRMb2NhbE1hdHJpeChpbnQgbmF0aXZlX3NoYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4X2luc3RhbmNlKTsKKyAgICAgICAgICAgIGludCBtYXRyaXhfaW5zdGFuY2UpOyAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRMb2NhbE1hdHJpeChpbnQgbmF0aXZlX3NoYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4X2luc3RhbmNlKTsKKyAgICAgICAgICAgIGludCBuYXRpdmVfc2tpYVNoYWRlciwgaW50IG1hdHJpeF9pbnN0YW5jZSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKaW5kZXggMWQ3ZmUwMS4uYzViODE0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQpAQCAtMTgsOSArMTgsMTEgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotLyogcGFja2FnZSAqLyBjbGFzcyBUZW1wb3JhcnlCdWZmZXIKLXsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjaGFyW10gb2J0YWluKGludCBsZW4pIHsKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFRlbXBvcmFyeUJ1ZmZlciB7CisgICAgcHVibGljIHN0YXRpYyBjaGFyW10gb2J0YWluKGludCBsZW4pIHsKICAgICAgICAgY2hhcltdIGJ1ZjsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKFRlbXBvcmFyeUJ1ZmZlci5jbGFzcykgewpAQCAtMjgsMTUgKzMwLDE1IEBACiAgICAgICAgICAgICBzVGVtcCA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoYnVmID09IG51bGwgfHwgYnVmLmxlbmd0aCA8IGxlbikKKyAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IGJ1Zi5sZW5ndGggPCBsZW4pIHsKICAgICAgICAgICAgIGJ1ZiA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGxlbildOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICB9CiAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyB2b2lkIHJlY3ljbGUoY2hhcltdIHRlbXApIHsKLSAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMTAwMCkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjeWNsZShjaGFyW10gdGVtcCkgeworICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAxMDAwKSByZXR1cm47CiAKICAgICAgICAgc3luY2hyb25pemVkIChUZW1wb3JhcnlCdWZmZXIuY2xhc3MpIHsKICAgICAgICAgICAgIHNUZW1wID0gdGVtcDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmphdmEKaW5kZXggNDJjNDEwZS4uMjQ2N2JkYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmphdmEKQEAgLTMxLDcgKzMxLDExIEBACiBwdWJsaWMgY2xhc3MgWGZlcm1vZGUgewogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZV9pbnN0YW5jZSk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCmluZGV4IDMxMjUzMjEuLjdiMmQ5ZDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCkBAIC0xNiwyMSArMTYsMzAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTmluZVBhdGNoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogQSBEcmF3YWJsZSBpcyBhIGdlbmVyYWwgYWJzdHJhY3Rpb24gZm9yICJzb21ldGhpbmcgdGhhdCBjYW4gYmUgZHJhd24uIiAgTW9zdApAQCAtNjQ1LDYgKzY1NCw4IEBACiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIG11dGFibGUgRHJhd2FibGUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhpcyBkcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlICNnZXRDb25zdGFudFN0YXRlKCkKICAgICAgKi8KICAgICBwdWJsaWMgRHJhd2FibGUgbXV0YXRlKCkgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTc0OSw2ICs3NjAsOCBAQAogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGV2ZWwtbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMZXZlbExpc3REcmF3YWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJtaXBtYXAiKSkgeworICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgTWlwbWFwRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGF5ZXItbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMYXllckRyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRyYW5zaXRpb24iKSkgewpAQCAtNzcwLDcgKzc4Myw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImluc2V0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEluc2V0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYml0bWFwIikpIHsKLSAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKCk7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShyKTsKICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICgoQml0bWFwRHJhd2FibGUpIGRyYXdhYmxlKS5zZXRUYXJnZXREZW5zaXR5KHIuZ2V0RGlzcGxheU1ldHJpY3MoKSk7CiAgICAgICAgICAgICB9CkBAIC04MDUsNiArODE4LDkgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSB0aGlzIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluZmxhdGUoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCkBAIC04MTMsNiArODI5LDEyIEBACiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluZmxhdGUgYSBEcmF3YWJsZSBmcm9tIGFuIFhNTCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KICAgICB2b2lkIGluZmxhdGVXaXRoQXR0cmlidXRlcyhSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsCiAgICAgICAgICAgICBUeXBlZEFycmF5IGF0dHJzLCBpbnQgdmlzaWJsZUF0dHIpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtODIwLDEyICs4NDIsMjcgQEAKICAgICAgICAgbVZpc2libGUgPSBhdHRycy5nZXRCb29sZWFuKHZpc2libGVBdHRyLCBtVmlzaWJsZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBEcmF3YWJsZX1zIHRvIHN0b3JlIHNoYXJlZCBjb25zdGFudCBzdGF0ZSBhbmQgZGF0YQorICAgICAqIGJldHdlZW4gRHJhd2FibGVzLiB7QGxpbmsgQml0bWFwRHJhd2FibGV9cyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgcmVzb3VyY2Ugd2lsbCBmb3IgaW5zdGFuY2UKKyAgICAgKiBzaGFyZSBhIHVuaXF1ZSBiaXRtYXAgc3RvcmVkIGluIHRoZWlyIENvbnN0YW50U3RhdGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgI25ld0RyYXdhYmxlKFJlc291cmNlcyl9IGNhbiBiZSB1c2VkIGFzIGEgZmFjdG9yeSB0byBjcmVhdGUgbmV3IERyYXdhYmxlIGluc3RhbmNlcworICAgICAqIGZyb20gdGhpcyBDb25zdGFudFN0YXRlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIFVzZSB7QGxpbmsgRHJhd2FibGUjZ2V0Q29uc3RhbnRTdGF0ZSgpfSB0byByZXRyaWV2ZSB0aGUgQ29uc3RhbnRTdGF0ZSBvZiBhIERyYXdhYmxlLiBDYWxsaW5nCisgICAgICoge0BsaW5rIERyYXdhYmxlI211dGF0ZSgpfSBvbiBhIERyYXdhYmxlIHNob3VsZCB0eXBpY2FsbHkgY3JlYXRlIGEgbmV3IENvbnN0YW50U3RhdGUgZm9yIHRoYXQKKyAgICAgKiBEcmF3YWJsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnN0YW50U3RhdGUgewogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlIGEgbmV3IGRyYXdhYmxlIHdpdGhvdXQgc3VwcGx5aW5nIHJlc291cmNlcyB0aGUgY2FsbGVyCiAgICAgICAgICAqIGlzIHJ1bm5pbmcgaW4uICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZWFucyB0aGUgZGVuc2l0eS1kZXBlbmRlbnQKICAgICAgICAgICogZHJhd2FibGVzIChsaWtlIGJpdG1hcHMpIHdpbGwgbm90IGJlIGFibGUgdG8gdXBkYXRlIHRoZWlyIHRhcmdldAotICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4KKyAgICAgICAgICogZGVuc2l0eSBjb3JyZWN0bHkuIE9uZSBzaG91bGQgdXNlIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0KKyAgICAgICAgICogaW5zdGVhZCB0byBwcm92aWRlIGEgcmVzb3VyY2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRHJhd2FibGUgbmV3RHJhd2FibGUoKTsKICAgICAgICAgLyoqCkBAIC04NDQsNiArODgxLDEzIEBACiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIHtAbGluayBDb25zdGFudFN0YXRlfSBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSBzaGFyZWQgc3RhdGUgb2YgdGhpcyBEcmF3YWJsZS4KKyAgICAgKnEKKyAgICAgKiBAcmV0dXJuIFRoZSBDb25zdGFudFN0YXRlIGFzc29jaWF0ZWQgdG8gdGhhdCBEcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlIERyYXdhYmxlI211dGF0ZSgpCisgICAgICovCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQppbmRleCBjNmY1N2Q0Li4xMjRkOTA3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQpAQCAtMTcsOCArMTcsMTYgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRoYXQgY29udGFpbnMgc2V2ZXJhbCB7QGxpbmsgRHJhd2FibGV9cyBhbmQgc2VsZWN0cyB3aGljaCBvbmUgdG8gdXNlLgorICoKKyAqIFlvdSBjYW4gc3ViY2xhc3MgaXQgdG8gY3JlYXRlIHlvdXIgb3duIERyYXdhYmxlQ29udGFpbmVycyBvciBkaXJlY3RseSB1c2Ugb25lIGl0cyBjaGlsZCBjbGFzc2VzLgorICovCiBwdWJsaWMgY2xhc3MgRHJhd2FibGVDb250YWluZXIgZXh0ZW5kcyBEcmF3YWJsZSBpbXBsZW1lbnRzIERyYXdhYmxlLkNhbGxiYWNrIHsKIAogICAgIC8qKgpAQCAtMTk2LDggKzIwNCw3IEBACiAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUuZ2V0T3BhY2l0eSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpIHsKICAgICAgICAgaWYgKGlkeCA9PSBtQ3VySW5kZXgpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjU1LDYgKzI2MiwxMiBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBIENvbnN0YW50U3RhdGUgdGhhdCBjYW4gY29udGFpbiBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyB3YXMgbWFkZSBwdWJsaWMgdG8gZW5hYmxlIHRlc3RpbmcsIGFuZCBpdHMgdmlzaWJpbGl0eSBtYXkgY2hhbmdlIGluIGEgZnV0dXJlCisgICAgICogcmVsZWFzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBDb25zdGFudFN0YXRlIHsKICAgICAgICAgZmluYWwgRHJhd2FibGVDb250YWluZXIgbU93bmVyOwogCkBAIC00NDMsMTIgKzQ1NiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudE1pbmltdW1IZWlnaHQ7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKICAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CiAKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICAgICAgZmluYWwgRHJhd2FibGVbXSBkcmF3YWJsZXMgPSBtRHJhd2FibGVzOwotICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAwOworICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkciA9IGRyYXdhYmxlc1tpXTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCmluZGV4IDMzZWNiZWEuLjg4ZjZkNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQpAQCAtMzEzLDE4ICszMTMsMTYgQEAKICAgICAgICAgICAgIGNhc2UgUkVDVEFOR0xFOgogICAgICAgICAgICAgICAgIGlmIChzdC5tUmFkaXVzQXJyYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobVJlY3QsIHN0Lm1SYWRpdXNBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNXKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1SZWN0LCBzdC5tUmFkaXVzQXJyYXksIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtRmlsbFBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0Lm1SYWRpdXMgPiAwLjBmKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjYWxsZXIgaXMgb25seSBnaXZpbmcgdXMgMSB2YWx1ZSwgd2Ugd2lsbCBmb3JjZQogICAgICAgICAgICAgICAgICAgICAvLyBpdCB0byBiZSBzcXVhcmUgaWYgdGhlIHJlY3QgaXMgdG9vIHNtYWxsIGluIG9uZSBkaW1lbnNpb24KICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2hvdyBpdC4gSWYgd2UgZGlkIG5vdGhpbmcsIFNraWEgd291bGQgY2xhbXAgdGhlIHJhZAotICAgICAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudGx5IGFsb25nIGVhY2ggYXhpcywgZ2l2aW5nIHVzIGEgdGhpbiBlbGxpcHMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXBlbmRlbnRseSBhbG9uZyBlYWNoIGF4aXMsIGdpdmluZyB1cyBhIHRoaW4gZWxsaXBzZQogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjdCB3ZXJlIHZlcnkgd2lkZSBidXQgbm90IHZlcnkgdGFsbAogICAgICAgICAgICAgICAgICAgICBmbG9hdCByYWQgPSBzdC5tUmFkaXVzOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gTWF0aC5taW4obVJlY3Qud2lkdGgoKSwgbVJlY3QuaGVpZ2h0KCkpICogMC41ZjsKQEAgLTMzNSw2ICszMzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Um91bmRSZWN0KG1SZWN0LCByYWQsIHJhZCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbUZpbGxQYWludCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlU3Ryb2tlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1TdHJva2VQYWludCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE9WQUw6CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQppbmRleCA4MDQ3ZGQ0Li41MDFjY2E5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKQEAgLTI2Niw2ICsyNjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldERyYXdhYmxlQnlMYXllcklkKGludCBpZCwgRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAgZmluYWwgQ2hpbGREcmF3YWJsZVtdIGxheWVycyA9IG1MYXllclN0YXRlLm1DaGlsZHJlbjsKKyAgICAgICAgZHJhd2FibGUuc2V0Q2FsbGJhY2sodGhpcyk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpID0gbUxheWVyU3RhdGUubU51bSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBpZiAobGF5ZXJzW2ldLm1JZCA9PSBpZCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkZWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBtYW5hZ2VzIGEgbnVtYmVyIG9mIGFsdGVybmF0ZSBEcmF3YWJsZXMsIGFuZCB3aGljaCBhY3R1YWxseSBkcmF3cyB0aGUgb25lIHdoaWNoCisgKiBzaXplIG1hdGNoZXMgdGhlIG1vc3QgY2xvc2VseSB0aGUgZHJhd2luZyBib3VuZHMuIFByb3ZpZGluZyBzZXZlcmFsIHByZS1zY2FsZWQgdmVyc2lvbiBvZiB0aGUKKyAqIGRyYXdhYmxlIGhlbHBzIG1pbmltaXppbmcgdGhlIGFsaWFzaW5nIGFydGlmYWN0cyB0aGF0IGNhbiBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBzY2FsaW5nLgorICoKKyAqIDxwPgorICogVXNlIHtAbGluayAjYWRkRHJhd2FibGUoRHJhd2FibGUpfSB0byBkZWZpbmUgdGhlIGRpZmZlcmVudCBEcmF3YWJsZXMgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGUKKyAqIG1pcG1hcCBsZXZlbHMgb2YgdGhpcyBNaXBtYXBEcmF3YWJsZS4gVGhlIG1pcG1hcCBEcmF3YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCB3aGVuIHRoaXMKKyAqIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIHRoZSBvbmUgd2hpY2ggaGFzIHRoZSBzbWFsbGVzdCBpbnRyaW5zaWMgaGVpZ2h0IGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICogdGhlIGJvdW5kcycgaGVpZ2h0LiBUaGlzIHNlbGVjdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGJlc3QgYXZhaWxhYmxlIG1pcG1hcCBsZXZlbCBpcyBzY2FsZWQgZG93biB0bworICogZHJhdyB0aGlzIE1pcG1hcERyYXdhYmxlLgorICogPC9wPgorICoKKyAqIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0IG1pcG1hcCB3aWxsIGJlIHNjYWxlZCB1cC4KKyAqIE5vdGUgdGhhdCBEcmF3YWJsZXMgd2l0aG91dCBpbnRyaW5zaWMgaGVpZ2h0IChpLmUuIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZSwgc3VjaCBhcyBDb2xvcikgd2lsbAorICogb25seSBiZSB1c2VkIGlmIG5vIG90aGVyIG1pcG1hcCBEcmF3YWJsZSBhcmUgcHJvdmlkZWQuIFRoZSBEcmF3YWJsZXMnIGludHJpbnNpYyBoZWlnaHRzIHNob3VsZAorICogbm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIERyYXdhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgTWlwbWFwRHJhd2FibGUuCisgKgorICogPHA+CisgKiBUaGUgZGlmZmVyZW50IG1pcG1hcHMnIHBhcmFtZXRlcnMgKG9wYWNpdHksIHBhZGRpbmcsIGNvbG9yIGZpbHRlciwgZ3Jhdml0eS4uLikgc2hvdWxkIHR5cGljYWxseQorICogYmUgc2ltaWxhciB0byBlbnN1cmUgYSBjb250aW51b3VzIHZpc3VhbCBhcHBlYXJhbmNlIHdoZW4gdGhlIE1pcG1hcERyYXdhYmxlIGlzIHNjYWxlZC4gVGhlIGFzcGVjdAorICogcmF0aW8gb2YgdGhlIGRpZmZlcmVudCBtaXBtYXBzIHNob3VsZCBlc3BlY2lhbGx5IGJlIGVxdWFsLgorICogPC9wPgorICoKKyAqIEEgdHlwaWNhbCBleGFtcGxlIHVzZSBvZiBhIE1pcG1hcERyYXdhYmxlIHdvdWxkIGJlIGZvciBhbiBpbWFnZSB3aGljaCBpcyBpbnRlbmRlZCB0byBiZSBzY2FsZWQgYXQKKyAqIHZhcmlvdXMgc2l6ZXMsIGFuZCBmb3Igd2hpY2ggb25lIHdhbnRzIHRvIHByb3ZpZGUgcHJlLXNjYWxlZCB2ZXJzaW9ucyB0byBwcmVjaXNlbHkgY29udHJvbCBpdHMKKyAqIGFwcGVhcmFuY2UuCisgKgorICogPHA+CisgKiBUaGUgaW50cmluc2ljIHNpemUgb2YgYSBNaXBtYXBEcmF3YWJsZSBhcmUgaW5mZXJyZWQgZnJvbSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBtaXBtYXAgKGluIHRlcm1zIG9mCisgKiB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9KS4gT24gdGhlIG9wcG9zaXRlLCBpdHMgbWluaW11bQorICogc2l6ZSBpcyBkZWZpbmVkIGJ5IHRoZSBzbWFsbGVzdCBwcm92aWRlZCBtaXBtYXAuCisgKiA8L3A+CisKKyAqIEl0IGNhbiBiZSBkZWZpbmVkIGluIGFuIFhNTCBmaWxlIHdpdGggdGhlIDxjb2RlPiZsdDttaXBtYXA+PC9jb2RlPiBlbGVtZW50LgorICogRWFjaCBtaXBtYXAgRHJhd2FibGUgaXMgZGVmaW5lZCBpbiBhIG5lc3RlZCA8Y29kZT4mbHQ7aXRlbT48L2NvZGU+LiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAmbHQ7bWlwbWFwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzgiIC8+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzMyIiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8xMjgiIC8+CisgKiAmbHQ7L21pcG1hcD4KKyAqPC9wcmU+CisgKiA8cD4KKyAqIFdpdGggdGhpcyBYTUwgc2F2ZWQgaW50byB0aGUgcmVzL2RyYXdhYmxlLyBmb2xkZXIgb2YgdGhlIHByb2plY3QsIGl0IGNhbiBiZSByZWZlcmVuY2VkIGFzCisgKiB0aGUgZHJhd2FibGUgZm9yIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9LiBBc3N1bWluZyB0aGF0IHRoZSBoZWlnaHRzIG9mIHRoZSBwcm92aWRlZAorICogZHJhd2FibGVzIGFyZSByZXNwZWN0aXZlbHkgOCwgMzIgYW5kIDEyOCBwaXhlbHMsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSBzY2FsZWQgZG93biB3aGVuIHRoZQorICogYm91bmRzJyBoZWlnaHQgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiA4IHBpeGVscy4gVGhlIHNlY29uZCBkcmF3YWJsZSB3aWxsIHRoZW4gYmUgdXNlZCB1cCB0byBhCisgKiBoZWlnaHQgb2YgMzIgcGl4ZWxzIGFuZCB0aGUgbGFyZ2VzdCBkcmF3YWJsZSB3aWxsIGJlIHVzZWQgZm9yIGdyZWF0ZXIgaGVpZ2h0cy4KKyAqIDwvcD4KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI01pcG1hcERyYXdhYmxlSXRlbV9kcmF3YWJsZQorICovCitwdWJsaWMgY2xhc3MgTWlwbWFwRHJhd2FibGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNaXBtYXBDb250YWluZXJTdGF0ZSBtTWlwbWFwQ29udGFpbmVyU3RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1NdXRhdGVkOworCisgICAgcHVibGljIE1pcG1hcERyYXdhYmxlKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhlIERyYXdhYmxlIGFjdHVhbGx5IHVzZWQgd2hlbgorICAgICAqIHRoaXMgTWlwbWFwRHJhd2FibGUgaXMgZHJhd24gaXMgZGV0ZXJtaW5lZCBmcm9tIGl0cyBib3VuZHMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIGRyYXdhYmxlIGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5hZGREcmF3YWJsZShkcmF3YWJsZSk7CisgICAgICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkRyYXdhYmxlQWRkZWQoKSB7CisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGFzc3VtZXMgdGhhdCB0aGUgY29udGFpbmVyIGNvbnRlbnQgZG9lcyBub3QgY2hhbmdlLgorICAgICAgICAvLyBXaGVuIGEgRHJhd2FibGUgaXMgYWRkZWQsIHRoZSBzYW1lIGluZGV4IGNhbiBjb3JyZXNwb25kIHRvIGEgbmV3IERyYXdhYmxlLCBhbmQgc2luY2UKKyAgICAgICAgLy8gc2VsZWN0RHJhd2FibGUgaGFzIGEgZmFzdCBleGl0IGNhc2Ugd2hlbiBvbGRJbmRleD09bmV3SW5kZXgsIHRoZSBuZXcgZHJhd2FibGUgY291bGQgZW5kCisgICAgICAgIC8vIHVwIG5vdCBiZWluZyB1c2VkIGluIHBsYWNlIG9mIHRoZSBwcmV2aW91cyBvbmUgaWYgdGhleSBoYXBwZW4gdG8gc2hhcmUgdGhlIHNhbWUgaW5kZXguCisgICAgICAgIC8vIFRoaXMgbWFrZSBzdXJlIHRoZSBuZXcgY29tcHV0ZWQgaW5kZXggY2FuIGFjdHVhbGx5IHJlcGxhY2UgdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgc2VsZWN0RHJhd2FibGUoLTEpOworICAgICAgICBvbkJvdW5kc0NoYW5nZShnZXRCb3VuZHMoKSk7CisgICAgfQorCisgICAgLy8gb3ZlcnJpZGVzIGZyb20gRHJhd2FibGUKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQm91bmRzQ2hhbmdlKFJlY3QgYm91bmRzKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1NaXBtYXBDb250YWluZXJTdGF0ZS5pbmRleEZvckJvdW5kcyhib3VuZHMpOworCisgICAgICAgIC8vIFdpbGwgY2FsbCBpbnZhbGlkYXRlU2VsZigpIGlmIG5lZWRlZAorICAgICAgICBzZWxlY3REcmF3YWJsZShpbmRleCk7CisKKyAgICAgICAgc3VwZXIub25Cb3VuZHNDaGFuZ2UoYm91bmRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbmZsYXRlKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzKQorICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuaW5mbGF0ZShyLCBwYXJzZXIsIGF0dHJzKTsKKworICAgICAgICBpbnQgdHlwZTsKKworICAgICAgICBmaW5hbCBpbnQgaW5uZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpICsgMTsKKyAgICAgICAgaW50IGRlcHRoOworICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICYmICgoZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSkgPj0gaW5uZXJEZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBpbm5lckRlcHRoIHx8ICFwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscygiaXRlbSIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHIub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtKTsKKworICAgICAgICAgICAgaW50IGRyYXdhYmxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUsIDApOworCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgRHJhd2FibGUgZHI7CisgICAgICAgICAgICBpZiAoZHJhd2FibGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGRyID0gci5nZXREcmF3YWJsZShkcmF3YWJsZVJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZSA9IHBhcnNlci5uZXh0KCkpID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiA8aXRlbT4gdGFnIHJlcXVpcmVzIGEgJ2RyYXdhYmxlJyBhdHRyaWJ1dGUgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoaWxkIHRhZyBkZWZpbmluZyBhIGRyYXdhYmxlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbElubmVyKHIsIHBhcnNlciwgYXR0cnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHIpOworICAgICAgICB9CisKKyAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERyYXdhYmxlIG11dGF0ZSgpIHsKKyAgICAgICAgaWYgKCFtTXV0YXRlZCAmJiBzdXBlci5tdXRhdGUoKSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMgPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMuY2xvbmUoKTsKKyAgICAgICAgICAgIG1NdXRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBNaXBtYXBDb250YWluZXJTdGF0ZSBleHRlbmRzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgeworICAgICAgICBwcml2YXRlIGludFtdIG1NaXBtYXBIZWlnaHRzOworCisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlKE1pcG1hcENvbnRhaW5lclN0YXRlIG9yaWcsIE1pcG1hcERyYXdhYmxlIG93bmVyLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgICAgICBzdXBlcihvcmlnLCBvd25lciwgcmVzKTsKKworICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gb3JpZy5tTWlwbWFwSGVpZ2h0czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXcgaW50W2dldENoaWxkcmVuKCkubGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICBzZXRDb25zdGFudFNpemUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIG1pcG1hcCBkcmF3YWJsZSB0aGF0IHdpbGwgYmVzdCBmaXQgdGhlIHByb3ZpZGVkIGJvdW5kcy4KKyAgICAgICAgICogVGhpcyBpbmRleCBpcyBkZXRlcm1pbmVkIGJ5IGNvbXBhcmluZyBib3VuZHMnIGhlaWdodCBhbmQgY2hpbGRyZW4gaW50cmluc2ljIGhlaWdodHMuCisgICAgICAgICAqIFRoZSByZXR1cm5lZCBtaXBtYXAgaW5kZXggaXMgdGhlIHNtYWxsZXN0IG1pcG1hcCB3aGljaCBoZWlnaHQgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgICAgICAgICAqIHRoZSBib3VuZHMnIGhlaWdodC4gSWYgdGhlIGJvdW5kcycgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1pcG1hcCwgdGhlIGxhcmdlc3QKKyAgICAgICAgICogbWlwbWFwIGluZGV4IGlzIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm91bmRzIFRoZSBib3VuZHMgb2YgdGhlIE1pcE1hcERyYXdhYmxlLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgRHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZXNlIGJvdW5kcywgb3IgLTEgaWYgdGhlcmUKKyAgICAgICAgICogYXJlIG5vIGNoaWxkcmVuIG1pcG1hcHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGluZGV4Rm9yQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYm91bmRzSGVpZ2h0ID0gYm91bmRzLmhlaWdodCgpOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChib3VuZHNIZWlnaHQgPD0gbU1pcG1hcEhlaWdodHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBObyBtaXBtYXAgbGFyZ2VyIHRoYW4gYm91bmRzIGZvdW5kLiBVc2UgbGFyZ2VzdCBvbmUgd2hpY2ggd2lsbCBiZSBzY2FsZWQgdXAuCisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBObyBEcmF3YWJsZSBtaXBtYXAgYXQgYWxsCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIERyYXdhYmxlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLiBUaGlzIGxpc3QgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgKiB1c2luZyB7QGxpbmsgRHJhd2FibGVDb250YWluZXIuRHJhd2FibGVDb250YWluZXJTdGF0ZSNnZXRDaGlsZHJlbigpfSBhbmQgdGhpcyBtZXRob2QKKyAgICAgICAgICogZW5zdXJlcyB0aGF0IGl0IGlzIGFsd2F5cyBzb3J0ZWQgYnkgaW5jcmVhc2luZyB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBjaGlsZHJlbiBsaXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGREcmF3YWJsZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGRyYXdhYmxlIGluIGxhc3QgcG9zaXRpb24sIGNvcnJlY3RseSByZXNldHRpbmcgY2FjaGVkIHZhbHVlcyBhbmQKKyAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgbUNvbXB1dGVkQ29uc3RhbnRTaXplCisgICAgICAgICAgICBpbnQgcG9zID0gYWRkQ2hpbGQoZHJhd2FibGUpOworCisgICAgICAgICAgICAvLyBCdWJibGUgc29ydCB0aGUgbGFzdCBkcmF3YWJsZSB0byByZXN0b3JlIHRoZSBzb3J0IGJ5IGludHJpbnNpYyBoZWlnaHQKKyAgICAgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZUhlaWdodCA9IGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICB3aGlsZSAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIHByZXZpb3VzRHJhd2FibGUgPSBtRHJhd2FibGVzW3Bvcy0xXTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQgPSBwcmV2aW91c0RyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlSGVpZ2h0IDwgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlc1twb3NdID0gcHJldmlvdXNEcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHNbcG9zXSA9IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zLTFdID0gZHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvcy0xXSA9IGRyYXdhYmxlSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW50cmluc2ljIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgbWlwbWFwLgorICAgICAgICAgKiBNaW5pbXVtIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBzbWFsbGVzdERyYXdhYmxlID0gbURyYXdhYmxlc1swXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1IZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGxhcmdlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbTi0xXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudEhlaWdodCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgbmV3RHJhd2FibGUoUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3dBcnJheShpbnQgb2xkU2l6ZSwgaW50IG5ld1NpemUpIHsKKyAgICAgICAgICAgIHN1cGVyLmdyb3dBcnJheShvbGRTaXplLCBuZXdTaXplKTsKKyAgICAgICAgICAgIGludFtdIG5ld0ludHMgPSBuZXcgaW50W25ld1NpemVdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWlwbWFwSGVpZ2h0cywgMCwgbmV3SW50cywgMCwgb2xkU2l6ZSk7CisgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG5ld0ludHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1pcG1hcERyYXdhYmxlKE1pcG1hcENvbnRhaW5lclN0YXRlIHN0YXRlLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlIGFzID0gbmV3IE1pcG1hcENvbnRhaW5lclN0YXRlKHN0YXRlLCB0aGlzLCByZXMpOworICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUgPSBhczsKKyAgICAgICAgc2V0Q29uc3RhbnRTdGF0ZShhcyk7CisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKaW5kZXggYmFkOTRmYi4uOWE5OGQ1MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKQEAgLTE3NSwxNiArMTc1LDkgQEAKICAgICAgICAgICAgIGRlc3QuYm90dG9tID0gQml0bWFwLnNjYWxlRnJvbURlbnNpdHkoc3JjLmJvdHRvbSwgc2RlbnNpdHksIHRkZW5zaXR5KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBvdmVycmlkZXMKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZsb2F0W10gcHRzID0gbmV3IGZsb2F0WzJdOwotICAgICAgICAgICAgY2FudmFzLmdldE1hdHJpeCgpLm1hcFBvaW50cyhwdHMpOwotICAgICAgICAgICAgTG9nLnYoIjlwYXRjaCIsICJEcmF3aW5nIDktcGF0Y2ggQCAiICsgcHRzWzBdICsgIiwiICsgcHRzWzFdICsgIjogIiArIGdldEJvdW5kcygpKTsKLSAgICAgICAgfQogICAgICAgICBtTmluZVBhdGNoLmRyYXcoY2FudmFzLCBnZXRCb3VuZHMoKSwgbVBhaW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQppbmRleCBmNGNmMTVjLi5iNDY5ZDJhIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCkBAIC01NywxMyArNTcsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUm91bmRSZWN0U2hhcGUoZmxvYXRbXSBvdXRlclJhZGlpLCBSZWN0RiBpbnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBpbm5lclJhZGlpKSB7Ci0gICAgICAgIGlmIChvdXRlclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICBpZiAob3V0ZXJSYWRpaSAhPSBudWxsICYmIG91dGVyUmFkaWkubGVuZ3RoIDwgOCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigib3V0ZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlubmVyUmFkaWkgIT0gbnVsbCAmJiBpbm5lclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlubmVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5uZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgbU91dGVyUmFkaWkgPSBvdXRlclJhZGlpOwogICAgICAgICBtSW5zZXQgPSBpbnNldDsKQEAgLTk3LDggKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucmlnaHQgLSBtSW5zZXQucmlnaHQsIHIuYm90dG9tIC0gbUluc2V0LmJvdHRvbSk7CiAgICAgICAgICAgICBpZiAobUlubmVyUmVjdC53aWR0aCgpIDwgdyAmJiBtSW5uZXJSZWN0LmhlaWdodCgpIDwgaCkgewogICAgICAgICAgICAgICAgIGlmIChtSW5uZXJSYWRpaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNDVyk7CisgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSZWN0KG1Jbm5lclJlY3QsIFBhdGguRGlyZWN0aW9uLkNDVyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5LDggKzEwNiw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJvdW5kUmVjdFNoYXBlIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgUm91bmRSZWN0U2hhcGUgc2hhcGUgPSAoUm91bmRSZWN0U2hhcGUpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIHNoYXBlLm1PdXRlclJhZGlpID0gbU91dGVyUmFkaWkuY2xvbmUoKTsKLSAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaS5jbG9uZSgpOworICAgICAgICBzaGFwZS5tT3V0ZXJSYWRpaSA9IG1PdXRlclJhZGlpICE9IG51bGwgPyBtT3V0ZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKKyAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaSAhPSBudWxsID8gbUlubmVyUmFkaWkuY2xvbmUoKSA6IG51bGw7CiAgICAgICAgIHNoYXBlLm1JbnNldCA9IG5ldyBSZWN0RihtSW5zZXQpOwogICAgICAgICBzaGFwZS5tSW5uZXJSZWN0ID0gbmV3IFJlY3RGKG1Jbm5lclJlY3QpOwogICAgICAgICBzaGFwZS5tUGF0aCA9IG5ldyBQYXRoKG1QYXRoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKaW5kZXggMTdjMDc3OC4uNDZmM2VhZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKQEAgLTQwLDYgKzQwLDIyIEBACiAgICAgICAgIG1UeXBlID0gdDsKICAgICB9CiAKKyAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKHJzKTsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgbU5hbWUgPSBtUlMubkdldE5hbWUobUlEKTsKKyAgICAgICAgaW50IHR5cGVJRCA9IG1SUy5uQWxsb2NhdGlvbkdldFR5cGUobUlEKTsKKyAgICAgICAgaWYodHlwZUlEICE9IDApIHsKKyAgICAgICAgICAgIG1UeXBlID0gbmV3IFR5cGUodHlwZUlELCBtUlMpOworICAgICAgICAgICAgbVR5cGUudXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIG1UeXBlOwogICAgIH0KQEAgLTc2LDEwICs5MiwzMCBAQAogICAgICAgICBzdWJEYXRhMUQoMCwgbVR5cGUuZ2V0RWxlbWVudENvdW50KCksIGQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEoaW50IG9mZiwgRmllbGRQYWNrZXIgZnApIHsKKyAgICAgICAgaW50IGVTaXplID0gbVR5cGUubUVsZW1lbnQuZ2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZnAuZ2V0RGF0YSgpOworCisgICAgICAgIGludCBjb3VudCA9IGRhdGEubGVuZ3RoIC8gZVNpemU7CisgICAgICAgIGlmICgoZVNpemUgKiBjb3VudCkgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHBhY2tlciBsZW5ndGggIiArIGRhdGEubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgZGl2aXNpYmxlIGJ5IGVsZW1lbnQgc2l6ZSAiICsgZVNpemUgKyAiLiIpOworICAgICAgICB9CisgICAgICAgIGRhdGExRENoZWNrcyhvZmYsIGNvdW50LCBkYXRhLmxlbmd0aCwgZGF0YS5sZW5ndGgpOworICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJEYXRhMUQobUlELCBvZmYsIGNvdW50LCBkYXRhLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRhdGExRENoZWNrcyhpbnQgb2ZmLCBpbnQgY291bnQsIGludCBsZW4sIGludCBkYXRhU2l6ZSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgaWYoKG9mZiA8IDApIHx8IChjb3VudCA8IDEpIHx8ICgob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgb3IgQ291bnQgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICAgICAgaWYob2ZmIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG11c3QgYmUgPj0gMC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZihjb3VudCA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvdW50IG11c3QgYmUgPj0gMS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZigob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJmbG93LCBBdmFpbGFibGUgY291bnQgIiArIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZ290ICIgKyBjb3VudCArICIgYXQgb2Zmc2V0ICIgKyBvZmYgKyAiLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmKChsZW4pIDwgZGF0YVNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IHRvbyBzbWFsbCBmb3IgYWxsb2NhdGlvbiB0eXBlLiIpOwpAQCAtMzY2LDYgKzQwMiwyMSBAQAogICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCBpZCwgbUJpdG1hcE9wdGlvbnMpOwogICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUJpdG1hcEJveGVkKHJzLCBiLCBkc3RGbXQsIGdlbk1pcHMpOwogICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVGcm9tU3RyaW5nKFJlbmRlclNjcmlwdCBycywgU3RyaW5nIHN0cikKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBhbGxvY0FycmF5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFsbG9jQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgRWxlbWVudC5VOChycyksIGFsbG9jQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICAgIGFsbG9jLmRhdGEoYWxsb2NBcnJheSk7CisgICAgICAgICAgICByZXR1cm4gYWxsb2M7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIHV0Zi04Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKaW5kZXggMDAyZmM3OC4uMjg2NzVkYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKQEAgLTgxLDUgKzgxLDEwIEBACiAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgIH0KIAorICAgIC8vIElmIGFuIG9iamVjdCBjYW1lIGZyb20gYW4gYTNkIGZpbGUsIGphdmEgZmllbGRzIG5lZWQgdG8gYmUKKyAgICAvLyBjcmVhdGVkIHdpdGggb2JqZWN0cyBmcm9tIHRoZSBuYXRpdmUgbGF5ZXIKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgfQorCiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNmODhjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEJ5dGUyIHsKKyAgICBwdWJsaWMgQnl0ZTIoKSB7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMGNhOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMyB7CisgICAgcHVibGljIEJ5dGUzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlNCB7CisgICAgcHVibGljIEJ5dGU0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworICAgIHB1YmxpYyBieXRlIHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCmluZGV4IDEwZWYwNWEuLjVkMmEwNTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtNDcsMjAgKzQ4LDIyIEBACiAgICAgICAgIFVOU0lHTkVEXzMyICgxMCwgNCksCiAgICAgICAgIC8vVU5TSUdORURfNjQgKDExLCA4KSwKIAotICAgICAgICBVTlNJR05FRF81XzZfNSAoMTIsIDIpLAotICAgICAgICBVTlNJR05FRF81XzVfNV8xICgxMywgMiksCi0gICAgICAgIFVOU0lHTkVEXzRfNF80XzQgKDE0LCAyKSwKKyAgICAgICAgQk9PTEVBTigxMiwgMSksCiAKLSAgICAgICAgUlNfRUxFTUVOVCAoMTUsIDQpLAotICAgICAgICBSU19UWVBFICgxNiwgNCksCi0gICAgICAgIFJTX0FMTE9DQVRJT04gKDE3LCA0KSwKLSAgICAgICAgUlNfU0FNUExFUiAoMTgsIDQpLAotICAgICAgICBSU19TQ1JJUFQgKDE5LCA0KSwKLSAgICAgICAgUlNfTUVTSCAoMjAsIDQpLAotICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMSwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMiwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyMywgNCksCi0gICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI0LCA0KTsKKyAgICAgICAgVU5TSUdORURfNV82XzUgKDEzLCAyKSwKKyAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTQsIDIpLAorICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNSwgMiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTYsIDQpLAorICAgICAgICBSU19UWVBFICgxNywgNCksCisgICAgICAgIFJTX0FMTE9DQVRJT04gKDE4LCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTksIDQpLAorICAgICAgICBSU19TQ1JJUFQgKDIwLCA0KSwKKyAgICAgICAgUlNfTUVTSCAoMjEsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMiwgNCksCisgICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMywgNCksCisgICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyNCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI1LCA0KTsKIAogICAgICAgICBpbnQgbUlEOwogICAgICAgICBpbnQgbVNpemU7CkBAIC03MiwxMiArNzUsNiBAQAogCiAgICAgcHVibGljIGVudW0gRGF0YUtpbmQgewogICAgICAgICBVU0VSICgwKSwKLSAgICAgICAgQ09MT1IgKDEpLAotICAgICAgICBQT1NJVElPTiAoMiksCi0gICAgICAgIFRFWFRVUkUgKDMpLAotICAgICAgICBOT1JNQUwgKDQpLAotICAgICAgICBJTkRFWCAoNSksCi0gICAgICAgIFBPSU5UX1NJWkUoNiksCiAKICAgICAgICAgUElYRUxfTCAoNyksCiAgICAgICAgIFBJWEVMX0EgKDgpLApAQCAtOTEsNDEgKzg4LDEzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfVTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBCT09MRUFOKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9CT09MRUFOID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0JPT0xFQU4gPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5CT09MRUFOKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0JPT0xFQU47CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1U4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfSTg7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfVTMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0kzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUxNihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTE2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UxNiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMTY7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfRjMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0YzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9GMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMTY7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRjMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRjMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBFTEVNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9FTEVNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0VMRU1FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19FTEVNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVFlQRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVFlQRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9UWVBFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfVFlQRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFMTE9DQVRJT04oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0FMTE9DQVRJT04gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQUxMT0NBVElPTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0FMTE9DQVRJT04pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9BTExPQ0FUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQU1QTEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQU1QTEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1NBTVBMRVIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQU1QTEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0FNUExFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgU0NSSVBUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQ1JJUFQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0NSSVBUID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfU0NSSVBUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0NSSVBUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNRVNIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NRVNIID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01FU0ggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19NRVNIKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTUVTSDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9GUkFHTUVOVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9GUkFHTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fVkVSVEVYKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fVkVSVEVYKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fUkFTVEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fUkFTVEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fU1RPUkUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkUgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fU1RPUkUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFfOChSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgaWYocnMubUVsZW1lbnRfQV84ID09IG51bGwpIHsKICAgICAgICAgICAgIHJzLm1FbGVtZW50X0FfOCA9IGNyZWF0ZVBpeGVsKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5QSVhFTF9BKTsKQEAgLTE2OCw1NCArMjU3LDM0IEBACiAgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9SR0JBXzg4ODg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IElOREVYXzE2KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9JTkRFWF8xNiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9JTkRFWF8xNiA9IGNyZWF0ZUluZGV4KHJzKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfMiA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JTkRFWF8xNjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8zKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzMgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl80KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF80ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzQgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMzsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9URVhUVVJFXzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1RFWFRVUkVfMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9URVhUVVJFXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5URVhUVVJFLCAyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVUNIQVJfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VQ0hBUl80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVEVYVFVSRV8yOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVUNIQVJfNDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX05PUk1BTF8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9OT1JNQUxfMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9OT1JNQUxfMyA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLk5PUk1BTCwgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X05PUk1BTF8zOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfVThfNCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9DT0xPUl9VOF80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9GMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80OwotICAgIH0KIAogICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewogICAgICAgICBzdXBlcihycyk7CkBAIC0yNDAsMzMgKzMwOSw0OSBAQAogICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CiAgICAgfQogCisgICAgRWxlbWVudChSZW5kZXJTY3JpcHQgcnMsIGludCBpZCkgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKworICAgICAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzVdOworICAgICAgICBtUlMubkVsZW1lbnRHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CisgICAgICAgIGZvciAoRGF0YVR5cGUgZHQ6IERhdGFUeXBlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkdC5tSUQgPT0gZGF0YUJ1ZmZlclswXSl7CisgICAgICAgICAgICAgICAgbVR5cGUgPSBkdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKERhdGFLaW5kIGRrOiBEYXRhS2luZC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYoZGsubUlEID09IGRhdGFCdWZmZXJbMV0peworICAgICAgICAgICAgICAgIG1LaW5kID0gZGs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtTm9ybWFsaXplZCA9IGRhdGFCdWZmZXJbMl0gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbVZlY3RvclNpemUgPSBkYXRhQnVmZmVyWzNdOworICAgICAgICBpbnQgbnVtU3ViRWxlbWVudHMgPSBkYXRhQnVmZmVyWzRdOworICAgICAgICBpZihudW1TdWJFbGVtZW50cyA+IDApIHsKKyAgICAgICAgICAgIG1FbGVtZW50cyA9IG5ldyBFbGVtZW50W251bVN1YkVsZW1lbnRzXTsKKyAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nW251bVN1YkVsZW1lbnRzXTsKKworICAgICAgICAgICAgaW50W10gc3ViRWxlbWVudElkcyA9IG5ldyBpbnRbbnVtU3ViRWxlbWVudHNdOworICAgICAgICAgICAgbVJTLm5FbGVtZW50R2V0U3ViRWxlbWVudHMobUlELCBzdWJFbGVtZW50SWRzLCBtRWxlbWVudE5hbWVzKTsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1TdWJFbGVtZW50czsgaSArKykgeworICAgICAgICAgICAgICAgIG1FbGVtZW50c1tpXSA9IG5ldyBFbGVtZW50KG1SUywgc3ViRWxlbWVudElkc1tpXSk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMpIHsKLSAgICAgICAgcnMudmFsaWRhdGUoKTsKLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7Ci0KLSAgICAgICAgZm9yKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8xNiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi5jcmVhdGUoKTsKLSAgICB9Ci0KLQogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVVzZXIoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCkgewogICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBEYXRhS2luZC5VU0VSLCBmYWxzZSwgMSk7CkBAIC0yNzksNTkgKzM2NCw2IEBACiAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCBzaXplKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlSW5kZXgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgRGF0YVR5cGUuVU5TSUdORURfMTYsIERhdGFLaW5kLklOREVYLCBmYWxzZSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUF0dHJpYihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKCEoZHQgPT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMTYgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzMyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YVR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLkNPTE9SIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPU0lUSU9OIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlRFWFRVUkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuTk9STUFMIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVVNFUikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIERhdGFLaW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYKLSAgICAgICAgICAgICgoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgJiYgZHQgIT0gRGF0YVR5cGUuVU5TSUdORURfOCkgfHwKLSAgICAgICAgICAgICBzaXplIDwgMyB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT1NJVElPTiAmJiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgPCAxIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLk5PUk1BTCAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgIT0gMykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT0lOVF9TSVpFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAxKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG5vcm0gPSBmYWxzZTsKLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLkNPTE9SICYmIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzgpIHsKLSAgICAgICAgICAgIG5vcm0gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVQaXhlbChSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaykgewogICAgICAgICBpZiAoIShkayA9PSBEYXRhS2luZC5QSVhFTF9MIHx8CiAgICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBJWEVMX0EgfHwKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQppbmRleCBiMjZlNDdkLi5mMDNiNTFjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCkBAIC0zMywyMSArMzMsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVzZXQoKSB7CisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIG1Qb3MgPSAwOwogICAgIH0KKyAgICBwdWJsaWMgdm9pZCByZXNldChpbnQgaSkgeworICAgICAgICBtUG9zID0gaTsKKyAgICB9CiAKLSAgICB2b2lkIGFkZEk4KGJ5dGUgdikgeworICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IGkpIHsKKyAgICAgICAgbVBvcyArPSBpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEk4KGJ5dGUgdikgewogICAgICAgICBtRGF0YVttUG9zKytdID0gdjsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkxNihzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKICAgICAgICAgYWxpZ24oMik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiAmIDB4ZmYpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgPj4gOCk7CiAgICAgfQogCi0gICAgdm9pZCBhZGRJMzIoaW50IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoaW50IHYpIHsKICAgICAgICAgYWxpZ24oNCk7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiAmIDB4ZmYpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDgpICYgMHhmZik7CkBAIC01NSw3ICs2Miw3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gMjQpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRJNjQobG9uZyB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkSTY0KGxvbmcgdikgewogICAgICAgICBhbGlnbig4KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTY3LDE0ICs3NCwxNCBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDU2KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTgoc2hvcnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFU4KHNob3J0IHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSl2OwogICAgIH0KIAotICAgIHZvaWQgYWRkVTE2KGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTE2KGludCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CkBAIC04Myw3ICs5MCw3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFUzMihsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIobG9uZyB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmZmZmZikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNhdmluZyB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUiKTsKICAgICAgICAgfQpAQCAtOTQsNyArMTAxLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVNjQobG9uZyB2KSB7CiAgICAgICAgIGlmICh2IDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CkBAIC0xMDksMTUgKzExNiwxMzkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEYzMihmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHYpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEY2NChmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTY0KERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKHYpKTsKICAgICB9CiAKLSAgICBmaW5hbCBieXRlW10gZ2V0RGF0YSgpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooQmFzZU9iaiBvYmopIHsKKyAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRJMzIob2JqLmdldElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkSTMyKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MiB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MyB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDQgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgICAgIGFkZEYzMih2LnopOworICAgICAgICBhZGRGMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlMiB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUzIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICAgICAgYWRkSTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTQgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgICAgICBhZGRJOCh2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MiB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MyB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0NCB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgICAgIGFkZFU4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MiB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MyB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDQgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgICAgIGFkZEkxNih2LnopOworICAgICAgICBhZGRJMTYodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MiB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDMgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgICAgIGFkZFUxNih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50NCB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgICAgIGFkZFUxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQyIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50MyB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICAgICAgYWRkSTMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQ0IHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICAgICAgYWRkSTMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDIgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgICAgICBhZGRVMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDQgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgICAgICBhZGRVMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCb29sZWFuKGJvb2xlYW4gdikgeworICAgICAgICBhZGRJOCgoYnl0ZSkodiA/IDEgOiAwKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgewogICAgICAgICByZXR1cm4gbURhdGE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmE1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGaWxlQTNEIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBwdWJsaWMgZW51bSBDbGFzc0lEIHsKKworICAgICAgICBVTktOT1dOLAorICAgICAgICBNRVNILAorICAgICAgICBUWVBFLAorICAgICAgICBFTEVNRU5ULAorICAgICAgICBBTExPQ0FUSU9OLAorICAgICAgICBQUk9HUkFNX1ZFUlRFWCwKKyAgICAgICAgUFJPR1JBTV9SQVNURVIsCisgICAgICAgIFBST0dSQU1fRlJBR01FTlQsCisgICAgICAgIFBST0dSQU1fU1RPUkUsCisgICAgICAgIFNBTVBMRVIsCisgICAgICAgIEFOSU1BVElPTiwKKyAgICAgICAgTElHSFQsCisgICAgICAgIEFEQVBURVJfMUQsCisgICAgICAgIEFEQVBURVJfMkQsCisgICAgICAgIFNDUklQVF9DOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NJRCB0b0NsYXNzSUQoaW50IGludElEKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NJRC52YWx1ZXMoKVtpbnRJRF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIG9ubHkgY2xhc3Mgd2l0aCBpbmRleCBlbnRyaWVzCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleEVudHJ5IHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgU3RyaW5nIG1OYW1lOworICAgICAgICBDbGFzc0lEIG1DbGFzc0lEOworICAgICAgICBCYXNlT2JqIG1Mb2FkZWRPYmo7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzSUQgZ2V0Q2xhc3NJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2xhc3NJRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCYXNlT2JqIGdldE9iamVjdCgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgQmFzZU9iaiBvYmogPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgQmFzZU9iaiBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEluZGV4RW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgIGlmKGVudHJ5Lm1Mb2FkZWRPYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5tTG9hZGVkT2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihlbnRyeS5tQ2xhc3NJRCA9PSBDbGFzc0lELlVOS05PV04pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9iamVjdElEID0gcnMubkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoZW50cnkubUlELCBlbnRyeS5tSW5kZXgpOworICAgICAgICAgICAgaWYob2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5Lm1DbGFzc0lEKSB7CisgICAgICAgICAgICBjYXNlIE1FU0g6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBNZXNoKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBUeXBlKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DQVRJT046CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgUHJvZ3JhbVZlcnRleChvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0FNUExFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMSUdIVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8xRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8yRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0NSSVBUX0M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmoudXBkYXRlRnJvbU5hdGl2ZSgpOworCisgICAgICAgICAgICByZXR1cm4gZW50cnkubUxvYWRlZE9iajsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4RW50cnkoUmVuZGVyU2NyaXB0IHJzLCBpbnQgaW5kZXgsIGludCBpZCwgU3RyaW5nIG5hbWUsIENsYXNzSUQgY2xhc3NJRCkgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNsYXNzSUQgPSBjbGFzc0lEOworICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleEVudHJ5W10gbUZpbGVFbnRyaWVzOworCisgICAgRmlsZUEzRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RW50cmllcygpIHsKKyAgICAgICAgaW50IG51bUZpbGVFbnRyaWVzID0gbVJTLm5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1JRCk7CisgICAgICAgIGlmKG51bUZpbGVFbnRyaWVzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlRW50cmllcyA9IG5ldyBJbmRleEVudHJ5W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtudW1GaWxlRW50cmllc107CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlRW50cmllc107CisKKyAgICAgICAgbVJTLm5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1JRCwgbnVtRmlsZUVudHJpZXMsIGlkcywgbmFtZXMpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICAgICAgbUZpbGVFbnRyaWVzW2ldID0gbmV3IEluZGV4RW50cnkobVJTLCBpLCBtSUQsIG5hbWVzW2ldLCBDbGFzc0lELnRvQ2xhc3NJRChpZHNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgeworICAgICAgICBpZihtRmlsZUVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4RW50cnkgZ2V0SW5kZXhFbnRyeShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYoZ2V0TnVtSW5kZXhFbnRyaWVzKCkgPT0gMCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbUZpbGVFbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllc1tpbmRleF07CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBGaWxlQTNEIGNyZWF0ZUZyb21SZXNvdXJjZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIGludCBpZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBpcyA9IHJlcy5vcGVuUmF3UmVzb3VyY2UoaWQsIHZhbHVlKTsKKworICAgICAgICAgICAgaW50IGFzc2V0ID0gKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCk7CisKKyAgICAgICAgICAgIGludCBmaWxlSWQgPSBycy5uRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShhc3NldCk7CisKKyAgICAgICAgICAgIGlmKGZpbGVJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9hZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlQTNEIGZhM2QgPSBuZXcgRmlsZUEzRChmaWxlSWQsIHJzKTsKKyAgICAgICAgICAgIGZhM2QuaW5pdEVudHJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYTNkOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZWE5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0MiB7CisgICAgcHVibGljIEZsb2F0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQzIHsKKyAgICBwdWJsaWMgRmxvYXQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBmbG9hdCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzAzZTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDQgeworICAgIHB1YmxpYyBGbG9hdDQoKSB7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGZsb2F0IHo7CisgICAgcHVibGljIGZsb2F0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjg4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRm9udCBleHRlbmRzIEJhc2VPYmogeworCisgICAgRm9udChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRwaSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpbnQgZm9udElkID0gcnMubkZvbnRDcmVhdGVGcm9tRmlsZShmaWxlTmFtZSwgc2l6ZSwgZHBpKTsKKworICAgICAgICAgICAgaWYoZm9udElkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMb2FkIGxvYWRpbmcgYSBmb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250IHJzRm9udCA9IG5ldyBGb250KGZvbnRJZCwgcnMpOworCisgICAgICAgICAgICByZXR1cm4gcnNGb250OworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDIgeworICAgIHB1YmxpYyBJbnQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNzUwOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDMgeworICAgIHB1YmxpYyBJbnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmYzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQ0IHsKKyAgICBwdWJsaWMgSW50NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworICAgIHB1YmxpYyBpbnQgejsKKyAgICBwdWJsaWMgaW50IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nMiB7CisgICAgcHVibGljIExvbmcyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzMgeworICAgIHB1YmxpYyBMb25nMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDI3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzQgeworICAgIHB1YmxpYyBMb25nNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKKyAgICBwdWJsaWMgbG9uZyB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCmluZGV4IDRiNWU2MWIuLjk5ZDIzZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKQEAgLTUxLDYgKzUxLDU3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1hdCwgMCwgc3JjLCAwLCA0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisgICAgICAgIG1NYXRbMF0gPSBjOworICAgICAgICBtTWF0WzFdID0gLXM7CisgICAgICAgIG1NYXRbMl0gPSBzOworICAgICAgICBtTWF0WzNdID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbM10gPSB5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4MmYgbGhzLCBNYXRyaXgyZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHJoc19paiA9IHJocy5nZXQoaSxqKTsKKyAgICAgICAgICAgICAgICByaTAgKz0gbGhzLmdldChqLDApICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMSArPSBsaHMuZ2V0KGosMSkgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KE1hdHJpeDJmIHJocykgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRNdWx0aXBseSh0aGlzLCByaHMpOworICAgICAgICBsb2FkKHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbMV07CisgICAgICAgIG1NYXRbMV0gPSBtTWF0WzJdOworICAgICAgICBtTWF0WzJdID0gdGVtcDsKKyAgICB9CisKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQppbmRleCAxOWQ3YjQzLi45NjFiYzVkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCkBAIC01Nyw2ICs1NywxMjQgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWF0LCAwLCBzcmMsIDAsIDkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKworICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydCh4KnggKyB5KnkgKyB6KnopOworICAgICAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICAgICAgICAgIGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gbGVuOworICAgICAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgICAgICB9CisgICAgICAgIGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgICAgIGZsb2F0IHh5ID0geCAqIHk7CisgICAgICAgIGZsb2F0IHl6ID0geSAqIHo7CisgICAgICAgIGZsb2F0IHp4ID0geiAqIHg7CisgICAgICAgIGZsb2F0IHhzID0geCAqIHM7CisgICAgICAgIGZsb2F0IHlzID0geSAqIHM7CisgICAgICAgIGZsb2F0IHpzID0geiAqIHM7CisgICAgICAgIG1NYXRbMF0gPSB4KngqbmMgKyAgYzsKKyAgICAgICAgbU1hdFszXSA9ICB4eSpuYyAtIHpzOworICAgICAgICBtTWF0WzZdID0gIHp4Km5jICsgeXM7CisgICAgICAgIG1NYXRbMV0gPSAgeHkqbmMgKyB6czsKKyAgICAgICAgbU1hdFs0XSA9IHkqeSpuYyArICBjOworICAgICAgICBtTWF0WzldID0gIHl6Km5jIC0geHM7CisgICAgICAgIG1NYXRbMl0gPSAgengqbmMgLSB5czsKKyAgICAgICAgbU1hdFs2XSA9ICB5eipuYyArIHhzOworICAgICAgICBtTWF0WzhdID0geip6Km5jICsgIGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworICAgICAgICBtTWF0WzBdID0gYzsKKyAgICAgICAgbU1hdFsxXSA9IC1zOworICAgICAgICBtTWF0WzNdID0gczsKKyAgICAgICAgbU1hdFs0XSA9IGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzRdID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbNF0gPSB5OworICAgICAgICBtTWF0WzhdID0gejsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbNl0gPSB4OworICAgICAgICBtTWF0WzddID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4M2YgbGhzLCBNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByaHNfaWogPSByaHMuZ2V0KGksaik7CisgICAgICAgICAgICAgICAgcmkwICs9IGxocy5nZXQoaiwwKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTEgKz0gbGhzLmdldChqLDEpICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMiArPSBsaHMuZ2V0KGosMikgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgICAgIHNldChpLDIsIHJpMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBseShNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkTXVsdGlwbHkodGhpcywgcmhzKTsKKyAgICAgICAgbG9hZCh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCAzOyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjMgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqMyArIGpdID0gbU1hdFtqKjMgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqMyArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCmluZGV4IGViZDViZGUuLjVmZmMyMWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKQEAgLTE3OSw2ICsxNzksODUgQEAKICAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CiAgICAgICAgIG11bHRpcGx5KHRtcCk7CiAgICAgfQorICAgIHByaXZhdGUgZmxvYXQgY29tcHV0ZUNvZmFjdG9yKGludCBpLCBpbnQgaikgeworICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgIGludCBjMSA9IChpKzIpICUgNDsKKyAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgIGludCByMSA9IChqKzIpICUgNDsKKyAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgIGZsb2F0IG1pbm9yID0gKG1NYXRbYzAgKyA0KnIwXSAqIChtTWF0W2MxICsgNCpyMV0gKiBtTWF0W2MyICsgNCpyMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMl0gKiBtTWF0W2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgLSAobU1hdFtjMCArIDQqcjFdICogKG1NYXRbYzEgKyA0KnIwXSAqIG1NYXRbYzIgKyA0KnIyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIyXSAqIG1NYXRbYzIgKyA0KnIwXSkpCisgICAgICAgICAgICAgICAgICAgICArIChtTWF0W2MwICsgNCpyMl0gKiAobU1hdFtjMSArIDQqcjBdICogbU1hdFtjMiArIDQqcjFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjFdICogbU1hdFtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoKGkraikgJiAxKSAhPSAwID8gLW1pbm9yIDogbWlub3I7CisgICAgICAgIHJldHVybiBjb2ZhY3RvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlKCkgeworCisgICAgICAgIE1hdHJpeDRmIHJlc3VsdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tTWF0WzQqaSArIGpdID0gY29tcHV0ZUNvZmFjdG9yKGksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG90IHByb2R1Y3Qgb2YgMHRoIGNvbHVtbiBvZiBzb3VyY2UgYW5kIDB0aCByb3cgb2YgcmVzdWx0CisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzFdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbMl0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFszXTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbU1hdFtpXSA9IHJlc3VsdC5tTWF0W2ldICogZGV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52ZXJzZVRyYW5zcG9zZSgpIHsKKworICAgICAgICBNYXRyaXg0ZiByZXN1bHQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubU1hdFs0KmogKyBpXSA9IGNvbXB1dGVDb2ZhY3RvcihpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzRdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbOF0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFsxMl07CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIG1NYXRbaV0gPSByZXN1bHQubU1hdFtpXSAqIGRldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjQgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqNCArIGpdID0gbU1hdFtqKjQgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMjMxOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCkBAIC0wLDAgKzEsNDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTWVzaCBleHRlbmRzIEJhc2VPYmogeworCisgICAgQWxsb2NhdGlvbltdIG1WZXJ0ZXhCdWZmZXJzOworICAgIEFsbG9jYXRpb25bXSBtSW5kZXhCdWZmZXJzOworICAgIFByaW1pdGl2ZVtdIG1QcmltaXRpdmVzOworCisgICAgTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VmVydGV4QWxsb2NhdGlvbkNvdW50KCkgeworICAgICAgICBpZihtVmVydGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnMubGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFByaW1pdGl2ZUNvdW50KCkgeworICAgICAgICBpZihtSW5kZXhCdWZmZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0SW5kZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzW3Nsb3RdOworICAgIH0KKyAgICBwdWJsaWMgUHJpbWl0aXZlIGdldFByaW1pdGl2ZShpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVByaW1pdGl2ZXNbc2xvdF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdnR4Q291bnQgPSBtUlMubk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtSUQpOworICAgICAgICBpbnQgaWR4Q291bnQgPSBtUlMubk1lc2hHZXRJbmRleENvdW50KG1JRCk7CisKKyAgICAgICAgaW50W10gdnR4SURzID0gbmV3IGludFt2dHhDb3VudF07CisgICAgICAgIGludFtdIGlkeElEcyA9IG5ldyBpbnRbaWR4Q291bnRdOworICAgICAgICBpbnRbXSBwcmltaXRpdmVzID0gbmV3IGludFtpZHhDb3VudF07CisKKyAgICAgICAgbVJTLm5NZXNoR2V0VmVydGljZXMobUlELCB2dHhJRHMsIHZ0eENvdW50KTsKKyAgICAgICAgbVJTLm5NZXNoR2V0SW5kaWNlcyhtSUQsIGlkeElEcywgcHJpbWl0aXZlcywgdnR4Q291bnQpOworCisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bdnR4Q291bnRdOworICAgICAgICBtSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25baWR4Q291bnRdOworICAgICAgICBtUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbaWR4Q291bnRdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2dHhDb3VudDsgaSArKykgeworICAgICAgICAgICAgaWYodnR4SURzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKHZ0eElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaWR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKGlkeElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKGlkeElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXJzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2ldID0gUHJpbWl0aXZlLnZhbHVlcygpW3ByaW1pdGl2ZXNbaV1dOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgICAgICBjbGFzcyBFbnRyeSB7CisgICAgICAgICAgICBUeXBlIHQ7CisgICAgICAgICAgICBFbGVtZW50IGU7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworICAgICAgICBWZWN0b3IgbUluZGV4VHlwZXM7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gbnVsbDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoVHlwZSB0LCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IHQ7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gMDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBlOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSBzaXplOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgeworICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOworICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFsbG9jSUQgPSAoYWxsb2MgPT0gbnVsbCkgPyAwIDogYWxsb2MuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlc1tjdF0gPSBlbnRyeS5wcmltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBiLm1WZXJ0ZXhUeXBlc1tjdF07CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGVudHJ5LnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kVmVydGV4KGlkLCBhbGxvYy5nZXRJRCgpLCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBhbGxvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld01lc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIE1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbGxvY2F0aW9uQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgQWxsb2NhdGlvbiBhOworICAgICAgICAgICAgUHJpbWl0aXZlIHByaW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7CisKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7CisgICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOworICAgICAgICAgICAgbUluZGV4VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5hID0gYTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IGE7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5hID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQWxsb2NhdGlvbkJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGVudHJ5LmEgPT0gbnVsbCkgPyAwIDogZW50cnkuYS5nZXRJRCgpOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZEluZGV4KGlkLCBhbGxvY0lELCBlbnRyeS5wcmltLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgZW50cnkuYS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzW2N0XSA9IGVudHJ5LmE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKKyAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKKyAgICAgICAgaW50IG1WdHhDb3VudDsKKyAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOworICAgICAgICBpbnQgbUluZGV4Q291bnQ7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7CisKKyAgICAgICAgZmxvYXQgbU5YID0gMDsKKyAgICAgICAgZmxvYXQgbU5ZID0gMDsKKyAgICAgICAgZmxvYXQgbU5aID0gLTE7CisgICAgICAgIGZsb2F0IG1TMCA9IDA7CisgICAgICAgIGZsb2F0IG1UMCA9IDA7CisgICAgICAgIGZsb2F0IG1SID0gMTsKKyAgICAgICAgZmxvYXQgbUcgPSAxOworICAgICAgICBmbG9hdCBtQiA9IDE7CisgICAgICAgIGZsb2F0IG1BID0gMTsKKworICAgICAgICBpbnQgbVZ0eFNpemU7CisgICAgICAgIGludCBtRmxhZ3M7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOworCisgICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVnR4Q291bnQgPSAwOworICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOworICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKKyAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKKyAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKKyAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworCisgICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgeworICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVMwID0gczsKKyAgICAgICAgICAgIG1UMCA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OWCA9IHg7CisgICAgICAgICAgICBtTlkgPSB5OworICAgICAgICAgICAgbU5aID0gejsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SID0gcjsKKyAgICAgICAgICAgIG1HID0gZzsKKyAgICAgICAgICAgIG1CID0gYjsKKyAgICAgICAgICAgIG1BID0gYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKKyAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8CisgICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZShib29sZWFuIHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIGludCBmbG9hdENvdW50ID0gbVZ0eFNpemU7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzIobVJTKSwgInRleHR1cmUwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOworICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOworICAgICAgICAgICAgc21iLmFkZEluZGV4VHlwZShFbGVtZW50LlUxNihtUlMpLCBtSW5kZXhDb3VudCwgUHJpbWl0aXZlLlRSSUFOR0xFKTsKKworICAgICAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS5kYXRhKG1WdHhEYXRhKTsKKyAgICAgICAgICAgIGlmKHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkuZGF0YShtSW5kZXhEYXRhKTsKKyAgICAgICAgICAgIHNtLmdldEluZGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworCisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKaW5kZXggMTYxNGVjNS4uYjE2ZGFjMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKQEAgLTkxLDggKzkxLDkgQEAKICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2hhZGVyKFN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0U2hhZGVyKFN0cmluZyBzKSB7CiAgICAgICAgICAgICBtU2hhZGVyID0gczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoRWxlbWVudCBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKQEAgLTEyMCwxMiArMTIxLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50Q291bnQrKzsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmVDb3VudChpbnQgY291bnQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgQmFzZVByb2dyYW1CdWlsZGVyIHNldFRleHR1cmVDb3VudChpbnQgY291bnQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICAgICAgLy8gU2hvdWxkIGNoZWNrIGZvciBjb25zaXN0YW50IGFuZCBub24tY29uZmxpY3RpbmcgbmFtZXMuLi4KICAgICAgICAgICAgIGlmKGNvdW50ID49IE1BWF9DT05TVEFOVCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1heCB0ZXh0dXJlIGNvdW50IGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvZ3JhbShQcm9ncmFtIHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCmluZGV4IDVlMDRmMGMuLjA0MDkxYTMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQpAQCAtNjYsNiArNjYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfVEVYVFVSRSA9IDI7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlRW5hYmxlOworICAgICAgICBib29sZWFuIG1WYXJ5aW5nQ29sb3JFbmFibGU7CiAKICAgICAgICAgcHVibGljIGVudW0gRW52TW9kZSB7CiAgICAgICAgICAgICBSRVBMQUNFICgxKSwKQEAgLTEwNiwyMSArMTA3LDI4IEBACiAgICAgICAgICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoRW52TW9kZSBlbnYsIEZvcm1hdCBmbXQsIGludCBzbG90KQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUZXh0dXJlKEVudk1vZGUgZW52LCBGb3JtYXQgZm10LCBpbnQgc2xvdCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICAgICAgaWYoKHNsb3QgPCAwKSB8fCAoc2xvdCA+PSBNQVhfVEVYVFVSRSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNQVhfVEVYVFVSRSBleGNlZWRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TbG90c1tzbG90XSA9IG5ldyBTbG90KGVudiwgZm10KTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTcHJpdGVUZXhDb29yZGluYXRlUmVwbGFjZW1lbnQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVUZXhDb29yZGluYXRlUmVwbGFjZW1lbnQoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VmFyeWluZ0NvbG9yKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtVmFyeWluZ0NvbG9yRW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGNyZWF0ZSgpIHsKICAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaW50W10gdG1wID0gbmV3IGludFtNQVhfVEVYVFVSRSAqIDIgKyAxXTsKKyAgICAgICAgICAgIGludFtdIHRtcCA9IG5ldyBpbnRbTUFYX1RFWFRVUkUgKiAyICsgMl07CiAgICAgICAgICAgICBpZiAobVNsb3RzWzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0bXBbMF0gPSBtU2xvdHNbMF0uZW52Lm1JRDsKICAgICAgICAgICAgICAgICB0bXBbMV0gPSBtU2xvdHNbMF0uZm9ybWF0Lm1JRDsKQEAgLTEzMCw2ICsxMzgsNyBAQAogICAgICAgICAgICAgICAgIHRtcFszXSA9IG1TbG90c1sxXS5mb3JtYXQubUlEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wWzRdID0gbVBvaW50U3ByaXRlRW5hYmxlID8gMSA6IDA7CisgICAgICAgICAgICB0bXBbNV0gPSBtVmFyeWluZ0NvbG9yRW5hYmxlID8gMSA6IDA7CiAgICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1GcmFnbWVudENyZWF0ZSh0bXApOwogICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50IHBmID0gbmV3IFByb2dyYW1GcmFnbWVudChpZCwgbVJTKTsKICAgICAgICAgICAgIHBmLm1UZXh0dXJlQ291bnQgPSBNQVhfVEVYVFVSRTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKaW5kZXggNTZmOWJmNC4uNmZjOWZmZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKQEAgLTI2LDIzICsyNiwzNCBAQAogICoKICAqKi8KIHB1YmxpYyBjbGFzcyBQcm9ncmFtUmFzdGVyIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBwdWJsaWMgZW51bSBDdWxsTW9kZSB7CisgICAgICAgIEJBQ0sgKDApLAorICAgICAgICBGUk9OVCAoMSksCisgICAgICAgIE5PTkUgKDIpOworCisgICAgICAgIGludCBtSUQ7CisgICAgICAgIEN1bGxNb2RlKGludCBpZCkgeworICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIH0KKyAgICB9CisKICAgICBib29sZWFuIG1Qb2ludFNtb290aDsKICAgICBib29sZWFuIG1MaW5lU21vb3RoOwogICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlOwotICAgIGZsb2F0IG1Qb2ludFNpemU7CiAgICAgZmxvYXQgbUxpbmVXaWR0aDsKLSAgICBFbGVtZW50IG1JbjsKLSAgICBFbGVtZW50IG1PdXQ7CisgICAgQ3VsbE1vZGUgbUN1bGxNb2RlOwogCiAgICAgUHJvZ3JhbVJhc3RlcihpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBzdXBlcihycyk7CiAgICAgICAgIG1JRCA9IGlkOwogCi0gICAgICAgIG1Qb2ludFNpemUgPSAxLjBmOwogICAgICAgICBtTGluZVdpZHRoID0gMS4wZjsKICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CiAgICAgICAgIG1MaW5lU21vb3RoID0gZmFsc2U7CiAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGZhbHNlOworCisgICAgICAgIG1DdWxsTW9kZSA9IEN1bGxNb2RlLkJBQ0s7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGZsb2F0IHcpIHsKQEAgLTUxLDUxICs2Miw0MyBAQAogICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgobUlELCB3KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcykgeworICAgIHB1YmxpYyB2b2lkIHNldEN1bGxNb2RlKEN1bGxNb2RlIG0pIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1Qb2ludFNpemUgPSBzOwotICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUobUlELCBzKTsKKyAgICAgICAgbUN1bGxNb2RlID0gbTsKKyAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUobUlELCBtLm1JRCk7CiAgICAgfQogCi0gICAgdm9pZCBpbnRlcm5hbEluaXQoKSB7Ci0gICAgICAgIGludCBpbklEID0gMDsKLSAgICAgICAgaW50IG91dElEID0gMDsKLSAgICAgICAgaWYgKG1JbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbklEID0gbUluLm1JRDsKLSAgICAgICAgfQotICAgICAgICBpZiAobU91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRJRCA9IG1PdXQubUlEOwotICAgICAgICB9Ci0gICAgICAgIG1JRCA9IG1SUy5uUHJvZ3JhbVJhc3RlckNyZWF0ZShpbklELCBvdXRJRCwgbVBvaW50U21vb3RoLCBtTGluZVNtb290aCwgbVBvaW50U3ByaXRlKTsKLSAgICB9Ci0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIFByb2dyYW1SYXN0ZXIgbVBSOworICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CisgICAgICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50IGluLCBFbGVtZW50IG91dCkgeworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgcnMpOworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmVTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0KICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBQcm9ncmFtUmFzdGVyIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBiLm1QUi5pbnRlcm5hbEluaXQoKTsKLSAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBiLm1QUjsKLSAgICAgICAgICAgIGIubVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgYi5tUlMpOworICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1SYXN0ZXJDcmVhdGUoYi5tUG9pbnRTbW9vdGgsIGIubUxpbmVTbW9vdGgsIGIubVBvaW50U3ByaXRlKTsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBuZXcgUHJvZ3JhbVJhc3RlcihpZCwgcnMpOwogICAgICAgICAgICAgcmV0dXJuIHByOwogICAgICAgICB9CiAKQEAgLTExMSwzICsxMTQsNCBAQAogCiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQppbmRleCA2OWJlMjQ1NC4uYTkyY2JiNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCkBAIC0xMTQsMjggKzExNCwzMyBAQAogCiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXB0aEZ1bmMoRGVwdGhGdW5jIGZ1bmMpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVwdGhGdW5jKERlcHRoRnVuYyBmdW5jKSB7CiAgICAgICAgICAgICBtRGVwdGhGdW5jID0gZnVuYzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlcHRoTWFzayhib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbURlcHRoTWFzayA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKSB7CiAgICAgICAgICAgICBtQ29sb3JNYXNrUiA9IHI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrRyA9IGc7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQiA9IGI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CiAgICAgICAgICAgICBtQmxlbmRTcmMgPSBzcmM7CiAgICAgICAgICAgICBtQmxlbmREc3QgPSBkc3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERpdGhlckVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREaXRoZXJFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1EaXRoZXIgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVN0b3JlIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CkBAIC0xNDcsMTcgKzE1MiwxNyBAQAogICAgICAgICAgICAgaWYgKGIubU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgb3V0SUQgPSBiLm1PdXQubUlEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCZWdpbihpbklELCBvdXRJRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tBKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURpdGhlcihiLm1EaXRoZXIpOwogCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtU3RvcmVDcmVhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVN0b3JlKGlkLCBycyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQppbmRleCAxYjE1NWQ3Li5lYzM3N2UyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQpAQCAtNDcsOCArNDcsOSBAQAogICAgICAgICAgICAgbVJTID0gcnM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlTWF0cml4RW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRleHR1cmVNYXRyaXhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBjcmVhdGUoKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQppbmRleCBhOTM1MjQzLi40ZWViNGQzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKQEAgLTY4LDEwICs2OCwxMSBAQAogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0U3VyZmFjZShpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpOworICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RmluaXNoKCk7CiAKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShpbnQgcGZzKTsKKyAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IHBmcyk7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZik7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChpbnQgcGYpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIoaW50IHByKTsKQEAgLTgyLDYgKzgzLDcgQEAKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7CiAKICAgICBuYXRpdmUgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSk7CisgICAgbmF0aXZlIFN0cmluZyBuR2V0TmFtZShpbnQgb2JqKTsKICAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveShpbnQgaWQpOwogICAgIG5hdGl2ZSB2b2lkIG5PYmpEZXN0cm95T09CKGludCBpZCk7CiAgICAgbmF0aXZlIGludCAgbkZpbGVPcGVuKGJ5dGVbXSBuYW1lKTsKQEAgLTg5LDEyICs5MSwxNSBAQAogCiAgICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKICAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBuYXRpdmUgdm9pZCBuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSk7CisgICAgbmF0aXZlIHZvaWQgbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpOwogCiAgICAgbmF0aXZlIHZvaWQgblR5cGVCZWdpbihpbnQgZWxlbWVudElEKTsKICAgICBuYXRpdmUgdm9pZCBuVHlwZUFkZChpbnQgZGltLCBpbnQgdmFsKTsKICAgICBuYXRpdmUgaW50ICBuVHlwZUNyZWF0ZSgpOwogICAgIG5hdGl2ZSB2b2lkIG5UeXBlRmluYWxEZXN0cm95KFR5cGUgdCk7CiAgICAgbmF0aXZlIHZvaWQgblR5cGVTZXR1cEZpZWxkcyhUeXBlIHQsIGludFtdIHR5cGVzLCBpbnRbXSBiaXRzLCBGaWVsZFtdIElEcyk7CisgICAgbmF0aXZlIHZvaWQgblR5cGVHZXROYXRpdmVEYXRhKGludCBpZCwgaW50W10gdHlwZURhdGEpOwogCiAgICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVUeXBlZChpbnQgdHlwZSk7CiAgICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CkBAIC0xMTYsNiArMTIxLDE0IEBACiAgICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25SZWFkKGludCBpZCwgZmxvYXRbXSBkKTsKICAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CiAgICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOworICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uR2V0VHlwZShpbnQgaWQpOworCisgICAgbmF0aXZlIGludCAgbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGFzc2V0U3RyZWFtKTsKKyAgICBuYXRpdmUgaW50ICBuRmlsZUEzREdldE51bUluZGV4RW50cmllcyhpbnQgZmlsZUEzRCk7CisgICAgbmF0aXZlIHZvaWQgbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoaW50IGZpbGVBM0QsIGludCBudW1FbnRyaWVzLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBuYXRpdmUgaW50ICBuRmlsZUEzREdldEVudHJ5QnlJbmRleChpbnQgZmlsZUEzRCwgaW50IGluZGV4KTsKKworICAgIG5hdGl2ZSBpbnQgIG5Gb250Q3JlYXRlRnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CiAKICAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpOwogICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKQEAgLTEzNCwzNiArMTQ3LDMyIEBACiAgICAgbmF0aXZlIGludCAgbkFkYXB0ZXIyRENyZWF0ZSgpOwogCiAgICAgbmF0aXZlIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckNvbG9yKGludCBzY3JpcHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckRlcHRoKGludCBzY3JpcHQsIGZsb2F0IGRlcHRoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGludCBzY3JpcHQsIGludCBzdGVuY2lsKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VHlwZShpbnQgdHlwZSwgYm9vbGVhbiB3cml0YWJsZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Um9vdChib29sZWFuIGlzUm9vdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldEludm9rYWJsZShTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdEludm9rZVYoaW50IGlkLCBpbnQgc2xvdCwgYnl0ZVtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckYoaW50IGlkLCBpbnQgc2xvdCwgZmxvYXQgdmFsKTsKKyAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKIAogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQmVnaW4oKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q1NldFNjcmlwdChieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKICAgICBuYXRpdmUgaW50ICBuU2NyaXB0Q0NyZWF0ZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lSTMyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lRihTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwogCiAgICAgbmF0aXZlIHZvaWQgblNhbXBsZXJCZWdpbigpOwogICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKTsKICAgICBuYXRpdmUgaW50ICBuU2FtcGxlckNyZWF0ZSgpOwogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYyk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUNvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpOworICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIGludCAgblByb2dyYW1TdG9yZUNyZWF0ZSgpOwogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoaW50IGluLCBpbnQgb3V0LCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOworICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CiAgICAgbmF0aXZlIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IHByLCBmbG9hdCB2KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShpbnQgcHIsIGZsb2F0IHYpOworICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IHByLCBpbnQgbW9kZSk7CiAKICAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRDb25zdGFudHMoaW50IHB2LCBpbnQgc2xvdCwgaW50IG1JRCk7CiAgICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpOwpAQCAtMTgyLDkgKzE5MSwxMyBAQAogICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldENvbG9yKGludCBsLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKICAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRQb3NpdGlvbihpbnQgbCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CiAKLSAgICBuYXRpdmUgaW50ICBuU2ltcGxlTWVzaENyZWF0ZShpbnQgYmF0Y2hJRCwgaW50IGlkeElELCBpbnRbXSB2dHhJRCwgaW50IHByaW0pOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZEluZGV4KGludCBpZCwgaW50IGFsbG9jKTsKKyAgICBuYXRpdmUgaW50ICBuTWVzaENyZWF0ZShpbnQgdnR4Q291bnQsIGludCBpbmRleENvdW50KTsKKyAgICBuYXRpdmUgdm9pZCBuTWVzaEJpbmRWZXJ0ZXgoaW50IGlkLCBpbnQgYWxsb2MsIGludCBzbG90KTsKKyAgICBuYXRpdmUgdm9pZCBuTWVzaEJpbmRJbmRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KTsKKyAgICBuYXRpdmUgaW50ICBuTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KGludCBpZCk7CisgICAgbmF0aXZlIGludCAgbk1lc2hHZXRJbmRleENvdW50KGludCBpZCk7CisgICAgbmF0aXZlIHZvaWQgbk1lc2hHZXRWZXJ0aWNlcyhpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpOworICAgIG5hdGl2ZSB2b2lkIG5NZXNoR2V0SW5kaWNlcyhpbnQgaWQsIGludFtdIGlkeElkcywgaW50W10gcHJpbWl0aXZlcywgaW50IHZ0eElkQ291bnQpOwogCiAgICAgbmF0aXZlIHZvaWQgbkFuaW1hdGlvbkJlZ2luKGludCBhdHRyaWJDb3VudCwgaW50IGtleWZyYW1lQ291bnQpOwogICAgIG5hdGl2ZSB2b2lkIG5BbmltYXRpb25BZGQoZmxvYXQgdGltZSwgZmxvYXRbXSBhdHRyaWJzKTsKQEAgLTE5NSwxMyArMjA4LDI1IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcm90ZWN0ZWQgTWVzc2FnZVRocmVhZCBtTWVzc2FnZVRocmVhZDsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VODsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX1UxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kzMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfRjMyOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9JODsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0JPT0xFQU47CisKKyAgICBFbGVtZW50IG1FbGVtZW50X0VMRU1FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9UWVBFOworICAgIEVsZW1lbnQgbUVsZW1lbnRfQUxMT0NBVElPTjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1NBTVBMRVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9TQ1JJUFQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NRVNIOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fVkVSVEVYOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1NUT1JFOwogCiAgICAgRWxlbWVudCBtRWxlbWVudF9BXzg7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JfNTY1OwpAQCAtMjEwLDEzICsyMzUsMTcgQEAKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfNDQ0NDsKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfODg4ODsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfSU5ERVhfMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9QT1NJVElPTl8yOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X1RFWFRVUkVfMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X05PUk1BTF8zOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfQ09MT1JfVThfNDsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX0YzMl80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzM7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfVUNIQVJfNDsKKworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLwpAQCAtMjgyLDcgKzMxMSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLm1JRCA9IG1zZzsKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgbXNnICIgKyBtc2cgKyAiIHYxICIgKyByYnVmWzBdICsgIiB2MiAiICsgcmJ1ZlsxXSArICIgdjMgIiArcmJ1ZlsyXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBleGl0aW5nLiIpOwogICAgICAgICB9CkBAIC0zMDcsNiArMzM1LDEwIEBACiAgICAgICAgIG5Db250ZXh0RHVtcChiaXRzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG5Db250ZXh0RmluaXNoKCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKICAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudCgpOwpAQCAtMzM1LDMgKzM2Nyw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKaW5kZXggZDFkZjIzZC4uZTkwYjRmYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQpAQCAtNzQsOSArNzQsOSBAQAogICAgICAgICBuQ29udGV4dEJpbmRSb290U2NyaXB0KHNhZmVJRChzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgcCkgeworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHNhZmVJRChwKSk7CisgICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShzYWZlSUQocCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KFByb2dyYW1GcmFnbWVudCBwKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCmluZGV4IDQwYmE3MjIuLmRhODNkMDQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCkBAIC01MSw2ICs1MSw4NiBAQAogICAgICAgICBtSUQgPSBpZDsKICAgICB9CiAKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVA7CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTkVBUkVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX0xJTkVBUl9NSVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9ORUFSRVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSX01JUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIFZhbHVlIG1NaW47CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQppbmRleCA1N2NjZmEzLi5kOWFlYzU5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKQEAgLTQyLDYgKzQyLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2UoaW50IHNsb3QpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRJbnZva2UobUlELCBzbG90KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2UoaW50IHNsb3QsIEZpZWxkUGFja2VyIHYpIHsKKyAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRJbnZva2VWKG1JRCwgc2xvdCwgdi5nZXREYXRhKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRJbnZva2UobUlELCBzbG90KTsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgU2NyaXB0KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIHN1cGVyKHJzKTsKICAgICAgICAgbUlEID0gaWQ7CkBAIC00OSwyMiArNjIsMjcgQEAKIAogICAgIHB1YmxpYyB2b2lkIGJpbmRBbGxvY2F0aW9uKEFsbG9jYXRpb24gdmEsIGludCBzbG90KSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgaWYgKHZhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIDAsIHNsb3QpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyQ29sb3IobUlELCByLCBnLCBiLCBhKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBmbG9hdCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyRihtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckRlcHRoKGZsb2F0IGQpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJEZXB0aChtSUQsIGQpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGludCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhclN0ZW5jaWwoaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKG1JRCwgc3RlbmNpbCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgYm9vbGVhbiB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2ID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIEZpZWxkUGFja2VyIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJWKG1JRCwgaW5kZXgsIHYuZ2V0RGF0YSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShTdHJpbmcgdGltZVpvbmUpIHsKQEAgLTc4LDcyICs5Niw1NCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtSXNSb290ID0gZmFsc2U7Ci0gICAgICAgIFR5cGVbXSBtVHlwZXM7Ci0gICAgICAgIFN0cmluZ1tdIG1OYW1lczsKLSAgICAgICAgYm9vbGVhbltdIG1Xcml0YWJsZTsKLSAgICAgICAgaW50IG1JbnZva2FibGVDb3VudCA9IDA7Ci0gICAgICAgIEludm9rYWJsZVtdIG1JbnZva2FibGVzOwogCiAgICAgICAgIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1UeXBlcyA9IG5ldyBUeXBlW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdbTUFYX1NMT1RdOwotICAgICAgICAgICAgbVdyaXRhYmxlID0gbmV3IGJvb2xlYW5bTUFYX1NMT1RdOwotICAgICAgICAgICAgbUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW01BWF9TTE9UXTsKICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgU3RyaW5nIG5hbWUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZva2FibGUgYWRkSW52b2thYmxlKFN0cmluZyBmdW5jKSB7Ci0gICAgICAgICAgICBJbnZva2FibGUgaSA9IG5ldyBJbnZva2FibGUoKTsKLSAgICAgICAgICAgIGkubU5hbWUgPSBmdW5jOwotICAgICAgICAgICAgaS5tUlMgPSBtUlM7Ci0gICAgICAgICAgICBpLm1TbG90ID0gbUludm9rYWJsZUNvdW50OwotICAgICAgICAgICAgbUludm9rYWJsZXNbbUludm9rYWJsZUNvdW50KytdID0gaTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShib29sZWFuIHdyaXRhYmxlLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyQ3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRSb290KG1Jc1Jvb3QpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1UeXBlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBpZihtVHlwZXNbY3RdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRUeXBlKG1UeXBlc1tjdF0ubUlELCBtV3JpdGFibGVbY3RdLCBtTmFtZXNbY3RdLCBjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0SW52b2thYmxlKG1JbnZva2FibGVzW2N0XS5tTmFtZSwgY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2Zlck9iamVjdChTY3JpcHQgcykgewotICAgICAgICAgICAgcy5tSXNSb290ID0gbUlzUm9vdDsKLSAgICAgICAgICAgIHMubVR5cGVzID0gbVR5cGVzOwotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbbUludm9rYWJsZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XSA9IG1JbnZva2FibGVzW2N0XTsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XS5tU2NyaXB0ID0gczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um9vdChib29sZWFuIHIpIHsKLSAgICAgICAgICAgIG1Jc1Jvb3QgPSByOwotICAgICAgICB9Ci0KICAgICB9CiAKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRCYXNlIHsKKyAgICAgICAgcHJvdGVjdGVkIEVsZW1lbnQgbUVsZW1lbnQ7CisgICAgICAgIHByb3RlY3RlZCBUeXBlIG1UeXBlOworICAgICAgICBwcm90ZWN0ZWQgQWxsb2NhdGlvbiBtQWxsb2NhdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFJlbmRlclNjcmlwdCBycywgaW50IGRpbXgpIHsKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgbUVsZW1lbnQsIGRpbXgpOworICAgICAgICAgICAgbVR5cGUgPSBtQWxsb2NhdGlvbi5nZXRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRmllbGRCYXNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy9AT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQWxsb2NhdGlvbigpIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLyoKKyAgICAgICAgcHVibGljIGNsYXNzIFNjcmlwdEZpZWxkX1VzZXJGaWVsZAorICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TY3JpcHQuRmllbGRCYXNlIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkCisKKyAgICAgICAgfQorCisgICAgICAgICovCisKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKaW5kZXggYmI5OWUyMy4uNTk1OWJlNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKQEAgLTM3LDExICszNyw0OSBAQAogICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBTY3JpcHRDKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQsIGJvb2xlYW4gaXNSb290KSB7CisgICAgICAgIHN1cGVyKDAsIHJzKTsKKyAgICAgICAgbUlEID0gaW50ZXJuYWxDcmVhdGUocnMsIHJlc291cmNlcywgcmVzb3VyY2VJRCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgYnl0ZVtdIHBnbTsKKyAgICAgICAgaW50IHBnbUxlbmd0aDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlKHJlc291cmNlSUQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwZ20gPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICBwZ21MZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVtwZ20ubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBnbSwgMCwgYnVmMiwgMCwgcGdtLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZ20gPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChwZ20sIHBnbUxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZ21MZW5ndGggKz0gYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBycy5uU2NyaXB0Q0JlZ2luKCk7CisgICAgICAgIHJzLm5TY3JpcHRDU2V0U2NyaXB0KHBnbSwgMCwgcGdtTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJzLm5TY3JpcHRDQ3JlYXRlKCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2NyaXB0LkJ1aWxkZXIgewogICAgICAgICBieXRlW10gbVByb2dyYW07CiAgICAgICAgIGludCBtUHJvZ3JhbUxlbmd0aDsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4gbUludERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxGbG9hdD4gbUZsb2F0RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBzdXBlcihycyk7CkBAIC05Miw2NiArMTMwLDIwIEBACiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTY3JpcHRDIGludGVybmFsQ3JlYXRlKEJ1aWxkZXIgYikgewogICAgICAgICAgICAgYi5tUlMublNjcmlwdENCZWdpbigpOwotICAgICAgICAgICAgYi50cmFuc2ZlckNyZWF0ZSgpOwogCi0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxJbnRlZ2VyPiBlOiBiLm1JbnREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUkzMihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxGbG9hdD4gZTogYi5tRmxvYXREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUYoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmZsb2F0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAibGVuID0gIiArIGIubVByb2dyYW1MZW5ndGgpOwogICAgICAgICAgICAgYi5tUlMublNjcmlwdENTZXRTY3JpcHQoYi5tUHJvZ3JhbSwgMCwgYi5tUHJvZ3JhbUxlbmd0aCk7CiAKICAgICAgICAgICAgIGludCBpZCA9IGIubVJTLm5TY3JpcHRDQ3JlYXRlKCk7CiAgICAgICAgICAgICBTY3JpcHRDIG9iaiA9IG5ldyBTY3JpcHRDKGlkLCBiLm1SUyk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyT2JqZWN0KG9iaik7Ci0KICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICAgICAgbUludERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgZmllbGRzIGZvciBhIGNsYXNzLCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoY2wuZ2V0RmllbGRzKCksIChNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLlBVQkxJQyksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIGZpZWxkcyBmb3IgYW4gb2JqZWN0LCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoby5nZXRDbGFzcygpLmdldEZpZWxkcygpLCBNb2RpZmllci5QVUJMSUMsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGZvciAoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChmLmdldE1vZGlmaWVycygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdCA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEludChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0RmxvYXQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSB3YW50IHRoaXMgbG9nPwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZpbmVzIHNraXBwaW5nIGZpZWxkICIgKyBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7fQorICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3Qgbykge30KIAogICAgICAgICBwdWJsaWMgU2NyaXB0QyBjcmVhdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDcmVhdGUodGhpcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY4MDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDIgeworICAgIHB1YmxpYyBTaG9ydDIoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MyB7CisgICAgcHVibGljIFNob3J0MygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKKyAgICBwdWJsaWMgc2hvcnQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQ0IHsKKyAgICBwdWJsaWMgU2hvcnQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworICAgIHB1YmxpYyBzaG9ydCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMTdhOS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNZXNoIGV4dGVuZHMgQmFzZU9iaiB7Ci0gICAgVHlwZVtdIG1WZXJ0ZXhUeXBlczsKLSAgICBUeXBlIG1JbmRleFR5cGU7Ci0gICAgLy9UeXBlIG1CYXRjaGVUeXBlOwotICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0gICAgU2ltcGxlTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJpbmRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgobUlELCBhLm1JRCwgc2xvdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZEluZGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRJbmRleChtSUQsIGEubUlEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1WZXJ0ZXhUeXBlc1tzbG90XSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlSW5kZXhBbGxvY2F0aW9uKCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtSW5kZXhUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRWZXJ0ZXhUeXBlKGludCBzbG90KSB7Ci0gICAgICAgIHJldHVybiBtVmVydGV4VHlwZXNbc2xvdF07Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0SW5kZXhUeXBlKCkgewotICAgICAgICByZXR1cm4gbUluZGV4VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotCi0gICAgICAgIGNsYXNzIEVudHJ5IHsKLSAgICAgICAgICAgIFR5cGUgdDsKLSAgICAgICAgICAgIEVsZW1lbnQgZTsKLSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOwotICAgICAgICBFbnRyeSBtSW5kZXhUeXBlOwotICAgICAgICAvL0VudHJ5IG1CYXRjaFR5cGU7Ci0gICAgICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShUeXBlIHQpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IHQ7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnQgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5lID0gZTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmltaXRpdmUoUHJpbWl0aXZlIHApIHsKLSAgICAgICAgICAgIG1QcmltaXRpdmUgPSBwOwotICAgICAgICB9Ci0KLQotICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOwotICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2ltcGxlTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgVHlwZVtdIHRvRGVzdHJveSA9IG5ldyBUeXBlWzE4XTsKLSAgICAgICAgICAgIGludCB0b0Rlc3Ryb3lDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGludCBpbmRleElEID0gMDsKLSAgICAgICAgICAgIGlmIChiLm1JbmRleFR5cGUudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYi5tSW5kZXhUeXBlLnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIGIubUluZGV4VHlwZS50ID0gYi5uZXdUeXBlKGIubUluZGV4VHlwZS5lLCBiLm1JbmRleFR5cGUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50W10gSURzID0gbmV3IGludFtiLm1WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmIChiLm1WZXJ0ZXhUeXBlc1tjdF0udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElEc1tjdF0gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udC5tSUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYi5tVmVydGV4VHlwZXNbY3RdLnQgPSBiLm5ld1R5cGUoYi5tVmVydGV4VHlwZXNbY3RdLmUsIGIubVZlcnRleFR5cGVzW2N0XS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgdG9EZXN0cm95W3RvRGVzdHJveUNvdW50KytdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uU2ltcGxlTWVzaENyZWF0ZSgwLCBpbmRleElELCBJRHMsIGIubVByaW1pdGl2ZS5tSUQpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IHRvRGVzdHJveUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgdG9EZXN0cm95W2N0XS5kZXN0cm95KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlTWVzaChpZCwgcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKLSAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlcyA9IG5ldyBUeXBlW21WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzbS5tVmVydGV4VHlwZXNbY3RdID0gbVZlcnRleFR5cGVzW2N0XS50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc20ubUluZGV4VHlwZSA9IG1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIHNtLm1QcmltaXRpdmUgPSBtUHJpbWl0aXZlOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKLSAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKLSAgICAgICAgaW50IG1WdHhDb3VudDsKLSAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOwotICAgICAgICBpbnQgbUluZGV4Q291bnQ7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7Ci0KLSAgICAgICAgZmxvYXQgbU5YID0gMDsKLSAgICAgICAgZmxvYXQgbU5ZID0gMDsKLSAgICAgICAgZmxvYXQgbU5aID0gLTE7Ci0gICAgICAgIGZsb2F0IG1TMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1UMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1SID0gMTsKLSAgICAgICAgZmxvYXQgbUcgPSAxOwotICAgICAgICBmbG9hdCBtQiA9IDE7Ci0gICAgICAgIGZsb2F0IG1BID0gMTsKLQotICAgICAgICBpbnQgbVZ0eFNpemU7Ci0gICAgICAgIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOwotCi0gICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVnR4Q291bnQgPSAwOwotICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOwotICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKLSAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKLSAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgewotICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMyk7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVMwID0gczsKLSAgICAgICAgICAgIG1UMCA9IHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OWCA9IHg7Ci0gICAgICAgICAgICBtTlkgPSB5OwotICAgICAgICAgICAgbU5aID0gejsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SID0gcjsKLSAgICAgICAgICAgIG1HID0gZzsKLSAgICAgICAgICAgIG1CID0gYjsKLSAgICAgICAgICAgIG1BID0gYTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKLSAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAotICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKLSAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSwgImNvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlRFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiksICJ0ZXh0dXJlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLk5PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSwgIm5vcm1hbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVsZW1lbnQgPSBiLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBCdWlsZGVyIHNtYiA9IG5ldyBCdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBzbWIuYWRkVmVydGV4VHlwZShtRWxlbWVudCwgbVZ0eENvdW50IC8gZmxvYXRDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0SW5kZXhUeXBlKEVsZW1lbnQuY3JlYXRlSW5kZXgobVJTKSwgbUluZGV4Q291bnQpOwotICAgICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuVFJJQU5HTEUpOwotICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKLQotICAgICAgICAgICAgQWxsb2NhdGlvbiB2ZXJ0ZXhBbGxvYyA9IHNtLmNyZWF0ZVZlcnRleEFsbG9jYXRpb24oMCk7Ci0gICAgICAgICAgICBBbGxvY2F0aW9uIGluZGV4QWxsb2MgPSBzbS5jcmVhdGVJbmRleEFsbG9jYXRpb24oKTsKLSAgICAgICAgICAgIHNtLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHZlcnRleEFsbG9jLCAwKTsKLSAgICAgICAgICAgIHNtLmJpbmRJbmRleEFsbG9jYXRpb24oaW5kZXhBbGxvYyk7Ci0KLSAgICAgICAgICAgIHZlcnRleEFsbG9jLmRhdGEobVZ0eERhdGEpOwotICAgICAgICAgICAgdmVydGV4QWxsb2MudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKLQotICAgICAgICAgICAgaW5kZXhBbGxvYy5kYXRhKG1JbmRleERhdGEpOwotICAgICAgICAgICAgaW5kZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKaW5kZXggNjJkMzg2Ny4uOGU0NWYyYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKQEAgLTE2LDcgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAorCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtMTA4LDQ4ICsxMTAsMzAgQEAKICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUpIHsKLSAgICAgICAgRWxlbWVudCBlID0gRWxlbWVudC5jcmVhdGVGcm9tQ2xhc3MocnMsIGMpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycywgZSk7Ci0gICAgICAgIGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgVHlwZSB0ID0gYi5jcmVhdGUoKTsKLSAgICAgICAgZS5kZXN0cm95KCk7CisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICAvLyBXZSBoYXZlIDYgaW50ZWdlciB0byBvYnRhaW4gbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAgICAgLy8gbURpbUxPRDsgbURpbUZhY2VzOyBtRWxlbWVudDsKKyAgICAgICAgaW50W10gZGF0YUJ1ZmZlciA9IG5ldyBpbnRbNl07CisgICAgICAgIG1SUy5uVHlwZUdldE5hdGl2ZURhdGEobUlELCBkYXRhQnVmZmVyKTsKIAotICAgICAgICAvLyBuYXRpdmUgZmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGludFtdIGFyVHlwZXMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICAgICAgaW50W10gYXJCaXRzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKKyAgICAgICAgbURpbVggPSBkYXRhQnVmZmVyWzBdOworICAgICAgICBtRGltWSA9IGRhdGFCdWZmZXJbMV07CisgICAgICAgIG1EaW1aID0gZGF0YUJ1ZmZlclsyXTsKKyAgICAgICAgbURpbUxPRCA9IGRhdGFCdWZmZXJbM10gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbURpbUZhY2VzID0gZGF0YUJ1ZmZlcls0XSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwogCi0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgZmllbGRzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIEZpZWxkIGYgPSBmaWVsZHNbY3RdOwotICAgICAgICAgICAgICAgIENsYXNzIGZjID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMTYubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMTY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF84Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAzMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJzLm5UeXBlU2V0dXBGaWVsZHModCwgYXJUeXBlcywgYXJCaXRzLCBmaWVsZHMpOworICAgICAgICBpbnQgZWxlbWVudElEID0gZGF0YUJ1ZmZlcls1XTsKKyAgICAgICAgaWYoZWxlbWVudElEICE9IDApIHsKKyAgICAgICAgICAgIG1FbGVtZW50ID0gbmV3IEVsZW1lbnQobVJTLCBlbGVtZW50SUQpOworICAgICAgICAgICAgbUVsZW1lbnQudXBkYXRlRnJvbU5hdGl2ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHQubUphdmFDbGFzcyA9IGM7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBjYWxjRWxlbWVudENvdW50KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMsIGludCBzaXplLCBTdHJpbmcgc2NyaXB0TmFtZSkgewotICAgICAgICBUeXBlIHQgPSBjcmVhdGVGcm9tQ2xhc3MocnMsIGMsIHNpemUpOwotICAgICAgICB0LnNldE5hbWUoc2NyaXB0TmFtZSk7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoIlJlbmRlclNjcmlwdCIsICJDYWxsaW5nIGRlcHJpY2F0ZWQgY3JlYXRlRnJvbUNsYXNzIik7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2Q1N2ZhLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4NDJmMy4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IzZiB7Ci0gICAgcHVibGljIFZlY3RvcjNmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmQ5NTkuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICBwdWJsaWMgZmxvYXQgejsKLSAgICBwdWJsaWMgZmxvYXQgdzsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKaW5kZXggNDVjYzcyZS4uODk2OGRmYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKKysrIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKQEAgLTg1LDYgKzg1LDE0IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKK25Db250ZXh0RmluaXNoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CisKK3N0YXRpYyB2b2lkCiBuQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKQEAgLTk2LDYgKzEwNCwxNyBAQAogICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKHN0ciwgY3B0ciwgSk5JX0FCT1JUKTsKIH0KIAorc3RhdGljIGpzdHJpbmcKK25HZXROYW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgibkdldE5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgIHJzR2V0TmFtZShjb24sICh2b2lkICopb2JqLCAmbmFtZSk7CisgICAgcmV0dXJuIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lKTsKK30KKwogc3RhdGljIHZvaWQKIG5PYmpEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCiB7CkBAIC0yODksNiArMzA4LDQ2IEBACiAgICAgcmV0dXJuIChqaW50KWlkOwogfQogCitzdGF0aWMgdm9pZAorbkVsZW1lbnRHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpZCwgamludEFycmF5IF9lbGVtZW50RGF0YSkKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfZWxlbWVudERhdGEpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5FbGVtZW50R2V0TmF0aXZlRGF0YSwgY29uKCVwKSIsIGNvbik7CisKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgYXNzZXJ0KGRhdGFTaXplID09IDUpOworCisgICAgdWludDMyX3QgZWxlbWVudERhdGFbNV07CisgICAgcnNFbGVtZW50R2V0TmF0aXZlRGF0YShjb24sIChSc0VsZW1lbnQpaWQsIGVsZW1lbnREYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9lbGVtZW50RGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZlbGVtZW50RGF0YVtpXSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldFN1YkVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpZCwgamludEFycmF5IF9JRHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCit7CisgICAgaW50IGRhdGFTaXplID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX0lEcyk7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXRTdWJFbGVtZW50cywgY29uKCVwKSIsIGNvbik7CisKKyAgICB1aW50MzJfdCAqaWRzID0gKHVpbnQzMl90ICopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGNvbnN0IGNoYXIgKipuYW1lcyA9IChjb25zdCBjaGFyICoqKW1hbGxvYygodWludDMyX3QpZGF0YVNpemUgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisKKyAgICByc0VsZW1lbnRHZXRTdWJFbGVtZW50cyhjb24sIChSc0VsZW1lbnQpaWQsIGlkcywgbmFtZXMsICh1aW50MzJfdClkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lc1tpXSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfSURzLCBpLCAxLCAoY29uc3QgamludCopJmlkc1tpXSk7CisgICAgfQorCisgICAgZnJlZShpZHMpOworICAgIGZyZWUobmFtZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZApAQCAtMzE1LDYgKzM3NCwyNiBAQAogICAgIHJldHVybiAoamludClyc1R5cGVDcmVhdGUoY29uKTsKIH0KIAorc3RhdGljIHZvaWQKK25UeXBlR2V0TmF0aXZlRGF0YShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaWQsIGppbnRBcnJheSBfdHlwZURhdGEpCit7CisgICAgLy8gV2UgYXJlIHBhY2tpbmcgNiBpdGVtczogbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgaW50IGVsZW1lbnRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF90eXBlRGF0YSk7CisKKyAgICBhc3NlcnQoZWxlbWVudENvdW50ID09IDYpOworCisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOworCisgICAgdWludDMyX3QgdHlwZURhdGFbNl07CisgICAgcnNUeXBlR2V0TmF0aXZlRGF0YShjb24sIChSc1R5cGUpaWQsIHR5cGVEYXRhLCA2KTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZWxlbWVudENvdW50OyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF90eXBlRGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZ0eXBlRGF0YVtpXSk7CisgICAgfQorfQorCiBzdGF0aWMgdm9pZCAqIFNGX0xvYWRJbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQogewogICAgICgoaW50MzJfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRJbnRGaWVsZChfb2JqLCBfZmllbGQpOwpAQCAtNzAwLDYgKzc3OSw3OCBAQAogICAgIGZyZWUoYnVmQWxsb2MpOwogfQogCitzdGF0aWMgamludAorbkFsbG9jYXRpb25HZXRUeXBlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhKQoreworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5BbGxvY2F0aW9uR2V0VHlwZSwgY29uKCVwKSwgYSglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYSk7CisgICAgcmV0dXJuIChqaW50KSByc0FsbG9jYXRpb25HZXRUeXBlKGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZpbGVBM0QpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisKKyAgICBpbnQzMl90IG51bUVudHJpZXMgPSAwOworICAgIHJzRmlsZUEzREdldE51bUluZGV4RW50cmllcyhjb24sICZudW1FbnRyaWVzLCAoUnNGaWxlKWZpbGVBM0QpOworICAgIHJldHVybiBudW1FbnRyaWVzOworfQorCitzdGF0aWMgdm9pZAorbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZpbGVBM0QsIGppbnQgbnVtRW50cmllcywgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfZW50cmllcykKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisKKyAgICBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcyA9IChSc0ZpbGVJbmRleEVudHJ5KiltYWxsb2MoKHVpbnQzMl90KW51bUVudHJpZXMgKiBzaXplb2YoUnNGaWxlSW5kZXhFbnRyeSkpOworCisgICAgcnNGaWxlQTNER2V0SW5kZXhFbnRyaWVzKGNvbiwgZmlsZUVudHJpZXMsICh1aW50MzJfdCludW1FbnRyaWVzLCAoUnNGaWxlKWZpbGVBM0QpOworCisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChfZW50cmllcywgaSwgX2Vudi0+TmV3U3RyaW5nVVRGKGZpbGVFbnRyaWVzW2ldLm9iamVjdE5hbWUpKTsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZmaWxlRW50cmllc1tpXS5jbGFzc0lEKTsKKyAgICB9CisKKyAgICBmcmVlKGZpbGVFbnRyaWVzKTsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZpbGVBM0QsIGppbnQgaW5kZXgpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzREdldEVudHJ5QnlJbmRleChjb24sICh1aW50MzJfdClpbmRleCwgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQKK25Gb250Q3JlYXRlRnJvbUZpbGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIGZpbGVOYW1lLCBqaW50IGZvbnRTaXplLCBqaW50IGRwaSkKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZVVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVOYW1lLCBOVUxMKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZvbnRDcmVhdGVGcm9tRmlsZShjb24sIGZpbGVOYW1lVVRGLCBmb250U2l6ZSwgZHBpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtODU0LDI5ICsxMDA1LDMzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgciwgamZsb2F0IGcsIGpmbG9hdCBiLCBqZmxvYXQgYSkKK25TY3JpcHRTZXRWYXJJKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamludCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldENsZWFyQ29sb3IsIGNvbiglcCksIHMoJXApLCByKCVmKSwgZyglZiksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHIsIGcsIGIsIGEpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJDb2xvcihjb24sIChSc1NjcmlwdClzY3JpcHQsIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJJKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhckRlcHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGpmbG9hdCBkKQorblNjcmlwdFNldFZhckYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBmbG9hdCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhckRlcHRoLCBjb24oJXApLCBzKCVwKSwgZGVwdGgoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgZCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhckRlcHRoKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgZCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckksIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVpKSwgYiglZiksIGEoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKIG5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQogewpAQCAtODk1LDM2ICsxMDUwLDYgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRUeXBlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqYm9vbGVhbiB3cml0YWJsZSwganN0cmluZyBfc3RyLCBqaW50IHNsb3QpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGRUeXBlLCBjb24oJXApLCB0eXBlKCVwKSwgd3JpdGFibGUoJWkpLCBzbG90KCVpKSIsIGNvbiwgKFJzVHlwZSl0eXBlLCB3cml0YWJsZSwgc2xvdCk7Ci0gICAgY29uc3QgY2hhciogbiA9IE5VTEw7Ci0gICAgaWYgKF9zdHIpIHsKLSAgICAgICAgbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKF9zdHIsIE5VTEwpOwotICAgIH0KLSAgICByc1NjcmlwdFNldFR5cGUoY29uLCAoUnNUeXBlKXR5cGUsIHNsb3QsIHdyaXRhYmxlLCBuKTsKLSAgICBpZiAobikgewotICAgICAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoX3N0ciwgbik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotblNjcmlwdFNldEludm9rZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgX3N0ciwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRTZXRJbnZva2UsIGNvbiglcCkiLCBjb24pOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRJbnZva2UoY29uLCBuLCBzbG90KTsKLSAgICBpZiAobikgewotICAgICAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoX3N0ciwgbik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAogblNjcmlwdEludm9rZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgb2JqLCBqaW50IHNsb3QpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CkBAIC05MzMsMTMgKzEwNTgsMTcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRSb290KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gaXNSb290KQorblNjcmlwdEludm9rZVYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBqYnl0ZUFycmF5IGRhdGEpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRSb290LCBjb24oJXApLCBpc1Jvb3QoJWkpIiwgY29uLCBpc1Jvb3QpOwotICAgIHJzU2NyaXB0U2V0Um9vdChjb24sIGlzUm9vdCk7CisgICAgTE9HX0FQSSgiblNjcmlwdEludm9rZVYsIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QpOworICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CisgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOworICAgIHJzU2NyaXB0SW52b2tlVihjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHB0ciwgbGVuKTsKKyAgICBfZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCBKTklfQUJPUlQpOwogfQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCkBAIC0xMDAyLDgzICsxMTMxLDYzIEBACiAgICAgcmV0dXJuIChqaW50KXJzU2NyaXB0Q0NyZWF0ZShjb24pOwogfQogCi1zdGF0aWMgdm9pZAotblNjcmlwdENBZGREZWZpbmVJMzIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIG5hbWUsIGppbnQgdmFsdWUpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgY29uc3QgY2hhciogbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkRGVmaW5lSTMyLCBjb24oJXApIG5hbWUoJXMpIHZhbHVlKCVkKSIsIGNvbiwgbiwgdmFsdWUpOwotICAgIHJzU2NyaXB0Q1NldERlZmluZUkzMihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIG5hbWUsIGpmbG9hdCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVGLCBjb24oJXApIG5hbWUoJXMpIHZhbHVlKCVmKSIsIGNvbiwgbiwgdmFsdWUpOwotICAgIHJzU2NyaXB0Q1NldERlZmluZUYoY29uLCBuLCB2YWx1ZSk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG4pOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQpCituUHJvZ3JhbVN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApIiwgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVCZWdpbiwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApIiwgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgcnNQcm9ncmFtU3RvcmVCZWdpbihjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZnVuYykKK25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZ1bmMpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jLCBjb24oJXApLCBmdW5jKCVpKSIsIGNvbiwgZnVuYyk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGVwdGhGdW5jLCBjb24oJXApLCBmdW5jKCVpKSIsIGNvbiwgZnVuYyk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aEZ1bmMoY29uLCAoUnNEZXB0aEZ1bmMpZnVuYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzaywgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHIsIGpib29sZWFuIGcsIGpib29sZWFuIGIsIGpib29sZWFuIGEpCituUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2ssIGNvbiglcCksIHIoJWkpLCBnKCVpKSwgYiglaSksIGEoJWkpIiwgY29uLCByLCBnLCBiLCBhKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGNvbiwgciwgZywgYiwgYSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOworICAgIHJzUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGNvbiwgciwgZywgYiwgYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBpbnQgc3JjLCBpbnQgZHN0KQorblByb2dyYW1TdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGludCBzcmMsIGludCBkc3QpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jLCBjb24oJXApLCBzcmMoJWkpLCBkc3QoJWkpIiwgY29uLCBzcmMsIGRzdCk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhjb24sIChSc0JsZW5kU3JjRnVuYylzcmMsIChSc0JsZW5kRHN0RnVuYylkc3QpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJsZW5kRnVuYyhjb24sIChSc0JsZW5kU3JjRnVuYylzcmMsIChSc0JsZW5kRHN0RnVuYylkc3QpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQorblByb2dyYW1TdG9yZURpdGhlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIsIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihjb24sIGVuYWJsZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKKyAgICByc1Byb2dyYW1TdG9yZURpdGhlcihjb24sIGVuYWJsZSk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblByb2dyYW1TdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKIAotICAgIHJldHVybiAoamludClyc1Byb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKGNvbik7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVN0b3JlQ3JlYXRlKGNvbik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE3MSwyMSArMTI4MCwxMiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaW4sIGppbnQgb3V0LAotICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gcG9pbnRTbW9vdGgsIGpib29sZWFuIGxpbmVTbW9vdGgsIGpib29sZWFuIHBvaW50U3ByaXRlKQorblByb2dyYW1SYXN0ZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSwgcG9pbnRTbW9vdGgoJWkpLCBsaW5lU21vb3RoKCVpKSwgcG9pbnRTcHJpdGUoJWkpIiwKLSAgICAgICAgICAgIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7Ci0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0LCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOwotfQotCi1zdGF0aWMgdm9pZAotblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwciwgamZsb2F0IHYpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUsIGNvbiglcCksIHZwZiglcCksIHZhbHVlKCVmKSIsIGNvbiwgKFJzUHJvZ3JhbVJhc3Rlcil2cHIsIHYpOwotICAgIHJzUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cHIsIHYpOworICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyQ3JlYXRlLCBjb24oJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAorICAgICAgICAgICAgY29uLCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOworICAgIHJldHVybiAoamludClyc1Byb2dyYW1SYXN0ZXJDcmVhdGUoY29uLCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTE5Myw3ICsxMjkzLDE1IEBACiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgsIGNvbiglcCksIHZwZiglcCksIHZhbHVlKCVmKSIsIGNvbiwgKFJzUHJvZ3JhbVJhc3Rlcil2cHIsIHYpOwotICAgIHJzUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cHIsIHYpOworICAgIHJzUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKK30KKworc3RhdGljIHZvaWQKK25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwciwgamludCB2KQoreworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUsIGNvbiglcCksIHZwZiglcCksIHZhbHVlKCVpKSIsIGNvbiwgKFJzUHJvZ3JhbVJhc3Rlcil2cHIsIHYpOworICAgIHJzUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKGNvbiwgKFJzUHJvZ3JhbVJhc3Rlcil2cHIsIChSc0N1bGxNb2RlKXYpOwogfQogCiAKQEAgLTEyMDgsMTEgKzEzMTYsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZnMpCituQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUpcGZzKTsKLSAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOworICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1TdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CisgICAgcnNDb250ZXh0QmluZFByb2dyYW1TdG9yZShjb24sIChSc1Byb2dyYW1TdG9yZSlwZnMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTMxOSwzMiArMTQyNyw4NCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uU2ltcGxlTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYmF0Y2hJRCwgamludCBpbmRleElELCBqaW50QXJyYXkgdnR4SURzLCBqaW50IHByaW1JRCkKK25NZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2dHhDb3VudCwgamludCBpZHhDb3VudCkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHZ0eElEcyk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hDcmVhdGUsIGNvbiglcCksIGJhdGNoSUQoJWkpLCBpbmRleElEKCVpKSwgdnR4SURzLmxlbiglaSksIHByaW1JRCglaSkiLAotICAgICAgICAgICAgY29uLCBiYXRjaElELCBpbmRleElELCBsZW4sIHByaW1JRCk7Ci0gICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyh2dHhJRHMsIE5VTEwpOwotICAgIGludCBpZCA9IChpbnQpcnNTaW1wbGVNZXNoQ3JlYXRlKGNvbiwgKHZvaWQgKiliYXRjaElELCAodm9pZCAqKWluZGV4SUQsICh2b2lkICoqKXB0ciwgbGVuLCBwcmltSUQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgcHRyLCAwLypKTklfQUJPUlQqLyk7CisgICAgTE9HX0FQSSgibk1lc2hDcmVhdGUsIGNvbiglcCksIHZ0eENvdW50KCVpKSwgaWR4Q291bnQoJWkpIiwgY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOworICAgIGludCBpZCA9IChpbnQpcnNNZXNoQ3JlYXRlKGNvbiwgdnR4Q291bnQsIGlkeENvdW50KTsKICAgICByZXR1cm4gaWQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25NZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBzbG90KQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TaW1wbGVNZXNoQmluZFZlcnRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSwgc2xvdCglaSkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZFZlcnRleChjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CisgICAgTE9HX0FQSSgibk1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICByc01lc2hCaW5kVmVydGV4KGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZEluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzLCBqaW50IGFsbG9jKQorbk1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG1lc2gsIGppbnQgYWxsb2MsIGppbnQgcHJpbUlELCBqaW50IHNsb3QpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kSW5kZXgsIGNvbiglcCksIFNpbXBsZU1lc2goJXApLCBBbGxvYyglcCkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZEluZGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICByc01lc2hCaW5kSW5kZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHByaW1JRCwgc2xvdCk7Cit9CisKK3N0YXRpYyBqaW50CituTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBtZXNoKQoreworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgdnR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KGNvbiwgKFJzTWVzaCltZXNoLCAmdnR4Q291bnQpOworICAgIHJldHVybiB2dHhDb3VudDsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0SW5kZXhDb3VudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbWVzaCkKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuTWVzaEdldEluZGV4Q291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgaWR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldEluZGV4Q291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZpZHhDb3VudCk7CisgICAgcmV0dXJuIGlkeENvdW50OworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRWZXJ0aWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbWVzaCwgamludEFycmF5IF9pZHMsIGludCBudW1WdHhJRHMpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtVnR4SURzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHJzTWVzaEdldFZlcnRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsICh1aW50MzJfdCludW1WdHhJRHMpOworCisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBudW1WdHhJRHM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgIH0KKworICAgIGZyZWUoYWxsb2NzKTsKK30KKworc3RhdGljIHZvaWQKK25NZXNoR2V0SW5kaWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbWVzaCwgamludEFycmF5IF9pZHhJZHMsIGppbnRBcnJheSBfcHJpbWl0aXZlcywgaW50IG51bUluZGljZXMpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtSW5kaWNlcyAqIHNpemVvZihSc0FsbG9jYXRpb24pKTsKKyAgICB1aW50MzJfdCAqcHJpbXM9ICh1aW50MzJfdCopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICByc01lc2hHZXRJbmRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsIHByaW1zLCAodWludDMyX3QpbnVtSW5kaWNlcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkeElkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfcHJpbWl0aXZlcywgaSwgMSwgKGNvbnN0IGppbnQqKSZwcmltc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworICAgIGZyZWUocHJpbXMpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNjEsNiArMTUyMSw3IEBACiB7Im5EZXZpY2VTZXRDb25maWciLCAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZVNldENvbmZpZyB9LAogeyJuQ29udGV4dENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCiB7Im5Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJuQ29udGV4dEZpbmlzaCIsICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCiB7Im5Db250ZXh0U2V0UHJpb3JpdHkiLCAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAogeyJuQ29udGV4dFNldFN1cmZhY2UiLCAgICAgICAgICAgICAiKElJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAogeyJuQ29udGV4dERlc3Ryb3kiLCAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVzdHJveSB9LApAQCAtMTM2OCw2ICsxNTI5LDcgQEAKIHsibkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFBhdXNlIH0sCiB7Im5Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRSZXN1bWUgfSwKIHsibkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQXNzaWduTmFtZSB9LAoreyJuR2V0TmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgICAgICAgICAgICAgICAodm9pZCopbkdldE5hbWUgfSwKIHsibk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAogeyJuT2JqRGVzdHJveU9PQiIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95T09CIH0sCiB7Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCkBAIC0xMzc1LDE1ICsxNTM3LDI0IEBACiB7Im5Db250ZXh0RGVpbml0VG9DbGllbnQiLCAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZWluaXRUb0NsaWVudCB9LAogCiB7Im5GaWxlT3BlbiIsICAgICAgICAgICAgICAgICAgICAgICIoW0IpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVPcGVuIH0sCit7Im5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIiwgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJuRmlsZUEzREdldE51bUluZGV4RW50cmllcyIsICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIH0sCit7Im5GaWxlQTNER2V0SW5kZXhFbnRyaWVzIiwgICAgICAgICIoSUlbSVtMamF2YS9sYW5nL1N0cmluZzspViIsICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEluZGV4RW50cmllcyB9LAoreyJuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0RW50cnlCeUluZGV4IH0sCisKK3sibkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKUkiLCAgICAgICAgICAgICAodm9pZCopbkZvbnRDcmVhdGVGcm9tRmlsZSB9LAogCiB7Im5FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKIHsibkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihbSVtMamF2YS9sYW5nL1N0cmluZzspSSIsICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKK3sibkVsZW1lbnRHZXROYXRpdmVEYXRhIiwgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50R2V0TmF0aXZlRGF0YSB9LAoreyJuRWxlbWVudEdldFN1YkVsZW1lbnRzIiwgICAgICAgICIoSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgICh2b2lkKiluRWxlbWVudEdldFN1YkVsZW1lbnRzIH0sCiAKIHsiblR5cGVCZWdpbiIsICAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUJlZ2luIH0sCiB7Im5UeXBlQWRkIiwgICAgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVBZGQgfSwKIHsiblR5cGVDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUNyZWF0ZSB9LAogeyJuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCiB7Im5UeXBlU2V0dXBGaWVsZHMiLCAgICAgICAgICAgICAgICIoTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7W0lbSVtMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7KVYiLCAodm9pZCopblR5cGVTZXR1cEZpZWxkcyB9LAoreyJuVHlwZUdldE5hdGl2ZURhdGEiLCAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUdldE5hdGl2ZURhdGEgfSwKIAogeyJuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkIiwgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQgfSwKIHsibkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwIiwgICAgIihJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAgfSwKQEAgLTE0MDIsNiArMTU3Myw3IEBACiB7Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKIHsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAogeyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7Im5BbGxvY2F0aW9uR2V0VHlwZSIsICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uR2V0VHlwZX0sCiAKIHsibkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQmluZEFsbG9jYXRpb24gfSwKIHsibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU2V0Q29uc3RyYWludCB9LApAQCAtMTQyMCwyOCArMTU5MiwyNCBAQAogeyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKIAogeyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCiB7Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKIHsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7Im5TY3JpcHRJbnZva2VWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3siblNjcmlwdFNldFZhckkiLCAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJuU2NyaXB0U2V0VmFyRiIsICAgICAgICAgICAgICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7Im5TY3JpcHRTZXRWYXJWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhclYgfSwKIAogeyJuU2NyaXB0Q0JlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKIHsiblNjcmlwdENTZXRTY3JpcHQiLCAgICAgICAgICAgICAgIihbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAogeyJuU2NyaXB0Q0NyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCi17Im5TY3JpcHRDQWRkRGVmaW5lSTMyIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENBZGREZWZpbmVJMzIgfSwKLXsiblNjcmlwdENBZGREZWZpbmVGIiwgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztGKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUYgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7Im5Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJlZ2luIH0sCit7Im5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aE1hc2sgfSwKK3siblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihaWlpaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIH0sCit7Im5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJsZW5kRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEaXRoZXIgfSwKK3siblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ3JlYXRlIH0sCiAKIHsiblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKIHsiblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCkBAIC0xNDUwLDkgKzE2MTgsOSBAQAogeyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIiwgICAgICAgICAiKFtJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKIHsiblByb2dyYW1GcmFnbWVudENyZWF0ZTIiLCAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiB9LAogCi17Im5Qcm9ncmFtUmFzdGVyQ3JlYXRlIiwgICAgICAgICAgICIoSUlaWlopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKLXsiblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZSB9LAoreyJuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKFpaWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlckNyZWF0ZSB9LAogeyJuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCIsICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIH0sCit7Im5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSB9LAogCiB7Im5Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKIHsiblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZTIgfSwKQEAgLTE0NjUsNyArMTYzMyw3IEBACiB7Im5MaWdodFNldFBvc2l0aW9uIiwgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0UG9zaXRpb24gfSwKIAogeyJuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB9LAoreyJuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUiLCAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIH0sCiB7Im5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCIsICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCiB7Im5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgiLCAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAogeyJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKQEAgLTE0NzQsOSArMTY0MiwxNCBAQAogeyJuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyU2V0IH0sCiB7Im5TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJDcmVhdGUgfSwKIAoteyJuU2ltcGxlTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAiKElJW0lJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQ3JlYXRlIH0sCi17Im5TaW1wbGVNZXNoQmluZFZlcnRleCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kVmVydGV4IH0sCi17Im5TaW1wbGVNZXNoQmluZEluZGV4IiwgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kSW5kZXggfSwKK3sibk1lc2hDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaENyZWF0ZSB9LAoreyJuTWVzaEJpbmRWZXJ0ZXgiLCAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZFZlcnRleCB9LAoreyJuTWVzaEJpbmRJbmRleCIsICAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZEluZGV4IH0sCisKK3sibk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCIsICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQgfSwKK3sibk1lc2hHZXRJbmRleENvdW50IiwgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldEluZGV4Q291bnQgfSwKK3sibk1lc2hHZXRWZXJ0aWNlcyIsICAgICAgICAgICAgICAgIihJW0lJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0VmVydGljZXMgfSwKK3sibk1lc2hHZXRJbmRpY2VzIiwgICAgICAgICAgICAgICAgIihJW0lbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldEluZGljZXMgfSwKIAogfTsKIApAQCAtMTUxMCwzICsxNjgzLDQgQEAKIGJhaWw6CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KKwpkaWZmIC0tZ2l0IGEvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YSBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKQEAgLTAsMCArMSwxOTQ3IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICogUG9ydGVkIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBmcm9tIElDVTRKIDQuMidzCisgKiBjb20uaWJtLmljdS50ZXh0LkFyYWJpY1NoYXBpbmcgY2xhc3MuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmljdS50ZXh0OworCisKKy8qKgorICogU2hhcGUgQXJhYmljIHRleHQgb24gYSBjaGFyYWN0ZXIgYmFzaXMuCisgKgorICogPHA+QXJhYmljU2hhcGluZyBwZXJmb3JtcyBiYXNpYyBvcGVyYXRpb25zIGZvciAic2hhcGluZyIgQXJhYmljIHRleHQuIEl0IGlzIG1vc3QKKyAqIHVzZWZ1bCBmb3IgdXNlIHdpdGggbGVnYWN5IGRhdGEgZm9ybWF0cyBhbmQgbGVnYWN5IGRpc3BsYXkgdGVjaG5vbG9neQorICogKHNpbXBsZSB0ZXJtaW5hbHMpLiBBbGwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIFVuaWNvZGUgY2hhcmFjdGVycy48L3A+CisgKgorICogPHA+VGV4dC1iYXNlZCBzaGFwaW5nIG1lYW5zIHRoYXQgc29tZSBjaGFyYWN0ZXIgY29kZSBwb2ludHMgaW4gdGhlIHRleHQgYXJlCisgKiByZXBsYWNlZCBieSBvdGhlcnMgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiBJdCB0cmFuc2Zvcm1zIG9uZSBraW5kIG9mIHRleHQKKyAqIGludG8gYW5vdGhlci4gSW4gY29tcGFyaXNvbiwgbW9kZXJuIGRpc3BsYXlzIGZvciBBcmFiaWMgdGV4dCBzZWxlY3QKKyAqIGFwcHJvcHJpYXRlLCBjb250ZXh0LWRlcGVuZGVudCBmb250IGdseXBocyBmb3IgZWFjaCB0ZXh0IGVsZW1lbnQsIHdoaWNoIG1lYW5zCisgKiB0aGF0IHRoZXkgdHJhbnNmb3JtIHRleHQgaW50byBhIGdseXBoIHZlY3Rvci48L3A+CisgKgorICogPHA+VGV4dCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG5lY2Vzc2FyeSB3aGVuIG1vZGVybiBkaXNwbGF5IHRlY2hub2xvZ3kgaXMgbm90CisgKiBhdmFpbGFibGUgb3Igd2hlbiB0ZXh0IG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIHRvIG9yIGZyb20gbGVnYWN5IGZvcm1hdHMgdGhhdAorICogdXNlICJzaGFwZWQiIGNoYXJhY3RlcnMuIFNpbmNlIHRoZSBBcmFiaWMgc2NyaXB0IGlzIGN1cnNpdmUsIGNvbm5lY3RpbmcKKyAqIGFkamFjZW50IGxldHRlcnMgdG8gZWFjaCBvdGhlciwgY29tcHV0ZXJzIHNlbGVjdCBpbWFnZXMgZm9yIGVhY2ggbGV0dGVyIGJhc2VkCisgKiBvbiB0aGUgc3Vycm91bmRpbmcgbGV0dGVycy4gVGhpcyB1c3VhbGx5IHJlc3VsdHMgaW4gZm91ciBpbWFnZXMgcGVyIEFyYWJpYworICogbGV0dGVyOiBpbml0aWFsLCBtaWRkbGUsIGZpbmFsLCBhbmQgaXNvbGF0ZWQgZm9ybXMuIEluIFVuaWNvZGUsIG9uIHRoZSBvdGhlcgorICogaGFuZCwgbGV0dGVycyBhcmUgbm9ybWFsbHkgc3RvcmVkIGFic3RyYWN0LCBhbmQgYSBkaXNwbGF5IHN5c3RlbSBpcyBleHBlY3RlZAorICogdG8gc2VsZWN0IHRoZSBuZWNlc3NhcnkgZ2x5cGhzLiAoVGhpcyBtYWtlcyBzZWFyY2hpbmcgYW5kIG90aGVyIHRleHQKKyAqIHByb2Nlc3NpbmcgZWFzaWVyIGJlY2F1c2UgdGhlIHNhbWUgbGV0dGVyIGhhcyBvbmx5IG9uZSBjb2RlLikgSXQgaXMgcG9zc2libGUKKyAqIHRvIG1pbWljIHRoaXMgd2l0aCB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGluCisgKiBVbmljb2RlIHRoYXQgYXJlIHJlbmRlcmVkIGFzIGxldHRlcnMgd2l0aCBhIHNwZWNpZmljIHNoYXBlCisgKiAob3IgY3Vyc2l2ZSBjb25uZWN0aXZpdHkpLiBUaGV5IHdlcmUgaW5jbHVkZWQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aAorICogbGVnYWN5IHN5c3RlbXMgYW5kIGNvZGVwYWdlcywgYW5kIGZvciB1bnNvcGhpc3RpY2F0ZWQgZGlzcGxheSBzeXN0ZW1zLjwvcD4KKyAqCisgKiA8cD5BIHNlY29uZCBraW5kIG9mIHRleHQgdHJhbnNmb3JtYXRpb25zIGlzIHN1cHBvcnRlZCBmb3IgQXJhYmljIGRpZ2l0czoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvZGVwYWdlcyB0aGF0IG9ubHkgaW5jbHVkZSBFdXJvcGVhbiBkaWdpdHMsCisgKiBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIG9uZSBzZXQgb2YgZGlnaXRzIGJ5IGFub3RoZXIsIGNoYW5naW5nIHRoZQorICogY2hhcmFjdGVyIGNvZGUgcG9pbnRzLiBUaGVzZSBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgZm9yIGVpdGhlcgorICogQXJhYmljLUluZGljIERpZ2l0cyAoVSswNjYwLi4uVSswNjY5KSBvciBFYXN0ZXJuIChFeHRlbmRlZCkgQXJhYmljLUluZGljCisgKiBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuPC9wPgorICoKKyAqIDxwPlNvbWUgcmVwbGFjZW1lbnRzIG1heSByZXN1bHQgaW4gbW9yZSBvciBmZXdlciBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cykuCisgKiBCeSBkZWZhdWx0LCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBtYXkgcmVjZWl2ZSB0ZXh0IHdpdGggYQorICogbGVuZ3RoIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UgbGVuZ3RoLiBTb21lIGxlZ2FjeSBzeXN0ZW1zIHJlbHkgb24gdGhlCisgKiBsZW5ndGggb2YgdGhlIHRleHQgdG8gYmUgY29uc3RhbnQuIFRoZXkgZXhwZWN0IGV4dHJhIHNwYWNlcyB0byBiZSBhZGRlZAorICogb3IgY29uc3VtZWQgZWl0aGVyIG5leHQgdG8gdGhlIGFmZmVjdGVkIGNoYXJhY3RlciBvciBhdCB0aGUgZW5kIG9mIHRoZQorICogdGV4dC48L3A+CisgKiBAc3RhYmxlIElDVSAyLjAKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQXJhYmljU2hhcGluZyB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3B0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dpY2FsOyAvLyBjb252ZW5pZW5jZQorICAgIHByaXZhdGUgYm9vbGVhbiBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kOworICAgIHByaXZhdGUgY2hhciB0YWlsQ2hhcjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJhYmljU2hhcGluZyBTSEFQRVIgPSBuZXcgQXJhYmljU2hhcGluZygKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5ESUdJVFNfTk9PUCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgc291cmNlIGFycmF5LCBwdXR0aW5nIHRoZSByZXN1bHQKKyAgICAgKiBpbnRvIGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXksIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgICAqIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzb3VyY2VTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5IHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXN1bHQuCisgICAgICogICBJdCBtYXkgYmUgPGNvZGU+TlVMTDwvY29kZT4gb25seSBpZiAgPGNvZGU+ZGVzdFNpemU8L2NvZGU+IGlzIDAuCisgICAgICogQHBhcmFtIGRlc3RTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gdXNlLgorICAgICAqIEBwYXJhbSBkZXN0U2l6ZSBUaGUgc2l6ZSAoY2FwYWNpdHkpIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMCwgdGhlbiBubyBvdXRwdXQgaXMgcHJvZHVjZWQsCisgICAgICogICBidXQgdGhlIG5lY2Vzc2FyeSBidWZmZXIgc2l6ZSBpcyByZXR1cm5lZCAoInByZWZsaWdodGluZyIpLiAgVGhpcworICAgICAqICAgZG9lcyBub3QgdmFsaWRhdGUgdGhlIHRleHQgYWdhaW5zdCB0aGUgb3B0aW9ucywgZm9yIGV4YW1wbGUsCisgICAgICogICBpZiBsZXR0ZXJzIGFyZSBiZWluZyB1bnNoYXBlZCwgYW5kIHNwYWNlcyBhcmUgYmVpbmcgY29uc3VtZWQKKyAgICAgKiAgIGZvbGxvd2luZyBsYW1hbGVmLCB0aGlzIHdpbGwgbm90IGRldGVjdCBhIGxhbWFsZWYgd2l0aG91dCBhCisgICAgICogICBjb3JyZXNwb25kaW5nIHNwYWNlLiAgQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gd2hlbiB0aGUgYWN0dWFsCisgICAgICogICBjb252ZXJzaW9uIGlzIGF0dGVtcHRlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbiB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAqICAgSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGVuIG5vIG91dHB1dCB3YXMgd3JpdHRlbiwgb3IgaXQgbWF5IGJlCisgICAgICogICBpbmNvbXBsZXRlLgorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdFN0YXJ0LCBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2UgY2FuIG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VMZW5ndGggPCAwIHx8IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoID4gc291cmNlLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIHNvdXJjZSBzdGFydCAoIiArIHNvdXJjZVN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3IgbGVuZ3RoICgiICsgc291cmNlTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIHNvdXJjZS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0ID09IG51bGwgJiYgZGVzdFNpemUgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBkZXN0IHJlcXVpcmVzIGRlc3RTaXplID09IDAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRlc3RTaXplICE9IDApICYmCisgICAgICAgICAgICAoZGVzdFN0YXJ0IDwgMCB8fCBkZXN0U2l6ZSA8IDAgfHwgZGVzdFN0YXJ0ICsgZGVzdFNpemUgPiBkZXN0Lmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBkZXN0IHN0YXJ0ICgiICsgZGVzdFN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3Igc2l6ZSAoIiArIGRlc3RTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIGRlc3QubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBWYWxpZGF0ZSBpbnB1dCBvcHRpb25zICovCisgICAgICAgIGlmICggKChvcHRpb25zJlRBU0hLRUVMX01BU0spID4gMCkgJiYKKyAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfRU5EICkgICB8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFU0laRSApfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSApeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgVGFzaGtlZWwgYXJndW1lbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgLy8vQ0xPVkVSOk9GRgorICAgICAgIC8vQWNjb3JkaW5nIHRvIFN0ZXZlbiBMb29taXMsIHRoZSBjb2RlIGlzIHVucmVhY2hhYmxlIHdoZW4geW91IE9SIGFsbCB0aGUgY29uc3RhbnRzIHdpdGhpbiB0aGUgaWYgc3RhdGVtZW50cworICAgICAgIGlmKCgob3B0aW9ucyZMQU1BTEVGX01BU0spID4gMCkmJgorICAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQkVHSU4pICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfRU5EICkgICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0FVVE8pICB8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX05FQVIpKSl7CisgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIExhbSBBbGVmIGFyZ3VtZW50Iik7CisgICAgICAgfQorICAgICAgIC8vL0NMT1ZFUjpPTgorCisgICAgICAgLyogVmFsaWRhdGUgVGFzaGtlZWwgKFRhc2hrZWVsIHJlcGxhY2VtZW50IG9wdGlvbnMgc2hvdWxkIGJlIGVuYWJsZWQgaW4gc2hhcGluZyBtb2RlIG9ubHkpKi8KKyAgICAgICBpZigoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJiAob3B0aW9ucyZMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFzaGtlZWwgcmVwbGFjZW1lbnQgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGluIGRlc2hhcGluZyBtb2RlICIpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gaW50ZXJuYWxTaGFwZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgsIGRlc3QsIGRlc3RTdGFydCwgZGVzdFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHBsYWNlLiAgVGhpcyBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBMZW5ndGggb3B0aW9uCisgICAgICogZG9lcyBub3QgZ3JvdyBvciBzaHJpbmsgdGhlIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlucHV0IHRleHQKKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaGFwZShjaGFyW10gc291cmNlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIkNhbm5vdCBzaGFwZSBpbiBwbGFjZSB3aXRoIGxlbmd0aCBvcHRpb24gcmVzaXplLiIpOworICAgICAgICB9CisgICAgICAgIHNoYXBlKHNvdXJjZSwgc3RhcnQsIGxlbmd0aCwgc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlIG5ldyBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaGFwZShTdHJpbmcgdGV4dCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBjaGFyW10gc3JjID0gdGV4dC50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gZGVzdCA9IHNyYzsKKyAgICAgICAgaWYgKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpICYmCisgICAgICAgICAgICAoKG9wdGlvbnMgJiBMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkpIHsKKworICAgICAgICAgICAgZGVzdCA9IG5ldyBjaGFyW3NyYy5sZW5ndGggKiAyXTsgLy8gbWF4CisgICAgICAgIH0KKyAgICAgICAgaW50IGxlbiA9IHNoYXBlKHNyYywgMCwgc3JjLmxlbmd0aCwgZGVzdCwgMCwgZGVzdC5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlc3QsIDAsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IEFyYWJpY1NoYXBpbmcgdXNpbmcgdGhlIG9wdGlvbnMgZmxhZ3MuCisgICAgICogVGhlIGZsYWdzIGFyZSBhcyBmb2xsb3dzOjxicj4KKyAgICAgKiAnTEVOR1RIJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgY2FuIGNoYW5nZSBzaXplLCBhbmQgaWYgbm90LAorICAgICAqIGhvdyB0byBtYWludGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGV4dCB3aGVuIExhbUFsZWYgbGlnYXR1cmVzIGFyZQorICAgICAqIGZvcm1lZCBvciBicm9rZW4uPGJyPgorICAgICAqICdURVhUX0RJUkVDVElPTicgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHRoZSB0ZXh0IGlzIHJlYWQgYW5kIHdyaXR0ZW4KKyAgICAgKiBpbiB2aXN1YWwgb3JkZXIgb3IgaW4gbG9naWNhbCBvcmRlci48YnI+CisgICAgICogJ0xFVFRFUlNfU0hBUEUnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBjb252ZXJzaW9uIGlzIHRvIG9yIGZyb20KKyAgICAgKiBwcmVzZW50YXRpb24gZm9ybXMuPGJyPgorICAgICAqICdESUdJVFMnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBkaWdpdHMgYXJlIHNoYXBlZCwgYW5kIHdoZXRoZXIgZnJvbQorICAgICAqIEV1cm9wZWFuIHRvIEFyYWJpYy1JbmRpYyBvciB2aWNlLXZlcnNhLjxicj4KKyAgICAgKiAnRElHSVRfVFlQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHN0YW5kYXJkIG9yIGV4dGVuZGVkIEFyYWJpYy1JbmRpYworICAgICAqIGRpZ2l0cyBhcmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGlnaXQgY29udmVyc2lvbi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJhYmljU2hhcGluZyhpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgPiAweDgwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgRElHSVRTIG9wdGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzTG9naWNhbCA9ICggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSA9PSBURVhUX0RJUkVDVElPTl9MT0dJQ0FMICk7CisgICAgICAgIC8qIFZhbGlkYXRlIG9wdGlvbnMgKi8KKyAgICAgICAgc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCA9ICggKG9wdGlvbnMgJiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9NQVNLKSA9PSBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgKTsKKyAgICAgICAgaWYgKCAob3B0aW9ucyZTSEFQRV9UQUlMX1RZUEVfTUFTSykgPT0gU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSl7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE5FV19UQUlMX0NIQVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE9MRF9UQUlMX0NIQVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZWVuIFRhaWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIKKyAgICAgKiAgICAgICAgICAgICAgIHRoZSBTRUVOIGZhbWlseSBjaGFyYWN0ZXIoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikuCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBTZWVuIGNoYXJhY3RlciBmb2xsb3dlZCBieSBUYWlsIGNoYXJhY3RlciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICByZXBsYWNlZCBieSBvbmUgY2VsbCBTZWVuIGFuZCBhIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgVGFpbC4KKyAgICAgKiBBZmZlY3RzOiBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVOX1RXT0NFTExfTkVBUiA9IDB4MjAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBTZWVuIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fTUFTSyA9IDB4NzAwMDAwOworCisgICAgLyogWWVoSGFtemEgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFlFSEhBTVpBIGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIgaXQKKyAgICAgKiAgICAgICAgICAgICAgKGkuZS4gdGhlIHNwYWNlIGFmdGVyIHRoZSBjaGFyYWN0ZXIpCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBZZWggKGZpbmFsIG9yIGlzb2xhdGVkKSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgSGFtemEgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFllaEhhbXphIGFuZCBzcGFjZSB3aWxsIHJlcGxhY2UgdGhlIEhhbXphLgorICAgICAqIEFmZmVjdHM6IFllaEhhbXphIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUhIQU1aQV9UV09DRUxMX05FQVIgID0gMHgxMDAwMDAwOworCisKKyAgICAvKiogQml0IG1hc2sgZm9yIFllaEhhbXphIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX01BU0sgPSAweDM4MDAwMDA7CisKKyAgICAvKiBOZXcgVGFzaGtlZWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIFNwYWNlcyB3aWxsIGJlIHBsYWNlZCBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfQkVHSU4gPSAweDQwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9FTkQgPSAweDYwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVtb3ZlZCwgYnVmZmVyIGxlbmd0aCB3aWxsIHNocmluay4KKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFU0laRSA9IDB4ODAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBUYXR3ZWVsIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBhZGphY2VudAorICAgICAqICAgICAgICAgICAgICAgY2hhcmFjdGVycyAoaS5lLiBzaGFwZWQgb24gVGF0d2VlbCkgb3IgcmVwbGFjZWQgYnkgc3BhY2UgaWYgaXQgaXMgbm90IGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCA9IDB4QzAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFRhc2hrZWVsIHJlcGxhY2VtZW50IHdpdGggU3BhY2Ugb3IgVGF0d2VlbCBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9NQVNLICA9IDB4RTAwMDA7CisKKyAgICAvKiBTcGFjZSBsb2NhdGlvbiBDb250cm9sIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBlZmZlY3RzIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb3B0aW9ucy4gaWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQgdGhlIGRlZmF1bHQKKyAgICAgKiBmb3IgQkVHSU4gYW5kIEVORCB3aWxsIGJlIGFzIGZvbGxvd2luZzoKKyAgICAgKiBUaGUgRGVmYXVsdCAoZm9yIGJvdGggVmlzdWFsIExUUiwgVmlzdWFsIFJUTCBhbmQgTG9naWNhbCBUZXh0KQorICAgICAqICAgICAgICAgICAxLiBCRUdJTiBhbHdheXMgcmVmZXJzIHRvIHRoZSBzdGFydCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKiAgICAgICAgICAgMi4gRU5EIGFsd2F5cyByZWZlcnMgdG8gdGhlIGVuZCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQgaXQgd2lsbCBzd2FwIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb25seSBmb3IgVmlzdWFsIExUUiB0ZXh0LgorICAgICAqCisgICAgICogVGhlIGFmZmVjdCBvbiBCRUdJTiBhbmQgRU5EIE1lbW9yeSBPcHRpb25zIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqICAgIEEuIEJFR0lOIEZvciBWaXN1YWwgTFRSIHRleHQ6IFRoaXMgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIChyaWdodCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQKKyAgICAgKiAgICAgICAoY29ycmVzcG9uZGluZyB0byB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgZW5kLCBzYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEIuIEJFR0lOIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgQkVHSU4gaW4gZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgKiAgICBDLiBFTkQgRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBlbmQgKGxlZnQgc2lkZSkgb2YgdGhlIHZpc3VhbCB0ZXh0LiAoY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGJlZ2lubmluZywgc2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEQuIEVORCBGb3IgTG9naWNhbCB0ZXh0OiBTYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqIEFmZmVjdHM6IEFsbCBMYW1BbGVmIEJFR0lOLCBFTkQgYW5kIEFVVE8gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgPSAweDQwMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIHN3YXBwaW5nIEJFR0lOIGFuZCBFTkQgZm9yIFZpc3VhbCBMVFIgdGV4dCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0sgPSAweDQwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBzaGFwaW5nIHdpbGwgdXNlIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciBUQUlMIChpLmUuIDB4RkU3MykuCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCAoRGVmYXVsdCksIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IGlzIHVzZWQgKGkuZS4gMHgyMDBCKQorICAgICAqIERlLXNoYXBpbmcgd2lsbCBub3QgdXNlIHRoaXMgb3B0aW9uIGFzIGl0IHdpbGwgYWx3YXlzIHNlYXJjaCBmb3IgYm90aCB0aGUgbmV3IFVuaWNvZGUgY29kZSBwb2ludCBmb3IgdGhlCisgICAgICogVEFJTCAoaS5lLiAweEZFNzMpIG9yIHRoZSBvbGQgdW5vZmZpY2lhbCBVbmljb2RlIFRBSUwgY29kZSBwb2ludCAoaS5lLiAweDIwMEIpIGFuZCBkZS1zaGFwZSB0aGUKKyAgICAgKiBTZWVuLUZhbWlseSBsZXR0ZXIgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiBTaGFwaW5nIE1vZGU6IE9ubHkgc2hhcGluZy4KKyAgICAgKiBEZS1zaGFwaW5nIE1vZGU6IE4vQS4KKyAgICAgKiBBZmZlY3RzOiBBbGwgU2VlbiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSA9IDB4ODAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgbmV3IFVuaWNvZGUgVGFpbCBvcHRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX1RZUEVfTUFTSyA9IDB4ODAwMDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9HUk9XX1NIUklOSyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfR1JPV19TSFJJTksKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX1JFU0laRSAgID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIG5leHQgdG8gbW9kaWZpZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgPSAxOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTkVBUiA9IDEgOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORCA9IDI7CisKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9FTkQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0VORCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfQkVHSU5OSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0JFR0lOID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgTW9kZTogRm9yIGVhY2ggTEFNQUxFRiBjaGFyYWN0ZXIgZm91bmQsIGV4cGFuZCBMQU1BTEVGIHVzaW5nIHNwYWNlIGF0IGVuZC4KKyAgICAgKiAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHNwYWNlIGF0IGVuZCwgdXNlIHNwYWNlcyBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlcmUKKyAgICAgKiAgICAgICAgICAgICAgIGlzIG5vIHNwYWNlIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCB1c2Ugc3BhY2VzIGF0IHRoZSBuZWFyIChpLmUuIHRoZSBzcGFjZQorICAgICAqICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIExBTUFMRUYgY2hhcmFjdGVyKS4KKyAgICAgKgorICAgICAqIERlc2hhcGluZyBNb2RlOiBQZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBmbGFnIGVxdWFscyBMQU1BTEVGX0VORC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0FVVE8gID0gMHgxMDAwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBtZW1vcnkgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfTUFTSyA9IDB4MTAwMDM7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIExhbUFsZWYgbWVtb3J5IG9wdGlvbnMuICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX01BU0sgID0gMHgxMDAwMzsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gbG9naWNhbCAoa2V5Ym9hcmQpIG9yZGVyLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjp0aGUgc291cmNlIGlzIGluIHZpc3VhbCBSVEwgb3JkZXIsCisgICAgICogdGhlIHJpZ2h0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfUlRMID0gMDsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIChkaXNwbGF5KSBvcmRlciwgdGhhdCBpcywKKyAgICAgKiB0aGUgbGVmdG1vc3QgZGlzcGxheWVkIGNoYXJhY3RlciBpcyBzdG9yZWQgZmlyc3QuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fVklTVUFMX0xUUiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlyZWN0aW9uIGluZGljYXRvcnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTUFTSyA9IDQ7CisKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogZG8gbm90IHBlcmZvcm0gbGV0dGVyIHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suIFBlcmZvcm1zIExhbS1BbGVmIGxpZ2F0dXJlCisgICAgICogc3Vic3RpdHV0aW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEUgPSA4OworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIHNoYXBlZCBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2sKKyAgICAgKiBieSBub3JtYXRpdmUgb25lcyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLiAgQ29udmVydHMgTGFtLUFsZWYgbGlnYXR1cmVzIHRvIHBhaXJzIG9mIExhbSBhbmQKKyAgICAgKiBBbGVmIGNoYXJhY3RlcnMsIGNvbnN1bWluZyBzcGFjZXMgaWYgcmVxdWlyZWQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19VTlNIQVBFID0gMHgxMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBleGNlcHQgZm9yIHRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIGF0IFUrMDY0Qi4uLlUrMDY1MiwgYnkgc2hhcGVkIG9uZXMgaW4gdGhlIFUrRmU3MAorICAgICAqIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suICBUaGUgVEFTSEtFRUwgY2hhcmFjdGVycyB3aWxsIGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8KKyAgICAgKiB0aGUgaXNvbGF0ZWQgZm9ybXMgcmF0aGVyIHRoYW4gdG8gdGhlaXIgY29ycmVjdCBzaGFwZS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEID0gMHgxODsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBsZXR0ZXIgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfTUFTSyA9IDB4MTg7CisKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBkaWdpdCBzaGFwaW5nLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTiA9IDB4MjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogUmVwbGFjZSBBcmFiaWMtSW5kaWMgZGlnaXRzIGJ5IEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfQU4yRU4gPSAweDQwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIG5vdCBhbiBBcmFiaWMsCisgICAgICogbGV0dGVyLCBzbyBFdXJvcGVhbiBkaWdpdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHdpbGwgbm90IGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOSVRfQUwuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfTFIgPSAweDYwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBjaGFuZ2UuCisgICAgICogQ29tcGFyZSB0byBESUdJVFNfQUxFTjJBTl9JTlRfTFIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfQUwgPSAweDgwOworCisgICAgLyoqIE5vdCBhIHZhbGlkIG9wdGlvbiB2YWx1ZS4gKi8KKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdJVFNfUkVTRVJWRUQgPSAweGEwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHNoYXBpbmcgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfTUFTSyA9IDB4ZTA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDY2MC4uLlUrMDY2OSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMgZGlnaXRzIChVKzA2ZjAuLi5VKzA2ZjkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfQU5fRVhURU5ERUQgPSAweDEwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaWdpdCB0eXBlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9NQVNLID0gMHgwMTAwOyAvLyAweDNmMDA/CisKKyAgICAvKioKKyAgICAgKiBzb21lIGNvbnN0YW50cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSEFNWkFGRV9DSEFSICAgICAgID0gJ1x1ZmU4MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQTA2X0NIQVIgICAgICAgPSAnXHUwNjIxJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFlFSF9IQU1aQV9DSEFSICAgICA9ICdcdTA2MjYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBRkVfQ0hBUiAgID0gJ1x1RkU4OSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1BTEVGX1NQQUNFX1NVQiAgPSAnXHVmZmZmJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBU0hLRUVMX1NQQUNFX1NVQiA9ICdcdWZmZmUnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEFNX0NIQVIgICAgICA9ICdcdTA2NDQnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiAgICA9ICdcdTAwMjAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRiA9ICdcdWZlZmYnOyAvLyBYWFg6IHR3ZWFrIGZvciBUZXh0TGluZSB1c2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9DSEFSICAgPSAnXHVGRTdDJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBVFdFRUxfQ0hBUiAgPSAnXHUwNjQwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9UQVRXRUVMX0NIQVIgPSAnXHVGRTdEJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5FV19UQUlMX0NIQVIgPSAnXHVGRTczJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9MRF9UQUlMX0NIQVIgPSAnXHUyMDBCJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfTU9ERSAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTSEFQRV9NT0RFICAgID0gMTsKKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisgICAgICAgIHJldHVybiByaHMgIT0gbnVsbCAmJgorICAgICAgICAgICAgcmhzLmdldENsYXNzKCkgPT0gQXJhYmljU2hhcGluZy5jbGFzcyAmJgorICAgICAgICAgICAgb3B0aW9ucyA9PSAoKEFyYWJpY1NoYXBpbmcpcmhzKS5vcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgICAvLy9DTE9WRVI6T0ZGCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spIHsKKyAgICAgICAgY2FzZSBMQU1BTEVGX1JFU0laRTogYnVmLmFwcGVuZCgiTGFtQWxlZiByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9ORUFSOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9BVVRPOiBidWYuYXBwZW5kKCJsYW1BbGVmIGF1dG8iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEVYVF9ESVJFQ1RJT05fTUFTSykgeworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX0xPR0lDQUw6IGJ1Zi5hcHBlbmQoIiwgbG9naWNhbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSOiBidWYuYXBwZW5kKCIsIHZpc3VhbCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX05PT1A6IGJ1Zi5hcHBlbmQoIiwgbm8gbGV0dGVyIHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRTogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgbGV0dGVycyB0YXNoa2VlbCBpc29sYXRlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6IGJ1Zi5hcHBlbmQoIiwgdW5zaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFNFRU5fTUFTSykgeworICAgICAgICBjYXNlIFNFRU5fVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFNlZW4gYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLKSB7CisgICAgICAgIGNhc2UgWUVISEFNWkFfVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFllaCBIYW16YSBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spIHsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBiZWdpbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgYXQgZW5kIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXBsYWNlIHdpdGggdGF0d2VlbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9SRVNJWkU6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgcmVzaXplIik7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVFNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBkaWdpdCBzaGFwaW5nIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0FOMkVOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBFTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9MUjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4gY29udGV4dHVhbGx5OiBkZWZhdWx0IEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgQUwiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTjogYnVmLmFwcGVuZCgiLCBzdGFuZGFyZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6IGJ1Zi5hcHBlbmQoIiwgZXh0ZW5kZWQgQXJhYmljLUluZGljIGRpZ2l0cyIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAvLy9DTE9WRVI6T04KKworICAgIC8vCisgICAgLy8gcG9ydGVkIGFwaQorICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVJSRUxFVkFOVCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBTVRZUEUgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxFRlRZUEUgPSAzMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LUiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktMID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19NQVNLID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBpcnJlbGV2YW50UG9zW10gPSB7CisgICAgICAgIDB4MCwgMHgyLCAweDQsIDB4NiwgMHg4LCAweEEsIDB4QywgMHhFCisgICAgfTsKKworLyoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnRMYW1BbGVmW10gPSAgeworICAgICAgICAnXHUwNjIyJywgLy8gRkVGNQorICAgICAgICAnXHUwNjIyJywgLy8gRkVGNgorICAgICAgICAnXHUwNjIzJywgLy8gRkVGNworICAgICAgICAnXHUwNjIzJywgLy8gRkVGOAorICAgICAgICAnXHUwNjI1JywgLy8gRkVGOQorICAgICAgICAnXHUwNjI1JywgLy8gRkVGQQorICAgICAgICAnXHUwNjI3JywgLy8gRkVGQgorICAgICAgICAnXHUwNjI3JyAgLy8gRkVGQworICAgIH07CisqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsW10gPSB7CisgICAgICAgIC8qIEZFQjEgKi8gMSwKKyAgICAgICAgLyogRkVCMiAqLyAxLAorICAgICAgICAvKiBGRUIzICovIDAsCisgICAgICAgIC8qIEZFQjQgKi8gMCwKKyAgICAgICAgLyogRkVCNSAqLyAxLAorICAgICAgICAvKiBGRUI2ICovIDEsCisgICAgICAgIC8qIEZFQjcgKi8gMCwKKyAgICAgICAgLyogRkVCOCAqLyAwLAorICAgICAgICAvKiBGRUI5ICovIDEsCisgICAgICAgIC8qIEZFQkEgKi8gMSwKKyAgICAgICAgLyogRkVCQiAqLyAwLAorICAgICAgICAvKiBGRUJDICovIDAsCisgICAgICAgIC8qIEZFQkQgKi8gMSwKKyAgICAgICAgLyogRkVCRSAqLyAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YXNoa2VlbE1lZGlhbFtdID0geworICAgICAgICAvKiBGRTcwICovIDAsCisgICAgICAgIC8qIEZFNzEgKi8gMSwKKyAgICAgICAgLyogRkU3MiAqLyAwLAorICAgICAgICAvKiBGRTczICovIDAsCisgICAgICAgIC8qIEZFNzQgKi8gMCwKKyAgICAgICAgLyogRkU3NSAqLyAwLAorICAgICAgICAvKiBGRTc2ICovIDAsCisgICAgICAgIC8qIEZFNzcgKi8gMSwKKyAgICAgICAgLyogRkU3OCAqLyAwLAorICAgICAgICAvKiBGRTc5ICovIDEsCisgICAgICAgIC8qIEZFN0EgKi8gMCwKKyAgICAgICAgLyogRkU3QiAqLyAxLAorICAgICAgICAvKiBGRTdDICovIDAsCisgICAgICAgIC8qIEZFN0QgKi8gMSwKKyAgICAgICAgLyogRkU3RSAqLyAwLAorICAgICAgICAvKiBGRTdGICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciB5ZWhIYW16YVRvWWVoW10gPQorICAgIHsKKyAgICAvKiBpc29sYXRlZCovIDB4RkVFRiwKKyAgICAvKiBmaW5hbCAgICovIDB4RkVGMAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltdID0geworICAgICAgICAnXHUwNjIyJywgLy8gMDY1QworICAgICAgICAnXHUwNjIzJywgLy8gMDY1RAorICAgICAgICAnXHUwNjI1JywgLy8gMDY1RQorICAgICAgICAnXHUwNjI3JywgLy8gMDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBhcmFMaW5rID0geworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMSwgIC8qMHgwNjIyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTMsICAvKjB4MDYyMyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDE1LCAgLyoweDA2MjQqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxNywgIC8qMHgwNjI1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MTksICAvKjB4MDYyNiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDFELCAgLyoweDA2MjcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxRiwgIC8qMHgwNjI4Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MjMsICAvKjB4MDYyOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI1LCAgLyoweDA2MkEqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyOSwgIC8qMHgwNjJCKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MkQsICAvKjB4MDYyQyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDMxLCAgLyoweDA2MkQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgzNSwgIC8qMHgwNjJFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MzksICAvKjB4MDYyRiovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNCLCAgLyoweDA2MzAqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRCwgIC8qMHgwNjMxKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0YsICAvKjB4MDYzMiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQxLCAgLyoweDA2MzMqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0NSwgIC8qMHgwNjM0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDksICAvKjB4MDYzNSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDRELCAgLyoweDA2MzYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1MSwgIC8qMHgwNjM3Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTUsICAvKjB4MDYzOCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDU5LCAgLyoweDA2MzkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1RCwgIC8qMHgwNjNBKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDYzQi0weDA2M0YqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjQwKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjEsICAvKjB4MDY0MSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY1LCAgLyoweDA2NDIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2OSwgIC8qMHgwNjQzKi8KKyAgICAgICAgMSArIDIgICAgICAgKyAxNiArIDI1NiAqIDB4NkQsICAvKjB4MDY0NCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDcxLCAgLyoweDA2NDUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3NSwgIC8qMHgwNjQ2Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzksICAvKjB4MDY0NyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdELCAgLyoweDA2NDgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg3RiwgIC8qMHgwNjQ5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4ODEsICAvKjB4MDY0QSovCisgICAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NEItMHgwNjRFKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Ri0weDA2NTIqLworICAgICAgICA0LCA0LCA0LCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjUzLTB4MDY1NyovCisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NTgtMHgwNjVCKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODUsICAvKjB4MDY1QyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg3LCAgLyoweDA2NUQqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4OSwgIC8qMHgwNjVFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4OEIsICAvKjB4MDY1RiovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NjAtMHgwNjY0Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2NS0weDA2NjkqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qMHgwNjZBLTB4MDY2RiovCisgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjcxKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzMqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjc0Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3NSovCisgICAgICAgIDEsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzYtMHgwNjc3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY3OC0weDA2N0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjdFLTB4MDY4MyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2ODQtMHgwNjg3Ki8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDY4OC0weDA2OTEqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgICAgICAgIC8qMHgwNjkyLTB4MDY5OSovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2OUEtMHgwNkEzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkE0LTB4MDZBRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZBRS0weDA2QjcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QjgtMHgwNkJGKi8KKyAgICAgICAgMSsyLCAxKzIsICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMwKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDMSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgLyoweDA2QzItMHgwNkNCKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDQyovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2Q0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkNFLTB4MDZEMSovCisgICAgICAgIDEsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2RDItMHgwNkQzKi8KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gcHJlc0xpbmsgPSB7CisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTcwKi8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzEqLworICAgICAgICAxICsgMiwgMCwgMSsgMiwgMCwgMSsgMiwgICAgICAvKjB4RkU3Mi0weEZFNzYqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3NyovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTc4LTB4RkU4MSovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTgyLTB4RkU4NSovCisgICAgICAgIDAsIDAgKyAzMiwgMSArIDMyLCAwICsgMzIsICAgIC8qMHhGRTg2LTB4RkU4OSovCisgICAgICAgIDEgKyAzMiwgMCwgMSwgIDAgKyAzMiwgICAgICAgIC8qMHhGRThBLTB4RkU4RCovCisgICAgICAgIDEgKyAzMiwgMCwgMiwgIDEgKyAyLCAgICAgICAgIC8qMHhGRThFLTB4RkU5MSovCisgICAgICAgIDEsIDAgKyAzMiwgMSArIDMyLCAwLCAgICAgICAgIC8qMHhGRTkyLTB4RkU5NSovCisgICAgICAgIDIsIDEgKyAyLCAxLCAwLCAgICAgICAgICAgICAgIC8qMHhGRTk2LTB4RkU5OSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlBLTB4RkU5RCovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlFLTB4RkVBMSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUEyLTB4RkVBNSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUE2LTB4RkVBOSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUFBLTB4RkVBRCovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUFFLTB4RkVCMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUIyLTB4RkVCNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUI2LTB4RkVCOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJBLTB4RkVCRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJFLTB4RkVDMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUMyLTB4RkVDNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUM2LTB4RkVDOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNBLTB4RkVDRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNFLTB4RkVEMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQyLTB4RkVENSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQ2LTB4RkVEOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURBLTB4RkVERCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURFLTB4RkVFMSovCisgICAgICAgIDEsIDAgKyAxNiwgMiArIDE2LCAxICsgMiArMTYsIC8qMHhGRUUyLTB4RkVFNSovCisgICAgICAgIDEgKyAxNiwgMCwgMiwgMSsyLCAgICAgICAgICAgIC8qMHhGRUU2LTB4RkVFOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVBLTB4RkVFRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVFLTB4RkVGMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUYyLTB4RkVGNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUY2LTB4RkVGOSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUZBLTB4RkVGRCovCisgICAgICAgIDEsIDAsIDEsIDAsCisgICAgICAgIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY29udmVydEZFdG8wNiA9IHsKKyAgICAgICAgLyoqKioqKioqKioqMCoqKioqKjEqKioqKioyKioqKioqMyoqKioqKjQqKioqKio1KioqKioqNioqKioqKjcqKioqKio4KioqKioqOSoqKioqKkEqKioqKipCKioqKioqQyoqKioqKkQqKioqKipFKioqKioqRioqKi8KKyAgICAgICAgLypGRTcqLyAgIDB4NjRCLCAweDY0QiwgMHg2NEMsIDB4NjRDLCAweDY0RCwgMHg2NEQsIDB4NjRFLCAweDY0RSwgMHg2NEYsIDB4NjRGLCAweDY1MCwgMHg2NTAsIDB4NjUxLCAweDY1MSwgMHg2NTIsIDB4NjUyLAorICAgICAgICAvKkZFOCovICAgMHg2MjEsIDB4NjIyLCAweDYyMiwgMHg2MjMsIDB4NjIzLCAweDYyNCwgMHg2MjQsIDB4NjI1LCAweDYyNSwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjYsIDB4NjI3LCAweDYyNywgMHg2MjgsCisgICAgICAgIC8qRkU5Ki8gICAweDYyOCwgMHg2MjgsIDB4NjI4LCAweDYyOSwgMHg2MjksIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJBLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQiwgMHg2MkMsIDB4NjJDLCAweDYyQywKKyAgICAgICAgLypGRUEqLyAgIDB4NjJDLCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRCwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkUsIDB4NjJGLCAweDYyRiwgMHg2MzAsIDB4NjMwLCAweDYzMSwgMHg2MzEsIDB4NjMyLAorICAgICAgICAvKkZFQiovICAgMHg2MzIsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjMzLCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNCwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzUsIDB4NjM2LCAweDYzNiwgMHg2MzYsCisgICAgICAgIC8qRkVDKi8gICAweDYzNiwgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzcsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM4LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzOSwgMHg2M0EsIDB4NjNBLCAweDYzQSwKKyAgICAgICAgLypGRUQqLyAgIDB4NjNBLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MSwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDIsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQzLCAweDY0NCwgMHg2NDQsIDB4NjQ0LAorICAgICAgICAvKkZFRSovICAgMHg2NDQsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ1LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NiwgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDcsIDB4NjQ4LCAweDY0OCwgMHg2NDksCisgICAgICAgIC8qRkVGKi8gICAweDY0OSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NEEsIDB4NjVDLCAweDY1QywgMHg2NUQsIDB4NjVELCAweDY1RSwgMHg2NUUsIDB4NjVGLCAweDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2hhcGVUYWJsZVtdW11bXSA9IHsKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsMX0gfSwKKyAgICAgICAgeyB7MCwwLDIsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfSwKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsM30gfSwKKyAgICAgICAgeyB7MCwwLDEsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfQorICAgIH07CisKKyAgICAvKgorICAgICAqIFRoaXMgZnVuY3Rpb24gc2hhcGVzIEV1cm9wZWFuIGRpZ2l0cyB0byBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaW4tcGxhY2UsIHdyaXRpbmcgb3ZlciB0aGUgaW5wdXQgY2hhcmFjdGVycy4gIERhdGEgaXMgaW4gdmlzdWFsCisgICAgICogb3JkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFzdFN0cm9uZ1dhc0FMKSB7CisgICAgICAgIGRpZ2l0QmFzZSAtPSAnMCc7IC8vIG1vdmUgY29tbW9uIGFkanVzdG1lbnQgb3V0IG9mIGxvb3AKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBzd2l0Y2ggKENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0eShjaCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ6CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOgorICAgICAgICAgICAgICAgIGxhc3RTdHJvbmdXYXNBTCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUM6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAobGFzdFN0cm9uZ1dhc0FMICYmIGNoIDw9ICdcdTAwMzknKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoY2ggKyBkaWdpdEJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpbnZlcnRCdWZmZXIKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBpbnZlcnRzIHRoZSBidWZmZXIsIGl0J3MgdXNlZAorICAgICAqICAgICAgICAgICBpbiBjYXNlIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgYnVmZmVyIHRvIGJlCisgICAgICogICAgICAgICAgIFRFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludmVydEJ1ZmZlcihjaGFyW10gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisKKyAgICAgICAgZm9yKGludCBpID0gc3RhcnQsIGogPSBzdGFydCArIGxlbmd0aCAtIDE7IGkgPCBqOyBpKyssIC0taikgeworICAgICAgICAgICAgY2hhciB0ZW1wID0gYnVmZmVyW2ldOworICAgICAgICAgICAgYnVmZmVyW2ldID0gYnVmZmVyW2pdOworICAgICAgICAgICAgYnVmZmVyW2pdID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNoYW5nZUxhbUFsZWYKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgdGhlIEFsZWYgY2hhcmFjdGVycyBpbnRvIGFuIGVxdWl2YWxlbnQKKyAgICAgKiAgICAgICAgICAgTGFtQWxlZiBsb2NhdGlvbiBpbiB0aGUgMHgwNnh4IFJhbmdlLCB0aGlzIGlzIGFuCisgICAgICogICAgICAgICAgIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgb3BlcmF0aW9uIG9mIHRoZSBwcm9ncmFtCisgICAgICogICAgICAgICAgIGxhdGVyIGl0J2xsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSAweEZFeHggTGFtQWxlZnMKKyAgICAgKiAgICAgICAgICAgaW4gdGhlIHNoYXBpbmcgZnVuY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBjaGFuZ2VMYW1BbGVmKGNoYXIgY2gpIHsKKyAgICAgICAgc3dpdGNoKGNoKSB7CisgICAgICAgIGNhc2UgJ1x1MDYyMic6IHJldHVybiAnXHUwNjVDJzsKKyAgICAgICAgY2FzZSAnXHUwNjIzJzogcmV0dXJuICdcdTA2NUQnOworICAgICAgICBjYXNlICdcdTA2MjUnOiByZXR1cm4gJ1x1MDY1RSc7CisgICAgICAgIGNhc2UgJ1x1MDYyNyc6IHJldHVybiAnXHUwNjVGJzsKKyAgICAgICAgZGVmYXVsdDogIHJldHVybiAnXHUwMDAwJzsgLy8gbm90IGEgbGFtYWxlZgorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc3BlY2lhbENoYXIKKyAgICAgKiBGdW5jdGlvbjogU3BlY2lhbCBBcmFiaWMgY2hhcmFjdGVycyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIHNoYXBlVW5pY29kZQorICAgICAqICAgICAgICAgICBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgb3IgMiBmb3IgdGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNwZWNpYWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKChjaCA+ICdcdTA2MjEnICYmIGNoIDwgJ1x1MDYyNicpIHx8CisgICAgICAgICAgICAoY2ggPT0gJ1x1MDYyNycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjJFJyAmJiBjaCA8ICdcdTA2MzMnKSB8fAorICAgICAgICAgICAgKGNoID4gJ1x1MDY0NycgJiYgY2ggPCAnXHUwNjRBJykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI5JykpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTA2NEInICYmIGNoPD0gJ1x1MDY1MicpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4MDY1MyAmJiBjaCA8PSAweDA2NTUgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA9PSAweDA2NzAgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA+PSAweEZFNzAgJiYgY2ggPD0gMHhGRTdGKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZ2V0TGluaworICAgICAqIEZ1bmN0aW9uOiBSZXNvbHZlcyB0aGUgbGluayBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzIGFzCisgICAgICogICAgICAgICAgIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtcyA6CisgICAgICogICAgICAgICAgIElzb2xhdGVkLCBJbml0aWFsLCBNaWRkbGUgYW5kIEZpbmFsIEZvcm0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGluayhjaGFyIGNoKSB7CisgICAgICAgIGlmIChjaCA+PSAnXHUwNjIyJyAmJiBjaCA8PSAnXHUwNkQzJykgeworICAgICAgICAgICAgcmV0dXJuIGFyYUxpbmtbY2ggLSAnXHUwNjIyJ107CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1x1MjAwRCcpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTIwNkQnICYmIGNoIDw9ICdcdTIwNkYnKSB7CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgcmV0dXJuIHByZXNMaW5rW2NoIC0gJ1x1RkU3MCddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjb3VudFNwYWNlcworICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgdGhlIG51bWJlciBvZiBzcGFjZXMKKyAgICAgKiAgICAgICAgICAgYXQgZWFjaCBlbmQgb2YgdGhlIGxvZ2ljYWwgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzTGVmdChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzUmlnaHQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGNvdW50OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgY291bnQgLSAxIC0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBUYXNoa2VlbCBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoID49J1x1MDY0QicgJiYgY2ggPD0gJ1x1MDY1MicgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1NlZW5UYWlsRmFtaWx5Q2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGlzb2xhdGVkIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICBpbiB0aGUgRkUgcmFuZ2Ugb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49IDB4ZmViMSAmJiBjaCA8IDB4ZmViZil7CisgICAgICAgICAgICAgcmV0dXJuIHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsIFtjaCAtIDB4RkVCMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgLyogTmFtZSAgICAgOiBpc1NlZW5GYW1pbHlDaGFyCisgICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzZWVuIGZhbWlseSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUKKyAgICAgICogICAgICAgICAgICAwNiByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuRmFtaWx5Q2hhcihjaGFyICBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweDYzMyAmJiBjaCA8PSAweDYzNil7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1RhaWxDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIG1hdGNoZXMgb25lIG9mIHRoZSB0YWlsIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgKDB4ZmU3MyBvciAweDIwMGIpIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFpbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZihjaCA9PSBPTERfVEFJTF9DSEFSIHx8IGNoID09IE5FV19UQUlMX0NIQVIpeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc0FsZWZNYWtzb3VyYUNoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBBbGVmIE1ha3NvdXJhIEZpbmFsIG9yIGlzb2xhdGVkCisgICAgICogICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZNYWtzb3VyYUNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCAoY2ggPT0gMHhGRUVGKSB8fCAoIGNoID09IDB4RkVGMCkgfHwgKGNoID09IDB4MDY0OSkpOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBpc1llaEhhbXphQ2hhcgorICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSB5ZWhIYW16YSBpc29sYXRlZCBvciB5ZWhoYW16YQorICAgICAqICAgICAgICAgICAgZmluYWwgaXMgZm91bmQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWWVoSGFtemFDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYoKGNoPT0weEZFODkpfHwoY2g9PTB4RkU4QSkpeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNUYXNoa2VlbENoYXJGRQorICAgICAqRnVuY3Rpb24gOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgaW4gRkUgcmFuZ2UgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXNoa2VlbENoYXJGRShjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoIT0weEZFNzUgJiYoY2g+PTB4RkU3MCAmJiBjaDw9IDB4RkU3RikgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIG9uIFRhdHdlZWwgb3Igbm90LGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCBvbiB0YXR3ZWVsIChGRSByYW5nZSksIGl0IHJldHVybnMgMSBlbHNlIGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCB3aXRoIHNoYWRkYSBvbiB0YXR3ZWVsIChGQyByYW5nZSlyZXR1cm4gMiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSAmJiBjaCAhPSBTSEFEREFfVEFUV0VFTF9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGFzaGtlZWxNZWRpYWwgW2NoIC0gMHhGRTcwXTsKKyAgICAgICAgfSBlbHNlIGlmKCAoY2ggPj0gMHhmY2YyICYmIGNoIDw9IDB4ZmNmNCkgfHwgKGNoID09IFNIQUREQV9UQVRXRUVMX0NIQVIpKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lOiBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtCisgICAgICogICAgICAgICAgIChpLmUuIFVuaWNvZGUgRkUgcmFuZ2UpIHJldHVybnMgMSBlbHNlIGlmIHRoZSBUYXNoa2VlbAorICAgICAqICAgICAgICAgICB3aXRoIHNoYWRkYSBpcyBpbiB0aGUgaXNvbGF0ZWQgZm9ybSAoaS5lLiBVbmljb2RlIEZDIHJhbmdlKQorICAgICAqICAgICAgICAgICByZXR1cm5zIDEgb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSl7CisgICAgICAgICAgICByZXR1cm4gKDEgLSB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdKTsKKyAgICAgICAgfSBlbHNlIGlmKGNoID49IDB4ZmM1ZSAmJiBjaCA8PSAweGZjNjMpeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNBbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIDEgZm9yIEFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID09ICdcdTA2MjInIHx8IGNoID09ICdcdTA2MjMnIHx8IGNoID09ICdcdTA2MjUnIHx8IGNoID09ICdcdTA2MjcnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzTGFtQWxlZkNoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBMYW1BbGVmIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFtQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPj0gJ1x1RkVGNScgJiYgY2ggPD0gJ1x1RkVGQyc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHUwNjVDJyAmJiBjaCA8PSAnXHUwNjVGJzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjYWxjdWxhdGVTaXplCisgICAgICogRnVuY3Rpb246IFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZGVzdFNpemUgdG8gYmUgdXNlZCBpbiBwcmVmbGlnaHRpbmcKKyAgICAgKiAgICAgICAgICAgd2hlbiB0aGUgZGVzdFNpemUgaXMgZXF1YWwgdG8gMAorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZVNpemUoY2hhcltdIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VMZW5ndGgpIHsKKworICAgICAgICBpbnQgZGVzdFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRToKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOgorICAgICAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoIC0gMTsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpKzFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB2aXN1YWwKKyAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCArIDEsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpLTFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWRlc3RTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoc291cmNlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VTdWIKKyAgICAgKiBGdW5jdGlvbjogQ291bnRzIG51bWJlciBvZiB0aW1lcyB0aGUgc3ViQ2hhciBhcHBlYXJzIGluIHRoZSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50U3BhY2VTdWIoY2hhciBbXSBkZXN0LGludCBsZW5ndGgsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBzdWJDaGFyKSB7CisgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNoaWZ0QXJyYXkKKyAgICAgKiBGdW5jdGlvbjogU2hpZnRzIGNoYXJhY3RlcnMgdG8gcmVwbGFjZSBzcGFjZSBzdWIgY2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaGlmdEFycmF5KGNoYXIgW10gZGVzdCxpbnQgc3RhcnQsIGludCBlLCBjaGFyIHN1YkNoYXIpeworICAgICAgICBpbnQgdyA9IGU7CisgICAgICAgIGludCByID0gZTsKKyAgICAgICAgd2hpbGUgKC0tciA+PSBzdGFydCkgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgIGlmIChjaCAhPSBzdWJDaGFyKSB7CisgICAgICAgICAgICAtLXc7CisgICAgICAgICAgICBpZiAodyAhPSByKSB7CisgICAgICAgICAgICAgIGRlc3Rbd10gPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGZsaXBBcnJheQorICAgICAqIEZ1bmN0aW9uOiBpbnZlcnRzIGFycmF5LCBzbyB0aGF0IHN0YXJ0IGJlY29tZXMgZW5kIGFuZCB2aWNlIHZlcnNhCisgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGludCBmbGlwQXJyYXkoY2hhciBbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBlLCBpbnQgdyl7CisgICAgICAgIGludCByOworICAgICAgICBpZiAodyA+IHN0YXJ0KSB7CisgICAgICAgIC8vIHNoaWZ0LCBhc3N1bWUgc21hbGwgYnVmZmVyIHNpemUgc28gZG9uJ3QgdXNlIGFycmF5Y29weQorICAgICAgICAgIHIgPSB3OworICAgICAgICAgIHcgPSBzdGFydDsKKyAgICAgICAgICB3aGlsZSAociA8IGUpIHsKKyAgICAgICAgICAgIGRlc3RbdysrXSA9IGRlc3RbcisrXTsKKyAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB3ID0gZTsKKyAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHc7CisgICAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgIDogaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbAorICAgICAqIEZ1bmN0aW9uIDogUmVwbGFjZXMgVGFzaGtlZWwgYXMgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgQ2FzZSAxIDppZiB0aGUgVGFzaGtlZWwgb24gdGF0d2VlbCwgcmVwbGFjZSBpdCB3aXRoIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDIgOmlmIHRoZSBUYXNoa2VlbCBhZ2dyZWdhdGVkIHdpdGggU2hhZGRhIG9uIFRhdHdlZWwsIHJlcGxhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICBpdCB3aXRoIFNoYWRkYSBvbiBUYXR3ZWVsLgorICAgICAqICAgICAgICAgICAgQ2FzZSAzOiBpZiB0aGUgVGFzaGtlZWwgaXMgaXNvbGF0ZWQgcmVwbGFjZSBpdCB3aXRoIFNwYWNlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwoY2hhcltdIGRlc3QsIGludCBzb3VyY2VMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAxKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBUQVRXRUVMX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigoaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoZGVzdFtpXSkgPT0gMikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU0hBRERBX1RBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGRlc3RbaV0pPT0xKSAmJiBkZXN0W2ldICE9IFNIQUREQV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGhhbmRsZUdlbmVyYXRlZFNwYWNlcworICAgICAqRnVuY3Rpb24gOiBUaGUgc2hhcGVVbmljb2RlIGZ1bmN0aW9uIGNvbnZlcnRzIExhbSArIEFsZWYgaW50byBMYW1BbGVmICsgc3BhY2UsCisgICAgICogICAgICAgICAgIGFuZCBUYXNoa2VlbCB0byBzcGFjZS4KKyAgICAgKiAgICAgICAgICAgaGFuZGxlR2VuZXJhdGVkU3BhY2VzIGZ1bmN0aW9uIHB1dHMgdGhlc2UgZ2VuZXJhdGVkIHNwYWNlcworICAgICAqICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIgc3BlY2lmaWVzLiBMYW1BbGVmIGFuZCBUYXNoa2VlbAorICAgICAqICAgICAgICAgICBzcGFjZXMgY2FuIGJlIHJlcGxhY2VkIGF0IGJlZ2luLCBhdCBlbmQsIGF0IG5lYXIgb3IgZGVjcmVhc2UgdGhlCisgICAgICogICAgICAgICAgIGJ1ZmZlciBzaXplLgorICAgICAqCisgICAgICogICAgICAgICAgIFRoZXJlIGlzIGFsc28gQXV0byBvcHRpb24gZm9yIExhbUFsZWYgYW5kIHRhc2hrZWVsLCB3aGljaCB3aWxsIHB1dAorICAgICAqICAgICAgICAgICB0aGUgc3BhY2VzIGF0IGVuZCBvZiB0aGUgYnVmZmVyIChvciBlbmQgb2YgdGV4dCBpZiB0aGUgdXNlciB1c2VkCisgICAgICogICAgICAgICAgIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EKS4KKyAgICAgKgorICAgICAqICAgICAgICAgICBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSIGFuZCB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQgdGhlIEVORAorICAgICAqICAgICAgICAgICBvcHRpb24gd2lsbCBwbGFjZSB0aGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqICAgICAgICAgICBCRUdJTiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICovCisgIHByaXZhdGUgaW50IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhjaGFyW10gZGVzdCwKKyAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgIGludCBsZW5PcHRpb25zVGFzaGtlZWwgPSBvcHRpb25zICYgVEFTSEtFRUxfTUFTSzsKKyAgICAgIGJvb2xlYW4gbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICBib29sZWFuIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgaWYgKCFpc0xvZ2ljYWwgJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc0xhbUFsZWYpIHsKKyAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zVGFzaGtlZWwpeworICAgICAgICAgIGNhc2UgVEFTSEtFRUxfQkVHSU46IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBMQU1BTEVGX1NQQUNFX1NVQikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVJfRk9SX0xBTUFMRUY7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICBmaW5hbCBpbnQgZSA9IHN0YXJ0ICsgbGVuZ3RoOworICAgICAgICAgIGludCB3TCA9IGNvdW50U3BhY2VTdWIoZGVzdCwgbGVuZ3RoLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgaW50IHdUID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCkpIHsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3TCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgZGVzdFstLXdMXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpKXsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICB3aGlsZSAod1QgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICBkZXN0Wy0td1RdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgICAgICB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpKXsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gd0wgLSBzdGFydDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpKSB7CisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdUID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd1QpOworICAgICAgICAgICAgICBsZW5ndGggPSB3VCAtIHN0YXJ0OworICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmICgobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTikgfHwKKyAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpeworICAgICAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4peworICAgICAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpKSB7IC8vIHNwYWNlcyBhdCBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd0wgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3TCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod0wgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3TCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0JFR0lOKSl7CisgICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod1QgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3VCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKworICAvKgorICAgKk5hbWUgICAgIDpleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luCisgICAqRnVuY3Rpb24gOkV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlIHJlcXVpcmVkCisgICAqICAgICAgICAgc3BhY2UgZnJvbSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMgdmlzdWFsX0xUUgorICAgKiAgICAgICAgIGFuZCB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQKKyAgICogICAgICAgICB0aGUgc3BhY2VzIHdpbGwgYmUgbG9jYXRlZCBhdCBlbmQgb2YgYnVmZmVyLgorICAgKiAgICAgICAgIElmIHRoZXJlIGFyZSBubyBzcGFjZXMgdG8gZXhwYW5kIHRoZSBMYW1BbGVmLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorKi8KKyBwcml2YXRlIGJvb2xlYW4gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQpIHsKKyAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc1JpZ2h0KGRlc3QsIHN0YXJ0LCBsZW5ndGgpKSB7CisgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICB9CisgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCAtIGxhY291bnQsIHcgPSBzdGFydCArIGxlbmd0aDsgLS1yID49IHN0YXJ0OykgeworICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgZGVzdFstLXddID0gTEFNX0NIQVI7CisgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjaDsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciB0byBMYW0gYW5kIEFsZWYgY29uc3VtaW5nIHRoZQorICAgKiAgICAgICAgICAgcmVxdWlyZWQgc3BhY2UgZnJvbSBlbmQgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMKKyAgICogICAgICAgICAgIFZpc3VhbCBMVFIgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5ECisgICAqICAgICAgICAgICB3YXMgdXNlZCwgdGhlIHNwYWNlcyB3aWxsIGJlIGNvbnN1bWVkIGZyb20gYmVnaW4gb2YgYnVmZmVyLiBJZgorICAgKiAgICAgICAgICAgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiAgZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCl7CisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc0xlZnQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxhY291bnQsIHcgPSBzdGFydCwgZSA9IHN0YXJ0ICsgbGVuZ3RoOyByIDwgZTsgKytyKSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICBkZXN0W3crK10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IExBTV9DSEFSOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNoOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcgorICAgKkZ1bmN0aW9uIDogRXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgaW50byBMYW0gKyBBbGVmLCBZZWhIYW16YSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgIGludG8gWWVoICsgSGFtemEsIFNlZW5GYW1pbHkgY2hhcmFjdGVyIGludG8gU2VlbkZhbWlseSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgICsgVGFpbCwgd2hpbGUgY29uc3VtaW5nIHRoZSBzcGFjZSBuZXh0IHRvIHRoZSBjaGFyYWN0ZXIuCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllaEhhbXphT3B0aW9uLCBpbnQgc2VlblRhaWxPcHRpb24sIGludCBsYW1BbGVmT3B0aW9uKXsKKworICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKworCisgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoZGVzdFtzdGFydF0pKSB7CisgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBsZW5ndGg7IC0taSA+PXN0YXJ0OykgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgIGlmIChsYW1BbGVmT3B0aW9uID09IDEgJiYgaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGlmIChpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICAgICAgIGRlc3RbLS1pXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZihzZWVuVGFpbE9wdGlvbiA9PSAxICYmIGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoKSA9PSAxKXsKKyAgICAgICAgICAgICAgaWYoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IHRhaWxDaGFyOworICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfWVsc2UgaWYoeWVoSGFtemFPcHRpb24gPT0gMSAmJiBpc1llaEhhbXphQ2hhcihjaCkpeworCisgICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHllaEhhbXphVG9ZZWhbY2ggLSBZRUhfSEFNWkFGRV9DSEFSXTsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IEhBTVpBRkVfQ0hBUjsKKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGV4cGFuZENvbXBvc2l0Q2hhcgorICAgICAqIEZ1bmN0aW9uOiBMYW1BbGVmIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgYXMgdGhlIExhbUFsZWYgaXMKKyAgICAgKiAgICAgICAgICAgb25lIGNoYXJhY3RlciB3aGlsZSBleHBhbmRpbmcgaXQgd2lsbCBnaXZlIHR3bworICAgICAqICAgICAgICAgICBjaGFyYWN0ZXJzIExhbSArIEFsZWYsIHNvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBMYW1BbGVmCisgICAgICogICAgICAgICAgIGluIG5lYXIgb3IgZmFyIHNwYWNlcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgc3BlY2lmaWVzIG9yIGluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZS4KKyAgICAgKiAgICAgICAgICAgRGVzdCBoYXMgZW5vdWdoIHJvb20gZm9yIHRoZSBleHBhbnNpb24gaWYgd2UgYXJlIGdyb3dpbmcuCisgICAgICogICAgICAgICAgIGxhbWFsZWYgYXJlIG5vcm1hbGl6ZWQgdG8gdGhlICdzcGVjaWFsIGNoYXJhY3RlcnMnCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZXhwYW5kQ29tcG9zaXRDaGFyKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYXBpbmdNb2RlKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNTZWVuID0gb3B0aW9ucyAmIFNFRU5fTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNZZWhIYW16YSA9IG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLOworICAgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgICBpZiAoIWlzTG9naWNhbCAmJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfRU5EOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNoYXBpbmdNb2RlID09IDEpeworICAgICAgICAgICAgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKXsKKyAgICAgICAgICAgICAgICBpZihpc0xvZ2ljYWwpeworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCwgdyA9IHIgKyBsYWNvdW50OyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSAnXHUwNjQ0JzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBsYWNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYobGVuT3B0aW9uc1NlZW4gPT0gU0VFTl9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDEsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgU2VlbiB0YWlsIGV4cGFuc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNZZWhIYW16YSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwxLDAsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgWWVoSGFtemEgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworCisgICAgLyogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGZyb20gRkV4eCBSYW5nZSBpbnRvIDA2eHggUmFuZ2UKKyAgICAgKiB0byBwdXQgYWxsIGNoYXJhY3RlcnMgaW50byB0aGUgMDZ4eCByYW5nZQorICAgICAqIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbgorICAgICAqIHRoZSAwNnh4IHJhbmdlLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbGFtYWxlZiBjaGFycyBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBub3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgICAgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZGVzaGFwZU5vcm1hbGl6ZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqICAgICAgICAgICBldmVuIHRoZSBsYW1hbGVmIGlzIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lhbCByZWdpb24gaW4gdGhlIDA2eHggcmFuZ2UuCisgICAgICogICAgICAgICAgIEFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBlbnRlcnMsIGFsbCBzZWVuIGZhbWlseSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgdGFpbCBjaGFyYWN0ZXIgYXJlIG1lcmdlZCB0byBzZWVuIHRhaWwgZmFtaWx5IGNoYXJhY3RlciBhbmQKKyAgICAgKiAgICAgICAgICAgYW55IHllaCBmb2xsb3dlZCBieSBhIGhhbXphIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHllaGhhbXphIGNoYXJhY3Rlci4KKyAgICAgKiAgICAgICAgICAgTWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlc2hhcGVOb3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGludCB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gMDsKKyAgICAgICAgaW50IHNlZW5Db21wb3NlRW5hYmxlZCA9IDA7CisKKyAgICAgICAgeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZZRUhIQU1aQV9NQVNLKSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpID8gMSA6IDA7CisgICAgICAgIHNlZW5Db21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZTRUVOX01BU0spID09IFNFRU5fVFdPQ0VMTF9ORUFSKT8gMSA6IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisKKyAgICAgICAgaWYoICh5ZWhIYW16YUNvbXBvc2VFbmFibGVkID09IDEpICYmICgoY2ggPT0gSEFNWkEwNl9DSEFSKSB8fCAoY2ggPT0gSEFNWkFGRV9DSEFSKSkKKyAgICAgICAgICAgICAgICYmIChpIDwgKGxlbmd0aCAtIDEpKSAmJiBpc0FsZWZNYWtzb3VyYUNoYXIoZGVzdFtpKzFdICkpIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICBkZXN0W2krMV0gPSBZRUhfSEFNWkFfQ0hBUjsKKyAgICAgICB9IGVsc2UgaWYgKCAoc2VlbkNvbXBvc2VFbmFibGVkID09IDEpICYmIChpc1RhaWxDaGFyKGNoKSkgJiYgKGk8IChsZW5ndGggLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlzU2VlblRhaWxGYW1pbHlDaGFyKGRlc3RbaSsxXSk9PTEpICkgeworICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlIGludG8gYSBzaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIEZFeHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFzaGtlZWxGbGFnKXRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IG5vcm1hbGl6ZShkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKworICAgICAgICAvLyByZXNvbHZlIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtczogSXNvbGF0ZWQsIEluaXRpYWwsIE1lZGlhbCBhbmQgRmluYWwuCisgICAgICAgIC8vIFRhc2hrZWVsIGNoYXJhY3RlcnMgaGF2ZSB0d28sIGlzb2xhdGVkIG9yIG1lZGlhbCwgYW5kIHNvbWV0aW1lcyBvbmx5IGlzb2xhdGVkLgorICAgICAgICAvLyB0YXNoa2VlbEZsYWcgPT0gMDogc2hhcGUgbm9ybWFsbHksIDE6IHNoYXBlIGlzb2xhdGVkLCAyOiBkb24ndCBzaGFwZQorCisgICAgICAgIGJvb2xlYW4gbGFtYWxlZl9mb3VuZCA9IGZhbHNlLCBzZWVuZmFtX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4geWVoaGFtemFfZm91bmQgPSBmYWxzZSwgdGFzaGtlZWxfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IGkgPSBzdGFydCArIGxlbmd0aCAtIDE7CisgICAgICAgIGludCBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgIGludCBuZXh0TGluayA9IDA7CisgICAgICAgIGludCBwcmV2TGluayA9IDA7CisgICAgICAgIGludCBsYXN0TGluayA9IDA7CisgICAgICAgIC8vaW50IHByZXZQb3MgPSBpOworICAgICAgICBpbnQgbGFzdFBvcyA9IGk7CisgICAgICAgIGludCBueCA9IC0yOworICAgICAgICBpbnQgbncgPSAwOworCisgICAgICAgIHdoaWxlIChpID49IDApIHsKKyAgICAgICAgICAgIC8vIElmIGhpZ2ggYnl0ZSBvZiBjdXJyTGluayA+IDAgdGhlbiB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lIHNoYXBlCisgICAgICAgICAgICBpZiAoKGN1cnJMaW5rICYgJ1x1RkYwMCcpID4gMCB8fCBpc1Rhc2hrZWVsQ2hhcihkZXN0W2ldKSkgeworICAgICAgICAgICAgICAgIG53ID0gaSAtIDE7CisgICAgICAgICAgICAgICAgbnggPSAtMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnggPCAwKSB7IC8vIHdlIG5lZWQgdG8ga25vdyBhYm91dCBuZXh0IGNoYXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG53ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBueCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSBnZXRMaW5rKGRlc3RbbnddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dExpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBudzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1udzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKGN1cnJMaW5rICYgQUxFRlRZUEUpID4gMCkgJiYgKChsYXN0TGluayAmIExBTVRZUEUpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFtYWxlZl9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgd0xhbWFsZWYgPSBjaGFuZ2VMYW1BbGVmKGRlc3RbaV0pOyAvLyBnZXQgZnJvbSAweDA2NUMtMHgwNjVmCisgICAgICAgICAgICAgICAgICAgIGlmICh3TGFtYWxlZiAhPSAnXHUwMDAwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBhbGVmIGJ5IG1hcmtlciwgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gJ1x1ZmZmZic7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2xhc3RQb3NdID0gd0xhbWFsZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gcHJldkxpbms7CisgICAgICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gZ2V0TGluayh3TGFtYWxlZik7IC8vIHJlcXVpcmVzICdcdTAwMDAnLCB1bmZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaSA+IDApICYmIChkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihpPT0wKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1NlZW5GYW1pbHlDaGFyKGRlc3RbaV0pID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmZhbV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdFtpXSA9PSBZRUhfSEFNWkFfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgeWVoaGFtemFfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlciBzaGFwZSBhY2NvcmRpbmcgdG8gbGluayBhYmlsaXR5IG9mIG5laWdoYm9ycworICAgICAgICAgICAgICAgIC8vIGFuZCBvZiBjaGFyYWN0ZXI7IGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBzaGFwZXMKKyAgICAgICAgICAgICAgICAvLyAoaXNvbGF0ZWQsIGluaXRpYWwsIG1pZGRsZSwgZmluYWwpIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEKKworICAgICAgICAgICAgICAgIGludCBmbGFnID0gc3BlY2lhbENoYXIoZGVzdFtpXSk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2hhcGUgPSBzaGFwZVRhYmxlW25leHRMaW5rICYgTElOS19NQVNLXQorICAgICAgICAgICAgICAgICAgICBbbGFzdExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtjdXJyTGluayAmIExJTktfTUFTS107CisKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXBlICY9IDB4MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFzaGtlZWxGbGFnID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdExpbmsgJiBMSU5LTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobmV4dExpbmsgJiBMSU5LUikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0QycgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0RCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEoKG5leHRMaW5rICYgQUxFRlRZUEUpID09IEFMRUZUWVBFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0TGluayAmIExBTVRZUEUpID09IExBTVRZUEUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBU0hLRUVMX1NQQUNFX1NVQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2hrZWVsX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIGlycmVsZXZhbnRQb3NbZGVzdFtpXSAtICdcdTA2NEInXSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGxlYXZlIHRhc2hrZWVsIGFsb25lCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIChjdXJyTGluayA+PiA4KSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1vdmUgb25lIG5vdGNoIGZvcndhcmQKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJldkxpbmsgPSBsYXN0TGluazsKKyAgICAgICAgICAgICAgICBsYXN0TGluayA9IGN1cnJMaW5rOworICAgICAgICAgICAgICAgIC8vcHJldlBvcyA9IGxhc3RQb3M7CisgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGlmIChpID09IG54KSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBuZXh0TGluazsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgfSBlbHNlIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKGRlc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBsYW0vYWxlZiBwYWlyIGluIHRoZSBidWZmZXIKKyAgICAgICAgLy8gY2FsbCBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgdG8gcmVtb3ZlIHRoZSBzcGFjZXMgdGhhdCB3ZXJlIGFkZGVkCisKKyAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIGlmIChsYW1hbGVmX2ZvdW5kIHx8IHRhc2hrZWVsX2ZvdW5kKSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VlbmZhbV9mb3VuZCB8fCB5ZWhoYW16YV9mb3VuZCl7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgZGVzdFNpemUsIGxhbWFsZWZfY291bnQsIFNIQVBFX01PREUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZVNoYXBlVW5pY29kZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyBhbiBBcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZSBpbnRvIHVuc2hhcGVkCisgICAgICogICAgICAgICAgIGFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVTaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxhbWFsZWZfY291bnQgPSBkZXNoYXBlTm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGxhbWFsZWYgaW4gdGhlIGJ1ZmZlciBjYWxsIGV4cGFuZExhbUFsZWYKKyAgICAgICAgaWYgKGxhbWFsZWZfY291bnQgIT0gMCkgeworICAgICAgICAgICAgLy8gbmVlZCB0byBhZGp1c3QgZGVzdCB0byBmaXQgZXhwYW5kZWQgYnVmZmVyLi4uICEhIQorICAgICAgICAgICAgZGVzdFNpemUgPSBleHBhbmRDb21wb3NpdENoYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFtYWxlZl9jb3VudCxERVNIQVBFX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJuYWxTaGFwZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChzb3VyY2VMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdFNpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKCgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgIT0gTEVUVEVSU19OT09QKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlU2l6ZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOyAvLyBieSBkZWZpbml0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHdheXMgdXNlIHRlbXAgYnVmZmVyCisgICAgICAgIGNoYXJbXSB0ZW1wID0gbmV3IGNoYXJbc291cmNlTGVuZ3RoICogMl07IC8vIGFsbCBsYW1hbGVmcyByZXF1aXJpbmcgZXhwYW5zaW9uCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzb3VyY2VTdGFydCwgdGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKworICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICBpbnZlcnRCdWZmZXIodGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBvdXRwdXRTaXplID0gc291cmNlTGVuZ3RoOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICAgICAgaWYoICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKT4gMCkgJiYKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgIT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSB7CisgICAgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2hhcGluZyBmdW5jdGlvbiB3aXRoIHRhc2hrZWVsIGZsYWcgPT0gMiBmb3IgcmVtb3ZhbCBvZiB0YXNoa2VlbCAqLworICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMik7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgIC8vZGVmYXVsdCBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAxICovCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAvKkFmdGVyIHNoYXBpbmcgdGV4dCBjaGVjayBpZiB1c2VyIHdhbnRzIHRvIHJlbW92ZSB0YXNoa2VlbCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRhdHdlZWwqLworICAgICAgICAgICAgICAgICAgIGlmKCAob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA9PSBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpeworICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbCh0ZW1wLHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gZGVTaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0U2l6ZSA+IGRlc3RTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigibm90IGVub3VnaCByb29tIGZvciByZXN1bHQgZGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvcHRpb25zICYgRElHSVRTX01BU0spICE9IERJR0lUU19OT09QKSB7CisgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSA9ICdcdTAwMzAnOyAvLyBFdXJvcGVhbiBkaWdpdHMKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUX1RZUEVfTUFTSykgeworICAgICAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOgorICAgICAgICAgICAgICAgIGRpZ2l0QmFzZSA9ICdcdTA2NjAnOyAgLy8gQXJhYmljLUluZGljIGRpZ2l0cworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDZmMCc7ICAvLyBFYXN0ZXJuIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFBlcnNpYW4gYW5kIFVyZHUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUU19NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gZGlnaXRCYXNlIC0gJ1x1MDAzMCc7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnXHUwMDM5JyAmJiBjaCA+PSAnXHUwMDMwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0gKz0gZGlnaXREZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0VG9wID0gKGNoYXIpKGRpZ2l0QmFzZSArIDkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXREZWx0YSA9ICdcdTAwMzAnIC0gZGlnaXRCYXNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dFNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRlbXBbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gZGlnaXRUb3AgJiYgY2ggPj0gZGlnaXRCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9BTDoKKyAgICAgICAgICAgICAgICBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQodGVtcCwgMCwgb3V0cHV0U2l6ZSwgZGlnaXRCYXNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgZGVzdCwgZGVzdFN0YXJ0LCBvdXRwdXRTaXplKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljdTRqL2xpY2Vuc2UuaHRtbCBiL2ljdTRqL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA1ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj48L21ldGE+Cis8dGl0bGU+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgQkdDT0xPUj0iI2ZmZmZmZiI+Cis8aDI+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC9oMj4KKworPHA+Q09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRTwvcD4KKworPHA+CitDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKzwvcD4KKzxwPgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzwvcD4KKzxwPgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucwordG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMKK3Blcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCis8L3A+Cis8cD4KK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIAorSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKK1JFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1VTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorPC9wPgorPHA+CitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBhIGNvcHlyaWdodCBob2xkZXIgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4KK3RoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCis8L3A+CisKKzxocj4KKzxwPjxzbWFsbD4KK0FsbCB0cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhlcmVpbiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorPC9zbWFsbD48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaAppbmRleCAwOWYwZGUxLi4yMmM5YjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKQEAgLTMwLDcgKzMwLDkgQEAKIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0gICAgCisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKwogY2xhc3MgQW5kcm9pZFJ1bnRpbWUKIHsKIHB1YmxpYzoKQEAgLTEyMiw2ICsxMjQsOCBAQAogLy8gUmV0dXJucyB0aGUgVW5peCBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgUGFyY2VsRmlsZURlc2NyaXB0b3Igb2JqZWN0CiBleHRlcm4gaW50IGdldFBhcmNlbEZpbGVEZXNjcmlwdG9yRkQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KTsKIAorZXh0ZXJuIEN1cnNvcldpbmRvdyAqIGdldF93aW5kb3dfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFXaW5kb3cpOworCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmggYi9pbmNsdWRlL2JpbmRlci9DdXJzb3JXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAorI2RlZmluZSBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgorI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQorI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKKworI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgorCisvLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCisvLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuaworI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKKworCisjaWYgTE9HX05ERUJVRworCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCisjZGVmaW5lIExPR19XSU5ET1coLi4uKQorCisjZWxzZQorCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKKyNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKKworI2VuZGlmCisKKworLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2CisjZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQorCisvLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKKyNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG51bVJvd3M7CisgICAgdWludDMyX3QgbnVtQ29sdW1uczsKK30gd2luZG93X2hlYWRlcl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG9mZnNldDsKK30gcm93X3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IHR5cGU7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgaW50NjRfdCBsOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgfSBidWZmZXI7CisgICAgfSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7CisKKyNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDAKKyNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKKyNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCisjZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKKyNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKKworLyoqCisgKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQorICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5CisgKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKKyAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQorICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KKyAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgorICovCitjbGFzcyBDdXJzb3JXaW5kb3cKK3sKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7CisgICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQorCisgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9CisgICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKKworICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KKworICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1NYXhTaXplOworICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKaW5kZXggZTEyYTY5NC4uYjI4MDhmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaApAQCAtMjIsNiArMjIsMjEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgU2l6ZSB7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisKKyAgICBTaXplKCkgeworICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgIGhlaWdodCA9IDA7CisgICAgfQorCisgICAgU2l6ZShpbnQgdywgaW50IGgpIHsKKyAgICAgICAgd2lkdGggPSB3OworICAgICAgICBoZWlnaHQgPSBoOworICAgIH0KK307CisKIGNsYXNzIENhbWVyYVBhcmFtZXRlcnMKIHsKIHB1YmxpYzoKQEAgLTQzLDEyICs1OCwxNCBAQAogCiAgICAgdm9pZCBzZXRQcmV2aWV3U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZvaWQgZ2V0UHJldmlld1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0OworICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0OwogICAgIHZvaWQgc2V0UHJldmlld0ZyYW1lUmF0ZShpbnQgZnBzKTsKICAgICBpbnQgZ2V0UHJldmlld0ZyYW1lUmF0ZSgpIGNvbnN0OwogICAgIHZvaWQgc2V0UHJldmlld0Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpOwogICAgIGNvbnN0IGNoYXIgKmdldFByZXZpZXdGb3JtYXQoKSBjb25zdDsKICAgICB2b2lkIHNldFBpY3R1cmVTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdm9pZCBnZXRQaWN0dXJlU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7CiAgICAgdm9pZCBzZXRQaWN0dXJlRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCk7CiAgICAgY29uc3QgY2hhciAqZ2V0UGljdHVyZUZvcm1hdCgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAppbmRleCAzMTkyZDAzLi5lZDVmMDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ3LDEyICs0NiwzNCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpOwogCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTb3VyY2VMaXN0ZW5lcjsKLQorcHJvdGVjdGVkOgogICAgIHNwPENhbWVyYT4gbUNhbWVyYTsKICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CiAKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBuZWVkIHRvIHNraXAgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgLy8gQ2FsbGVkIGZyb20gZGF0YUNhbGxiYWNrVGltZXN0YW1wLgorICAgIHZpcnR1YWwgYm9vbCBza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpIHtyZXR1cm4gZmFsc2U7fQorCisgICAgLy8gQ2FsbGJhY2sgY2FsbGVkIHdoZW4gc3RpbGwgY2FtZXJhIHJhdyBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CisKICAgICBNdXRleCBtTG9jazsKICAgICBDb25kaXRpb24gbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uOwogICAgIENvbmRpdGlvbiBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbjsKQEAgLTYwLDIxICs4MSwxMiBAQAogICAgIExpc3Q8c3A8SU1lbW9yeT4gPiBtRnJhbWVzQmVpbmdFbmNvZGVkOwogICAgIExpc3Q8aW50NjRfdD4gbUZyYW1lVGltZXM7CiAKLSAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKICAgICBpbnQ2NF90IG1GaXJzdEZyYW1lVGltZVVzOwotICAgIGludDY0X3QgbUxhc3RGcmFtZVRpbWVzdGFtcFVzOwotICAgIGludDMyX3QgbU51bUZyYW1lc1JlY2VpdmVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0VuY29kZWQ7CiAgICAgaW50MzJfdCBtTnVtRnJhbWVzRHJvcHBlZDsKICAgICBpbnQzMl90IG1OdW1HbGl0Y2hlczsKICAgICBpbnQ2NF90IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzOwogICAgIGJvb2wgbUNvbGxlY3RTdGF0czsKLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSk7Ci0KLSAgICB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgKLSAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOwogCiAgICAgdm9pZCByZWxlYXNlUXVldWVkRnJhbWVzKCk7CiAgICAgdm9pZCByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzVhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KKworI2RlZmluZSBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSUNhbWVyYTsKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBDYW1lcmE7CisKK2NsYXNzIENhbWVyYVNvdXJjZVRpbWVMYXBzZSA6IHB1YmxpYyBDYW1lcmFTb3VyY2UgeworcHVibGljOgorICAgIHN0YXRpYyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNyZWF0ZShib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIHN0YXRpYyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIHZpcnR1YWwgfkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgpOworCitwcml2YXRlOgorICAgIC8vIElmIHRydWUsIHdpbGwgdXNlIHN0aWxsIGNhbWVyYSB0YWtlUGljdHVyZSgpIGZvciB0aW1lIGxhcHNlIGZyYW1lcworICAgIC8vIElmIGZhbHNlLCB3aWxsIHVzZSB0aGUgdmlkZW9jYW1lcmEgZnJhbWVzIGluc3RlYWQuCisgICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7CisKKyAgICAvLyBTaXplIG9mIHBpY3R1cmUgdGFrZW4gZnJvbSBzdGlsbCBjYW1lcmEuIFRoaXMgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplCisgICAgLy8gb2YgdGhlIHZpZGVvLCBhcyBzdGlsbCBjYW1lcmEgbWF5IG5vdCBzdXBwb3J0IHRoZSBleGFjdCB2aWRlbyByZXNvbHV0aW9uCisgICAgLy8gZGVtYW5kZWQuIFNlZSBzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZCgpLgorICAgIGludDMyX3QgbVBpY3R1cmVXaWR0aDsKKyAgICBpbnQzMl90IG1QaWN0dXJlSGVpZ2h0OworCisgICAgLy8gc2l6ZSBvZiB0aGUgZW5jb2RlZCB2aWRlby4KKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworCisgICAgLy8gVHJ1ZSBpZiB3ZSBuZWVkIHRvIGNyb3AgdGhlIHN0aWxsIGNhbWVyYSBpbWFnZSB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgorICAgIGJvb2wgbU5lZWRDcm9wcGluZzsKKworICAgIC8vIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBjcm9wcGluZyByZWN0YW5nbGUuCisgICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFg7CisgICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFk7CisKKyAgICAvLyBUaW1lIGJldHdlZW4gY2FwdHVyZSBvZiB0d28gZnJhbWVzIGR1cmluZyB0aW1lIGxhcHNlIHJlY29yZGluZworICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRpbWVsYXBzZSBpcyBkaXNhYmxlZC4KKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworCisgICAgLy8gVGltZSBiZXR3ZWVuIHR3byBmcmFtZXMgaW4gZmluYWwgdmlkZW8gKDEvZnJhbWVSYXRlKQorICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKworICAgIC8vIFJlYWwgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGVuY29kZWQgdGltZSBsYXBzZSBmcmFtZQorICAgIGludDY0X3QgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVczsKKworICAgIC8vIFRocmVhZCBpZCBvZiB0aHJlYWQgd2hpY2ggdGFrZXMgc3RpbGwgcGljdHVyZSBhbmQgc2xlZXBzIGluIGEgbG9vcC4KKyAgICBwdGhyZWFkX3QgbVRocmVhZFRpbWVMYXBzZTsKKworICAgIC8vIFZhcmlhYmxlIHNldCBpbiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSB0byBoZWxwIHNraXBDdXJyZW50RnJhbWUoKQorICAgIC8vIHRvIGtub3cgaWYgY3VycmVudCBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkLgorICAgIGJvb2wgbVNraXBDdXJyZW50RnJhbWU7CisKKyAgICAvLyBUcnVlIGlmIGNhbWVyYSBpcyBpbiBwcmV2aWV3IG1vZGUgYW5kIHJlYWR5IGZvciB0YWtlUGljdHVyZSgpLgorICAgIGJvb2wgbUNhbWVyYUlkbGU7CisKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBzdGFydHMgYSB0aHJlYWQgd2hpY2ggY2FsbHMgY2FtZXJhJ3MgdGFrZVBpY3R1cmUoKQorICAgIC8vIGluIGEgbG9vcC4gRm9yIHZpZGVvIGNhbWVyYSBjYXNlLCBqdXN0IHN0YXJ0cyB0aGUgY2FtZXJhJ3MgdmlkZW8gcmVjb3JkaW5nLgorICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIGpvaW5zIHRoZSB0aHJlYWQgY3JlYXRlZCBpbiBzdGFydENhbWVyYVJlY29yZGluZygpLgorICAgIC8vIEZvciB2aWRlbyBjYW1lcmEgY2FzZSwganVzdCBzdG9wcyB0aGUgY2FtZXJhJ3MgdmlkZW8gcmVjb3JkaW5nLgorICAgIHZpcnR1YWwgdm9pZCBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBtZW1vcnkgaXMgbG9jYWxseQorICAgIC8vIGFsbG9jYXRlZCB3aXRoIHJlZmNvdW50aW5nLgorICAgIC8vIEZvciB2aWRlbyBjYW1lcmEgY2FzZSBqdXN0IHRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIHRoZSBmcmFtZS4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBtU2tpcEN1cnJlbnRGcmFtZSBpcyBzZXQgdG8gdHJ1ZSBpbiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBpZiB0aGUgY3VycmVudAorICAgIC8vIGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQgYW5kIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBtU2tpcEN1cnJlbnRGcmFtZS4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIC8vIEhhbmRsZXMgdGhlIGNhbGxiYWNrIHRvIGhhbmRsZSByYXcgZnJhbWUgZGF0YSBmcm9tIHRoZSBzdGlsbCBjYW1lcmEuCisgICAgLy8gQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIGZyYW1lIGRhdGEgYXMgdGhlIGNhbWVyYSBjYW4gcmV1c2UgdGhlIGZyYW1lIG1lbW9yeQorICAgIC8vIG9uY2UgdGhpcyBjYWxsYmFjayByZXR1cm5zLiBUaGUgZnVuY3Rpb24gYWxzbyBzZXRzIGEgbmV3IHRpbXN0YW1wIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB0byBvbmUgZnJhbWUgdGltZSBhaGVhZCBvZiB0aGUgbGFzdCBlbmNvZGVkIGZyYW1lJ3MgdGltZSBzdGFtcC4gSXQgdGhlbgorICAgIC8vIGNhbGxzIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIG9mIHRoZSBiYXNlIGNsYXNzIHdpdGggdGhlIGNvcGllZCBkYXRhIGFuZCB0aGUKKyAgICAvLyBtb2RpZmllZCB0aW1lc3RhbXAsIHdoaWNoIHdpbGwgdGhpbmsgdGhhdCBpdCByZWNpZXZlZCB0aGUgZnJhbWUgZnJvbSBhIHZpZGVvCisgICAgLy8gY2FtZXJhIGFuZCBwcm9jZWVkIGFzIHVzdWFsLgorICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKKyAgICAvLyBJbiB0aGUgdmlkZW8gY2FtZXJhIGNhc2UgY2FsbHMgc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKCkgdG8gbW9kaWZ5CisgICAgLy8gdGltZXN0YW1wIGFuZCBzZXQgbVNraXBDdXJyZW50RnJhbWUuCisgICAgLy8gVGhlbiBpdCBjYWxscyB0aGUgYmFzZSBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgpCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKKyAgICAvLyBUaGUgc3RpbGwgY2FtZXJhIG1heSBub3Qgc3VwcG9ydCB0aGUgZGVtYW5kZWQgdmlkZW8gd2lkdGggYW5kIGhlaWdodC4KKyAgICAvLyBXZSBsb29rIGZvciB0aGUgc3VwcG9ydGVkIHBpY3R1cmUgc2l6ZXMgZnJvbSB0aGUgc3RpbGwgY2FtZXJhIGFuZAorICAgIC8vIGNob29zZSB0aGUgc21hbGxlc3Qgb25lIHdpdGggZWl0aGVyIGRpbWVuc2lvbnMgaGlnaGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB2aWRlbyBkaW1lbnNpb25zLiBUaGUgc3RpbGwgcGljdHVyZSB3aWxsIGJlIGNyb3BwZWQgdG8gZ2V0IHRoZSB2aWRlbyBmcmFtZS4KKyAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW1lcmEgc3VwcG9ydHMgcGljdHVyZSBzaXplcyBncmVhdGVyIHRoYW4KKyAgICAvLyBvciBlcXVhbCB0byB0aGUgcGFzc2VkIGluIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBDb21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSByZWN0YW5nbGUgZnJvbSB3aGVyZSB0byBzdGFydCBjcm9wcGluZyB0aGUKKyAgICAvLyBzdGlsbCBpbWFnZSBpbnRvIHRoZSB2aWRlbyBmcmFtZS4gV2UgY2hvb3NlIHRoZSBjZW50ZXIgb2YgdGhlIGltYWdlIHRvIGJlCisgICAgLy8gY3JvcHBlZC4gVGhlIG9mZnNldCBpcyBzdG9yZWQgaW4gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKS4KKyAgICBib29sIGNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCk7CisKKyAgICAvLyBDcm9wcyB0aGUgc291cmNlIGRhdGEgaW50byBhIHNtYWxsZXIgaW1hZ2Ugc3RhcnRpbmcgYXQKKyAgICAvLyAobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpIGFuZCBvZiB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGRhdGEgaXMgcmV0dXJuZWQgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBJTWVtb3J5LgorICAgIHNwPElNZW1vcnk+IGNyb3BZVVZJbWFnZShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpOworCisgICAgLy8gV2hlbiB2aWRlbyBjYW1lcmEgaXMgdXNlZCBmb3IgdGltZSBsYXBzZSBjYXB0dXJlLCByZXR1cm5zIHRydWUKKyAgICAvLyB1bnRpbCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIGZvciB0aGUgbmV4dCB0aW1lIGxhcHNlIGZyYW1lLiBXaGVuCisgICAgLy8gdGhlIGZyYW1lIG5lZWRzIHRvIGJlIGVuY29kZWQsIGl0IHJldHVybnMgZmFsc2UgYW5kIGFsc28gbW9kaWZpZXMKKyAgICAvLyB0aGUgdGltZSBzdGFtcCB0byBiZSBvbmUgZnJhbWUgdGltZSBhaGVhZCBvZiB0aGUgbGFzdCBlbmNvZGVkCisgICAgLy8gZnJhbWUncyB0aW1lIHN0YW1wLgorICAgIGJvb2wgc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkVGltZUxhcHNlRW50cnkoKQorICAgIHN0YXRpYyB2b2lkICpUaHJlYWRUaW1lTGFwc2VXcmFwcGVyKHZvaWQgKm1lKTsKKworICAgIC8vIFJ1bnMgYSBsb29wIHdoaWNoIHNsZWVwcyB1bnRpbCBhIHN0aWxsIHBpY3R1cmUgaXMgcmVxdWlyZWQKKyAgICAvLyBhbmQgdGhlbiBjYWxscyBtQ2FtZXJhLT50YWtlUGljdHVyZSgpIHRvIHRha2UgdGhlIHN0aWxsIHBpY3R1cmUuCisgICAgLy8gVXNlZCBvbmx5IGluIHRoZSBjYXNlIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IHRydWUuCisgICAgdm9pZCB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpOworCisgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRTdGFydFByZXZpZXcoKQorICAgIHN0YXRpYyB2b2lkICpUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKHZvaWQgKm1lKTsKKworICAgIC8vIFN0YXJ0cyB0aGUgY2FtZXJhJ3MgcHJldmlldy4KKyAgICB2b2lkIHRocmVhZFN0YXJ0UHJldmlldygpOworCisgICAgLy8gU3RhcnRzIHRocmVhZCBUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKCkgZm9yIHJlc3RhcnRpbmcgcHJldmlldy4KKyAgICAvLyBOZWVkcyB0byBiZSBkb25lIGluIGEgdGhyZWFkIHNvIHRoYXQgZGF0YUNhbGxiYWNrKCkgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbgorICAgIC8vIGNhbiByZXR1cm4sIGFuZCB0aGUgY2FtZXJhIGNhbiBrbm93IHRoYXQgdGFrZVBpY3R1cmUoKSBpcyBkb25lLgorICAgIHZvaWQgcmVzdGFydFByZXZpZXcoKTsKKworICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHNvdXJjZV9kYXRhIGludG8gYSBuZXcgbWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZS4KKyAgICBzcDxJTWVtb3J5PiBjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpOworCisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmKTsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJm9wZXJhdG9yPShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxNzA0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFlVVkNhbnZhcyBob2xkcyBhIHJlZmVyZW5jZSB0byBhIFlVVkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbyB2YXJpb3VzCisvLyBkcmF3aW5nIG9wZXJhdGlvbnMuIEl0IHByb3ZpZGVzIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGZpbGxpbmcsCisvLyBjcm9wcGluZywgZXRjLgorCisKKyNpZm5kZWYgWVVWX0NBTlZBU19IXworCisjZGVmaW5lIFlVVl9DQU5WQVNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFlVVkltYWdlOworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWQ2FudmFzIHsKK3B1YmxpYzoKKworICAgIC8vIENvbnN0cnVjdG9yIHRha2VzIGluIHJlZmVyZW5jZSB0byBhIHl1dkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbworICAgIC8vIHZhcmlvdXMgZHJhd2luZyBvcHJlYXRpb25zLgorICAgIFlVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpOworICAgIH5ZVVZDYW52YXMoKTsKKworICAgIC8vIEZpbGxzIHRoZSBlbnRpcmUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVYodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBGaWxscyB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIFtzdGFydFgsZW5kWF14W3N0YXJ0WSxlbmRZXSB3aXRoIHRoZSBnaXZlbiBZVVYgdmFsdWVzLgorICAgIHZvaWQgRmlsbFlVVlJlY3RhbmdsZShjb25zdCBSZWN0JiByZWN0LAorICAgICAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBDb3BpZXMgdGhlIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gZnJvbSBzcmNJbWFnZSBpbnRvIHRoZQorICAgIC8vIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpIHN0YXJ0aW5nIGF0CisgICAgLy8gKGRlc3RpbmF0aW9uU3RhcnRYLGRlc3RpbmF0aW9uU3RhcnRZKS4KKyAgICAvLyBOb3RlIHRoYXQgdW5kZWZpbmVkIGJlaGF2aW9yIG1heSBvY2N1ciBpZiBzcmNJbWFnZSBpcyBzYW1lIGFzIHRoZSBjYW52YXMnCisgICAgLy8gdGFyZ2V0IGltYWdlLgorICAgIHZvaWQgQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSk7CisKK3ByaXZhdGU6CisgICAgWVVWSW1hZ2UmIG1ZVVZJbWFnZTsKKworICAgIFlVVkNhbnZhcyhjb25zdCBZVVZDYW52YXMgJik7CisgICAgWVVWQ2FudmFzICZvcGVyYXRvcj0oY29uc3QgWVVWQ2FudmFzICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBZVVZfQ0FOVkFTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlYWMzZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEEgY29udGFpbmVyIGNsYXNzIHRvIGhvbGQgWVVWIGRhdGEgYW5kIHByb3ZpZGUgdmFyaW91cyB1dGlsaXRpZXMsCisvLyBlLmcuIHRvIHNldC9nZXQgcGl4ZWwgdmFsdWVzLgorLy8gU3VwcG9ydGVkIGZvcm1hdHM6CisvLyAgLSBZVVY0MjAgUGxhbmFyCisvLyAgLSBZVVY0MjAgU2VtaSBQbGFuYXIKKy8vCisvLyAgQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgc3RyaWRlcy4KKy8vCisvLyAgSW1wbGVtZW50YXRpb246IFR3byBzaW1wbGUgYWJzdHJhY3Rpb25zIGFyZSBkb25lIHRvIHNpbXBsaWZ5IGFjY2VzcworLy8gIHRvIFlVViBjaGFubmVscyBmb3IgZGlmZmVyZW50IGZvcm1hdHM6CisvLyAgLSBpbml0aWFsaXplWVVWUG9pbnRlcnMoKSBzZXRzIHVwIHBvaW50ZXJzIChtWWRhdGEsIG1VZGF0YSwgbVZkYXRhKSB0bworLy8gIHBvaW50IHRvIHRoZSByaWdodCBzdGFydCBsb2NhdGlvbnMgb2YgdGhlIGRpZmZlcmVudCBjaGFubmVsIGRhdGEgZGVwZW5kaW5nCisvLyAgb24gdGhlIGZvcm1hdC4KKy8vICAtIGdldE9mZnNldHMoKSByZXR1cm5zIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhlIGRpZmZlcmVudCBjaGFubmVscworLy8gIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LgorLy8gIExvY2F0aW9uIG9mIGFueSBwaXhlbCdzIFlVViBjaGFubmVscyBjYW4gdGhlbiBiZSBlYXNpbHkgY29tcHV0ZWQgdXNpbmcgdGhlc2UuCisvLworCisjaWZuZGVmIFlVVl9JTUFHRV9IXworCisjZGVmaW5lIFlVVl9JTUFHRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBSZWN0OworCitjbGFzcyBZVVZJbWFnZSB7CitwdWJsaWM6CisgICAgLy8gU3VwcG9ydGVkIFlVViBmb3JtYXRzCisgICAgZW51bSBZVVZGb3JtYXQgeworICAgICAgICBZVVY0MjBQbGFuYXIsCisgICAgICAgIFlVVjQyMFNlbWlQbGFuYXIKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIEFsc28gYWxsb2NhdGVzIGFuZCBvd25zCisgICAgLy8gdGhlIHJlcXVpcmVkIG1lbW9yeS4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBDb25zdHJ1Y3RzIGFuIGltYWdlIHdpdGggdGhlIGdpdmVuIHNpemUsIGZvcm1hdC4gVGhlIG1lbW9yeSBpcyBwcm92aWRlZAorICAgIC8vIGJ5IHRoZSBjYWxsZXIgYW5kIHdlIGRvbid0IG93biBpdC4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCAqYnVmZmVyKTsKKworICAgIC8vIERlc3RydWN0b3IgdG8gZGVsZXRlIHRoZSBtZW1vcnkgaWYgaXQgb3ducyBpdC4KKyAgICB+WVVWSW1hZ2UoKTsKKworICAgIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBzdG9yZSB0aGUgWVVWIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgIC8vIGZvcm1hdCBhbmQgZ2VvbWV0cnkuIFVzZWZ1bCB3aGVuIHRoZSBjYWxsZXIgd2FudHMgdG8gYWxsb2NhdGUgdGhlIHJlcXVpc2l0ZQorICAgIC8vIG1lbW9yeS4KKyAgICBzdGF0aWMgc2l6ZV90IGJ1ZmZlclNpemUoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgaW50MzJfdCB3aWR0aCgpIHtyZXR1cm4gbVdpZHRoO30KKyAgICBpbnQzMl90IGhlaWdodCgpIHtyZXR1cm4gbUhlaWdodDt9CisKKyAgICAvLyBHZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBnZXQgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZ2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgIHVpbnQ4X3QgKnlQdHIsIHVpbnQ4X3QgKnVQdHIsIHVpbnQ4X3QgKnZQdHIpIGNvbnN0OworCisgICAgLy8gU2V0IHRoZSBwaXhlbCBZVVYgdmFsdWUgYXQgcGl4ZWwgKHgseSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgc2V0IHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIFVzZXMgbWVtY3B5IHRvIGNvcHkgYW4gZW50aXJlIHJvdyBvZiBkYXRhCisgICAgc3RhdGljIHZvaWQgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVHJpZXMgdG8gdXNlIG1lbWNvcHkgdG8gY29weSBlbnRpcmUgcm93cyBvZiBkYXRhLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFzdCBjb3B5IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHBhc3NlZCBpbWFnZSBmb3JtYXRzLgorICAgIHN0YXRpYyBib29sIGZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIFlVViB2YWx1ZSB0byBSR0IuCisgICAgdm9pZCB5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0OworCisgICAgLy8gV3JpdGUgdGhlIGltYWdlIHRvIGEgaHVtYW4gcmVhZGFibGUgUFBNIGZpbGUuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXRlIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHdyaXRlVG9QUE0oY29uc3QgY2hhciAqZmlsZW5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIFlVViBGb3JtYXQgb2YgdGhlIGltYWdlLgorICAgIFlVVkZvcm1hdCBtWVVWRm9ybWF0OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gUG9pbnRlciB0byB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICB1aW50OF90ICptQnVmZmVyOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgd2Ugb3duIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIGJvb2wgbU93bkJ1ZmZlcjsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFkgZGF0YSBwbGFuZS4KKyAgICB1aW50OF90ICptWWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBVIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVWRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgVSBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBWIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVmRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgViBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVmRhdGE7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBwb2ludGVycyBtWWRhdGEsIG1VZGF0YSwgbVZkYXRhIHRvIHBvaW50IHRvIHRoZSByaWdodCBsb2NhdGlvbnMgZm9yCisgICAgLy8gdGhlIGdpdmVuIGZvcm1hdCBhbmQgZ2VvbWV0cnkuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluaXRpYWxpemUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7CisKKyAgICAvLyBGb3IgdGhlIGdpdmVuIHBpeGVsIGxvY2F0aW9uLCB0aGlzIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gb2YgeSwgdSBhbmQgdgorICAgIC8vIGRhdGEgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBiYXNlIHBvaW50ZXJzIC0tIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0dGluZyBvZmZzZXRzIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcgZnJvbSBvbmUgZGF0YSByb3cgdG8gdGhlIG5leHQgZGF0YSByb3cKKyAgICAvLyBmb3IgdGhlIFlVViBjaGFubmVscy4gTm90ZSB0aGF0IHRoaXMgY29ycmVzcG9uZHMgdG8gZGF0YSByb3dzIGFuZCBub3QgcGl4ZWwgcm93cy4KKyAgICAvLyBFLmcuIGRlcGVuZGluZyBvbiBmb3JtYXRzLCBVL1YgY2hhbm5lbHMgbWF5IGhhdmUgb25seSBvbmUgZGF0YSByb3cgY29ycmVzcG9uZGluZworICAgIC8vIHRvIHR3byBwaXhlbCByb3dzLgorICAgIGJvb2wgZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0OworCisgICAgLy8gR2l2ZW4gdGhlIG9mZnNldCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgdWludDhfdCogZ2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50OF90KiBnZXRWQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgcGl4ZWwgbG9jYXRpb24sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICBib29sIGdldFlVVkFkZHJlc3NlcyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqKnlBZGRyLCB1aW50OF90ICoqdUFkZHIsIHVpbnQ4X3QgKip2QWRkcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyBpbXBsaWNpdCBjYXN0aW5nIGFuZCBjb3B5aW5nLgorICAgIFlVVkltYWdlKGNvbnN0IFlVVkltYWdlICYpOworICAgIFlVVkltYWdlICZvcGVyYXRvcj0oY29uc3QgWVVWSW1hZ2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFlVVl9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQW5kcm9pZC5tayBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKaW5kZXggMTNkYzUwMC4uZjlkOWYyNSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvQW5kcm9pZC5taworKysgYi9saWJzL2JpbmRlci9BbmRyb2lkLm1rCkBAIC0xNiw2ICsxNiw3IEBACiBzb3VyY2VzIDo9IFwKICAgICBCaW5kZXIuY3BwIFwKICAgICBCcEJpbmRlci5jcHAgXAorICAgIEN1cnNvcldpbmRvdy5jcHAgXAogICAgIElJbnRlcmZhY2UuY3BwIFwKICAgICBJTWVtb3J5LmNwcCBcCiAgICAgSVBDVGhyZWFkU3RhdGUuY3BwIFwKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjI3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkN1cnNvcldpbmRvdyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9DdXJzb3JXaW5kb3cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ3Vyc29yV2luZG93OjpDdXJzb3JXaW5kb3coc2l6ZV90IG1heFNpemUpIDoKKyAgICBtTWF4U2l6ZShtYXhTaXplKQoreworfQorCitib29sIEN1cnNvcldpbmRvdzo6c2V0TWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBtZW1vcnkpCit7CisgICAgbU1lbW9yeSA9IG1lbW9yeTsKKyAgICBtRGF0YSA9ICh1aW50OF90ICopIG1lbW9yeS0+cG9pbnRlcigpOworICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhlYWRlciA9ICh3aW5kb3dfaGVhZGVyX3QgKikgbURhdGE7CisKKyAgICAvLyBNYWtlIHRoZSB3aW5kb3cgcmVhZC1vbmx5CisgICAgc3NpemVfdCBzaXplID0gbWVtb3J5LT5zaXplKCk7CisgICAgbVNpemUgPSBzaXplOworICAgIG1NYXhTaXplID0gc2l6ZTsKKyAgICBtRnJlZU9mZnNldCA9IHNpemU7CitMT0dfV0lORE9XKCJDcmVhdGVkIEN1cnNvcldpbmRvdyBmcm9tIGV4aXN0aW5nIElNZW1vcnk6IG1GcmVlT2Zmc2V0ID0gJWQsIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6aW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSkKK3sKKyAgICAvL1RPRE8gVXNlIGEgbm9uLW1lbW9yeSBkZWFsZXIgbW1hcCByZWdpb24gZm9yIGxvY2FsT25seQorCisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXA7CisgICAgaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShtTWF4U2l6ZSwgMCwgIkN1cnNvcldpbmRvdyIpOworICAgIGlmIChoZWFwICE9IE5VTEwpIHsKKyAgICAgICAgbU1lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIDAsIG1NYXhTaXplKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKSBtTWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgICAgICBpZiAobURhdGEpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKKyAgICAgICAgICAgICAgICBtU2l6ZSA9IG1NYXhTaXplOworCisgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSB3aW5kb3cgaW50byBhIGNsZWFuIHN0YXRlCisgICAgICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIExPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IHdpdGggbmV3IE1lbW9yeURlYWxlcjogbUZyZWVPZmZzZXQgPSAlZCwgbVNpemUgPSAlZCwgbU1heFNpemUgPSAlZCwgbURhdGEgPSAlcCIsIG1GcmVlT2Zmc2V0LCBtU2l6ZSwgbU1heFNpemUsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIExPR0UoIkN1cnNvcldpbmRvdyBoZWFwIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIHRoZSBDdXJzb3JXaW5kb3cgaGVhcCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitDdXJzb3JXaW5kb3c6On5DdXJzb3JXaW5kb3coKQoreworICAgIC8vIEV2ZXJ5dGhpbmcgdGhhdCBtYXR0ZXJzIGlzIGEgc21hcnQgcG9pbnRlcgorfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y2xlYXIoKQoreworICAgIG1IZWFkZXItPm51bVJvd3MgPSAwOworICAgIG1IZWFkZXItPm51bUNvbHVtbnMgPSAwOworICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFOworICAgIC8vIE1hcmsgdGhlIGZpcnN0IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAorICAgICooKHVpbnQzMl90ICopKG1EYXRhICsgbUZyZWVPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKSkgPSAwOworfQorCitpbnQzMl90IEN1cnNvcldpbmRvdzo6ZnJlZVNwYWNlKCkKK3sKKyAgICBpbnQzMl90IGZyZWVTcGFjZSA9IG1TaXplIC0gbUZyZWVPZmZzZXQ7CisgICAgaWYgKGZyZWVTcGFjZSA8IDApIHsKKyAgICAgICAgZnJlZVNwYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGZyZWVTcGFjZTsKK30KKworZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1JvdygpCit7CisgICAgLy8gRmlsbCBpbiB0aGUgcm93IHNsb3QKKyAgICByb3dfc2xvdF90ICogcm93U2xvdCA9IGFsbG9jUm93U2xvdCgpOworICAgIGlmIChyb3dTbG90ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdGhlIHNsb3RzIGZvciB0aGUgZmllbGQgZGlyZWN0b3J5CisgICAgc2l6ZV90IGZpZWxkRGlyU2l6ZSA9IG1IZWFkZXItPm51bUNvbHVtbnMgKiBzaXplb2YoZmllbGRfc2xvdF90KTsKKyAgICB1aW50MzJfdCBmaWVsZERpck9mZnNldCA9IGFsbG9jKGZpZWxkRGlyU2l6ZSk7CisgICAgaWYgKCFmaWVsZERpck9mZnNldCkgeworICAgICAgICBtSGVhZGVyLT5udW1Sb3dzLS07CisgICAgICAgIExPR0UoIlRoZSByb3cgZmFpbGVkLCBzbyBiYWNrIG91dCB0aGUgbmV3IHJvdyBhY2NvdW50aW5nIGZyb20gYWxsb2NSb3dTbG90ICVkIiwgbUhlYWRlci0+bnVtUm93cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCk7CisgICAgbWVtc2V0KGZpZWxkRGlyLCAweDAsIGZpZWxkRGlyU2l6ZSk7CisKK0xPR19XSU5ET1coIkFsbG9jYXRlZCByb3cgJXUsIHJvd1Nsb3QgaXMgYXQgb2Zmc2V0ICV1LCBmaWVsZERpciBpcyAlZCBieXRlcyBhdCBvZmZzZXQgJXVcbiIsIChtSGVhZGVyLT5udW1Sb3dzIC0gMSksICgodWludDhfdCAqKXJvd1Nsb3QpIC0gbURhdGEsIGZpZWxkRGlyU2l6ZSwgZmllbGREaXJPZmZzZXQpOworICAgIHJvd1Nsb3QtPm9mZnNldCA9IGZpZWxkRGlyT2Zmc2V0OworCisgICAgcmV0dXJuIGZpZWxkRGlyOworfQorCit1aW50MzJfdCBDdXJzb3JXaW5kb3c6OmFsbG9jKHNpemVfdCByZXF1ZXN0ZWRTaXplLCBib29sIGFsaWduZWQpCit7CisgICAgaW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IHBhZGRpbmc7CisgICAgaWYgKGFsaWduZWQpIHsKKyAgICAgICAgLy8gNCBieXRlIGFsaWdubWVudAorICAgICAgICBwYWRkaW5nID0gNCAtIChtRnJlZU9mZnNldCAmIDB4Myk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFkZGluZyA9IDA7CisgICAgfQorCisgICAgc2l6ZSA9IHJlcXVlc3RlZFNpemUgKyBwYWRkaW5nOworCisgICAgaWYgKHNpemUgPiBmcmVlU3BhY2UoKSkgeworICAgICAgICBMT0dFKCJuZWVkIHRvIGdyb3c6IG1TaXplID0gJWQsIHNpemUgPSAlZCwgZnJlZVNwYWNlKCkgPSAlZCwgbnVtUm93cyA9ICVkIiwgbVNpemUsIHNpemUsIGZyZWVTcGFjZSgpLCBtSGVhZGVyLT5udW1Sb3dzKTsKKyAgICAgICAgLy8gT25seSBncm93IHRoZSB3aW5kb3cgaWYgdGhlIGZpcnN0IHJvdyBkb2Vzbid0IGZpdAorICAgICAgICBpZiAobUhlYWRlci0+bnVtUm93cyA+IDEpIHsKK0xPR0UoIm5vdCBncm93aW5nIHNpbmNlIHRoZXJlIGFyZSBhbHJlYWR5ICVkIHJvdyhzKSwgbWF4IHNpemUgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCBtTWF4U2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgYSBuZXcgc2l6ZSB0aGF0IHdpbGwgZml0IHRoZSBhbGxvY2F0aW9uCisgICAgICAgIGludCBhbGxvY2F0ZWQgPSBtU2l6ZSAtIGZyZWVTcGFjZSgpOworICAgICAgICBpbnQgbmV3U2l6ZSA9IG1TaXplICsgV0lORE9XX0FMTE9DQVRJT05fU0laRTsKKyAgICAgICAgd2hpbGUgKHNpemUgPiAobmV3U2l6ZSAtIGFsbG9jYXRlZCkpIHsKKyAgICAgICAgICAgIG5ld1NpemUgKz0gV0lORE9XX0FMTE9DQVRJT05fU0laRTsKKyAgICAgICAgICAgIGlmIChuZXdTaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIGdyb3cgd2luZG93IGJleW9uZCBtYXggc2l6ZSAoJWQpIiwgbU1heFNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CitMT0dfV0lORE9XKCJmb3VuZCBzaXplICVkIiwgbmV3U2l6ZSk7CisgICAgICAgIG1TaXplID0gbmV3U2l6ZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBtRnJlZU9mZnNldCArIHBhZGRpbmc7CisgICAgbUZyZWVPZmZzZXQgKz0gc2l6ZTsKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCityb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRSb3dTbG90KGludCByb3cpCit7CisgICAgTE9HX1dJTkRPVygiZW50ZXIgZ2V0Um93U2xvdCBjdXJyZW50IHJvdyBudW0gJWQsIHRoaXMgcm93ICVkIiwgbUhlYWRlci0+bnVtUm93cywgcm93KTsKKyAgICBpbnQgY2h1bmtOdW0gPSByb3cgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQb3MgPSByb3cgJSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQdHJPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpOworICAgIHVpbnQ4X3QgKiByb3dDaHVuayA9IG1EYXRhICsgc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaHVua051bTsgaSsrKSB7CisgICAgICAgIHJvd0NodW5rID0gb2Zmc2V0VG9QdHIoKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpKTsKKyAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKKyAgICB9CisgICAgcmV0dXJuIChyb3dfc2xvdF90ICopKHJvd0NodW5rICsgKGNodW5rUG9zICogc2l6ZW9mKHJvd19zbG90X3QpKSk7CisgICAgTE9HX1dJTkRPVygiZXhpdCBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOyAgICAKK30KKworcm93X3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6YWxsb2NSb3dTbG90KCkKK3sKKyAgICBpbnQgY2h1bmtOdW0gPSBtSGVhZGVyLT5udW1Sb3dzIC8gUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUG9zID0gbUhlYWRlci0+bnVtUm93cyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7CisgICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKK0xPR19XSU5ET1coIkFsbG9jYXRpbmcgcm93IHNsb3QsIG1IZWFkZXItPm51bVJvd3MgaXMgJWQsIGNodW5rTnVtIGlzICVkLCBjaHVua1BvcyBpcyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIGNodW5rTnVtLCBjaHVua1Bvcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaHVua051bTsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IG5leHRDaHVua09mZnNldCA9ICooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKTsKK0xPR19XSU5ET1coIm5leHRDaHVua09mZnNldCBpcyAlZCIsIG5leHRDaHVua09mZnNldCk7CisgICAgICAgIGlmIChuZXh0Q2h1bmtPZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGUgYSBuZXcgcm93IGNodW5rCisgICAgICAgICAgICBuZXh0Q2h1bmtPZmZzZXQgPSBhbGxvYyhST1dfU0xPVF9DSFVOS19TSVpFLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChuZXh0Q2h1bmtPZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOworTE9HX1dJTkRPVygiYWxsb2NhdGVkIG5ldyBjaHVuayBhdCAlZCwgcm93Q2h1bmsgPSAlcCIsIG5leHRDaHVua09mZnNldCwgcm93Q2h1bmspOworICAgICAgICAgICAgKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpID0gcm93Q2h1bmsgLSBtRGF0YTsKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIG5ldyBjaHVuaydzIG5leHQgJ3BvaW50ZXInIGFzIG51bGwKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopKHJvd0NodW5rICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7CisgICAgICAgIH0gZWxzZSB7CitMT0dfV0lORE9XKCJmb2xsd2luZyAncG9pbnRlcicgdG8gbmV4dCBjaHVuaywgb2Zmc2V0IG9mIG5leHQgcG9pbnRlciBpcyAlZCIsIGNodW5rUHRyT2Zmc2V0KTsKKyAgICAgICAgICAgIHJvd0NodW5rID0gb2Zmc2V0VG9QdHIobmV4dENodW5rT2Zmc2V0KTsKKyAgICAgICAgICAgIGNodW5rUHRyT2Zmc2V0ID0gcm93Q2h1bmsgLSBtRGF0YSArIChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUhlYWRlci0+bnVtUm93cysrOworCisgICAgcmV0dXJuIChyb3dfc2xvdF90ICopKHJvd0NodW5rICsgKGNodW5rUG9zICogc2l6ZW9mKHJvd19zbG90X3QpKSk7Cit9CisKK2ZpZWxkX3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6Z2V0RmllbGRTbG90V2l0aENoZWNrKGludCByb3csIGludCBjb2x1bW4pCit7CisgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKKyAgICAgIExPR0UoIkJhZCByZXF1ZXN0IGZvciBmaWVsZCBzbG90ICVkLCVkLiBudW1Sb3dzID0gJWQsIG51bUNvbHVtbnMgPSAlZCIsIHJvdywgY29sdW1uLCBtSGVhZGVyLT5udW1Sb3dzLCBtSGVhZGVyLT5udW1Db2x1bW5zKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9ICAgICAgICAKKyAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7CisgIGlmICghcm93U2xvdCkgeworICAgICAgTE9HRSgiRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBmb3Igcm93ICVkIiwgcm93KTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChyb3dTbG90LT5vZmZzZXQgPT0gMCB8fCByb3dTbG90LT5vZmZzZXQgPj0gbVNpemUpIHsKKyAgICAgIExPR0UoIkludmFsaWQgcm93U2xvdCwgb2Zmc2V0ID0gJWQiLCByb3dTbG90LT5vZmZzZXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0gIAorICBpbnQgZmllbGREaXJPZmZzZXQgPSByb3dTbG90LT5vZmZzZXQ7CisgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47ICAKK30KKwordWludDMyX3QgQ3Vyc29yV2luZG93OjpyZWFkX2ZpZWxkX3Nsb3QoaW50IHJvdywgaW50IGNvbHVtbiwgZmllbGRfc2xvdF90ICogc2xvdE91dCkKK3sKKyAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gbUhlYWRlci0+bnVtUm93cyB8fCBjb2x1bW4gPCAwIHx8IGNvbHVtbiA+PSBtSGVhZGVyLT5udW1Db2x1bW5zKSB7CisgICAgICAgIExPR0UoIkJhZCByZXF1ZXN0IGZvciBmaWVsZCBzbG90ICVkLCVkLiBudW1Sb3dzID0gJWQsIG51bUNvbHVtbnMgPSAlZCIsIHJvdywgY29sdW1uLCBtSGVhZGVyLT5udW1Sb3dzLCBtSGVhZGVyLT5udW1Db2x1bW5zKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gICAgICAgIAorICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gZ2V0Um93U2xvdChyb3cpOworICAgIGlmICghcm93U2xvdCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyb3dTbG90LT5vZmZzZXQgPT0gMCB8fCByb3dTbG90LT5vZmZzZXQgPj0gbVNpemUpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CitMT0dfV0lORE9XKCJGb3VuZCBmaWVsZCBkaXJlY3RvcnkgZm9yICVkLCVkIGF0IHJvd1Nsb3QgJWQsIG9mZnNldCAlZCIsIHJvdywgY29sdW1uLCAodWludDhfdCAqKXJvd1Nsb3QgLSBtRGF0YSwgcm93U2xvdC0+b2Zmc2V0KTsKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihyb3dTbG90LT5vZmZzZXQpOworTE9HX1dJTkRPVygiUmVhZCBmaWVsZF9zbG90X3QgJWQsJWQ6IG9mZnNldCA9ICVkLCBzaXplID0gJWQsIHR5cGUgPSAlZCIsIHJvdywgY29sdW1uLCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldCwgZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplLCBmaWVsZERpcltjb2x1bW5dLnR5cGUpOworCisgICAgLy8gQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0IHBhcmFtCisgICAgc2xvdE91dC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5vZmZzZXQ7CisgICAgc2xvdE91dC0+ZGF0YS5idWZmZXIuc2l6ZSA9IGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIuc2l6ZTsKKyAgICBzbG90T3V0LT50eXBlID0gZmllbGREaXJbY29sdW1uXS50eXBlOworICAgIHJldHVybiAwOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsgICAgCisgICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSkKK3sKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGludDY0X3QpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsICh1aW50OF90ICopJmRhdGEsIHNpemVvZihpbnQ2NF90KSk7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSkKK3sKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGRvdWJsZSkgPD0gbVNpemUpOworICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGRvdWJsZSkpOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weU91dCh1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KGRhdGEsIG1EYXRhICsgb2Zmc2V0LCBzaXplKTsKK30KKworaW50NjRfdCBDdXJzb3JXaW5kb3c6OmNvcHlPdXRMb25nKHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBpbnQ2NF90IHZhbHVlOworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOworICAgIG1lbWNweSgmdmFsdWUsIG1EYXRhICsgb2Zmc2V0LCBzaXplb2YoaW50NjRfdCkpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworZG91YmxlIEN1cnNvcldpbmRvdzo6Y29weU91dERvdWJsZSh1aW50MzJfdCBvZmZzZXQpCit7CisgICAgZG91YmxlIHZhbHVlOworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihkb3VibGUpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpwdXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgdmFsdWUpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCisgICAgZmllbGRTbG90LT5kYXRhLmwgPSB2YWx1ZTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IGFsbG9jKHNpemVvZihpbnQ2NF90KSk7CisgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvcHlJbihvZmZzZXQsIHZhbHVlKTsKKworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IHNpemVvZihpbnQ2NF90KTsKKyNlbmRpZgorICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfSU5URUdFUjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OnB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCisgICAgZmllbGRTbG90LT5kYXRhLmQgPSB2YWx1ZTsKKyNlbHNlCisgICAgaW50IG9mZnNldCA9IGFsbG9jKHNpemVvZihpbnQ2NF90KSk7CisgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvcHlJbihvZmZzZXQsIHZhbHVlKTsKKworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IHNpemVvZihkb3VibGUpOworI2VuZGlmCisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9GTE9BVDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OnB1dE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX05VTEw7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSAwOworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IDA7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpnZXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgKiB2YWx1ZU91dCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0lOVEVHRVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEubDsKKyNlbHNlCisgICAgKnZhbHVlT3V0ID0gY29weU91dExvbmcoZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpnZXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlICogdmFsdWVPdXQpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCB8fCBmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9GTE9BVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCisgICAgKnZhbHVlT3V0ID0gZmllbGRTbG90LT5kYXRhLmQ7CisjZWxzZQorICAgICp2YWx1ZU91dCA9IGNvcHlPdXREb3VibGUoZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpnZXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGJvb2wgKiB2YWx1ZU91dCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgaWYgKGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX05VTEwpIHsKKyAgICAgICAgKnZhbHVlT3V0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnZhbHVlT3V0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDE0MTU0OTMuLmFiZDQxOGEgMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCisrKyBiL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yNjksNyArMjY5LDcgQEAKICAgICBtTWFwLnJlbW92ZUl0ZW0oU3RyaW5nOChrZXkpKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV9zaXplKGNvbnN0IGNoYXIgKnN0ciwgaW50ICZ3aWR0aCwgaW50ICZoZWlnaHQpCitzdGF0aWMgaW50IHBhcnNlX3NpemUoY29uc3QgY2hhciAqc3RyLCBpbnQgJndpZHRoLCBpbnQgJmhlaWdodCwgY2hhciAqKmVuZHB0ciA9IE5VTEwpCiB7CiAgICAgLy8gRmluZCB0aGUgd2lkdGguCiAgICAgY2hhciAqZW5kOwpAQCAtMjc5LDE0ICsyNzksNDIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgLy8gRmluZCB0aGUgaGVpZ2h0LCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJ3gnLgotICAgIGludCBoID0gKGludClzdHJ0b2woZW5kKzEsIDAsIDEwKTsKKyAgICBpbnQgaCA9IChpbnQpc3RydG9sKGVuZCsxLCAmZW5kLCAxMCk7CiAKICAgICB3aWR0aCA9IHc7CiAgICAgaGVpZ2h0ID0gaDsKIAorICAgIGlmIChlbmRwdHIpIHsKKyAgICAgICAgKmVuZHB0ciA9IGVuZDsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcGFyc2VTaXplc0xpc3QoY29uc3QgY2hhciAqc2l6ZXNTdHIsIFZlY3RvcjxTaXplPiAmc2l6ZXMpCit7CisgICAgaWYgKHNpemVzU3RyID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYXIgKnNpemVTdGFydFB0ciA9IChjaGFyICopc2l6ZXNTdHI7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaW50IHN1Y2Nlc3MgPSBwYXJzZV9zaXplKHNpemVTdGFydFB0ciwgd2lkdGgsIGhlaWdodCwgJnNpemVTdGFydFB0cik7CisgICAgICAgIGlmIChzdWNjZXNzID09IC0xIHx8ICgqc2l6ZVN0YXJ0UHRyICE9ICcsJyAmJiAqc2l6ZVN0YXJ0UHRyICE9ICdcMCcpKSB7CisgICAgICAgICAgICBMT0dFKCJQaWN0dXJlIHNpemVzIHN0cmluZyBcIiVzXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIuIiwgc2l6ZXNTdHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemVzLnB1c2goU2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisKKyAgICAgICAgaWYgKCpzaXplU3RhcnRQdHIgPT0gJ1wwJykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemVTdGFydFB0cisrOworICAgIH0KK30KKwogdm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgY2hhciBzdHJbMzJdOwpAQCAtMzExLDYgKzMzOSwxMiBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3QKK3sKKyAgICBjb25zdCBjaGFyICpwcmV2aWV3U2l6ZXNTdHIgPSBnZXQoS0VZX1NVUFBPUlRFRF9QUkVWSUVXX1NJWkVTKTsKKyAgICBwYXJzZVNpemVzTGlzdChwcmV2aWV3U2l6ZXNTdHIsIHNpemVzKTsKK30KKwogdm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3RnJhbWVSYXRlKGludCBmcHMpCiB7CiAgICAgc2V0KEtFWV9QUkVWSUVXX0ZSQU1FX1JBVEUsIGZwcyk7CkBAIC0zNTUsNiArMzg5LDEyIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdAoreworICAgIGNvbnN0IGNoYXIgKnBpY3R1cmVTaXplc1N0ciA9IGdldChLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMpOworICAgIHBhcnNlU2l6ZXNMaXN0KHBpY3R1cmVTaXplc1N0ciwgc2l6ZXMpOworfQorCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OnNldFBpY3R1cmVGb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KQogewogICAgIHNldChLRVlfUElDVFVSRV9GT1JNQVQsIGZvcm1hdCk7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvQW5kcm9pZC5tayBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmU2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQxIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIE9ubHkgYnVpbGQgbGliaHd1aSB3aGVuIFVTRV9PUEVOR0xfUkVOREVSRVIgaXMKKyMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBkZXZpY2UvYm9hcmQgY29uZmlndXJhdGlvbgoraWZlcSAoJChVU0VfT1BFTkdMX1JFTkRFUkVSKSx0cnVlKQorCUxPQ0FMX1NSQ19GSUxFUzo9IFwKKwkJRm9udFJlbmRlcmVyLmNwcCBcCisJCUdyYWRpZW50Q2FjaGUuY3BwIFwKKwkJTGF5ZXJDYWNoZS5jcHAgXAorCQlNYXRyaXguY3BwIFwKKwkJT3BlbkdMUmVuZGVyZXIuY3BwIFwKKwkJUGF0Y2guY3BwIFwKKwkJUGF0Y2hDYWNoZS5jcHAgXAorCQlQYXRoQ2FjaGUuY3BwIFwKKwkJUHJvZ3JhbS5jcHAgXAorCQlQcm9ncmFtQ2FjaGUuY3BwIFwKKwkJU2tpYUNvbG9yRmlsdGVyLmNwcCBcCisJCVNraWFTaGFkZXIuY3BwIFwKKwkJVGV4dHVyZUNhY2hlLmNwcAorCQorCUxPQ0FMX0NfSU5DTFVERVMgKz0gXAorCQkkKEpOSV9IX0lOQ0xVREUpIFwKKwkJJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3V0aWxzIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvZWZmZWN0cyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXAorCQlleHRlcm5hbC9za2lhL3NyYy9wb3J0cyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS91dGlscworCisJTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX09QRU5HTF9SRU5ERVJFUgorCUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBTSEFSRURfTElCUkFSSUVTCisJTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGliR0xFU3YyIGxpYnNraWEKKwlMT0NBTF9NT0RVTEUgOj0gbGliaHd1aQorCUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisJTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwkKKwlpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyAgICBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0V4dGVuc2lvbnMuaCBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ODI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKworI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK2NsYXNzIEV4dGVuc2lvbnMgeworcHVibGljOgorICAgIEV4dGVuc2lvbnMoKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGJ1ZmZlciA9IChjb25zdCBjaGFyKikgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyk7CisgICAgICAgIGNvbnN0IGNoYXIqIGN1cnJlbnQgPSBidWZmZXI7CisgICAgICAgIGNvbnN0IGNoYXIqIGhlYWQgPSBjdXJyZW50OworICAgICAgICBkbyB7CisgICAgICAgICAgICBoZWFkID0gc3RyY2hyKGN1cnJlbnQsICcgJyk7CisgICAgICAgICAgICBTdHJpbmc4IHMoY3VycmVudCwgaGVhZCA/IGhlYWQgLSBjdXJyZW50IDogc3RybGVuKGN1cnJlbnQpKTsKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgbUV4dGVuc2lvbkxpc3QuYWRkKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IGhlYWQgKyAxOworICAgICAgICB9IHdoaWxlIChoZWFkKTsKKworICAgICAgICBtSGFzTlBvdCA9IGhhc0V4dGVuc2lvbigiR0xfT0VTX3RleHR1cmVfbnBvdCIpOworICAgICAgICBtSGFzRHJhd1BhdGggPSBoYXNFeHRlbnNpb24oIkdMX05WX2RyYXdfcGF0aCIpOworICAgICAgICBtSGFzQ292ZXJhZ2VTYW1wbGUgPSBoYXNFeHRlbnNpb24oIkdMX05WX2NvdmVyYWdlX3NhbXBsZSIpOworCisgICAgICAgIG1FeHRlbnNpb25zID0gYnVmZmVyOworICAgIH0KKworICAgIGlubGluZSBib29sIGhhc05Qb3QoKSBjb25zdCB7IHJldHVybiBtSGFzTlBvdDsgfQorICAgIGlubGluZSBib29sIGhhc0RyYXdQYXRoKCkgY29uc3QgeyByZXR1cm4gbUhhc0RyYXdQYXRoOyB9CisgICAgaW5saW5lIGJvb2wgaGFzQ292ZXJhZ2VTYW1wbGUoKSBjb25zdCB7IHJldHVybiBtSGFzQ292ZXJhZ2VTYW1wbGU7IH0KKworICAgIGJvb2wgaGFzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBTdHJpbmc4IHMoZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25MaXN0LmluZGV4T2YocykgPj0gMDsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoKSB7CisgICAgICAgIExPR0QoIlN1cHBvcnRlZCBleHRlbnNpb25zOlxuJXMiLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBtRXh0ZW5zaW9uTGlzdDsKKworICAgIGNvbnN0IGNoYXIqIG1FeHRlbnNpb25zOworCisgICAgYm9vbCBtSGFzTlBvdDsKKyAgICBib29sIG1IYXNEcmF3UGF0aDsKKyAgICBib29sIG1IYXNDb3ZlcmFnZVNhbXBsZTsKK307IC8vIGNsYXNzIEV4dGVuc2lvbnMKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA3YWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw4MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8U2tVdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZvbnRSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAorI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ZvbnQ6OkZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgOgorICAgIG1TdGF0ZShzdGF0ZSksIG1Gb250SWQoZm9udElkKSwgbUZvbnRTaXplKGZvbnRTaXplKSB7Cit9CisKKworRm9udDo6fkZvbnQoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVN0YXRlLT5tQWN0aXZlRm9udHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIGlmIChtU3RhdGUtPm1BY3RpdmVGb250c1tjdF0gPT0gdGhpcykgeworICAgICAgICAgICAgbVN0YXRlLT5tQWN0aXZlRm9udHMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOworICAgICAgICBkZWxldGUgZ2x5cGg7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpLT5tSXNWYWxpZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBGb250OjptZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgaWYgKGJvdW5kcy0+Ym90dG9tID4gblBlblkpIHsKKyAgICAgICAgYm91bmRzLT5ib3R0b20gPSBuUGVuWTsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+bGVmdCA+IG5QZW5YKSB7CisgICAgICAgIGJvdW5kcy0+bGVmdCA9IG5QZW5YOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5yaWdodCA8IG5QZW5YICsgd2lkdGgpIHsKKyAgICAgICAgYm91bmRzLT5yaWdodCA9IG5QZW5YICsgd2lkdGg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnRvcCA8IG5QZW5ZICsgaGVpZ2h0KSB7CisgICAgICAgIGJvdW5kcy0+dG9wID0gblBlblkgKyBoZWlnaHQ7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQgeCwgaW50IHkpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgZmxvYXQgdTEgPSBnbHlwaC0+bUJpdG1hcE1pblU7CisgICAgZmxvYXQgdTIgPSBnbHlwaC0+bUJpdG1hcE1heFU7CisgICAgZmxvYXQgdjEgPSBnbHlwaC0+bUJpdG1hcE1pblY7CisgICAgZmxvYXQgdjIgPSBnbHlwaC0+bUJpdG1hcE1heFY7CisKKyAgICBpbnQgd2lkdGggPSAoaW50KSBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIGludCBoZWlnaHQgPSAoaW50KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIG1TdGF0ZS0+YXBwZW5kTWVzaFF1YWQoblBlblgsIG5QZW5ZLCAwLCB1MSwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSwgMCwgdTIsIHYyLAorICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblkgLSBoZWlnaHQsIDAsIHUyLCB2MSwKKyAgICAgICAgICAgIG5QZW5YLCBuUGVuWSAtIGhlaWdodCwgMCwgdTEsIHYxKTsKK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIHVpbnQzMl90IGVuZFggPSBnbHlwaC0+bVN0YXJ0WCArIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IGdseXBoLT5tU3RhcnRZICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgY29uc3QgdWludDhfdCogY2FjaGVCdWZmZXIgPSBtU3RhdGUtPmdldFRleHRUZXh0dXJlRGF0YSgpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgY2FjaGVZID0gMDsKKyAgICBpbnQzMl90IGJYID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gZ2x5cGgtPm1TdGFydFgsIGJYID0gblBlblg7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gZ2x5cGgtPm1TdGFydFksIGJZID0gblBlblk7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICBpZiAoYlggPCAwIHx8IGJZIDwgMCB8fCBiWCA+PSAoaW50MzJfdCliaXRtYXBXIHx8IGJZID49IChpbnQzMl90KWJpdG1hcEgpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTa2lwcGluZyBpbnZhbGlkIGluZGV4Iik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXTsKKyAgICAgICAgICAgIGJpdG1hcFtiWSAqIGJpdG1hcFcgKyBiWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Z2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKSB7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVGb3IodXRmQ2hhcik7CisgICAgaWYgKGNhY2hlZEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBjYWNoZUdseXBoKHBhaW50LCB1dGZDaGFyKTsKKyAgICB9CisKKyAgICAvLyBJcyB0aGUgZ2x5cGggc3RpbGwgaW4gdGV4dHVyZSBjYWNoZT8KKyAgICBpZiAoIWNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICBjb25zdCBTa0dseXBoJiBza2lhR2x5cGggPSBwYWludC0+Z2V0VW5pY2hhck1ldHJpY3ModXRmQ2hhcik7CisgICAgICAgIHVwZGF0ZUdseXBoQ2FjaGUocGFpbnQsIHNraWFHbHlwaCwgY2FjaGVkR2x5cGgpOworICAgIH0KKworICAgIHJldHVybiBjYWNoZWRHbHlwaDsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKSB7CisgICAgaWYgKGJpdG1hcCAhPSBOVUxMICYmIGJpdG1hcFcgPiAwICYmIGJpdG1hcEggPiAwKSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBCSVRNQVAsIGJpdG1hcCwKKyAgICAgICAgICAgICAgICBiaXRtYXBXLCBiaXRtYXBILCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsIDAsIDAsIE5VTEwpOworICAgIH0KKworfQorCit2b2lkIEZvbnQ6Om1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcykgeworICAgIGlmIChib3VuZHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyByZXR1cm4gcmVjdGFuZ2xlIHByb3ZpZGVkIHRvIG1lYXN1cmUgdGV4dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvdW5kcy0+c2V0KDFlNiwgLTFlNiwgLTFlNiwgMWU2KTsKKyAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgMCwgMCwgTUVBU1VSRSwgTlVMTCwgMCwgMCwgYm91bmRzKTsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgUmVuZGVyTW9kZSBtb2RlLCB1aW50OF90ICpiaXRtYXAsCisgICAgICAgIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgsUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQgZ2x5cGhzTGVmdCA9IDE7CisgICAgaWYgKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgZ2x5cGhzTGVmdCA9IG51bUdseXBoczsKKyAgICB9CisKKyAgICB0ZXh0ICs9IHN0YXJ0OworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IFNrVVRGMTZfTmV4dFVuaWNoYXIoKGNvbnN0IHVpbnQxNl90KiopICZ0ZXh0KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICBpZiAodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIocGFpbnQsIHV0ZkNoYXIpOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZiAoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIHBlblgsIHBlblkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCSVRNQVA6CisgICAgICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZLCBiaXRtYXAsIGJpdG1hcFcsIGJpdG1hcEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRUFTVVJFOgorICAgICAgICAgICAgICAgIG1lYXN1cmVDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gU2tGaXhlZEZsb29yKGNhY2hlZEdseXBoLT5tQWR2YW5jZVgpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYgKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQtLTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGb250Ojp1cGRhdGVHbHlwaENhY2hlKFNrUGFpbnQqIHBhaW50LCBjb25zdCBTa0dseXBoJiBza2lhR2x5cGgsIENhY2hlZEdseXBoSW5mbyogZ2x5cGgpIHsKKyAgICBnbHlwaC0+bUFkdmFuY2VYID0gc2tpYUdseXBoLmZBZHZhbmNlWDsKKyAgICBnbHlwaC0+bUFkdmFuY2VZID0gc2tpYUdseXBoLmZBZHZhbmNlWTsKKyAgICBnbHlwaC0+bUJpdG1hcExlZnQgPSBza2lhR2x5cGguZkxlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBza2lhR2x5cGguZlRvcDsKKworICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIEdldCB0aGUgYml0bWFwIGZvciB0aGUgZ2x5cGgKKyAgICBwYWludC0+ZmluZEltYWdlKHNraWFHbHlwaCk7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gbVN0YXRlLT5jYWNoZUJpdG1hcChza2lhR2x5cGgsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYgKCFnbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBza2lhR2x5cGguZldpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBza2lhR2x5cGguZkhlaWdodDsKKworICAgIGdseXBoLT5tU3RhcnRYID0gc3RhcnRYOworICAgIGdseXBoLT5tU3RhcnRZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBza2lhR2x5cGguZldpZHRoOworICAgIGdseXBoLT5tQml0bWFwSGVpZ2h0ID0gc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgdWludDMyX3QgY2FjaGVIZWlnaHQgPSBtU3RhdGUtPmdldENhY2hlSGVpZ2h0KCk7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblUgPSAoZmxvYXQpIHN0YXJ0WCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblYgPSAoZmxvYXQpIHN0YXJ0WSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KSBlbmRYIC8gKGZsb2F0KSBjYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWF4ViA9IChmbG9hdCkgZW5kWSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisKKyAgICBtU3RhdGUtPm1VcGxvYWRUZXh0dXJlID0gdHJ1ZTsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKSB7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBuZXdHbHlwaCA9IG5ldyBDYWNoZWRHbHlwaEluZm8oKTsKKyAgICBtQ2FjaGVkR2x5cGhzLmFkZChnbHlwaCwgbmV3R2x5cGgpOworCisgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gcGFpbnQtPmdldFVuaWNoYXJNZXRyaWNzKGdseXBoKTsKKyAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBza2lhR2x5cGguZklEOworICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQqIEZvbnQ6OmNyZWF0ZShGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgVmVjdG9yPEZvbnQqPiAmYWN0aXZlRm9udHMgPSBzdGF0ZS0+bUFjdGl2ZUZvbnRzOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEZvbnQqIGZvbnQgPSBhY3RpdmVGb250c1tpXTsKKyAgICAgICAgaWYgKGZvbnQtPm1Gb250SWQgPT0gZm9udElkICYmIGZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250KiBuZXdGb250ID0gbmV3IEZvbnQoc3RhdGUsIGZvbnRJZCwgZm9udFNpemUpOworICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgcmV0dXJuIG5ld0ZvbnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvbnRSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitGb250UmVuZGVyZXI6OkZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBGb250UmVuZGVyZXIiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVRleHR1cmVJZCA9IDA7CisKKyAgICBtVGV4dE1lc2hQdHIgPSBOVUxMOworICAgIG1UZXh0VGV4dHVyZSA9IE5VTEw7CisKKyAgICBtSW5kZXhCdWZmZXJJRCA9IDA7CisKKyAgICBtQ2FjaGVXaWR0aCA9IERFRkFVTFRfVEVYVF9DQUNIRV9XSURUSDsKKyAgICBtQ2FjaGVIZWlnaHQgPSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUOworCisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVF9DQUNIRV9XSURUSCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBjYWNoZSB3aWR0aCB0byAlcyBwaXhlbHMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1DYWNoZVdpZHRoID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgY2FjaGUgd2lkdGggb2YgJWkgcGl4ZWxzIiwgbUNhY2hlV2lkdGgpOworICAgIH0KKworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVF9DQUNIRV9IRUlHSFQsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgY2FjaGUgd2lkdGggdG8gJXMgcGl4ZWxzIiwgcHJvcGVydHkpOworICAgICAgICBtQ2FjaGVIZWlnaHQgPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBjYWNoZSBoZWlnaHQgb2YgJWkgcGl4ZWxzIiwgbUNhY2hlSGVpZ2h0KTsKKyAgICB9Cit9CisKK0ZvbnRSZW5kZXJlcjo6fkZvbnRSZW5kZXJlcigpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKyAgICBtQ2FjaGVMaW5lcy5jbGVhcigpOworCisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBkZWxldGVbXSBtVGV4dE1lc2hQdHI7CisgICAgICAgIGRlbGV0ZVtdIG1UZXh0VGV4dHVyZTsKKyAgICB9CisKKyAgICBpZiAobVRleHR1cmVJZCkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZUlkKTsKKyAgICB9CisKKyAgICBWZWN0b3I8Rm9udCo+IGZvbnRzVG9EZXJlZmVyZW5jZSA9IG1BY3RpdmVGb250czsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZm9udHNUb0RlcmVmZXJlbmNlLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBmb250c1RvRGVyZWZlcmVuY2VbaV07CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6Zmx1c2hBbGxBbmRJbnZhbGlkYXRlKCkgeworICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCAhPSAwKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUFjdGl2ZUZvbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BY3RpdmVGb250c1tpXS0+aW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1DdXJyZW50Q29sID0gMDsKKyAgICB9Cit9CisKK2Jvb2wgRm9udFJlbmRlcmVyOjpjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QqIHJldE9yaWdpblgsIHVpbnQzMl90KiByZXRPcmlnaW5ZKSB7CisgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAorICAgIGlmIChnbHlwaC5mV2lkdGggPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCkgLSAxXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAoaW50KSBnbHlwaC5mV2lkdGgsIChpbnQpIGdseXBoLmZIZWlnaHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgICAgICAvLyBUcnkgdG8gZml0IGl0IGFnYWluCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZiAoYml0bWFwRml0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBmaXQsIHNvbWV0aGluZyBpcyB3cm9uZyBhbmQgd2Ugc2hvdWxkbid0IGRyYXcKKyAgICAgICAgaWYgKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcmV0T3JpZ2luWCA9IHN0YXJ0WDsKKyAgICAqcmV0T3JpZ2luWSA9IHN0YXJ0WTsKKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBnbHlwaC5mV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbUNhY2hlV2lkdGg7CisKKyAgICB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1UZXh0VGV4dHVyZTsKKyAgICB1aW50OF90KiBiaXRtYXBCdWZmZXIgPSAodWludDhfdCopIGdseXBoLmZJbWFnZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RyaWRlID0gZ2x5cGgucm93Qnl0ZXMoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBzdHJpZGUgKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OmluaXRUZXh0VGV4dHVyZSgpIHsKKyAgICBtVGV4dFRleHR1cmUgPSBuZXcgdWludDhfdFttQ2FjaGVXaWR0aCAqIG1DYWNoZUhlaWdodF07CisgICAgbVVwbG9hZFRleHR1cmUgPSBmYWxzZTsKKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICAvLyBJbml0aWFsaXplIHRleHR1cmUgZGltZW50aW9ucworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgbUNhY2hlV2lkdGgsIG1DYWNoZUhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgLy8gU3BsaXQgdXAgb3VyIGNhY2hlIHRleHR1cmUgaW50byBsaW5lcyBvZiBjZXJ0YWluIHdpZHRocworICAgIGludCBuZXh0TGluZSA9IDA7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgMTYsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgMjQsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgMjQsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgMzIsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgMzIsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgNDAsIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZShtQ2FjaGVXaWR0aCwgbUNhY2hlSGVpZ2h0IC0gbmV4dExpbmUsIG5leHRMaW5lLCAwKSk7Cit9CisKKy8vIEF2b2lkIGhhdmluZyB0byByZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmVuZGVyIHF1YWQgYnkgcXVhZAordm9pZCBGb250UmVuZGVyZXI6OmluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKSB7CisgICAgdWludDMyX3QgbnVtSW5kaWNpZXMgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIDY7CisgICAgdWludDMyX3QgaW5kZXhCdWZmZXJTaXplQnl0ZXMgPSBudW1JbmRpY2llcyAqIHNpemVvZih1aW50MTZfdCk7CisgICAgdWludDE2X3QqIGluZGV4QnVmZmVyRGF0YSA9ICh1aW50MTZfdCopIG1hbGxvYyhpbmRleEJ1ZmZlclNpemVCeXRlcyk7CisKKyAgICAvLyBGb3VyIHZlcnRzLCB0d28gdHJpYW5nbGVzICwgc2l4IGluZGljZXMgcGVyIHF1YWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU1heE51bWJlck9mUXVhZHM7IGkrKykgeworICAgICAgICBpbnQgaTYgPSBpICogNjsKKyAgICAgICAgaW50IGk0ID0gaSAqIDQ7CisKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMF0gPSBpNCArIDA7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDFdID0gaTQgKyAxOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAyXSA9IGk0ICsgMjsKKworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAzXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgNF0gPSBpNCArIDI7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDVdID0gaTQgKyAzOworICAgIH0KKworICAgIGdsR2VuQnVmZmVycygxLCAmbUluZGV4QnVmZmVySUQpOworICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBpbmRleEJ1ZmZlclNpemVCeXRlcywgaW5kZXhCdWZmZXJEYXRhLCBHTF9EWU5BTUlDX0RSQVcpOworICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIDApOworCisgICAgZnJlZShpbmRleEJ1ZmZlckRhdGEpOworCisgICAgdWludDMyX3QgY29vcmRTaXplID0gMzsKKyAgICB1aW50MzJfdCB1dlNpemUgPSAyOworICAgIHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgdWludDMyX3QgdmVydGV4QnVmZmVyU2l6ZSA9IG1NYXhOdW1iZXJPZlF1YWRzICogdmVydHNQZXJRdWFkICogY29vcmRTaXplICogdXZTaXplOworICAgIG1UZXh0TWVzaFB0ciA9IG5ldyBmbG9hdFt2ZXJ0ZXhCdWZmZXJTaXplXTsKK30KKworLy8gV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbnl0aGluZyB1bmxlc3Mgd2UgYWN0dWFsbHkgZHJhdyB0ZXh0Cit2b2lkIEZvbnRSZW5kZXJlcjo6Y2hlY2tJbml0KCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKTsKKworICAgIC8vIFdlIHN0b3JlIGEgc3RyaW5nIHdpdGggbGV0dGVycyBpbiBhIHJvdWdoIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlCisgICAgbUxhdGluUHJlY2FjaGUgPSBTdHJpbmcxNigiZWlzYXJudG9sY2R1Z3BtaGJ5ZnZrd3p4anEgIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nMTYoIkVJU0FSTlRPTENEVUdQTUhCWUZWS1daWEpRIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nMTYoIiwuPyEoKS0rQDs6YCciKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiMDEyMzQ1Njc4OSIpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OmNoZWNrVGV4dHVyZVVwZGF0ZSgpIHsKKyAgICBpZiAoIW1VcGxvYWRUZXh0dXJlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlSWQpOworCisgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgY2FjaGUgbGluZXMgYW5kIHNlZSB3aGljaCBvbmVzIG5lZWQgdG8gYmUgdXBkYXRlZAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKiBjbCA9IG1DYWNoZUxpbmVzW2ldOworICAgICAgICBpZihjbC0+bURpcnR5KSB7CisgICAgICAgICAgICB1aW50MzJfdCB4T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IHlPZmZzZXQgPSBjbC0+bUN1cnJlbnRSb3c7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCAgID0gbUNhY2hlV2lkdGg7CisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgID0gY2wtPm1NYXhIZWlnaHQ7CisgICAgICAgICAgICB2b2lkKiAgICB0ZXh0dXJlRGF0YSA9IG1UZXh0VGV4dHVyZSArIHlPZmZzZXQqd2lkdGg7CisKKyAgICAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCB4T2Zmc2V0LCB5T2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdGV4dHVyZURhdGEpOworCisgICAgICAgICAgICBjbC0+bURpcnR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVXBsb2FkVGV4dHVyZSA9IGZhbHNlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aXNzdWVEcmF3Q29tbWFuZCgpIHsKKyAgICBjaGVja1RleHR1cmVVcGRhdGUoKTsKKworICAgIGZsb2F0KiB2dHggPSBtVGV4dE1lc2hQdHI7CisgICAgZmxvYXQqIHRleCA9IHZ0eCArIDM7CisKKyAgICAvLyBwb3NpdGlvbiBpcyBzbG90IDAKKyAgICB1aW50MzJfdCBzbG90ID0gMDsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwgMywgR0xfRkxPQVQsIGZhbHNlLCAyMCwgdnR4KTsKKworICAgIC8vIHRleHR1cmUwIGlzIHNsb3QgMQorICAgIHNsb3QgPSAxOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LCAyLCBHTF9GTE9BVCwgZmFsc2UsIDIwLCB0ZXgpOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBtQ3VycmVudFF1YWRJbmRleCAqIDYsIEdMX1VOU0lHTkVEX1NIT1JULCBOVUxMKTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OmFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsCisgICAgICAgIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCkgeworICAgIGlmICh4MSA+IG1DbGlwLT5yaWdodCB8fCB5MSA8IG1DbGlwLT50b3AgfHwgeDIgPCBtQ2xpcC0+bGVmdCB8fCB5NCA+IG1DbGlwLT5ib3R0b20pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZmxvYXRzUGVyVmVydCA9IDU7CisgICAgZmxvYXQqIGN1cnJlbnRQb3MgPSBtVGV4dE1lc2hQdHIgKyBtQ3VycmVudFF1YWRJbmRleCAqIHZlcnRzUGVyUXVhZCAqIGZsb2F0c1BlclZlcnQ7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MTsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgyOworICAgICgqY3VycmVudFBvcysrKSA9IHkyOworICAgICgqY3VycmVudFBvcysrKSA9IHoyOworICAgICgqY3VycmVudFBvcysrKSA9IHUyOworICAgICgqY3VycmVudFBvcysrKSA9IHYyOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDM7CisgICAgKCpjdXJyZW50UG9zKyspID0geTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gejM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjM7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2NDsKKworICAgIG1DdXJyZW50UXVhZEluZGV4Kys7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggPT0gbU1heE51bWJlck9mUXVhZHMpIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit1aW50MzJfdCBGb250UmVuZGVyZXI6OmdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKSB7CisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSAwOworICAgIGZsb2F0IHRvdGFsUGl4ZWxzID0gMDsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ICs9IChtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoIC0gbUNhY2hlTGluZXNbaV0tPm1DdXJyZW50Q29sKTsKKyAgICAgICAgIHRvdGFsUGl4ZWxzICs9IG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGg7CisgICAgfQorICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gKHJlbWFpbmluZ0NhcGFjaXR5ICogMTAwKSAvIHRvdGFsUGl4ZWxzOworICAgIHJldHVybiByZW1haW5pbmdDYXBhY2l0eTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnByZWNhY2hlTGF0aW4oU2tQYWludCogcGFpbnQpIHsKKyAgICAvLyBSZW1haW5pbmcgY2FwYWNpdHkgaXMgbWVhc3VyZWQgaW4gJQorICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgIHVpbnQzMl90IHByZWNhY2hlSWR4ID0gMDsKKyAgICB3aGlsZShyZW1haW5pbmdDYXBhY2l0eSA+IDI1ICYmIHByZWNhY2hlSWR4IDwgbUxhdGluUHJlY2FjaGUuc2l6ZSgpKSB7CisgICAgICAgIG1DdXJyZW50Rm9udC0+Z2V0Q2FjaGVkVVRGQ2hhcihwYWludCwgKGludDMyX3QpbUxhdGluUHJlY2FjaGVbcHJlY2FjaGVJZHhdKTsKKyAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgICAgIHByZWNhY2hlSWR4ICsrOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6OnNldEZvbnQoU2tQYWludCogcGFpbnQsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpIHsKKyAgICB1aW50MzJfdCBjdXJyZW50TnVtRm9udHMgPSBtQWN0aXZlRm9udHMuc2l6ZSgpOworICAgIG1DdXJyZW50Rm9udCA9IEZvbnQ6OmNyZWF0ZSh0aGlzLCBmb250SWQsIGZvbnRTaXplKTsKKworICAgIGNvbnN0IGZsb2F0IG1heFByZWNhY2hlRm9udFNpemUgPSA0MC4wZjsKKyAgICBib29sIGlzTmV3Rm9udCA9IGN1cnJlbnROdW1Gb250cyAhPSBtQWN0aXZlRm9udHMuc2l6ZSgpOworCisgICAgaWYoaXNOZXdGb250ICYmIGZvbnRTaXplIDw9IG1heFByZWNhY2hlRm9udFNpemUgKXsKKyAgICAgICAgcHJlY2FjaGVMYXRpbihwYWludCk7CisgICAgfQorfQorRm9udFJlbmRlcmVyOjpEcm9wU2hhZG93IEZvbnRSZW5kZXJlcjo6cmVuZGVyRHJvcFNoYWRvdyhTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCwgdWludDMyX3QgbGVuLCBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpIHsKKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KShib3VuZHMucmlnaHQgLSBib3VuZHMubGVmdCkgKyAyKnJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpKGJvdW5kcy50b3AgLSBib3VuZHMuYm90dG9tKSArIDIqcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgcGFkZGVkV2lkdGggKiBwYWRkZWRIZWlnaHQ7IGkgKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorICAgIGludCBwZW5YID0gcmFkaXVzIC0gYm91bmRzLmxlZnQ7CisgICAgaW50IHBlblkgPSByYWRpdXMgLSBib3VuZHMuYm90dG9tOworCisgICAgbUN1cnJlbnRGb250LT5yZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCBwZW5YLCBwZW5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCk7CisgICAgYmx1ckltYWdlKGRhdGFCdWZmZXIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIHJhZGl1cyk7CisKKyAgICBEcm9wU2hhZG93IGltYWdlOworICAgIGltYWdlLndpZHRoID0gcGFkZGVkV2lkdGg7CisgICAgaW1hZ2UuaGVpZ2h0ID0gcGFkZGVkSGVpZ2h0OworICAgIGltYWdlLmltYWdlID0gZGF0YUJ1ZmZlcjsKKyAgICBpbWFnZS5wZW5YID0gcGVuWDsKKyAgICBpbWFnZS5wZW5ZID0gcGVuWTsKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpyZW5kZXJUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBSZWN0KiBjbGlwLCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSkgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgTE9HRSgiTm8gZm9udCBzZXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DbGlwID0gY2xpcDsKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHgsIHkpOworCisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6Y29tcHV0ZUdhdXNzaWFuV2VpZ2h0cyhmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMpIHsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuMyAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuM2YgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZvcihpbnQzMl90IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdCBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gd2VpZ2h0c1tyICsgcmFkaXVzXTsKKyAgICB9CisKKyAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIHdlaWdodHNbciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6Omhvcml6b250YWxCbHVyKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0geCArIHI7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10pOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjp2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGZsb2F0IGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgZmxvYXQgY3VycmVudFBpeGVsID0gMC4wZjsKKworICAgIGZvcihpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICsrKSB7CisKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW5wdXQgPSBzb3VyY2UgKyB4OworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh5ID4gcmFkaXVzKSAmJiAoeSA8IChoZWlnaHQgLSByYWRpdXMpKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmkgPSBpbnB1dCArICgoeSAtIHJhZGl1cykgKiB3aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpICs9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSB5ICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgdmFsaWRIICogd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBGb250UmVuZGVyZXI6OmJsdXJJbWFnZSh1aW50OF90ICppbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKSB7CisgICAgZmxvYXQgKmdhdXNzaWFuID0gbmV3IGZsb2F0WzIgKiByYWRpdXMgKyAxXTsKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGdhdXNzaWFuLCByYWRpdXMpOworICAgIHVpbnQ4X3QqIHNjcmF0Y2ggPSBuZXcgdWludDhfdFt3aWR0aCAqIGhlaWdodF07CisgICAgaG9yaXpvbnRhbEJsdXIoZ2F1c3NpYW4sIHJhZGl1cywgaW1hZ2UsIHNjcmF0Y2gsIHdpZHRoLCBoZWlnaHQpOworICAgIHZlcnRpY2FsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBzY3JhdGNoLCBpbWFnZSwgd2lkdGgsIGhlaWdodCk7CisgICAgZGVsZXRlW10gZ2F1c3NpYW47CisgICAgZGVsZXRlW10gc2NyYXRjaDsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmggYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0NmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworY2xhc3MgRm9udFJlbmRlcmVyOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBmb250LCBkZWZpbmVkIGJ5IGEgU2tpYSBmb250IGlkIGFuZCBhIGZvbnQgc2l6ZS4gQSBmb250IGlzIHVzZWQKKyAqIHRvIGdlbmVyYXRlIGdseXBocyBhbmQgY2FjaGUgdGhlbSBpbiB0aGUgRm9udFN0YXRlLgorICovCitjbGFzcyBGb250IHsKK3B1YmxpYzoKKyAgICB+Rm9udCgpOworCisgICAgLyoqCisgICAgICogUmVuZGVycyB0aGUgc3BlY2lmaWVkIHN0cmluZyBvZiB0ZXh0LgorICAgICAqIElmIGJpdG1hcCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVuZGVyIHRhcmdldAorICAgICAqLworICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9udCBzdGF0ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgRm9udCogY3JlYXRlKEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIEZvbnRSZW5kZXJlcjsKKworICAgIGVudW0gUmVuZGVyTW9kZSB7CisgICAgICAgIEZSQU1FQlVGRkVSLAorICAgICAgICBCSVRNQVAsCisgICAgICAgIE1FQVNVUkUsCisgICAgfTsKKworICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgsCisgICAgICAgICAgICAgICAgICAgICBSZWN0ICpib3VuZHMpOworCisgICAgdm9pZCBtZWFzdXJlVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcyk7CisKKyAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZSBvcgorICAgICAgICAvLyByZW5kZXIgdG8gYml0bWFwCisgICAgICAgIHVpbnQzMl90IG1TdGFydFg7CisgICAgICAgIHVpbnQzMl90IG1TdGFydFk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgdWludDMyX3QgbUdseXBoSW5kZXg7CisgICAgICAgIHVpbnQzMl90IG1BZHZhbmNlWDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VZOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgaW50MzJfdCBtQml0bWFwTGVmdDsKKyAgICAgICAgaW50MzJfdCBtQml0bWFwVG9wOworICAgIH07CisKKyAgICBGb250KEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CisKKyAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKworICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCk7CisgICAgdm9pZCB1cGRhdGVHbHlwaENhY2hlKFNrUGFpbnQqIHBhaW50LCBjb25zdCBTa0dseXBoJiBza2lhR2x5cGgsIENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpOworICAgIHZvaWQgbWVhc3VyZUNhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSwgUmVjdCAqYm91bmRzKTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKTsKKworICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKTsKKworICAgIEZvbnRSZW5kZXJlciogbVN0YXRlOworICAgIHVpbnQzMl90IG1Gb250SWQ7CisgICAgZmxvYXQgbUZvbnRTaXplOworfTsKKworY2xhc3MgRm9udFJlbmRlcmVyIHsKK3B1YmxpYzoKKyAgICBGb250UmVuZGVyZXIoKTsKKyAgICB+Rm9udFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIGRlaW5pdCgpOworCisgICAgdm9pZCBzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKyAgICB2b2lkIHJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICBzdHJ1Y3QgRHJvcFNoYWRvdyB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQ4X3QqIGltYWdlOworICAgICAgICBpbnQzMl90IHBlblg7CisgICAgICAgIGludDMyX3QgcGVuWTsKKyAgICB9OworCisgICAgLy8gQWZ0ZXIgcmVuZGVyRHJvcFNoYWRvdyByZXR1cm5zLCB0aGUgY2FsbGVkIG93bnMgdGhlIG1lbW9yeSBpbiBEcm9wU2hhZG93LmltYWdlCisgICAgLy8gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQgd2hlbiBpdCdzIGRvbmUgd2l0aCBpdAorICAgIERyb3BTaGFkb3cgcmVuZGVyRHJvcFNoYWRvdyhTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuLCBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgR0x1aW50IGdldFRleHR1cmUoKSB7CisgICAgICAgIGNoZWNrSW5pdCgpOworICAgICAgICByZXR1cm4gbVRleHR1cmVJZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lIHsKKyAgICAgICAgdWludDE2X3QgbU1heEhlaWdodDsKKyAgICAgICAgdWludDE2X3QgbU1heFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQ3VycmVudFJvdzsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRDb2w7CisgICAgICAgIGJvb2wgICAgIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQxNl90IG1heFdpZHRoLCB1aW50MTZfdCBtYXhIZWlnaHQsIHVpbnQzMl90IGN1cnJlbnRSb3csCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudENvbCk6CisgICAgICAgICAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgbU1heFdpZHRoKG1heFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSb3coY3VycmVudFJvdyksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtRGlydHkoZmFsc2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmIChnbHlwaC5mSGVpZ2h0ID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aDsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCB2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLCBjb25zdCB1aW50OF90ICpzb3VyY2UsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgIHZvaWQgYmx1ckltYWdlKHVpbnQ4X3QqIGltYWdlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCByYWRpdXMpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oIGIvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjNmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2VuZXJhdGlvbkNhY2hlLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0VORVJBVElPTl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfR0VORVJBVElPTl9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnRyeUtleSwgdHlwZW5hbWUgRW50cnlWYWx1ZT4KK2NsYXNzIE9uRW50cnlSZW1vdmVkIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5PbkVudHJ5UmVtb3ZlZCgpIHsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShFbnRyeUtleSYga2V5LCBFbnRyeVZhbHVlJiB2YWx1ZSkgPSAwOworfTsgLy8gY2xhc3MgT25FbnRyeVJlbW92ZWQKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitzdHJ1Y3QgRW50cnk6IHB1YmxpYyBMaWdodFJlZkJhc2U8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4geworICAgIEVudHJ5KCkgeyB9CisgICAgRW50cnkoY29uc3QgRW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+JiBlKToKKyAgICAgICAgICAgIGtleShlLmtleSksIHZhbHVlKGUudmFsdWUpLCBwYXJlbnQoZS5wYXJlbnQpLCBjaGlsZChlLmNoaWxkKSB7IH0KKyAgICBFbnRyeShzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBlKToKKyAgICAgICAgICAgIGtleShlLT5rZXkpLCB2YWx1ZShlLT52YWx1ZSksIHBhcmVudChlLT5wYXJlbnQpLCBjaGlsZChlLT5jaGlsZCkgeyB9CisKKyAgICBFbnRyeUtleSBrZXk7CisgICAgRW50cnlWYWx1ZSB2YWx1ZTsKKworICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHBhcmVudDsKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBjaGlsZDsKK307IC8vIHN0cnVjdCBFbnRyeQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorY2xhc3MgR2VuZXJhdGlvbkNhY2hlIHsKK3B1YmxpYzoKKyAgICBHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOworICAgIHZpcnR1YWwgfkdlbmVyYXRpb25DYWNoZSgpOworCisgICAgZW51bSBDYXBhY2l0eSB7CisgICAgICAgIGtVbmxpbWl0ZWRDYXBhY2l0eSwKKyAgICB9OworCisgICAgdm9pZCBzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICBib29sIGNvbnRhaW5zKEsga2V5KSBjb25zdDsKKyAgICBWIGdldChLIGtleSk7CisgICAgdm9pZCBwdXQoSyBrZXksIFYgdmFsdWUpOworICAgIFYgcmVtb3ZlKEsga2V5KTsKKyAgICBWIHJlbW92ZU9sZGVzdCgpOworCisgICAgdWludDMyX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgdm9pZCBhZGRUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnksIEsga2V5LCBWIHZhbHVlKTsKKyAgICB2b2lkIGF0dGFjaFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSk7CisgICAgdm9pZCBkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSk7CisKKyAgICBWIHJlbW92ZUF0KHNzaXplX3QgaW5kZXgpOworCisgICAgS2V5ZWRWZWN0b3I8Sywgc3A8RW50cnk8SywgVj4gPiA+IG1DYWNoZTsKKyAgICB1aW50MzJfdCBtTWF4Q2FwYWNpdHk7CisKKyAgICBPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbUxpc3RlbmVyOworCisgICAgc3A8RW50cnk8SywgVj4gPiBtT2xkZXN0OworICAgIHNwPEVudHJ5PEssIFY+ID4gbVlvdW5nZXN0OworfTsgLy8gY2xhc3MgR2VuZXJhdGlvbkNhY2hlCisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitHZW5lcmF0aW9uQ2FjaGU8SywgVj46OkdlbmVyYXRpb25DYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk6IG1NYXhDYXBhY2l0eShtYXhDYXBhY2l0eSksIG1MaXN0ZW5lcihOVUxMKSB7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojp+R2VuZXJhdGlvbkNhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordWludDMyX3QgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuc2l6ZSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SywgVj4qIGxpc3RlbmVyKSB7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Y2xlYXIoKSB7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICB3aGlsZSAobUNhY2hlLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhY2hlLmNsZWFyKCk7CisgICAgfQorICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGVudHJ5LmdldCgpKSB7CisgICAgICAgICAgICBkZXRhY2hGcm9tQ2FjaGUoZW50cnkpOworICAgICAgICAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7CisgICAgICAgICAgICByZXR1cm4gZW50cnktPnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgaWYgKG1NYXhDYXBhY2l0eSAhPSBrVW5saW1pdGVkQ2FwYWNpdHkgJiYgbUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKKyAgICAgICAgcmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG5ldyBFbnRyeTxLLCBWPjsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmFkZFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSwgSyBrZXksIFYgdmFsdWUpIHsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworICAgIG1DYWNoZS5hZGQoa2V5LCBlbnRyeSk7CisgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlKEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVBdChzc2l6ZV90IGluZGV4KSB7CisgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgIH0KKyAgICBtQ2FjaGUucmVtb3ZlSXRlbXNBdChpbmRleCwgMSk7CisgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKworICAgIHJldHVybiBlbnRyeS0+dmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlT2xkZXN0KCkgeworICAgIGlmIChtT2xkZXN0LmdldCgpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShtT2xkZXN0LT5rZXkpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmF0dGFjaFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmICghbVlvdW5nZXN0LmdldCgpKSB7CisgICAgICAgIG1Zb3VuZ2VzdCA9IG1PbGRlc3QgPSBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS0+cGFyZW50ID0gbVlvdW5nZXN0OworICAgICAgICBtWW91bmdlc3QtPmNoaWxkID0gZW50cnk7CisgICAgICAgIG1Zb3VuZ2VzdCA9IGVudHJ5OworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChlbnRyeS0+Y2hpbGQuZ2V0KCkpIHsKKyAgICAgICAgZW50cnktPmNoaWxkLT5wYXJlbnQgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGlmIChtT2xkZXN0ID09IGVudHJ5KSB7CisgICAgICAgIG1PbGRlc3QgPSBlbnRyeS0+Y2hpbGQ7CisgICAgfQorCisgICAgaWYgKG1Zb3VuZ2VzdCA9PSBlbnRyeSkgeworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKKyAgICBlbnRyeS0+Y2hpbGQuY2xlYXIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZmEwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5jcHAKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrR3JhZGllbnRTaGFkZXIuaD4KKworI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitHcmFkaWVudENhY2hlOjpHcmFkaWVudENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6On5HcmFkaWVudENhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgR3JhZGllbnRDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IEdyYWRpZW50Q2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBHcmFkaWVudENhY2hlOjpvcGVyYXRvcigpKFNrU2hhZGVyKiYgc2hhZGVyLCBUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0ICogNDsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBHcmFkaWVudENhY2hlOjpnZXQoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIHJldHVybiBtQ2FjaGUuZ2V0KHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6cmVtb3ZlKFNrU2hhZGVyKiBzaGFkZXIpIHsKKyAgICBtQ2FjaGUucmVtb3ZlKHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmFkZExpbmVhckdyYWRpZW50KFNrU2hhZGVyKiBzaGFkZXIsIGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKSB7CisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCAxMDI0LCAxKTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworCisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldCgwLjBmLCAwLjBmKTsKKyAgICBwb2ludHNbMV0uc2V0KGJpdG1hcC53aWR0aCgpLCAwLjBmKTsKKworICAgIFNrU2hhZGVyKiBsb2NhbFNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwb2ludHMsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvcnMpLCBwb3NpdGlvbnMsIGNvdW50LCB0aWxlTW9kZSk7CisKKyAgICBTa1BhaW50IHA7CisgICAgcC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlQW5kRmlsbF9TdHlsZSk7CisgICAgcC5zZXRTaGFkZXIobG9jYWxTaGFkZXIpLT51bnJlZigpOworCisgICAgY2FudmFzLmRyYXdSZWN0Q29vcmRzKDAuMGYsIDAuMGYsIGJpdG1hcC53aWR0aCgpLCAxLjBmLCBwKTsKKworICAgIC8vIEFzdW1lIHRoZSBjYWNoZSBpcyBhbHdheXMgYmlnIGVub3VnaAorICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAucm93Qnl0ZXMoKSAqIGJpdG1hcC5oZWlnaHQoKTsKKyAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgIH0KKworICAgIFRleHR1cmUqIHRleHR1cmUgPSBuZXcgVGV4dHVyZTsKKyAgICBnZW5lcmF0ZVRleHR1cmUoJmJpdG1hcCwgdGV4dHVyZSk7CisKKyAgICBtU2l6ZSArPSBzaXplOworICAgIG1DYWNoZS5wdXQoc2hhZGVyLCB0ZXh0dXJlKTsKKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKSB7CisgICAgU2tBdXRvTG9ja1BpeGVscyBhdXRvTG9jaygqYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC0+cmVhZHlUb0RyYXcoKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2VuZXJhdGUgdGV4dHVyZSBmcm9tIHNoYWRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7CisgICAgdGV4dHVyZS0+d2lkdGggPSBiaXRtYXAtPndpZHRoKCk7CisgICAgdGV4dHVyZS0+aGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgYml0bWFwLT5ieXRlc1BlclBpeGVsKCkpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSAhYml0bWFwLT5pc09wYXF1ZSgpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaCBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjOGEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfR1JBRElFTlRfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tTaGFkZXIuaD4KKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc2ltcGxlIExSVSBncmFkaWVudCBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIEdyYWRpZW50Q2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxTa1NoYWRlciosIFRleHR1cmUqPiB7CitwdWJsaWM6CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tTaGFkZXIqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBHcmFkaWVudENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXIuaCBiL2xpYnMvaHd1aS9MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGI3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXIuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGltZW5zaW9ucyBvZiBhIGxheWVyLgorICovCitzdHJ1Y3QgTGF5ZXJTaXplIHsKKyAgICBMYXllclNpemUoKTogd2lkdGgoMCksIGhlaWdodCgwKSwgaWQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgTGF5ZXJTaXplJiBzaXplKTogd2lkdGgoc2l6ZS53aWR0aCksIGhlaWdodChzaXplLmhlaWdodCksIGlkKHNpemUuaWQpIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworCisgICAgLy8gSW5jcmVtZW50YWwgaWQgdXNlZCBieSB0aGUgbGF5ZXIgY2FjaGUgdG8gc3RvcmUgbXVsdGlwbGUKKyAgICAvLyBMYXllclNpemUgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zCisgICAgdWludDMyX3QgaWQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICBpZiAoaWQgIT0gMCAmJiByaHMuaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIG9mIHRoZSBsYXllciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc25hcHNob3QuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIFJlY3QgbGF5ZXI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdGV4dHVyZSB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIEZCTyB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCBmYm87CisgICAgLyoqCisgICAgICogT3BhY2l0eSBvZiB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIGZsb2F0IGFscGhhOworICAgIC8qKgorICAgICAqIEJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyNjNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbGF5ZXItPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBMYXllckNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChMYXllclNpemUmIHNpemUsIEdMdWludCBwcmV2aW91c0ZibykgeworICAgIExheWVyKiBsYXllciA9IG1DYWNoZS5yZW1vdmUoc2l6ZSk7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIExBWUVSX0xPR0QoIlJldXNpbmcgbGF5ZXIiKTsKKworICAgICAgICBtU2l6ZSAtPSBsYXllci0+bGF5ZXIuZ2V0V2lkdGgoKSAqIGxheWVyLT5sYXllci5nZXRIZWlnaHQoKSAqIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiQ3JlYXRpbmcgbmV3IGxheWVyIik7CisKKyAgICAgICAgbGF5ZXIgPSBuZXcgTGF5ZXI7CisgICAgICAgIGxheWVyLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIEZCTyBhbmQgYXR0YWNoIHRoZSB0ZXh0dXJlCisgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGxheWVyLT5mYm8pOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3CisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgLy8gVGhlIEZCTyB3aWxsIG5vdCBiZSBzY2FsZWQsIHNvIHdlIGNhbiB1c2UgbG93ZXIgcXVhbGl0eSBmaWx0ZXJpbmcKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOworCisgICAgICAgIC8vIEJpbmQgdGV4dHVyZSB0byBGQk8KKyAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIDApOworCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBMT0dFKCJGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIChHTCBlcnJvciBjb2RlIDB4JXgpIiwgc3RhdHVzKTsKKworICAgICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzRmJvKTsKKworICAgICAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXllcjsKK30KKworYm9vbCBMYXllckNhY2hlOjpwdXQoTGF5ZXJTaXplJiBsYXllclNpemUsIExheWVyKiBsYXllcikgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBsYXllclNpemUud2lkdGggKiBsYXllclNpemUuaGVpZ2h0ICogNDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGxheWVyIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIGRlbGV0ZUxheWVyKG9sZGVzdCk7CisgICAgICAgIH0KKworICAgICAgICBsYXllclNpemUuaWQgPSBtSWRHZW5lcmF0b3IrKzsKKyAgICAgICAgbUNhY2hlLnB1dChsYXllclNpemUsIGxheWVyKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmggYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODA1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfTEFZRVJTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19MQVlFUlMKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIExheWVyQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxMYXllclNpemUsIExheWVyKj4geworcHVibGljOgorICAgIExheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5MYXllckNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKExheWVyU2l6ZSYgc2l6ZSwgTGF5ZXIqJiBsYXllcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsYXllciBvZiBzcGVjaWZpZWQgZGltZW5zaW9ucy4gSWYgbm90IHN1aXRhYmxlIGxheWVyCisgICAgICogY2FuIGJlIGZvdW5kLCBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuIElmIGNyZWF0aW5nIGEgbmV3CisgICAgICogbGF5ZXIgZmFpbHMsIE5VTEwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBXaGVuIGEgbGF5ZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUsIGl0IGlzIHJlbW92ZWQgYW5kIHRoZSB0b3RhbAorICAgICAqIHNpemUgb2YgdGhlIGNhY2hlIGdvZXMgZG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBkZXNpcmVkIGxheWVyCisgICAgICogQHBhcmFtIHByZXZpb3VzRmJvIFRoZSBuYW1lIG9mIHRoZSBGQk8gdG8gYmluZCB0byBpZiBjcmVhdGluZyBhIG5ldworICAgICAqICAgICAgICBsYXllciBmYWlscworICAgICAqLworICAgIExheWVyKiBnZXQoTGF5ZXJTaXplJiBzaXplLCBHTHVpbnQgcHJldmlvdXNGYm8pOworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGxheWVyIHRvIHRoZSBjYWNoZS4gVGhlIGxheWVyIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZXJlIGlzCisgICAgICogbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZGltZW5zaW9ucyBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyIHRvIGFkZCB0byB0aGUgY2FjaGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwdXQoTGF5ZXJTaXplJiBzaXplLCBMYXllciogbGF5ZXIpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCBsYXllcnMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGRlbGV0ZUxheWVyKExheWVyKiBsYXllcik7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+IG1DYWNoZTsKKyAgICB1aW50MzJfdCBtSWRHZW5lcmF0b3I7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKK307IC8vIGNsYXNzIExheWVyQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTWF0cml4LmNwcCBiL2xpYnMvaHd1aS9NYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzFiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmNwcApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCit2b2lkIE1hdHJpeDQ6OmxvYWRJZGVudGl0eSgpIHsKKyAgICBkYXRhWzBdICA9IDEuMGY7CisgICAgZGF0YVsxXSAgPSAwLjBmOworICAgIGRhdGFbMl0gID0gMC4wZjsKKyAgICBkYXRhWzNdICA9IDAuMGY7CisKKyAgICBkYXRhWzRdICA9IDAuMGY7CisgICAgZGF0YVs1XSAgPSAxLjBmOworICAgIGRhdGFbNl0gID0gMC4wZjsKKyAgICBkYXRhWzddICA9IDAuMGY7CisKKyAgICBkYXRhWzhdICA9IDAuMGY7CisgICAgZGF0YVs5XSAgPSAwLjBmOworICAgIGRhdGFbMTBdID0gMS4wZjsKKyAgICBkYXRhWzExXSA9IDAuMGY7CisKKyAgICBkYXRhWzEyXSA9IDAuMGY7CisgICAgZGF0YVsxM10gPSAwLjBmOworICAgIGRhdGFbMTRdID0gMC4wZjsKKyAgICBkYXRhWzE1XSA9IDEuMGY7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBmbG9hdCogdikgeworICAgIG1lbWNweShkYXRhLCB2LCBzaXplb2YoZGF0YSkpOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgTWF0cml4NCYgdikgeworICAgIG1lbWNweShkYXRhLCB2LmRhdGEsIHNpemVvZihkYXRhKSk7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBTa01hdHJpeCYgdikgeworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgZGF0YVswXSAgPSB2W1NrTWF0cml4OjprTVNjYWxlWF07CisgICAgZGF0YVs0XSAgPSB2W1NrTWF0cml4OjprTVNrZXdYXTsKKyAgICBkYXRhWzEyXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNYXTsKKworICAgIGRhdGFbMV0gID0gdltTa01hdHJpeDo6a01Ta2V3WV07CisgICAgZGF0YVs1XSAgPSB2W1NrTWF0cml4OjprTVNjYWxlWV07CisgICAgZGF0YVsxM10gPSB2W1NrTWF0cml4OjprTVRyYW5zWV07CisKKyAgICBkYXRhWzNdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AwXTsKKyAgICBkYXRhWzddICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AxXTsKKyAgICBkYXRhWzE1XSA9IHZbU2tNYXRyaXg6OmtNUGVyc3AyXTsKKworICAgIGRhdGFbMTBdID0gMS4wZjsKK30KKwordm9pZCBNYXRyaXg0Ojpjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0IHsKKyAgICB2LnJlc2V0KCk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01TY2FsZVgsIGRhdGFbMF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNrZXdYLCAgZGF0YVs0XSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNYLCBkYXRhWzEyXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WSwgIGRhdGFbMV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWSwgZGF0YVs1XSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNZLCBkYXRhWzEzXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDAsIGRhdGFbM10pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMSwgZGF0YVs3XSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AyLCBkYXRhWzE1XSk7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZEludmVyc2UoY29uc3QgTWF0cml4NCYgdikgeworICAgIGRvdWJsZSBzY2FsZSA9IDEuMCAvCisgICAgICAgICAgICAodi5kYXRhWzBdICAqICgoZG91YmxlKSB2LmRhdGFbNV0gICogdi5kYXRhWzE1XSAtIChkb3VibGUpIHYuZGF0YVsxM10gKiB2LmRhdGFbN10pICsKKyAgICAgICAgICAgICB2LmRhdGFbNF0gICogKChkb3VibGUpIHYuZGF0YVsxM10gKiB2LmRhdGFbM10gIC0gKGRvdWJsZSkgdi5kYXRhWzFdICAqIHYuZGF0YVsxNV0pICsKKyAgICAgICAgICAgICB2LmRhdGFbMTJdICogKChkb3VibGUpIHYuZGF0YVsxXSAgKiB2LmRhdGFbN10gIC0gKGRvdWJsZSkgdi5kYXRhWzVdICAqIHYuZGF0YVszXSkpOworCisgICAgZGF0YVswXSAgPSAodi5kYXRhWzVdICogdi5kYXRhWzE1XSAtIHYuZGF0YVsxM10gKiB2LmRhdGFbN10pICAqIHNjYWxlOworICAgIGRhdGFbNF0gID0gKHYuZGF0YVsxMl0gKiB2LmRhdGFbN10gLSB2LmRhdGFbNF0gICogdi5kYXRhWzE1XSkgKiBzY2FsZTsKKyAgICBkYXRhWzEyXSA9ICh2LmRhdGFbNF0gKiB2LmRhdGFbMTNdIC0gdi5kYXRhWzEyXSAqIHYuZGF0YVs1XSkgICogc2NhbGU7CisKKyAgICBkYXRhWzFdICA9ICh2LmRhdGFbMTNdICogdi5kYXRhWzNdIC0gdi5kYXRhWzFdICAqIHYuZGF0YVsxNV0pICogc2NhbGU7CisgICAgZGF0YVs1XSAgPSAodi5kYXRhWzBdICogdi5kYXRhWzE1XSAtIHYuZGF0YVsxMl0gKiB2LmRhdGFbM10pICAqIHNjYWxlOworICAgIGRhdGFbMTNdID0gKHYuZGF0YVsxMl0gKiB2LmRhdGFbMV0gLSB2LmRhdGFbMF0gICogdi5kYXRhWzEzXSkgKiBzY2FsZTsKKworICAgIGRhdGFbM10gID0gKHYuZGF0YVsxXSAqIHYuZGF0YVs3XSAtIHYuZGF0YVs1XSAqIHYuZGF0YVszXSkgKiBzY2FsZTsKKyAgICBkYXRhWzddICA9ICh2LmRhdGFbNF0gKiB2LmRhdGFbM10gLSB2LmRhdGFbMF0gKiB2LmRhdGFbN10pICogc2NhbGU7CisgICAgZGF0YVsxNV0gPSAodi5kYXRhWzBdICogdi5kYXRhWzVdIC0gdi5kYXRhWzRdICogdi5kYXRhWzFdKSAqIHNjYWxlOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhmbG9hdCogdikgY29uc3QgeworICAgIG1lbWNweSh2LCBkYXRhLCBzaXplb2YoZGF0YSkpOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVYKCkgeworICAgIHJldHVybiBkYXRhWzEyXTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWSgpIHsKKyAgICByZXR1cm4gZGF0YVsxM107Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVsxMl0gPSB4OworICAgIGRhdGFbMTNdID0geTsKKyAgICBkYXRhWzE0XSA9IHo7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhWzBdICA9IHN4OworICAgIGRhdGFbNV0gID0gc3k7CisgICAgZGF0YVsxMF0gPSBzejsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZGF0YVszXSAgPSAwLjBmOworICAgIGRhdGFbN10gID0gMC4wZjsKKyAgICBkYXRhWzExXSA9IDAuMGY7CisgICAgZGF0YVsxMl0gPSAwLjBmOworICAgIGRhdGFbMTNdID0gMC4wZjsKKyAgICBkYXRhWzE0XSA9IDAuMGY7CisgICAgZGF0YVsxNV0gPSAxLjBmOworCisgICAgYW5nbGUgKj0gZmxvYXQoTV9QSSAvIDE4MC4wZik7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIGZsb2F0IHMgPSBzaW5mKGFuZ2xlKTsKKworICAgIGNvbnN0IGZsb2F0IGxlbmd0aCA9IHNxcnRmKHggKiB4ICsgeSAqIHkgKyB6ICogeik7CisgICAgZmxvYXQgcmVjaXBMZW4gPSAxLjBmIC8gbGVuZ3RoOworICAgIHggKj0gcmVjaXBMZW47CisgICAgeSAqPSByZWNpcExlbjsKKyAgICB6ICo9IHJlY2lwTGVuOworCisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKworICAgIGRhdGFbMF0gID0geCAqIHggKiBuYyArICBjOworICAgIGRhdGFbNF0gID0gICAgeHkgKiBuYyAtIHpzOworICAgIGRhdGFbOF0gID0gICAgenggKiBuYyArIHlzOworICAgIGRhdGFbMV0gID0gICAgeHkgKiBuYyArIHpzOworICAgIGRhdGFbNV0gID0geSAqIHkgKiBuYyArICBjOworICAgIGRhdGFbOV0gID0gICAgeXogKiBuYyAtIHhzOworICAgIGRhdGFbMl0gID0gICAgenggKiBuYyAtIHlzOworICAgIGRhdGFbNl0gID0gICAgeXogKiBuYyArIHhzOworICAgIGRhdGFbMTBdID0geiAqIHogKiBuYyArICBjOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgNCA7IGkrKykgeworICAgICAgICBmbG9hdCB4ID0gMDsKKyAgICAgICAgZmxvYXQgeSA9IDA7CisgICAgICAgIGZsb2F0IHogPSAwOworICAgICAgICBmbG9hdCB3ID0gMDsKKworICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCA0IDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBlID0gdi5nZXQoaSwgaik7CisgICAgICAgICAgICB4ICs9IHUuZ2V0KGosIDApICogZTsKKyAgICAgICAgICAgIHkgKz0gdS5nZXQoaiwgMSkgKiBlOworICAgICAgICAgICAgeiArPSB1LmdldChqLCAyKSAqIGU7CisgICAgICAgICAgICB3ICs9IHUuZ2V0KGosIDMpICogZTsKKyAgICAgICAgfQorCisgICAgICAgIHNldChpLCAwLCB4KTsKKyAgICAgICAgc2V0KGksIDEsIHkpOworICAgICAgICBzZXQoaSwgMiwgeik7CisgICAgICAgIHNldChpLCAzLCB3KTsKKyAgICB9Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVswXSAgPSAyLjBmIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgZGF0YVs1XSAgPSAyLjBmIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVsxMF0gPSAtMi4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICBkYXRhWzEyXSA9IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFbMTNdID0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVsxNF0gPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCisjZGVmaW5lIE1VTF9BRERfU1RPUkUoYSwgYiwgYykgYSA9IChhKSAqIChiKSArIChjKQorCit2b2lkIE1hdHJpeDQ6Om1hcFJlY3QoUmVjdCYgcikgY29uc3QgeworICAgIGNvbnN0IGZsb2F0IHN4ID0gZGF0YVswXTsKKyAgICBjb25zdCBmbG9hdCBzeSA9IGRhdGFbNV07CisKKyAgICBjb25zdCBmbG9hdCB0eCA9IGRhdGFbMTJdOworICAgIGNvbnN0IGZsb2F0IHR5ID0gZGF0YVsxM107CisKKyAgICBNVUxfQUREX1NUT1JFKHIubGVmdCwgc3gsIHR4KTsKKyAgICBNVUxfQUREX1NUT1JFKHIucmlnaHQsIHN4LCB0eCk7CisgICAgTVVMX0FERF9TVE9SRShyLnRvcCwgc3ksIHR5KTsKKyAgICBNVUxfQUREX1NUT1JFKHIuYm90dG9tLCBzeSwgdHkpOworfQorCit2b2lkIE1hdHJpeDQ6OmR1bXAoKSBjb25zdCB7CisgICAgTE9HRCgiTWF0cml4NFsiKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVswXSwgZGF0YVs0XSwgZGF0YVsgOF0sIGRhdGFbMTJdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsxXSwgZGF0YVs1XSwgZGF0YVsgOV0sIGRhdGFbMTNdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsyXSwgZGF0YVs2XSwgZGF0YVsxMF0sIGRhdGFbMTRdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVszXSwgZGF0YVs3XSwgZGF0YVsxMV0sIGRhdGFbMTVdKTsKKyAgICBMT0dEKCJdIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5oIGIvbGlicy9od3VpL01hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTRkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTUFUUklYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9NQVRSSVhfSAorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE1hdHJpeDQgeworcHVibGljOgorICAgIGZsb2F0IGRhdGFbMTZdOworCisgICAgTWF0cml4NCgpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBmbG9hdCogdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRJZGVudGl0eSgpOworCisgICAgdm9pZCBsb2FkKGNvbnN0IGZsb2F0KiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgTWF0cml4NCYgdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IFNrTWF0cml4JiB2KTsKKworICAgIHZvaWQgbG9hZEludmVyc2UoY29uc3QgTWF0cml4NCYgdik7CisKKyAgICB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisgICAgdm9pZCBsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeik7CisgICAgdm9pZCBsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKTsKKworICAgIHZvaWQgbXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZE11bHRpcGx5KCp0aGlzLCB2KTsKKyAgICAgICAgbG9hZCh1KTsKKyAgICB9CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkVHJhbnNsYXRlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRTY2FsZShzeCwgc3ksIHN6KTsKKyAgICAgICAgbXVsdGlwbHkodSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRSb3RhdGUoYW5nbGUsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHlUbyhmbG9hdCogdikgY29uc3Q7CisgICAgdm9pZCBjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRG9lcyBub3QgYXBwbHkgcm90YXRpb25zIQorICAgICAqLworICAgIHZvaWQgbWFwUmVjdChSZWN0JiByKSBjb25zdDsKKworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVgoKTsKKyAgICBmbG9hdCBnZXRUcmFuc2xhdGVZKCk7CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbmxpbmUgZmxvYXQgZ2V0KGludCBpLCBpbnQgaikgY29uc3QgeworICAgICAgICByZXR1cm4gZGF0YVtpICogNCArIGpdOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHNldChpbnQgaSwgaW50IGosIGZsb2F0IHYpIHsKKyAgICAgICAgZGF0YVtpICogNCArIGpdID0gdjsKKyAgICB9Cit9OyAvLyBjbGFzcyBNYXRyaXg0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgTWF0cml4NCBtYXQ0OworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTUFUUklYX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9OT1RJQ0UgYi9saWJzL2h3dWkvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmNzU2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrVHlwZWZhY2UuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJPcGVuR0xSZW5kZXJlci5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUgMjAuMGYKKyNkZWZpbmUgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFIDYuMGYKKyNkZWZpbmUgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUgNi4wZgorI2RlZmluZSBERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUgMTAwCisjZGVmaW5lIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSAwLjVmCisKKyNkZWZpbmUgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCAzCisKKy8vIENvbnZlcnRzIGEgbnVtYmVyIG9mIG1lZ2EtYnl0ZXMgaW50byBieXRlcworI2RlZmluZSBNQihzKSBzICogMTAyNCAqIDEwMjQKKworLy8gR2VuZXJhdGVzIHNpbXBsZSBhbmQgdGV4dHVyZWQgdmVydGljZXMKKyNkZWZpbmUgRlYoeCwgeSwgdSwgdikgeyB7IHgsIHkgfSwgeyB1LCB2IH0gfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHbG9iYWxzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgYXJyYXkgaXMgbmV2ZXIgdXNlZCBkaXJlY3RseSBidXQgdXNlZCBhcyBhIG1lbWNweSBzb3VyY2UgaW4gdGhlCisvLyBPcGVuR0xSZW5kZXJlciBjb25zdHJ1Y3Rvcgorc3RhdGljIGNvbnN0IFRleHR1cmVWZXJ0ZXggZ01lc2hWZXJ0aWNlc1tdID0geworICAgICAgICBGVigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiksCisgICAgICAgIEZWKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgICBGVigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKQorfTsKK3N0YXRpYyBjb25zdCBHTHNpemVpIGdNZXNoU3RyaWRlID0gc2l6ZW9mKFRleHR1cmVWZXJ0ZXgpOworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ01lc2hDb3VudCA9IDQ7CisKKy8qKgorICogU3RydWN0dXJlIG1hcHBpbmcgU2tpYSB4ZmVybW9kZXMgdG8gT3BlbkdMIGJsZW5kaW5nIGZhY3RvcnMuCisgKi8KK3N0cnVjdCBCbGVuZGVyIHsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgR0xlbnVtIHNyYzsKKyAgICBHTGVudW0gZHN0OworfTsgLy8gc3RydWN0IEJsZW5kZXIKKworLy8gSW4gdGhpcyBhcnJheSwgdGhlIGluZGV4IG9mIGVhY2ggQmxlbmRlciBlcXVhbHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdAorLy8gZW50cnkuIEZvciBpbnN0YW5jZSwgZ0JsZW5kc1sxXSA9PSBnQmxlbmRzW1NrWGZlcm1vZGU6OmtTcmNfTW9kZV0KK3N0YXRpYyBjb25zdCBCbGVuZGVyIGdCbGVuZHNbXSA9IHsKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNfTW9kZSwgICAgIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdF9Nb2RlLCAgICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGUsIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE92ZXJfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNJbl9Nb2RlLCAgIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNPdXRfTW9kZSwgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE91dF9Nb2RlLCAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjQVRvcF9Nb2RlLCBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RBVG9wX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprWG9yX01vZGUsICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9Cit9OworCitzdGF0aWMgY29uc3QgR0xlbnVtIGdUZXh0dXJlVW5pdHNbXSA9IHsKKyAgICAgICAgR0xfVEVYVFVSRTAsCisgICAgICAgIEdMX1RFWFRVUkUxLAorICAgICAgICBHTF9URVhUVVJFMgorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT3BlbkdMUmVuZGVyZXI6Ok9wZW5HTFJlbmRlcmVyKCk6CisgICAgICAgIG1CbGVuZChmYWxzZSksIG1MYXN0U3JjTW9kZShHTF9aRVJPKSwgbUxhc3REc3RNb2RlKEdMX1pFUk8pLAorICAgICAgICBtVGV4dHVyZUNhY2hlKE1CKERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKSksCisgICAgICAgIG1MYXllckNhY2hlKE1CKERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSkpLAorICAgICAgICBtR3JhZGllbnRDYWNoZShNQihERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUpKSwKKyAgICAgICAgbVBhdGhDYWNoZShNQihERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSkpLAorICAgICAgICBtUGF0Y2hDYWNoZShERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUpIHsKKyAgICBMT0dEKCJDcmVhdGUgT3BlbkdMUmVuZGVyZXIiKTsKKworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dHVyZSBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1UZXh0dXJlQ2FjaGUuc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0dXJlIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgbGF5ZXIgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBtTGF5ZXJDYWNoZS5zZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGxheWVyIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGdyYWRpZW50IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgbUdyYWRpZW50Q2FjaGUuc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBncmFkaWVudCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9QQVRIX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHBhdGggY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBtUGF0aENhY2hlLnNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgcGF0aCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBtQ3VycmVudFByb2dyYW0gPSBOVUxMOworICAgIG1TaGFkZXIgPSBOVUxMOworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7CisKKyAgICBtZW1jcHkobU1lc2hWZXJ0aWNlcywgZ01lc2hWZXJ0aWNlcywgc2l6ZW9mKGdNZXNoVmVydGljZXMpKTsKKworICAgIG1GaXJzdFNuYXBzaG90ID0gbmV3IFNuYXBzaG90OworCisgICAgR0xpbnQgbWF4VGV4dHVyZVVuaXRzOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZtYXhUZXh0dXJlVW5pdHMpOworICAgIGlmIChtYXhUZXh0dXJlVW5pdHMgPCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKSB7CisgICAgICAgIExPR1coIkF0IGxlYXN0ICVkIHRleHR1cmUgdW5pdHMgYXJlIHJlcXVpcmVkISIsIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQpOworICAgIH0KK30KKworT3BlbkdMUmVuZGVyZXI6On5PcGVuR0xSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJEZXN0cm95IE9wZW5HTFJlbmRlcmVyIik7CisKKyAgICBtVGV4dHVyZUNhY2hlLmNsZWFyKCk7CisgICAgbUxheWVyQ2FjaGUuY2xlYXIoKTsKKyAgICBtR3JhZGllbnRDYWNoZS5jbGVhcigpOworICAgIG1QYXRjaENhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBtT3J0aG9NYXRyaXgubG9hZE9ydGhvKDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxKTsKKworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgbUZpcnN0U25hcHNob3QtPmhlaWdodCA9IGhlaWdodDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cHJlcGFyZSgpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobUZpcnN0U25hcHNob3QpOworICAgIG1TYXZlQ291bnQgPSAwOworCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xTY2lzc29yKDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBtU25hcHNob3QtPnNldENsaXAoMC4wZiwgMC4wZiwgbVdpZHRoLCBtSGVpZ2h0KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3RhdGUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OmdldFNhdmVDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNhdmVDb3VudDsKK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlKGludCBmbGFncykgeworICAgIHJldHVybiBzYXZlU25hcHNob3QoKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZSgpIHsKKyAgICBpZiAobVNhdmVDb3VudCA9PSAwKSByZXR1cm47CisKKyAgICBpZiAocmVzdG9yZVNuYXBzaG90KCkpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgaWYgKHNhdmVDb3VudCA8PSAwIHx8IHNhdmVDb3VudCA+IG1TYXZlQ291bnQpIHJldHVybjsKKworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBmYWxzZTsKKworICAgIHdoaWxlIChtU2F2ZUNvdW50ICE9IHNhdmVDb3VudCAtIDEpIHsKKyAgICAgICAgcmVzdG9yZUNsaXAgfD0gcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorCisgICAgaWYgKHJlc3RvcmVDbGlwKSB7CisgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlU25hcHNob3QoKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1TbmFwc2hvdCk7CisgICAgcmV0dXJuICsrbVNhdmVDb3VudDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgeworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIGJvb2wgcmVzdG9yZU9ydGhvID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG87CisKKyAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVPcnRobykgeworICAgICAgICBtT3J0aG9NYXRyaXgubG9hZChjdXJyZW50LT5vcnRob01hdHJpeCk7CisgICAgfQorCisgICAgaWYgKHJlc3RvcmVMYXllcikgeworICAgICAgICBjb21wb3NlTGF5ZXIoY3VycmVudCwgcHJldmlvdXMpOworICAgIH0KKworICAgIG1TbmFwc2hvdCA9IHByZXZpb3VzOworICAgIG1TYXZlQ291bnQtLTsKKworICAgIHJldHVybiByZXN0b3JlQ2xpcDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBpZiAoIWN1cnJlbnQtPmxheWVyKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gY29tcG9zZSBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVuYmluZCBjdXJyZW50IEZCTyBhbmQgcmVzdG9yZSBwcmV2aW91cyBvbmUKKyAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCBwcmV2aW91cy0+ZmJvIHdpbGwgYmUgMCB0byBiaW5kIHRoZSBkZWZhdWx0IGJ1ZmZlcgorICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91cy0+ZmJvKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAgZnJvbSB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gcHJldmlvdXMtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIG1IZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKKworICAgIExheWVyKiBsYXllciA9IGN1cnJlbnQtPmxheWVyOworICAgIGNvbnN0IFJlY3QmIHJlY3QgPSBsYXllci0+bGF5ZXI7CisKKyAgICBkcmF3VGV4dHVyZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICBsYXllci0+dGV4dHVyZSwgbGF5ZXItPmFscGhhLCBsYXllci0+bW9kZSwgbGF5ZXItPmJsZW5kKTsKKworICAgIExheWVyU2l6ZSBzaXplKHJlY3QuZ2V0V2lkdGgoKSwgcmVjdC5nZXRIZWlnaHQoKSk7CisgICAgLy8gRmFpbGluZyB0byBhZGQgdGhlIGxheWVyIHRvIHRoZSBjYWNoZSBzaG91bGQgaGFwcGVuIG9ubHkgaWYgdGhlCisgICAgLy8gbGF5ZXIgaXMgdG9vIGxhcmdlCisgICAgaWYgKCFtTGF5ZXJDYWNoZS5wdXQoc2l6ZSwgbGF5ZXIpKSB7CisgICAgICAgIExBWUVSX0xPR0QoIkRlbGV0aW5nIGxheWVyIik7CisKKyAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGF5ZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKSB7CisgICAgaW50IGNvdW50ID0gc2F2ZVNuYXBzaG90KCk7CisKKyAgICBpbnQgYWxwaGEgPSAyNTU7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworCisgICAgaWYgKHApIHsKKyAgICAgICAgYWxwaGEgPSBwLT5nZXRBbHBoYSgpOworICAgICAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwLT5nZXRYZmVybW9kZSgpLCAmbW9kZSk7CisgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgIG1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorCisgICAgY3JlYXRlTGF5ZXIobVNuYXBzaG90LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGFscGhhLCBtb2RlLCBmbGFncyk7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBpbnQgYWxwaGEsIGludCBmbGFncykgeworICAgIGludCBjb3VudCA9IHNhdmVTbmFwc2hvdCgpOworICAgIGNyZWF0ZUxheWVyKG1TbmFwc2hvdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZSwgZmxhZ3MpOworICAgIHJldHVybiBjb3VudDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y3JlYXRlTGF5ZXIoc3A8U25hcHNob3Q+IHNuYXBzaG90LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLGludCBmbGFncykgeworICAgIExBWUVSX0xPR0QoIlJlcXVlc3RpbmcgbGF5ZXIgJWZ4JWYiLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgTEFZRVJfTE9HRCgiTGF5ZXIgY2FjaGUgc2l6ZSA9ICVkIiwgbUxheWVyQ2FjaGUuZ2V0U2l6ZSgpKTsKKworICAgIEdMdWludCBwcmV2aW91c0ZibyA9IHNuYXBzaG90LT5wcmV2aW91cy5nZXQoKSA/IHNuYXBzaG90LT5wcmV2aW91cy0+ZmJvIDogMDsKKyAgICBMYXllclNpemUgc2l6ZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisKKyAgICBMYXllciogbGF5ZXIgPSBtTGF5ZXJDYWNoZS5nZXQoc2l6ZSwgcHJldmlvdXNGYm8pOworICAgIGlmICghbGF5ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBsYXllci0+ZmJvKTsKKworICAgIC8vIENsZWFyIHRoZSBGQk8KKyAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworCisgICAgLy8gU2F2ZSB0aGUgbGF5ZXIgaW4gdGhlIHNuYXBzaG90CisgICAgc25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisgICAgbGF5ZXItPm1vZGUgPSBtb2RlOworICAgIGxheWVyLT5hbHBoYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGxheWVyLT5sYXllci5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgIHNuYXBzaG90LT5sYXllciA9IGxheWVyOworICAgIHNuYXBzaG90LT5mYm8gPSBsYXllci0+ZmJvOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBzbmFwc2hvdCB0byBkcmF3IGludG8gdGhlIEZCTworICAgIHNhdmVTbmFwc2hvdCgpOworICAgIC8vIFRPRE86IFRoaXMgZG9lc24ndCBwcmVzZXJ2ZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgKGNoZWNrIFNraWEgZmlyc3QpCisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubG9hZFRyYW5zbGF0ZSgtbGVmdCwgLXRvcCwgMC4wZik7CisgICAgbVNuYXBzaG90LT5zZXRDbGlwKDAuMGYsIDAuMGYsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICBtU25hcHNob3QtPmhlaWdodCA9IGJvdHRvbSAtIHRvcDsKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIG1TbmFwc2hvdC0+ZmxhZ3MgPSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eU9ydGhvIHwgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBtU25hcHNob3QtPm9ydGhvTWF0cml4LmxvYWQobU9ydGhvTWF0cml4KTsKKworICAgIC8vIENoYW5nZSB0aGUgb3J0aG8gcHJvamVjdGlvbgorICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMC4wZiwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDAuMGYsIDAuMGYsIDEuMGYpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRyYW5zZm9ybXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6dHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLnRyYW5zbGF0ZShkeCwgZHksIDAuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLnJvdGF0ZShkZWdyZWVzLCAwLjBmLCAwLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0uc2NhbGUoc3gsIHN5LCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5sb2FkKCptYXRyaXgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLmNvcHlUbygqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtYXQ0IG0oKm1hdHJpeCk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubXVsdGlwbHkobSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsaXBwaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFNjaXNzb3JGcm9tQ2xpcCgpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gbVNuYXBzaG90LT5jbGlwUmVjdDsKKyAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtU25hcHNob3QtPmhlaWdodCAtIGNsaXAuYm90dG9tLCBjbGlwLmdldFdpZHRoKCksIGNsaXAuZ2V0SGVpZ2h0KCkpOworfQorCitjb25zdCBSZWN0JiBPcGVuR0xSZW5kZXJlcjo6Z2V0Q2xpcEJvdW5kcygpIHsKKyAgICByZXR1cm4gbVNuYXBzaG90LT5nZXRMb2NhbENsaXAoKTsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubWFwUmVjdChyKTsKKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QuaW50ZXJzZWN0cyhyKTsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICBib29sIGNsaXBwZWQgPSBtU25hcHNob3QtPmNsaXAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7CisgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC5pc0VtcHR5KCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBsZWZ0ICsgYml0bWFwLT53aWR0aCgpOworICAgIGNvbnN0IGZsb2F0IGJvdHRvbSA9IHRvcCArIGJpdG1hcC0+aGVpZ2h0KCk7CisKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIFJlY3QgcigwLjBmLCAwLjBmLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNmb3JtKCptYXRyaXgpOworICAgIHRyYW5zZm9ybS5tYXBSZWN0KHIpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sCisgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBjb25zdCBmbG9hdCB1MSA9IHNyY0xlZnQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MSA9IHNyY1RvcCAvIGhlaWdodDsKKyAgICBjb25zdCBmbG9hdCB1MiA9IHNyY1JpZ2h0IC8gd2lkdGg7CisgICAgY29uc3QgZmxvYXQgdjIgPSBzcmNCb3R0b20gLyBoZWlnaHQ7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKHUxLCB2MSwgdTIsIHYyKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHRleHR1cmUsIHBhaW50KTsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIFBhdGNoKiBtZXNoID0gbVBhdGNoQ2FjaGUuZ2V0KHBhdGNoKTsKKyAgICBtZXNoLT51cGRhdGVWZXJ0aWNlcyhiaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICZwYXRjaC0+eERpdnNbMF0sICZwYXRjaC0+eURpdnNbMF0sIHBhdGNoLT5udW1YRGl2cywgcGF0Y2gtPm51bVlEaXZzKTsKKworICAgIC8vIFNwZWNpZnkgcmlnaHQgYW5kIGJvdHRvbSBhcyArMS4wZiBmcm9tIGxlZnQvdG9wIHRvIHByZXZlbnQgc2NhbGluZyBzaW5jZSB0aGUKKyAgICAvLyBwYXRjaCBtZXNoIGFscmVhZHkgZGVmaW5lcyB0aGUgZmluYWwgc2l6ZQorICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIGxlZnQgKyAxLjBmLCB0b3AgKyAxLjBmLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsCisgICAgICAgICAgICBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwgJm1lc2gtPnZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLAorICAgICAgICAgICAgJm1lc2gtPnZlcnRpY2VzWzBdLnRleHR1cmVbMF0sIG1lc2gtPmluZGljZXMsIG1lc2gtPmluZGljZXNDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmNsaXBSZWN0OworICAgIGRyYXdDb2xvclJlY3QoY2xpcC5sZWZ0LCBjbGlwLnRvcCwgY2xpcC5yaWdodCwgY2xpcC5ib3R0b20sIGNvbG9yLCBtb2RlLCB0cnVlKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwKSB7CisgICAgaWYgKHF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKworICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorCisgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgaW50IGNvbG9yID0gcC0+Z2V0Q29sb3IoKTsKKyAgICBpZiAoKChjb2xvciA+PiAyNCkgJiAweGZmKSA9PSAyNTUpIHsKKyAgICAgICAgY29sb3IgfD0gcC0+Z2V0QWxwaGEoKSA8PCAyNDsKKyAgICB9CisKKyAgICBkcmF3Q29sb3JSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgY29sb3IsIG1vZGUpOworfQorCisjZGVmaW5lIGtTdGRTdHJpa2VUaHJ1X09mZnNldCAgICgtNi4wZiAvIDIxLjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX09mZnNldCAgICAoMS4wZiAvIDkuMGYpCisjZGVmaW5lIGtTdGRVbmRlcmxpbmVfVGhpY2tuZXNzICgxLjBmIC8gMTguMGYpCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKHRleHQgPT0gTlVMTCB8fCBjb3VudCA9PSAwIHx8IChwYWludC0+Z2V0QWxwaGEoKSA9PSAwICYmIHBhaW50LT5nZXRYZmVybW9kZSgpID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCBsZW5ndGggPSAtMS4wZjsKKyAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aCAvIDIuMGY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIG1Nb2RlbFZpZXcubG9hZElkZW50aXR5KCk7CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIC8vIE5lZWRzIHRvIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIEZvbnRSZW5kZXJlcjo6Z2V0VGV4dHVyZSgpCisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIFByb2dyYW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICBkZXNjcmlwdGlvbi5oYXNBbHBoYThUZXh0dXJlID0gdHJ1ZTsKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisKKyAgICB1c2VQcm9ncmFtKG1Qcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisgICAgbUN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtU25hcHNob3QtPnRyYW5zZm9ybSk7CisKKyAgICAvLyBUZXh0IGlzIGFsd2F5cyBibGVuZGVkLCBubyBuZWVkIHRvIGNoZWNrIHRoZSBzaGFkZXIKKyAgICBjaG9vc2VCbGVuZGluZyh0cnVlLCBtb2RlKTsKKyAgICBiaW5kVGV4dHVyZShtRm9udFJlbmRlcmVyLmdldFRleHR1cmUoKSwgR0xfQ0xBTVBfVE9fRURHRSwgR0xfQ0xBTVBfVE9fRURHRSwgdGV4dHVyZVVuaXQpOworICAgIGdsVW5pZm9ybTFpKG1DdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCB0ZXh0dXJlVW5pdCk7CisKKyAgICBpbnQgdGV4Q29vcmRzU2xvdCA9IG1DdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworCisgICAgLy8gQWx3YXlzIHByZW11bHRpcGxpZWQKKyAgICBnbFVuaWZvcm00ZihtQ3VycmVudFByb2dyYW0tPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgIHRleHR1cmVVbml0Kys7CisgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUN1cnJlbnRQcm9ncmFtLCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LCAmdGV4dHVyZVVuaXQpOworICAgIH0KKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Z2V0TG9jYWxDbGlwKCk7CisgICAgbUZvbnRSZW5kZXJlci5zZXRGb250KHBhaW50LCBTa1R5cGVmYWNlOjpVbmlxdWVJRChwYWludC0+Z2V0VHlwZWZhY2UoKSksIHBhaW50LT5nZXRUZXh0U2l6ZSgpKTsKKyAgICBtRm9udFJlbmRlcmVyLnJlbmRlclRleHQocGFpbnQsICZjbGlwLCB0ZXh0LCAwLCBieXRlc0NvdW50LCBjb3VudCwgeCwgeSk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworCisgICAgLy8gSGFuZGxlIHVuZGVybGluZSBhbmQgc3RyaWtlLXRocm91Z2gKKyAgICB1aW50MzJfdCBmbGFncyA9IHBhaW50LT5nZXRGbGFncygpOworICAgIGlmIChmbGFncyAmIChTa1BhaW50OjprVW5kZXJsaW5lVGV4dF9GbGFnIHwgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpKSB7CisgICAgICAgIGZsb2F0IHVuZGVybGluZVdpZHRoID0gbGVuZ3RoOworICAgICAgICAvLyBJZiBsZW5ndGggaXMgPiAwLjBmLCB3ZSBhbHJlYWR5IG1lYXN1cmVkIHRoZSB0ZXh0IGZvciB0aGUgdGV4dCBhbGlnbm1lbnQKKyAgICAgICAgaWYgKGxlbmd0aCA8PSAwLjBmKSB7CisgICAgICAgICAgICB1bmRlcmxpbmVXaWR0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IG9mZnNldFggPSAwOworICAgICAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aCAqIDAuNWY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjoKKyAgICAgICAgICAgICAgICBvZmZzZXRYID0gdW5kZXJsaW5lV2lkdGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVuZGVybGluZVdpZHRoID4gMC4wZikgeworICAgICAgICAgICAgZmxvYXQgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgICAgIGZsb2F0IGhlaWdodCA9IHRleHRTaXplICoga1N0ZFVuZGVybGluZV9UaGlja25lc3M7CisKKyAgICAgICAgICAgIGZsb2F0IGxlZnQgPSB4IC0gb2Zmc2V0WDsKKyAgICAgICAgICAgIGZsb2F0IHRvcCA9IDAuMGY7CisgICAgICAgICAgICBmbG9hdCByaWdodCA9IGxlZnQgKyB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IDAuMGY7CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3AgPSB5ICsgdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX09mZnNldDsKKyAgICAgICAgICAgICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7CisgICAgICAgICAgICAgICAgZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNrUGFpbnQ6OmtTdHJpa2VUaHJ1VGV4dF9GbGFnKSB7CisgICAgICAgICAgICAgICAgdG9wID0geSArIHRleHRTaXplICoga1N0ZFN0cmlrZVRocnVfT2Zmc2V0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgICAgICAgICAgICBkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIGNvbnN0IFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbVBhdGhDYWNoZS5nZXQocGF0aCwgcGFpbnQpOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGRlc2NyaXB0aW9uLmhhc1RleHR1cmUgPSB0cnVlOworICAgIGRlc2NyaXB0aW9uLmhhc0FscGhhOFRleHR1cmUgPSB0cnVlOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgIHVzZVByb2dyYW0obVByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgY2hvb3NlQmxlbmRpbmcodHJ1ZSwgbW9kZSk7CisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIEdMX0NMQU1QX1RPX0VER0UsIEdMX0NMQU1QX1RPX0VER0UsIHRleHR1cmVVbml0KTsKKyAgICBnbFVuaWZvcm0xaShtQ3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgdGV4dHVyZVVuaXQpOworCisgICAgaW50IHRleENvb3Jkc1Nsb3QgPSBtQ3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRzU2xvdCwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0pOworCisgICAgLy8gU2V0dXAgdW5pZm9ybXMKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUodGV4dHVyZS0+bGVmdCAtIHRleHR1cmUtPm9mZnNldCwKKyAgICAgICAgICAgIHRleHR1cmUtPnRvcCAtIHRleHR1cmUtPm9mZnNldCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZSh0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCAxLjBmKTsKKyAgICBtQ3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIG1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKworICAgIGdsVW5pZm9ybTRmKG1DdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgdGV4dHVyZVVuaXQrKzsKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyByZXF1aXJlZCBieSB0aGUgc2hhZGVycworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPnNldHVwUHJvZ3JhbShtQ3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUN1cnJlbnRQcm9ncmFtKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnTWVzaENvdW50KTsKKworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZGVyKCkgeworICAgIG1TaGFkZXIgPSBOVUxMOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICBtU2hhZGVyID0gc2hhZGVyOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPnNldCgmbVRleHR1cmVDYWNoZSwgJm1HcmFkaWVudENhY2hlKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbG9yIGZpbHRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRDb2xvckZpbHRlcigpIHsKKyAgICBtQ29sb3JGaWx0ZXIgPSBOVUxMOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKSB7CisgICAgbUNvbG9yRmlsdGVyID0gZmlsdGVyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICAvLyBJZiBhIHNoYWRlciBpcyBzZXQsIHByZXNlcnZlIG9ubHkgdGhlIGFscGhhCisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgY29sb3IgfD0gMHgwMGZmZmZmZjsKKyAgICB9CisKKyAgICAvLyBSZW5kZXIgdXNpbmcgcHJlLW11bHRpcGxpZWQgYWxwaGEKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisKKyAgICAvLyBTZXR1cCB0aGUgYmxlbmRpbmcgbW9kZQorICAgIGNob29zZUJsZW5kaW5nKGFscGhhIDwgMjU1IHx8IChtU2hhZGVyICYmIG1TaGFkZXItPmJsZW5kKCkpLCBtb2RlKTsKKworICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgIHVzZVByb2dyYW0obVByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdKTsKKworICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisgICAgaWYgKCFpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICAgICAgbUN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0NCBpZGVudGl0eTsKKyAgICAgICAgbUN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBpZGVudGl0eSk7CisgICAgfQorICAgIGdsVW5pZm9ybTRmKG1DdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUN1cnJlbnRQcm9ncmFtLCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LCAmdGV4dHVyZVVuaXQpOworICAgIH0KKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLCBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQpIHsKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLCBhbHBoYSwgbW9kZSwgYmxlbmQsCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQpIHsKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24uaGFzVGV4dHVyZSA9IHRydWU7CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisKKyAgICB1c2VQcm9ncmFtKG1Qcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisgICAgbUN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtU25hcHNob3QtPnRyYW5zZm9ybSk7CisKKyAgICBjaG9vc2VCbGVuZGluZyhibGVuZCB8fCBhbHBoYSA8IDEuMGYsIG1vZGUpOworCisgICAgLy8gVGV4dHVyZQorICAgIGJpbmRUZXh0dXJlKHRleHR1cmUsIEdMX0NMQU1QX1RPX0VER0UsIEdMX0NMQU1QX1RPX0VER0UsIDApOworICAgIGdsVW5pZm9ybTFpKG1DdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCAwKTsKKworICAgIC8vIEFsd2F5cyBwcmVtdWx0aXBsaWVkCisgICAgZ2xVbmlmb3JtNGYobUN1cnJlbnRQcm9ncmFtLT5jb2xvciwgYWxwaGEsIGFscGhhLCBhbHBoYSwgYWxwaGEpOworCisgICAgLy8gTWVzaAorICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRzU2xvdCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCB2ZXJ0aWNlcyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3Jkc1Nsb3QsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgZ01lc2hTdHJpZGUsIHRleENvb3Jkcyk7CisKKyAgICAvLyBDb2xvciBmaWx0ZXIKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgaWYgKCFpbmRpY2VzKSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBlbGVtZW50c0NvdW50LCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7CisgICAgfQorICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaXNQcmVtdWx0aXBsaWVkKSB7CisgICAgYmxlbmQgPSBibGVuZCB8fCBtb2RlICE9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgaWYgKGJsZW5kKSB7CisgICAgICAgIGlmICghbUJsZW5kKSB7CisgICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIH0KKworICAgICAgICBHTGVudW0gc291cmNlTW9kZSA9IGdCbGVuZHNbbW9kZV0uc3JjOworICAgICAgICBHTGVudW0gZGVzdE1vZGUgPSBnQmxlbmRzW21vZGVdLmRzdDsKKyAgICAgICAgaWYgKCFpc1ByZW11bHRpcGxpZWQgJiYgc291cmNlTW9kZSA9PSBHTF9PTkUpIHsKKyAgICAgICAgICAgIHNvdXJjZU1vZGUgPSBHTF9TUkNfQUxQSEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlTW9kZSAhPSBtTGFzdFNyY01vZGUgfHwgZGVzdE1vZGUgIT0gbUxhc3REc3RNb2RlKSB7CisgICAgICAgICAgICBnbEJsZW5kRnVuYyhzb3VyY2VNb2RlLCBkZXN0TW9kZSk7CisgICAgICAgICAgICBtTGFzdFNyY01vZGUgPSBzb3VyY2VNb2RlOworICAgICAgICAgICAgbUxhc3REc3RNb2RlID0gZGVzdE1vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1CbGVuZCkgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKyAgICBtQmxlbmQgPSBibGVuZDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6dXNlUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgaWYgKCFwcm9ncmFtLT5pc0luVXNlKCkpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50UHJvZ3JhbSAhPSBOVUxMKSBtQ3VycmVudFByb2dyYW0tPnJlbW92ZSgpOworICAgICAgICBwcm9ncmFtLT51c2UoKTsKKyAgICAgICAgbUN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2MikgeworICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmbU1lc2hWZXJ0aWNlc1swXTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYyKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2Mik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSkgeworICAgIGlmIChwYWludCkgeworICAgICAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwYWludC0+Z2V0WGZlcm1vZGUoKSwgbW9kZSk7CisgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgICptb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraWEgZHJhd3MgdXNpbmcgdGhlIGNvbG9yJ3MgYWxwaGEgY2hhbm5lbCBpZiA8IDI1NQorICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICAgICAgaW50IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgICphbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgICAgICBpZiAoKmFscGhhID09IDI1NSkgeworICAgICAgICAgICAgKmFscGhhID0gcGFpbnQtPmdldEFscGhhKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICphbHBoYSA9IDI1NTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3ODNlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1JlZ2lvbi5oPgorI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKworI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJNYXRyaXguaCIKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlNuYXBzaG90LmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJQYXRjaENhY2hlLmgiCisjaW5jbHVkZSAiVmVydGV4LmgiCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiU2tpYVNoYWRlci5oIgorI2luY2x1ZGUgIlNraWFDb2xvckZpbHRlci5oIgorI2luY2x1ZGUgIlBhdGhDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogT3BlbkdMIHJlbmRlcmVyIHVzZWQgdG8gZHJhdyBhY2NlbGVyYXRlZCAyRCBncmFwaGljcy4gVGhlIEFQSSBpcyBhCisgKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2tpYSdzIENhbnZhcyBBUEkuCisgKi8KK2NsYXNzIE9wZW5HTFJlbmRlcmVyIHsKK3B1YmxpYzoKKyAgICBPcGVuR0xSZW5kZXJlcigpOworICAgIH5PcGVuR0xSZW5kZXJlcigpOworCisgICAgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHZvaWQgcHJlcGFyZSgpOworCisgICAgaW50IGdldFNhdmVDb3VudCgpIGNvbnN0OworICAgIGludCBzYXZlKGludCBmbGFncyk7CisgICAgdm9pZCByZXN0b3JlKCk7CisgICAgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KTsKKworICAgIGludCBzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworICAgIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgaW50IGZsYWdzKTsKKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSk7CisgICAgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcyk7CisgICAgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdm9pZCBnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdm9pZCBjb25jYXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisKKyAgICBjb25zdCBSZWN0JiBnZXRDbGlwQm91bmRzKCk7CisgICAgYm9vbCBxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOworICAgIGJvb2wgY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApOworCisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIFJlc19wbmdfOXBhdGNoKiBwYXRjaCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCk7CisKKyAgICB2b2lkIHJlc2V0U2hhZGVyKCk7CisgICAgdm9pZCBzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpOworCisgICAgdm9pZCByZXNldENvbG9yRmlsdGVyKCk7CisgICAgdm9pZCBzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKTsKKworICAgIHZvaWQgZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZW5kZXJlciBhcyBhIG5ldyBzbmFwc2hvdC4KKyAgICAgKiBUaGUgbmV3IHNuYXBzaG90IGlzIHNhdmVkIGluIG1TbmFwc2hvdCBhbmQgdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgICogaXMgbGlua2VkIGZyb20gbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBzYXZlIGNvdW50LiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gI3Jlc3RvcmVUb0NvdW50KCkKKyAgICAgKi8KKyAgICBpbnQgc2F2ZVNuYXBzaG90KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzbmFwc2hvdDsgbVNuYXBzaG90IGJlY29tZXMgbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xpcCBzaG91bGQgYmUgYWxzbyByZWFwcGxpZWQgYnkgY2FsbGluZworICAgICAqICAgICAgICAgI3NldFNjaXNzb3JGcm9tQ2xpcCgpLgorICAgICAqLworICAgIGJvb2wgcmVzdG9yZVNuYXBzaG90KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGlwcGluZyByZWN0YW5nbGUgdXNpbmcgZ2xTY2lzc29yLiBUaGUgY2xpcCBpcyBkZWZpbmVkIGJ5CisgICAgICogdGhlIGN1cnJlbnQgc25hcHNob3QncyBjbGlwUmVjdCBtZW1iZXIuCisgICAgICovCisgICAgdm9pZCBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIC8qKgorICAgICAqIENvbXBvc2UgdGhlIGxheWVyIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc25hcHNob3Qgd2l0aCB0aGUgbGF5ZXIKKyAgICAgKiBkZWZpbmVkIGJ5IHRoZSBwcmV2aW91cyBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIFRoZSBjdXJyZW50IHNuYXBzaG90ICptdXN0KiBiZSBhIGxheWVyIChmbGFnIGtGbGFnSXNMYXllciBzZXQuKQorICAgICAqCisgICAgICogQHBhcmFtIGN1cmVudCBUaGUgY3VycmVudCBzbmFwc2hvdCBjb250YWluaW5nIHRoZSBsYXllciB0byBjb21wb3NlCisgICAgICogQHBhcmFtIHByZXZpb3VzIFRoZSBwcmV2aW91cyBzbmFwc2hvdCB0byBjb21wb3NlIHRoZSBjdXJyZW50IGxheWVyIHdpdGgKKyAgICAgKi8KKyAgICB2b2lkIGNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbGF5ZXIgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgc25hcHNob3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc25hcHNob3QgVGhlIHNuYXBzaG90IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGxheWVyCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGFscGhhIFRoZSB0cmFuc2x1Y2VuY3kgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGZsYWdzIFRoZSBsYXllciBzYXZlIGZsYWdzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxheWVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBjcmVhdGVMYXllcihzcDxTbmFwc2hvdD4gc25hcHNob3QsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSBjb2xvcmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBjb2xvciBUaGUgcmVjdGFuZ2xlJ3MgQVJHQiBjb2xvciwgZGVmaW5lZCBhcyBhIHBhY2tlZCAzMiBiaXRzIHdvcmQKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgU2tpYSB4ZmVybW9kZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gaWdub3JlVHJhbnNmb3JtIFRydWUgaWYgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICovCisgICAgdm9pZCBkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAJCWludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHRleHR1cmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gdXNlCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCBjb250YWluaW5nIHRoZSBhbHBoYSwgYmxlbmRpbmcgbW9kZSwgZXRjLgorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgbWVzaCB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gSWYgdGhlIGluZGljZXMgYXJlIG9taXR0ZWQsIHRoZQorICAgICAqIG1lc2ggaXMgZHJhd24gYXMgYSBzaW1wbGUgcXVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gdmVydGljZXMgVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIHRoZSBtZXNoCisgICAgICogQHBhcmFtIHRleENvb3JkcyBUaGUgdGV4dHVyZSBjb29yZGluYXRlcyBvZiBlYWNoIHZlcnRleAorICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2ZXJ0aWNlcywgY2FuIGJlIE5VTEwKKyAgICAgKiBAcGFyYW0gZWxlbWVudHNDb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtZXNoLCByZXF1aXJlZCBieSBpbmRpY2VzCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZU1lc2goZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBHTHVpbnQgdGV4dHVyZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQsCisgICAgICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQgPSAwKTsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBzdG9yZWQgaW4gbU1lc2hWZXJ0aWNlcy4gU2V0dGluZyB0aGUgdmFsdWVzCisgICAgICogYmFjayB0byBkZWZhdWx0IGlzIGFjaGlldmVkIGJ5IGNhbGxpbmc6CisgICAgICoKKyAgICAgKiByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgICAqCisgICAgICogQHBhcmFtIHUxIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjEgVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHUyIFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHYyIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqLworICAgIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbHBoYSBhbmQgeGZlcm1vZGUgb3V0IG9mIGEgcGFpbnQgb2JqZWN0LiBJZiB0aGUgcGFpbnQgaXMgbnVsbAorICAgICAqIGFscGhhIHdpbGwgYmUgMjU1IGFuZCB0aGUgeGZlcm1vZGUgd2lsbCBiZSBTUkNfT1ZFUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbQorICAgICAqIEBwYXJhbSBhbHBoYSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGFscGhhCisgICAgICogQHBhcmFtIG1vZGUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB4ZmVybW9kZQorICAgICAqLworICAgIGlubGluZSB2b2lkIGdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHRleHR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXAgbW9kZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJsZW5kaW5nIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGJsZW5kIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlzUHJlbXVsdGlwbGllZCA9IHRydWUpOworCisgICAgLyoqCisgICAgICogVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBjdXJyZW50IEdMIGNvbnRleHQuIElmIHRoZSBwcm9ncmFtIGlzIGFscmVhZHkKKyAgICAgKiBpbiB1c2UsIGl0IHdpbGwgbm90IGJlIGJvdW5kIGFnYWluLiBJZiBpdCBpcyBub3QgaW4gdXNlLCB0aGUgY3VycmVudCBwcm9ncmFtIGlzCisgICAgICogbWFya2VkIHVudXNlZCBhbmQgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGJlY29tZXMgdXNlZCBhbmQgYmVjb21lcyB0aGUgbmV3CisgICAgICogY3VycmVudCBwcm9ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2dyYW0gVGhlIHByb2dyYW0gdG8gdXNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgSWYgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdhcyBhbHJlYWR5IGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGlubGluZSBib29sIHVzZVByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgICAvLyBEaW1lbnNpb25zIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UKKyAgICBpbnQgbVdpZHRoLCBtSGVpZ2h0OworCisgICAgLy8gTWF0cml4IHVzZWQgZm9yIG9ydGhvIHByb2plY3Rpb24gaW4gc2hhZGVycworICAgIG1hdDQgbU9ydGhvTWF0cml4OworCisgICAgLy8gTW9kZWwtdmlldyBtYXRyaXggdXNlZCB0byBwb3NpdGlvbi9zaXplIG9iamVjdHMKKyAgICBtYXQ0IG1Nb2RlbFZpZXc7CisKKyAgICAvLyBOdW1iZXIgb2Ygc2F2ZWQgc3RhdGVzCisgICAgaW50IG1TYXZlQ291bnQ7CisgICAgLy8gQmFzZSBzdGF0ZQorICAgIHNwPFNuYXBzaG90PiBtRmlyc3RTbmFwc2hvdDsKKyAgICAvLyBDdXJyZW50IHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1TbmFwc2hvdDsKKworICAgIC8vIFNoYWRlcnMKKyAgICBQcm9ncmFtKiBtQ3VycmVudFByb2dyYW07CisgICAgU2tpYVNoYWRlciogbVNoYWRlcjsKKworICAgIC8vIENvbG9yIGZpbHRlcnMKKyAgICBTa2lhQ29sb3JGaWx0ZXIqIG1Db2xvckZpbHRlcjsKKworICAgIC8vIFVzZWQgdG8gZHJhdyB0ZXh0dXJlZCBxdWFkcworICAgIFRleHR1cmVWZXJ0ZXggbU1lc2hWZXJ0aWNlc1s0XTsKKworICAgIC8vIExhc3Qga25vd24gYmxlbmQgc3RhdGUKKyAgICBib29sIG1CbGVuZDsKKyAgICBHTGVudW0gbUxhc3RTcmNNb2RlOworICAgIEdMZW51bSBtTGFzdERzdE1vZGU7CisKKyAgICAvLyBHTCBleHRlbnNpb25zCisgICAgRXh0ZW5zaW9ucyBtRXh0ZW5zaW9uczsKKworICAgIC8vIEZvbnQgcmVuZGVyZXIKKyAgICBGb250UmVuZGVyZXIgbUZvbnRSZW5kZXJlcjsKKworICAgIC8vIFZhcmlvdXMgY2FjaGVzCisgICAgVGV4dHVyZUNhY2hlIG1UZXh0dXJlQ2FjaGU7CisgICAgTGF5ZXJDYWNoZSBtTGF5ZXJDYWNoZTsKKyAgICBHcmFkaWVudENhY2hlIG1HcmFkaWVudENhY2hlOworICAgIFByb2dyYW1DYWNoZSBtUHJvZ3JhbUNhY2hlOworICAgIFBhdGhDYWNoZSBtUGF0aENhY2hlOworICAgIFBhdGNoQ2FjaGUgbVBhdGNoQ2FjaGU7Cit9OyAvLyBjbGFzcyBPcGVuR0xSZW5kZXJlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5jcHAgYi9saWJzL2h3dWkvUGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2guY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlBhdGNoLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0Y2g6OlBhdGNoKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KToKKyAgICAgICAgeENvdW50KHhDb3VudCArIDIpLCB5Q291bnQoeUNvdW50ICsgMikgeworICAgIHZlcnRpY2VzQ291bnQgPSAoeENvdW50ICsgMikgKiAoeUNvdW50ICsgMik7CisgICAgdmVydGljZXMgPSBuZXcgVGV4dHVyZVZlcnRleFt2ZXJ0aWNlc0NvdW50XTsKKworICAgIC8vIDIgdHJpYW5nbGVzIHBlciBwYXRjaCwgMyB2ZXJ0aWNlcyBwZXIgdHJpYW5nbGUKKyAgICBpbmRpY2VzQ291bnQgPSAoeENvdW50ICsgMSkgKiAoeUNvdW50ICsgMSkgKiAyICogMzsKKyAgICBpbmRpY2VzID0gbmV3IHVpbnQxNl90W2luZGljZXNDb3VudF07CisKKyAgICBjb25zdCB1aW50MzJfdCB4TnVtID0geENvdW50ICsgMTsKKyAgICBjb25zdCB1aW50MzJfdCB5TnVtID0geUNvdW50ICsgMTsKKworICAgIHVpbnQxNl90KiBzdGFydEluZGljZXMgPSBpbmRpY2VzOworICAgIHVpbnQzMl90IG4gPSAwOworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCB5TnVtOyB5KyspIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHhOdW07IHgrKykgeworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyAxOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAyOworCisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAyOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAxOworCisgICAgICAgICAgICBuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgbiArPSAxOworICAgIH0KK30KKworUGF0Y2g6On5QYXRjaCgpIHsKKyAgICBkZWxldGUgaW5kaWNlczsKKyAgICBkZWxldGUgdmVydGljZXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZlcnRpY2VzIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaDo6dXBkYXRlVmVydGljZXMoY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgZmxvYXQgYm90dG9tLCBjb25zdCBpbnQzMl90KiB4RGl2cywgIGNvbnN0IGludDMyX3QqIHlEaXZzLCBjb25zdCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgY29uc3QgdWludDMyX3QgeFN0cmV0Y2hDb3VudCA9ICh3aWR0aCArIDEpID4+IDE7CisgICAgY29uc3QgdWludDMyX3QgeVN0cmV0Y2hDb3VudCA9IChoZWlnaHQgKyAxKSA+PiAxOworCisgICAgZmxvYXQgeFN0cmV0Y2ggPSAwOworICAgIGZsb2F0IHlTdHJldGNoID0gMDsKKyAgICBmbG9hdCB4U3RyZXRjaFRleCA9IDA7CisgICAgZmxvYXQgeVN0cmV0Y2hUZXggPSAwOworCisgICAgY29uc3QgZmxvYXQgbWVzaFdpZHRoID0gcmlnaHQgLSBsZWZ0OworCisgICAgY29uc3QgZmxvYXQgYml0bWFwV2lkdGggPSBmbG9hdChiaXRtYXAtPndpZHRoKCkpOworICAgIGNvbnN0IGZsb2F0IGJpdG1hcEhlaWdodCA9IGZsb2F0KGJpdG1hcC0+aGVpZ2h0KCkpOworCisgICAgaWYgKHhTdHJldGNoQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN0cmV0Y2hTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IHdpZHRoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHhEaXZzW2ldIC0geERpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIHhTdHJldGNoVGV4ID0gKHN0cmV0Y2hTaXplIC8gYml0bWFwV2lkdGgpIC8geFN0cmV0Y2hDb3VudDsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWQgPSBiaXRtYXBXaWR0aCAtIHN0cmV0Y2hTaXplOworICAgICAgICB4U3RyZXRjaCA9IChyaWdodCAtIGxlZnQgLSBmaXhlZCkgLyB4U3RyZXRjaENvdW50OworICAgIH0KKworICAgIGlmICh5U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBoZWlnaHQ7IGkgKz0gMikgeworICAgICAgICAgICAgc3RyZXRjaFNpemUgKz0geURpdnNbaV0gLSB5RGl2c1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgeVN0cmV0Y2hUZXggPSAoc3RyZXRjaFNpemUgLyBiaXRtYXBIZWlnaHQpIC8geVN0cmV0Y2hDb3VudDsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWQgPSBiaXRtYXBIZWlnaHQgLSBzdHJldGNoU2l6ZTsKKyAgICAgICAgeVN0cmV0Y2ggPSAoYm90dG9tIC0gdG9wIC0gZml4ZWQpIC8geVN0cmV0Y2hDb3VudDsKKyAgICB9CisKKyAgICBmbG9hdCB2eSA9IDAuMGY7CisgICAgZmxvYXQgdHkgPSAwLjBmOworICAgIFRleHR1cmVWZXJ0ZXgqIHZlcnRleCA9IHZlcnRpY2VzOworCisgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIDAuMGYsIDAuMGYsIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7CisgICAgdmVydGV4ICs9IHdpZHRoICsgMjsKKworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoeSAmIDEpIHsKKyAgICAgICAgICAgIHZ5ICs9IHlTdHJldGNoOworICAgICAgICAgICAgdHkgKz0geVN0cmV0Y2hUZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzdGVwID0gZmxvYXQoeURpdnNbeV0pOworICAgICAgICAgICAgdnkgKz0gc3RlcDsKKyAgICAgICAgICAgIHR5ICs9IHN0ZXAgLyBiaXRtYXBIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIHZ5LCB0eSwgeERpdnMsIHdpZHRoLCB4U3RyZXRjaCwgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7CisgICAgICAgIHZlcnRleCArPSB3aWR0aCArIDI7CisgICAgfQorCisgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIGJvdHRvbSAtIHRvcCwgMS4wZiwgeERpdnMsIHdpZHRoLCB4U3RyZXRjaCwgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICBtZXNoV2lkdGgsIGJpdG1hcFdpZHRoKTsKK30KKworaW5saW5lIHZvaWQgUGF0Y2g6OmdlbmVyYXRlVmVydGljZXMoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB5LCBmbG9hdCB2LAorICAgICAgICBjb25zdCBpbnQzMl90IHhEaXZzW10sIHVpbnQzMl90IHhDb3VudCwgZmxvYXQgeFN0cmV0Y2gsIGZsb2F0IHhTdHJldGNoVGV4LAorICAgICAgICBmbG9hdCB3aWR0aCwgZmxvYXQgd2lkdGhUZXgpIHsKKyAgICBmbG9hdCB2eCA9IDAuMGY7CisgICAgZmxvYXQgdHggPSAwLjBmOworCisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCwgdngsIHksIHR4LCB2KTsKKyAgICB2ZXJ0ZXgrKzsKKworICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4Q291bnQ7IHgrKykgeworICAgICAgICBpZiAoeCAmIDEpIHsKKyAgICAgICAgICAgIHZ4ICs9IHhTdHJldGNoOworICAgICAgICAgICAgdHggKz0geFN0cmV0Y2hUZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzdGVwID0gZmxvYXQoeERpdnNbeF0pOworICAgICAgICAgICAgdnggKz0gc3RlcDsKKyAgICAgICAgICAgIHR4ICs9IHN0ZXAgLyB3aWR0aFRleDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHZ4LCB5LCB0eCwgdik7CisgICAgICAgIHZlcnRleCsrOworICAgIH0KKworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHdpZHRoLCB5LCAxLjBmLCB2KTsKKyAgICB2ZXJ0ZXgrKzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVidWcgdG9vbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaDo6ZHVtcCgpIHsKKyAgICBMT0dEKCJWZXJ0aWNlcyBbIik7CisgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IHlDb3VudDsgeSsrKSB7CisgICAgICAgIGNoYXIgYnVmZmVyWzUxMl07CisgICAgICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4Q291bnQ7IHgrKykgeworICAgICAgICAgICAgVGV4dHVyZVZlcnRleCogdiA9ICZ2ZXJ0aWNlc1t5ICogeENvdW50ICsgeF07CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZigmYnVmZmVyW29mZnNldF0sICIgKCUuNGYsJS40ZiktKCUuNGYsJS40ZikiLAorICAgICAgICAgICAgICAgICAgICB2LT5wb3NpdGlvblswXSwgdi0+cG9zaXRpb25bMV0sIHYtPnRleHR1cmVbMF0sIHYtPnRleHR1cmVbMV0pOworICAgICAgICB9CisgICAgICAgIExPR0QoIiAgWyVzIF0iLCBidWZmZXIpOworICAgIH0KKyAgICBMT0dEKCJdXG5JbmRpY2VzIFsgIik7CisgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7IGkrKykgeworICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZigmYnVmZmVyW29mZnNldF0sICIlZCAiLCBpbmRpY2VzW2ldKTsKKyAgICB9CisgICAgTE9HRCgiICAlc1xuXSIsIGJ1ZmZlcik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoLmggYi9saWJzL2h3dWkvUGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNhZDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorCisjaW5jbHVkZSAiVmVydGV4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIHBhdGNoLgorICovCitzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbiB7CisgICAgUGF0Y2hEZXNjcmlwdGlvbigpOiB4Q291bnQoMCksIHlDb3VudCgwKSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KToKKyAgICAgICAgICAgIHhDb3VudCh4Q291bnQpLCB5Q291bnQoeUNvdW50KSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKToKKyAgICAgICAgICAgIHhDb3VudChkZXNjcmlwdGlvbi54Q291bnQpLCB5Q291bnQoZGVzY3JpcHRpb24ueUNvdW50KSB7IH0KKworICAgIHVpbnQzMl90IHhDb3VudDsKKyAgICB1aW50MzJfdCB5Q291bnQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRjaERlc2NyaXB0aW9uJiByaHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKHhDb3VudCA9PSByaHMueENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4geUNvdW50IDwgcmhzLnlDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geENvdW50IDwgcmhzLnhDb3VudDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiB4Q291bnQgPT0gcmhzLnhDb3VudCAmJiB5Q291bnQgPT0gcmhzLnlDb3VudDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbgorCisvKioKKyAqIEFuIE9wZW5HTCBwYXRjaC4gVGhpcyBjb250YWlucyBhbiBhcnJheSBvZiB2ZXJ0aWNlcyBhbmQgYW4gYXJyYXkgb2YKKyAqIGluZGljZXMgdG8gcmVuZGVyIHRoZSB2ZXJ0aWNlcy4KKyAqLworc3RydWN0IFBhdGNoIHsKKyAgICBQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk7CisgICAgflBhdGNoKCk7CisKKyAgICB2b2lkIHVwZGF0ZVZlcnRpY2VzKGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHhEaXZzLCAgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB3aWR0aCwgY29uc3QgdWludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGR1bXAoKTsKKworICAgIHVpbnQzMl90IHhDb3VudDsKKyAgICB1aW50MzJfdCB5Q291bnQ7CisKKyAgICB1aW50MTZfdCogaW5kaWNlczsKKyAgICB1aW50MzJfdCBpbmRpY2VzQ291bnQ7CisKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0aWNlczsKKyAgICB1aW50MzJfdCB2ZXJ0aWNlc0NvdW50OworCitwcml2YXRlOgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBnZW5lcmF0ZVZlcnRpY2VzKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeSwgZmxvYXQgdiwKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgeERpdnNbXSwgdWludDMyX3QgeENvdW50LCBmbG9hdCB4U3RyZXRjaCwgZmxvYXQgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICBmbG9hdCB3aWR0aCwgZmxvYXQgd2lkdGhUZXgpOworfTsgLy8gc3RydWN0IFBhdGNoCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRDSF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ZTNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKworI2luY2x1ZGUgIlBhdGNoQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKHVpbnQzMl90IG1heEVudHJpZXMpOiBtQ2FjaGUobWF4RW50cmllcykgeworfQorCitQYXRjaENhY2hlOjp+UGF0Y2hDYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpvcGVyYXRvcigpKFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBQYXRjaComIG1lc2gpIHsKKyAgICBpZiAobWVzaCkgZGVsZXRlIG1lc2g7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworUGF0Y2gqIFBhdGNoQ2FjaGU6OmdldChjb25zdCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gpIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHBhdGNoLT5udW1YRGl2czsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBwYXRjaC0+bnVtWURpdnM7CisgICAgY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlLmdldChkZXNjcmlwdGlvbik7CisgICAgaWYgKCFtZXNoKSB7CisgICAgICAgIFBBVENIX0xPR0QoIkNyZWF0aW5nIG5ldyBwYXRjaCBtZXNoLCB3PSVkIGg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbWVzaCA9IG5ldyBQYXRjaCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbUNhY2hlLnB1dChkZXNjcmlwdGlvbiwgbWVzaCk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5NTA4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorCisjaW5jbHVkZSAiUGF0Y2guaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BBVENIRVMgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BBVENIRVMKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFBhdGNoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IHsKK3B1YmxpYzoKKyAgICBQYXRjaENhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB+UGF0Y2hDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgUGF0Y2gqJiBtZXNoKTsKKworICAgIFBhdGNoKiBnZXQoY29uc3QgUmVzX3BuZ185cGF0Y2gqIHBhdGNoKTsKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgR2VuZXJhdGlvbkNhY2hlPFBhdGNoRGVzY3JpcHRpb24sIFBhdGNoKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUGF0Y2hDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAgYi9saWJzL2h3dWkvUGF0aENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIyZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrUmVjdC5oPgorCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aENhY2hlOjpQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKworICAgIEdMaW50IG1heFRleHR1cmVTaXplOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1heFRleHR1cmVTaXplKTsKKyAgICBtTWF4VGV4dHVyZVNpemUgPSBtYXhUZXh0dXJlU2l6ZTsKK30KKworUGF0aENhY2hlOjp+UGF0aENhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB0ZXh0dXJlLT53aWR0aCAqIHRleHR1cmUtPmhlaWdodDsKKyAgICBtU2l6ZSAtPSBzaXplOworCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6Z2V0KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBQYXRoQ2FjaGVFbnRyeSBlbnRyeShwYXRoLCBwYWludCk7CisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICB0ZXh0dXJlID0gYWRkVGV4dHVyZShlbnRyeSwgcGF0aCwgcGFpbnQpOworICAgIH0gZWxzZSBpZiAocGF0aC0+Z2V0R2VuZXJhdGlvbklEKCkgIT0gdGV4dHVyZS0+Z2VuZXJhdGlvbikgeworICAgICAgICBtQ2FjaGUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgdGV4dHVyZSA9IGFkZFRleHR1cmUoZW50cnksIHBhdGgsIHBhaW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6YWRkVGV4dHVyZShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnksCisgICAgICAgIGNvbnN0IFNrUGF0aCAqcGF0aCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBTa1JlY3QmIGJvdW5kcyA9IHBhdGgtPmdldEJvdW5kcygpOworCisgICAgY29uc3QgZmxvYXQgcGF0aFdpZHRoID0gYm91bmRzLndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgcGF0aEhlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKworICAgIGlmIChwYXRoV2lkdGggPiBtTWF4VGV4dHVyZVNpemUgfHwgcGF0aEhlaWdodCA+IG1NYXhUZXh0dXJlU2l6ZSkgeworICAgICAgICBMT0dXKCJQYXRoIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZCBpbnRvIGEgdGV4dHVyZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBmbG9hdCBvZmZzZXQgPSBlbnRyeS5zdHJva2VXaWR0aCAqIDEuNWY7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSB1aW50MzJfdChwYXRoV2lkdGggKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IHVpbnQzMl90KHBhdGhIZWlnaHQgKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBuZXcgUGF0aFRleHR1cmU7CisgICAgdGV4dHVyZS0+bGVmdCA9IGJvdW5kcy5mTGVmdDsKKyAgICB0ZXh0dXJlLT50b3AgPSBib3VuZHMuZlRvcDsKKyAgICB0ZXh0dXJlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgdGV4dHVyZS0+d2lkdGggPSB3aWR0aDsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IHBhdGgtPmdldEdlbmVyYXRpb25JRCgpOworCisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBOF9Db25maWcsIHdpZHRoLCBoZWlnaHQpOworICAgIGJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOworCisgICAgU2tDYW52YXMgY2FudmFzKGJpdG1hcCk7CisgICAgY2FudmFzLnRyYW5zbGF0ZSgtYm91bmRzLmZMZWZ0ICsgb2Zmc2V0LCAtYm91bmRzLmZUb3AgKyBvZmZzZXQpOworICAgIGNhbnZhcy5kcmF3UGF0aCgqcGF0aCwgKnBhaW50KTsKKworICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUpOworCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscChiaXRtYXApOworICAgIGlmICghYml0bWFwLnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgYml0bWFwLnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIGJpdG1hcC5nZXRQaXhlbHMoKSk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGhDYWNoZS5oIGIvbGlicy9od3VpL1BhdGhDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTc4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0aENhY2hlLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUSF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1BhdGguaD4KKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIERlc2NyaWJlIGEgcGF0aCBpbiB0aGUgcGF0aCBjYWNoZS4KKyAqLworc3RydWN0IFBhdGhDYWNoZUVudHJ5IHsKKyAgICBQYXRoQ2FjaGVFbnRyeSgpIHsKKyAgICAgICAgcGF0aCA9IE5VTEw7CisgICAgICAgIGpvaW4gPSBTa1BhaW50OjprRGVmYXVsdF9Kb2luOworICAgICAgICBjYXAgPSBTa1BhaW50OjprRGVmYXVsdF9DYXA7CisgICAgICAgIHN0eWxlID0gU2tQYWludDo6a0ZpbGxfU3R5bGU7CisgICAgICAgIG1pdGVyID0gNC4wZjsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSAxLjBmOworICAgIH0KKworICAgIFBhdGhDYWNoZUVudHJ5KGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSk6CisgICAgICAgIHBhdGgoZW50cnkucGF0aCksIGpvaW4oZW50cnkuam9pbiksIGNhcChlbnRyeS5jYXApLAorICAgICAgICBzdHlsZShlbnRyeS5zdHlsZSksIG1pdGVyKGVudHJ5Lm1pdGVyKSwKKyAgICAgICAgc3Ryb2tlV2lkdGgoZW50cnkuc3Ryb2tlV2lkdGgpIHsKKyAgICB9CisKKyAgICBQYXRoQ2FjaGVFbnRyeShTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgIHRoaXMtPnBhdGggPSBwYXRoOworICAgICAgICBqb2luID0gcGFpbnQtPmdldFN0cm9rZUpvaW4oKTsKKyAgICAgICAgY2FwID0gcGFpbnQtPmdldFN0cm9rZUNhcCgpOworICAgICAgICBtaXRlciA9IHBhaW50LT5nZXRTdHJva2VNaXRlcigpOworICAgICAgICBzdHJva2VXaWR0aCA9IHBhaW50LT5nZXRTdHJva2VXaWR0aCgpOworICAgICAgICBzdHlsZSA9IHBhaW50LT5nZXRTdHlsZSgpOworICAgIH0KKworICAgIFNrUGF0aCogcGF0aDsKKyAgICBTa1BhaW50OjpKb2luIGpvaW47CisgICAgU2tQYWludDo6Q2FwIGNhcDsKKyAgICBTa1BhaW50OjpTdHlsZSBzdHlsZTsKKyAgICBmbG9hdCBtaXRlcjsKKyAgICBmbG9hdCBzdHJva2VXaWR0aDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhdGhDYWNoZUVudHJ5JiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1lbWNtcCh0aGlzLCAmcmhzLCBzaXplb2YoUGF0aENhY2hlRW50cnkpKSA8IDA7CisgICAgfQorfTsgLy8gc3RydWN0IFBhdGhDYWNoZUVudHJ5CisKKy8qKgorICogQWxwaGEgdGV4dHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHBhdGguCisgKi8KK3N0cnVjdCBQYXRoVGV4dHVyZTogcHVibGljIFRleHR1cmUgeworICAgIFBhdGhUZXh0dXJlKCk6IFRleHR1cmUoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVmdCBjb29yZGluYXRlIG9mIHRoZSBwYXRoIGJvdW5kcy4KKyAgICAgKi8KKyAgICBmbG9hdCBsZWZ0OworICAgIC8qKgorICAgICAqIFRvcCBjb29yZGluYXRlIG9mIHRoZSBwYXRoIGJvdW5kcy4KKyAgICAgKi8KKyAgICBmbG9hdCB0b3A7CisgICAgLyoqCisgICAgICogT2Zmc2V0IHRvIGRyYXcgdGhlIHBhdGggYXQgdGhlIGNvcnJlY3Qgb3JpZ2luLgorICAgICAqLworICAgIGZsb2F0IG9mZnNldDsKK307IC8vIHN0cnVjdCBQYXRoVGV4dHVyZQorCisvKioKKyAqIEEgc2ltcGxlIExSVSBwYXRoIGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgUGF0aENhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj4geworcHVibGljOgorICAgIFBhdGhDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflBhdGhDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShQYXRoQ2FjaGVFbnRyeSYgcGF0aCwgUGF0aFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4gSWYgdGhlIHRleHR1cmUKKyAgICAgKiBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGNhY2hlLCBhIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBQYXRoVGV4dHVyZSogZ2V0KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCYgYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKTsKKworICAgIFBhdGhUZXh0dXJlKiBhZGRUZXh0dXJlKGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSwgY29uc3QgU2tQYXRoICpwYXRoLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0x1aW50IG1NYXhUZXh0dXJlU2l6ZTsKK307IC8vIGNsYXNzIFBhdGhDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUSF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhZTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNIQURFUl9TT1VSQ0UobmFtZSwgc291cmNlKSBjb25zdCBjaGFyKiBuYW1lID0gI3NvdXJjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbTo6UHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KSB7CisgICAgdmVydGV4U2hhZGVyID0gYnVpbGRTaGFkZXIodmVydGV4LCBHTF9WRVJURVhfU0hBREVSKTsKKyAgICBmcmFnbWVudFNoYWRlciA9IGJ1aWxkU2hhZGVyKGZyYWdtZW50LCBHTF9GUkFHTUVOVF9TSEFERVIpOworCisgICAgaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgZnJhZ21lbnRTaGFkZXIpOworICAgIGdsTGlua1Byb2dyYW0oaWQpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgIGlmIChpbmZvTGVuID4gMSkgeworICAgICAgICAgICAgY2hhciogbG9nID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogaW5mb0xlbik7CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKGlkLCBpbmZvTGVuLCAwLCBsb2cpOworICAgICAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgbGlua2luZyBzaGFkZXJzOiAlcyIsIGxvZyk7CisgICAgICAgICAgICBkZWxldGUgbG9nOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7CisgICAgfQorCisgICAgbVVzZSA9IGZhbHNlOworCisgICAgcG9zaXRpb24gPSBhZGRBdHRyaWIoInBvc2l0aW9uIik7CisgICAgY29sb3IgPSBhZGRVbmlmb3JtKCJjb2xvciIpOworICAgIHRyYW5zZm9ybSA9IGFkZFVuaWZvcm0oInRyYW5zZm9ybSIpOworfQorCitQcm9ncmFtOjp+UHJvZ3JhbSgpIHsKKyAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0QXR0cmliTG9jYXRpb24oaWQsIG5hbWUpOworICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mS2V5KG5hbWUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkQXR0cmliKG5hbWUpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IHNsb3QgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihpZCwgbmFtZSk7CisgICAgdW5pZm9ybXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpbmRleCA9IHVuaWZvcm1zLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHVuaWZvcm1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkVW5pZm9ybShuYW1lKTsKK30KKworR0x1aW50IFByb2dyYW06OmJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAvLyBTb21lIGRyaXZlcnMgcmV0dXJuIHdyb25nIHZhbHVlcyBmb3IgR0xfSU5GT19MT0dfTEVOR1RICisgICAgICAgIC8vIHVzZSBhIGZpeGVkIHNpemUgaW5zdGVhZAorICAgICAgICBHTGNoYXIgbG9nWzUxMl07CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihsb2cpLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHNoYWRlcjogJXMiLCBsb2cpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6c2V0KGNvbnN0IG1hdDQmIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IG1hdDQmIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KSB7CisgICAgbWF0NCB0KHByb2plY3Rpb25NYXRyaXgpOworICAgIHQubXVsdGlwbHkodHJhbnNmb3JtTWF0cml4KTsKKyAgICB0Lm11bHRpcGx5KG1vZGVsVmlld01hdHJpeCk7CisKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgJnQuZGF0YVswXSk7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6dXNlKCkgeworICAgIGdsVXNlUHJvZ3JhbShpZCk7CisgICAgbVVzZSA9IHRydWU7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKK30KKwordm9pZCBQcm9ncmFtOjpyZW1vdmUoKSB7CisgICAgbVVzZSA9IGZhbHNlOworCisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmggYi9saWJzL2h3dWkvUHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzFjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST0dSQU1fSAorI2RlZmluZSBBTkRST0lEX1VJX1BST0dSQU1fSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHByb2dyYW0gaG9sZHMgYSB2ZXJ0ZXggYW5kIGEgZnJhZ21lbnQgc2hhZGVyLiBJdCBvZmZlcnMgc2V2ZXJhbCB1dGlsaXR5CisgKiBtZXRob2RzIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLgorICovCitjbGFzcyBQcm9ncmFtIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnRleCBhbmQgZnJhZ21lbnQKKyAgICAgKiBzaGFkZXJzIHNvdXJjZXMuCisgICAgICovCisgICAgUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KTsKKyAgICB2aXJ0dWFsIH5Qcm9ncmFtKCk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHVzZSgpOworCisgICAgLyoqCisgICAgICogTWFya3MgdGhpcyBwcm9ncmFtIGFzIHVudXNlZC4gVGhpcyB3aWxsIG5vdCB1bmJpbmQKKyAgICAgKiB0aGUgcHJvZ3JhbSBmcm9tIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb2dyYW0gaXMgY3VycmVudGx5IGluIHVzZSB3aXRoCisgICAgICogdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Vc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgdGhlIHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHByb2plY3Rpb24sIG1vZGVsVmlldyBhbmQKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cmljZXMuCisgICAgICovCisgICAgdm9pZCBzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICAgICAgIGNvbnN0IG1hdDQmIHRyYW5zZm9ybU1hdHJpeCk7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IHBvc2l0aW9uOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgY29sb3IgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgY29sb3I7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0cmFuc2Zvcm0gdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgdHJhbnNmb3JtOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogQWRkcyBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBhZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgdW5pZm9ybSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSB1bmlmb3JtLgorICAgICAqLworICAgIGludCBhZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbXBpbGVzIHRoZSBzcGVjaWZpZWQgc2hhZGVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBHTHVpbnQgYnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSk7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBPcGVuR0wgcHJvZ3JhbQorICAgIEdMdWludCBpZDsKKworICAgIC8vIE5hbWUgb2YgdGhlIHNoYWRlcnMKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNoYWRlcjsKKworICAgIC8vIEtlZXBzIHRyYWNrIG9mIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHNsb3RzCisgICAgS2V5ZWRWZWN0b3I8Y29uc3QgY2hhciosIGludD4gYXR0cmlidXRlczsKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiB1bmlmb3JtczsKKworICAgIGJvb2wgbVVzZTsKK307IC8vIGNsYXNzIFByb2dyYW0KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST0dSQU1fSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZlODVhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmVydGV4IHNoYWRlcnMgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXMgPQorICAgICAgICAidW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50ID0KKyAgICAgICAgInVuaWZvcm0gZmxvYXQgZ3JhZGllbnRMZW5ndGg7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzIgZ3JhZGllbnQ7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzIgZ3JhZGllbnRTdGFydDtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NCBzY3JlZW5TcGFjZTtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0JpdG1hcCA9CisgICAgICAgICJ1bmlmb3JtIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiB0ZXh0dXJlRGltZW5zaW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSA9CisgICAgICAgICJ2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRCaXRtYXBUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNHcmFkaWVudCA9CisgICAgICAgICJ2YXJ5aW5nIGZsb2F0IGluZGV4O1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluID0KKyAgICAgICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRUZXhDb29yZHMgPQorICAgICAgICAiICAgIG91dFRleENvb3JkcyA9IHRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRHcmFkaWVudEluZGV4ID0KKyAgICAgICAgIiAgICB2ZWM0IGxvY2F0aW9uID0gc2NyZWVuU3BhY2UgKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBpbmRleCA9IGRvdChsb2NhdGlvbi54eSAtIGdyYWRpZW50U3RhcnQsIGdyYWRpZW50KSAqIGdyYWRpZW50TGVuZ3RoO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dEJpdG1hcFRleENvb3JkcyA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb29yZHMgPSB0ZXh0dXJlVHJhbnNmb3JtICogcG9zaXRpb247XG4iCisgICAgICAgICIgICAgb3V0Qml0bWFwVGV4Q29vcmRzID0gYml0bWFwQ29vcmRzLnh5ICogdGV4dHVyZURpbWVuc2lvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9Qb3NpdGlvbiA9CisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB0cmFuc2Zvcm0gKiBwb3NpdGlvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfRm9vdGVyID0KKyAgICAgICAgIn1cblxuIjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRnJhZ21lbnQgc2hhZGVycyBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnRlNfSGVhZGVyID0KKyAgICAgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0NvbG9yID0KKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfVGV4dHVyZVNhbXBsZXIgPQorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgc2FtcGxlcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfR3JhZGllbnRTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50U2FtcGxlcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBiaXRtYXBTYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19Db2xvck9wWzRdID0geworICAgICAgICAvLyBOb25lCisgICAgICAgICIiLAorICAgICAgICAvLyBNYXRyaXgKKyAgICAgICAgInVuaWZvcm0gbWF0NCBjb2xvck1hdHJpeDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvck1hdHJpeFZlY3RvcjtcbiIsCisgICAgICAgIC8vIExpZ2h0aW5nCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdNdWw7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdBZGQ7XG4iLAorICAgICAgICAvLyBQb3J0ZXJEdWZmCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3JCbGVuZDtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iCisgICAgICAgICIgICAgbG93cCB2ZWM0IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaENvbG9yID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBjb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3JkcykuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEdyYWRpZW50ID0KKyAgICAgICAgIiAgICB2ZWM0IGdyYWRpZW50Q29sb3IgPSB0ZXh0dXJlMkQoZ3JhZGllbnRTYW1wbGVyLCB2ZWMyKGluZGV4LCAwLjUpKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEJpdG1hcCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCBvdXRCaXRtYXBUZXhDb29yZHMpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCB3cmFwKG91dEJpdG1hcFRleENvb3JkcykpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0JHID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoZ3JhZGllbnRDb2xvciwgYml0bWFwQ29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0dCID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoYml0bWFwQ29sb3IsIGdyYWRpZW50Q29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc19Nb2R1bGF0ZSA9CisgICAgICAgICIgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gZ3JhZGllbnRDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JpdG1hcFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYml0bWFwQ29sb3IgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3IgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9BcHBseUNvbG9yT3BbNF0gPSB7CisgICAgICAgIC8vIE5vbmUKKyAgICAgICAgIiIsCisgICAgICAgIC8vIE1hdHJpeAorICAgICAgICAvLyBUT0RPOiBGaXggcHJlbXVsdGlwbGllZCBhbHBoYSBjb21wdXRhdGlvbnMgZm9yIGNvbG9yIG1hdHJpeAorICAgICAgICAiICAgIGZyYWdDb2xvciAqPSBjb2xvck1hdHJpeDtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgKz0gY29sb3JNYXRyaXhWZWN0b3I7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yLnJnYiAqPSBmcmFnQ29sb3IuYTtcbiIsCisgICAgICAgIC8vIExpZ2h0aW5nCisgICAgICAgICIgICAgZmxvYXQgbGlnaHRpbmdBbHBoYSA9IGZyYWdDb2xvci5hO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciA9IG1pbihmcmFnQ29sb3IgKiBsaWdodGluZ011bCArIChsaWdodGluZ0FkZCAqIGxpZ2h0aW5nQWxwaGEpLCBsaWdodGluZ0FscGhhKTtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IuYSA9IGxpZ2h0aW5nQWxwaGE7XG4iLAorICAgICAgICAvLyBQb3J0ZXJEdWZmCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYmxlbmRDb2xvcnMoY29sb3JCbGVuZCwgZnJhZ0NvbG9yKTtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfRm9vdGVyID0KKyAgICAgICAgIn1cblxuIjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUG9ydGVyRHVmZiBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnQmxlbmRPcHNbMThdID0geworICAgICAgICAvLyBDbGVhcgorICAgICAgICAicmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiIsCisgICAgICAgIC8vIFNyYworICAgICAgICAicmV0dXJuIHNyYztcbiIsCisgICAgICAgIC8vIERzdAorICAgICAgICAicmV0dXJuIGRzdDtcbiIsCisgICAgICAgIC8vIFNyY092ZXIKKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgKiAoMS4wIC0gc3JjLmEpO1xuIiwKKyAgICAgICAgLy8gRHN0T3ZlcgorICAgICAgICAicmV0dXJuIGRzdCArIHNyYyAqICgxLjAgLSBkc3QuYSk7XG4iLAorICAgICAgICAvLyBTcmNJbgorICAgICAgICAicmV0dXJuIHNyYyAqIGRzdC5hO1xuIiwKKyAgICAgICAgLy8gRHN0SW4KKyAgICAgICAgInJldHVybiBkc3QgKiBzcmMuYTtcbiIsCisgICAgICAgIC8vIFNyY091dAorICAgICAgICAicmV0dXJuIHNyYyAqICgxLjAgLSBkc3QuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdXQKKyAgICAgICAgInJldHVybiBkc3QgKiAoMS4wIC0gc3JjLmEpO1xuIiwKKyAgICAgICAgLy8gU3JjQXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqIGRzdC5hICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IsIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdEF0b3AKKyAgICAgICAgInJldHVybiB2ZWM0KGRzdC5yZ2IgKiBzcmMuYSArICgxLjAgLSBkc3QuYSkgKiBzcmMucmdiLCBzcmMuYSk7XG4iLAorICAgICAgICAvLyBYb3IKKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IsICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKyBkc3QuYSAtIDIuMCAqIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gQWRkCisgICAgICAgICJyZXR1cm4gbWluKHNyYyArIGRzdCwgMS4wKTtcbiIsCisgICAgICAgIC8vIE11bHRpcGx5CisgICAgICAgICJyZXR1cm4gc3JjICogZHN0O1xuIiwKKyAgICAgICAgLy8gU2NyZWVuCisgICAgICAgICJyZXR1cm4gc3JjICsgZHN0IC0gc3JjICogZHN0O1xuIiwKKyAgICAgICAgLy8gT3ZlcmxheQorICAgICAgICAicmV0dXJuIGNsYW1wKHZlYzQobWl4KCIKKyAgICAgICAgICAgICAgICAiMi4wICogc3JjLnJnYiAqIGRzdC5yZ2IgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInNyYy5hICogZHN0LmEgLSAyLjAgKiAoZHN0LmEgLSBkc3QucmdiKSAqIChzcmMuYSAtIHNyYy5yZ2IpICsgc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyBkc3QucmdiICogKDEuMCAtIHNyYy5hKSwgIgorICAgICAgICAgICAgICAgICJzdGVwKGRzdC5hLCAyLjAgKiBkc3QucmdiKSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpLCAwLjAsIDEuMCk7XG4iLAorICAgICAgICAvLyBEYXJrZW4KKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IgKyAiCisgICAgICAgICAgICAgICAgIm1pbihzcmMucmdiICogZHN0LmEsIGRzdC5yZ2IgKiBzcmMuYSksIHNyYy5hICsgZHN0LmEgLSBzcmMuYSAqIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIExpZ2h0ZW4KKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IgKyAiCisgICAgICAgICAgICAgICAgIm1heChzcmMucmdiICogZHN0LmEsIGRzdC5yZ2IgKiBzcmMuYSksIHNyYy5hICsgZHN0LmEgLSBzcmMuYSAqIGRzdC5hKTtcbiIsCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbUNhY2hlOjpQcm9ncmFtQ2FjaGUoKSB7Cit9CisKK1Byb2dyYW1DYWNoZTo6flByb2dyYW1DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpjbGVhcigpIHsKKyAgICBzaXplX3QgY291bnQgPSBtQ2FjaGUuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworfQorCitQcm9ncmFtKiBQcm9ncmFtQ2FjaGU6OmdldChjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgcHJvZ3JhbWlkIGtleSA9IGRlc2NyaXB0aW9uLmtleSgpOworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOworICAgIFByb2dyYW0qIHByb2dyYW0gPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCJDb3VsZCBub3QgZmluZCBwcm9ncmFtIHdpdGgga2V5IDB4JXgiLCBrZXkpOworICAgICAgICBwcm9ncmFtID0gZ2VuZXJhdGVQcm9ncmFtKGRlc2NyaXB0aW9uLCBrZXkpOworICAgICAgICBtQ2FjaGUuYWRkKGtleSwgcHJvZ3JhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZ3JhbSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFByb2dyYW0gZ2VuZXJhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtKiBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlUHJvZ3JhbShjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBwcm9ncmFtaWQga2V5KSB7CisgICAgU3RyaW5nOCB2ZXJ0ZXhTaGFkZXIgPSBnZW5lcmF0ZVZlcnRleFNoYWRlcihkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBmcmFnbWVudFNoYWRlciA9IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoZGVzY3JpcHRpb24pOworCisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKHZlcnRleFNoYWRlci5zdHJpbmcoKSwgZnJhZ21lbnRTaGFkZXIuc3RyaW5nKCkpOworICAgIHJldHVybiBwcm9ncmFtOworfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIEFkZCBhdHRyaWJ1dGVzCisgICAgU3RyaW5nOCBzaGFkZXIoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMpOworICAgIH0KKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtcyk7CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtc19IYXNHcmFkaWVudCk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0JpdG1hcCk7CisgICAgfQorICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbik7IHsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fT3V0VGV4Q29vcmRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fT3V0R3JhZGllbnRJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRCaXRtYXBUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIC8vIE91dHB1dCB0cmFuc2Zvcm1lZCBwb3NpdGlvbgorICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX1Bvc2l0aW9uKTsKKyAgICB9CisgICAgLy8gRW5kIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19Gb290ZXIpOworCisgICAgUFJPR1JBTV9MT0dEKCIqKiogR2VuZXJhdGVkIHZlcnRleCBzaGFkZXI6XG5cbiVzIiwgc2hhZGVyLnN0cmluZygpKTsKKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uCisgICAgU3RyaW5nOCBzaGFkZXIoZ0ZTX0hlYWRlcik7CisKKyAgICAvLyBWYXJ5aW5ncworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNHcmFkaWVudCk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0JpdG1hcCk7CisgICAgfQorCisKKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXIpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0JpdG1hcFNhbXBsZXIpOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19Db2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKworICAgIC8vIEdlbmVyYXRlIHJlcXVpcmVkIGZ1bmN0aW9ucworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZFNoYWRlcnMiLCBkZXNjcmlwdGlvbi5zaGFkZXJzTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5jb2xvck9wID09IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQpIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZENvbG9ycyIsIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QpIHsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlV3JhcChzaGFkZXIsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBTLCBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwVCk7CisgICAgfQorCisgICAgLy8gQmVnaW4gdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW4pOyB7CisgICAgICAgIC8vIFN0b3JlcyB0aGUgcmVzdWx0IGluIGZyYWdDb2xvciBkaXJlY3RseQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0FscGhhOFRleHR1cmUpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQThUZXh0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaFRleHR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hHcmFkaWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgaWYgKCFkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEJpdG1hcE5wb3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENhc2Ugd2hlbiB3ZSBoYXZlIHR3byBzaGFkZXJzIHNldAorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQgJiYgZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaXNCaXRtYXBGaXJzdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzQkcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JsZW5kU2hhZGVyc0dCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzX01vZHVsYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fR3JhZGllbnRTaGFkZXJfTW9kdWxhdGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JpdG1hcFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQXBwbHkgdGhlIGNvbG9yIG9wIGlmIG5lZWRlZAorICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0FwcGx5Q29sb3JPcFtkZXNjcmlwdGlvbi5jb2xvck9wXSk7CisgICAgICAgIC8vIE91dHB1dCB0aGUgZnJhZ21lbnQKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GcmFnQ29sb3IpOworICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX0Zvb3Rlcik7CisKKyAgICBpZiAoREVCVUdfUFJPR1JBTV9DQUNIRSkgeworICAgICAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgZnJhZ21lbnQgc2hhZGVyOlxuXG4iKTsKKyAgICAgICAgcHJpbnRMb25nU3RyaW5nKHNoYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlQmxlbmQoU3RyaW5nOCYgc2hhZGVyLCBjb25zdCBjaGFyKiBuYW1lLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBzaGFkZXIuYXBwZW5kKCJcbnZlYzQgIik7CisgICAgc2hhZGVyLmFwcGVuZChuYW1lKTsKKyAgICBzaGFkZXIuYXBwZW5kKCIodmVjNCBzcmMsIHZlYzQgZHN0KSB7XG4iKTsKKyAgICBzaGFkZXIuYXBwZW5kKCIgICAgIik7CisgICAgc2hhZGVyLmFwcGVuZChnQmxlbmRPcHNbbW9kZV0pOworICAgIHNoYWRlci5hcHBlbmQoIn1cbiIpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVUZXh0dXJlV3JhcChTdHJpbmc4JiBzaGFkZXIsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBUKSB7CisgICAgc2hhZGVyLmFwcGVuZCgiXG52ZWMyIHdyYXAodmVjMiB0ZXhDb29yZHMpIHtcbiIpOworICAgIGlmICh3cmFwUyA9PSBHTF9NSVJST1JFRF9SRVBFQVQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGZsb2F0IHhNb2QyID0gbW9kKHRleENvb3Jkcy54LCAyLjApO1xuIik7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBpZiAoeE1vZDIgPiAxLjApIHhNb2QyID0gMi4wIC0geE1vZDI7XG4iKTsKKyAgICB9CisgICAgaWYgKHdyYXBUID09IEdMX01JUlJPUkVEX1JFUEVBVCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgZmxvYXQgeU1vZDIgPSBtb2QodGV4Q29vcmRzLnksIDIuMCk7XG4iKTsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGlmICh5TW9kMiA+IDEuMCkgeU1vZDIgPSAyLjAgLSB5TW9kMjtcbiIpOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIgICAgcmV0dXJuIHZlYzIoIik7CisgICAgc3dpdGNoICh3cmFwUykgeworICAgICAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ0ZXhDb29yZHMueCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgibW9kKHRleENvb3Jkcy54LCAxLjApIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ4TW9kMiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIiwgIik7CisgICAgc3dpdGNoICh3cmFwVCkgeworICAgICAgICBjYXNlIEdMX0NMQU1QX1RPX0VER0U6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ0ZXhDb29yZHMueSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgibW9kKHRleENvb3Jkcy55LCAxLjApIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJ5TW9kMiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIik7XG4iKTsKKyAgICBzaGFkZXIuYXBwZW5kKCJ9XG4iKTsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OnByaW50TG9uZ1N0cmluZyhjb25zdCBTdHJpbmc4JiBzaGFkZXIpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gMDsKKyAgICBzc2l6ZV90IGxhc3RJbmRleCA9IDA7CisgICAgY29uc3QgY2hhciogc3RyID0gc2hhZGVyLnN0cmluZygpOworICAgIHdoaWxlICgoaW5kZXggPSBzaGFkZXIuZmluZCgiXG4iLCBpbmRleCkpID4gLTEpIHsKKyAgICAgICAgU3RyaW5nOCBsaW5lKHN0ciwgaW5kZXggLSBsYXN0SW5kZXgpOworICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSBsaW5lLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCIlcyIsIGxpbmUuc3RyaW5nKCkpOworICAgICAgICBpbmRleCsrOworICAgICAgICBzdHIgKz0gKGluZGV4IC0gbGFzdEluZGV4KTsKKyAgICAgICAgbGFzdEluZGV4ID0gaW5kZXg7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaCBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg1MGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST0dSQU1fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BST0dSQU1fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BST0dSQU1fQ0FDSEUgMQorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BST0dSQU1fQ0FDSEUKKyAgICAjZGVmaW5lIFBST0dSQU1fTE9HRCguLi4pIExPR0QoX19WQV9BUkdTX18pCisjZWxzZQorICAgICNkZWZpbmUgUFJPR1JBTV9MT0dEKC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFBST0dSQU1fS0VZX1RFWFRVUkUgMHgxCisjZGVmaW5lIFBST0dSQU1fS0VZX0E4X1RFWFRVUkUgMHgyCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUCAweDQKKyNkZWZpbmUgUFJPR1JBTV9LRVlfR1JBRElFTlQgMHg4CisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9GSVJTVCAweDEwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWCAweDIwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HIDB4NDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQgMHg4MAorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVCAweDEwMAorCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9XUkFQU19NQVNLIDB4NjAwCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9XUkFQVF9NQVNLIDB4MTgwMAorCisvLyBFbmNvZGUgdGhlIHhmZXJtb2RlcyBvbiA2IGJpdHMKKyNkZWZpbmUgUFJPR1JBTV9NQVhfWEZFUk1PREUgMHgxZgorI2RlZmluZSBQUk9HUkFNX1hGRVJNT0RFX1NIQURFUl9TSElGVCAyNgorI2RlZmluZSBQUk9HUkFNX1hGRVJNT0RFX0NPTE9SX09QX1NISUZUIDIwCisKKyNkZWZpbmUgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQgOQorI2RlZmluZSBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVCAxMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUeXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0eXBlZGVmIHVpbnQzMl90IHByb2dyYW1pZDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBEZXNjcmliZSB0aGUgZmVhdHVyZXMgcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gcHJvZ3JhbS4gVGhlIGZlYXR1cmVzCisgKiBkZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgYm90aCB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLgorICogQSBQcm9ncmFtRGVzY3JpcHRpb24gbXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBQcm9ncmFtQ2FjaGUuCisgKi8KK3N0cnVjdCBQcm9ncmFtRGVzY3JpcHRpb24geworICAgIGVudW0gQ29sb3JNb2RpZmllciB7CisgICAgICAgIGtDb2xvck5vbmUsCisgICAgICAgIGtDb2xvck1hdHJpeCwKKyAgICAgICAga0NvbG9yTGlnaHRpbmcsCisgICAgICAgIGtDb2xvckJsZW5kCisgICAgfTsKKworICAgIFByb2dyYW1EZXNjcmlwdGlvbigpOgorICAgICAgICBoYXNUZXh0dXJlKGZhbHNlKSwgaGFzQWxwaGE4VGV4dHVyZShmYWxzZSksCisgICAgICAgIGhhc0JpdG1hcChmYWxzZSksIGlzQml0bWFwTnBvdChmYWxzZSksIGhhc0dyYWRpZW50KGZhbHNlKSwKKyAgICAgICAgc2hhZGVyc01vZGUoU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpLCBpc0JpdG1hcEZpcnN0KGZhbHNlKSwKKyAgICAgICAgYml0bWFwV3JhcFMoR0xfQ0xBTVBfVE9fRURHRSksIGJpdG1hcFdyYXBUKEdMX0NMQU1QX1RPX0VER0UpLAorICAgICAgICBjb2xvck9wKGtDb2xvck5vbmUpLCBjb2xvck1vZGUoU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpIHsKKyAgICB9CisKKyAgICAvLyBUZXh0dXJpbmcKKyAgICBib29sIGhhc1RleHR1cmU7CisgICAgYm9vbCBoYXNBbHBoYThUZXh0dXJlOworCisgICAgLy8gU2hhZGVycworICAgIGJvb2wgaGFzQml0bWFwOworICAgIGJvb2wgaXNCaXRtYXBOcG90OworICAgIGJvb2wgaGFzR3JhZGllbnQ7CisgICAgU2tYZmVybW9kZTo6TW9kZSBzaGFkZXJzTW9kZTsKKyAgICBib29sIGlzQml0bWFwRmlyc3Q7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBTOworICAgIEdMZW51bSBiaXRtYXBXcmFwVDsKKworICAgIC8vIENvbG9yIG9wZXJhdGlvbnMKKyAgICBpbnQgY29sb3JPcDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIGNvbG9yTW9kZTsKKworICAgIGlubGluZSB1aW50MzJfdCBnZXRFbnVtRm9yV3JhcChHTGVudW0gd3JhcCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKHdyYXApIHsKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJvZ3JhbWlkIGtleSgpIGNvbnN0IHsKKyAgICAgICAgcHJvZ3JhbWlkIGtleSA9IDA7CisgICAgICAgIGlmIChoYXNUZXh0dXJlKSBrZXkgfD0gUFJPR1JBTV9LRVlfVEVYVFVSRTsKKyAgICAgICAgaWYgKGhhc0FscGhhOFRleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9BOF9URVhUVVJFOworICAgICAgICBpZiAoaGFzQml0bWFwKSB7CisgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQklUTUFQOworICAgICAgICAgICAgaWYgKGlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVDsKKyAgICAgICAgICAgICAgICBrZXkgfD0gZ2V0RW51bUZvcldyYXAoYml0bWFwV3JhcFMpIDw8IFBST0dSQU1fQklUTUFQX1dSQVBTX1NISUZUOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwVCkgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc0dyYWRpZW50KSBrZXkgfD0gUFJPR1JBTV9LRVlfR1JBRElFTlQ7CisgICAgICAgIGlmIChpc0JpdG1hcEZpcnN0KSBrZXkgIHw9IFBST0dSQU1fS0VZX0JJVE1BUF9GSVJTVDsKKyAgICAgICAgaWYgKGhhc0JpdG1hcCAmJiBoYXNHcmFkaWVudCkgeworICAgICAgICAgICAga2V5IHw9IChzaGFkZXJzTW9kZSAmIFBST0dSQU1fTUFYX1hGRVJNT0RFKSA8PCBQUk9HUkFNX1hGRVJNT0RFX1NIQURFUl9TSElGVDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbG9yT3ApIHsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTWF0cml4OgorICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9DT0xPUl9NQVRSSVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtDb2xvckxpZ2h0aW5nOgorICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9DT0xPUl9MSUdIVElORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yQmxlbmQ6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0JMRU5EOworICAgICAgICAgICAgICAgIGtleSB8PSAoY29sb3JNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtDb2xvck5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUHJvZ3JhbURlc2NyaXB0aW9uCisKKy8qKgorICogR2VuZXJhdGVzIGFuZCBjYWNoZXMgcHJvZ3JhbS4gUHJvZ3JhbXMgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbgorICogUHJvZ3JhbURlc2NyaXB0aW9ucy4KKyAqLworY2xhc3MgUHJvZ3JhbUNhY2hlIHsKK3B1YmxpYzoKKyAgICBQcm9ncmFtQ2FjaGUoKTsKKyAgICB+UHJvZ3JhbUNhY2hlKCk7CisKKyAgICBQcm9ncmFtKiBnZXQoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgUHJvZ3JhbSogZ2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpOworICAgIFN0cmluZzggZ2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpOworCisgICAgdm9pZCBwcmludExvbmdTdHJpbmcoY29uc3QgU3RyaW5nOCYgc2hhZGVyKSBjb25zdDsKKworICAgIEtleWVkVmVjdG9yPHByb2dyYW1pZCwgUHJvZ3JhbSo+IG1DYWNoZTsKKworfTsgLy8gY2xhc3MgUHJvZ3JhbUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWIwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHN5c3RlbSBwcm9wZXJ0aWVzIHVzZWQgdG8gY29uZmlndXJlCisgKiB0aGUgT3BlbkdMUmVuZGVyZXIuCisgKi8KKworLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBpbiBtZWdhLWJ5dGVzCisjZGVmaW5lIFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSAicm8uaHd1aS50ZXh0dXJlX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0xBWUVSX0NBQ0hFX1NJWkUgInJvLmh3dWkubGF5ZXJfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfR1JBRElFTlRfQ0FDSEVfU0laRSAicm8uaHd1aS5ncmFkaWVudF9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9QQVRIX0NBQ0hFX1NJWkUgInJvLmh3dWkucGF0aF9jYWNoZV9zaXplIgorCisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHBpeGVscworI2RlZmluZSBQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRIICJyby5od3VpLnRleHRfY2FjaGVfd2lkdGgiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQ0FDSEVfSEVJR0hUICJyby5od3VpLnRleHRfY2FjaGVfaGVpZ2h0IgorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9QRVJUSUVTX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9SZWN0LmggYi9saWJzL2h3dWkvUmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTBjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1JlY3QuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9SRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9SRUNUX0gKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0cnVjdHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IFJlY3QgeworICAgIGZsb2F0IGxlZnQ7CisgICAgZmxvYXQgdG9wOworICAgIGZsb2F0IHJpZ2h0OworICAgIGZsb2F0IGJvdHRvbTsKKworICAgIFJlY3QoKToKKyAgICAgICAgICAgIGxlZnQoMCksCisgICAgICAgICAgICB0b3AoMCksCisgICAgICAgICAgICByaWdodCgwKSwKKyAgICAgICAgICAgIGJvdHRvbSgwKSB7CisgICAgfQorCisgICAgUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOgorICAgICAgICAgICAgbGVmdChsZWZ0KSwKKyAgICAgICAgICAgIHRvcCh0b3ApLAorICAgICAgICAgICAgcmlnaHQocmlnaHQpLAorICAgICAgICAgICAgYm90dG9tKGJvdHRvbSkgeworICAgIH0KKworICAgIFJlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdChSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBmcmllbmQgaW50IG9wZXJhdG9yPT0oY29uc3QgUmVjdCYgYSwgY29uc3QgUmVjdCYgYikgeworICAgICAgICByZXR1cm4gIW1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvciE9KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuIG1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodCB8fCB0b3AgPj0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0RW1wdHkoKSB7CisgICAgICAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgdGhpcy0+bGVmdCA9IGxlZnQ7CisgICAgICAgIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgdGhpcy0+Ym90dG9tID0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gbGVmdDsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRIZWlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCB0aGlzLT5yaWdodCAmJiB0aGlzLT50b3AgPCB0aGlzLT5ib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoY29uc3QgUmVjdCYgcikgY29uc3QgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0cyhyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmICF0aGlzLT5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbSkgeworCisgICAgICAgICAgICBpZiAodGhpcy0+bGVmdCA8IGxlZnQpIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICAgICAgaWYgKHRoaXMtPnRvcCA8IHRvcCkgdGhpcy0+dG9wID0gdG9wOworICAgICAgICAgICAgaWYgKHRoaXMtPnJpZ2h0ID4gcmlnaHQpIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICBpZiAodGhpcy0+Ym90dG9tID4gYm90dG9tKSB0aGlzLT5ib3R0b20gPSBib3R0b207CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgdW5pb25XaXRoKGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgaWYgKHIubGVmdCA8IHIucmlnaHQgJiYgci50b3AgPCByLmJvdHRvbSkgeworICAgICAgICAgICAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20pIHsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA+IHIubGVmdCkgbGVmdCA9IHIubGVmdDsKKyAgICAgICAgICAgICAgICBpZiAodG9wID4gci50b3ApIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIGlmIChyaWdodCA8IHIucmlnaHQpIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgci5ib3R0b20pIGJvdHRvbSA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gci5sZWZ0OworICAgICAgICAgICAgICAgIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBib3R0b20gPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgY29uc3QgeworICAgICAgICBMT0dEKCJSZWN0W2w9JWYgdD0lZiByPSVmIGI9JWZdIiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisKK307IC8vIHN0cnVjdCBSZWN0CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9SRUNUX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1N2FlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNraWFDb2xvckZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvckZpbHRlcjo6U2tpYUNvbG9yRmlsdGVyKFR5cGUgdHlwZSwgYm9vbCBibGVuZCk6IG1UeXBlKHR5cGUpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYUNvbG9yRmlsdGVyOjp+U2tpYUNvbG9yRmlsdGVyKCkgeworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBtYXRyaXggZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvck1hdHJpeEZpbHRlcjo6U2tpYUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0KiBtYXRyaXgsIGZsb2F0KiB2ZWN0b3IpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0NvbG9yTWF0cml4LCB0cnVlKSwgbU1hdHJpeChtYXRyaXgpLCBtVmVjdG9yKHZlY3RvcikgeworfQorCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6On5Ta2lhQ29sb3JNYXRyaXhGaWx0ZXIoKSB7CisgICAgZGVsZXRlW10gbU1hdHJpeDsKKyAgICBkZWxldGVbXSBtVmVjdG9yOworfQorCit2b2lkIFNraWFDb2xvck1hdHJpeEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwKKyAgICAgICAgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvck1hdHJpeDsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4IiksIDEsIEdMX0ZBTFNFLCAmbU1hdHJpeFswXSk7CisgICAgZ2xVbmlmb3JtNGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4VmVjdG9yIiksIDEsIG1WZWN0b3IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaWdodGluZyBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUxpZ2h0aW5nRmlsdGVyOjpTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtMaWdodGluZywgdHJ1ZSkgeworICAgIG1NdWxSID0gKChtdWx0aXBseSA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtTXVsRyA9ICgobXVsdGlwbHkgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEIgPSAoKG11bHRpcGx5ICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgbUFkZFIgPSAoKGFkZCA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkRyA9ICgoYWRkID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1BZGRCID0gKChhZGQgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yTGlnaHRpbmc7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nTXVsIiksIG1NdWxSLCBtTXVsRywgbU11bEIsIDEuMGYpOworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nQWRkIiksIG1BZGRSLCBtQWRkRywgbUFkZEIsIDAuMGYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCbGVuZCBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUJsZW5kRmlsdGVyOjpTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0JsZW5kLCB0cnVlKSwgbU1vZGUobW9kZSkgeworICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIG1BID0gYWxwaGEgLyAyNTUuMGY7CisgICAgbVIgPSBtQSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUcgPSBtQSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUIgPSBtQSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQ7CisgICAgZGVzY3JpcHRpb24uY29sb3JNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yQmxlbmQiKSwgbVIsIG1HLCBtQiwgbUEpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjViNmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTa2lhIGNvbG9yIGZpbHRlci4gQSBjb2xvciBmaWx0ZXIgbW9kaWZpZXMgYSBQcm9ncmFtRGVzY3JpcHRpb24KKyAqIGFuZCBzZXRzIHVuaWZvcm1zIG9uIHRoZSByZXN1bHRpbmcgc2hhZGVycy4KKyAqLworc3RydWN0IFNraWFDb2xvckZpbHRlciB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiBTa2lhIGNvbG9yIGZpbHRlciBpbiB1c2UuCisgICAgICovCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga05vbmUsCisgICAgICAgIGtDb2xvck1hdHJpeCwKKyAgICAgICAga0xpZ2h0aW5nLAorICAgICAgICBrQmxlbmQsCisgICAgfTsKKworICAgIFNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFDb2xvckZpbHRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pID0gMDsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIFR5cGUgbVR5cGU7CisgICAgYm9vbCBtQmxlbmQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbG9yRmlsdGVyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgY29sb3IgZmlsdGVyIHRoYXQgbXVsdGlwbGllcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBtYXRyaXggYW5kIGFkZHMgYSB2ZWN0b3IuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKTsKKyAgICB+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtTWF0cml4OworICAgIGZsb2F0KiBtVmVjdG9yOworfTsgLy8gc3RydWN0IFNraWFDb2xvck1hdHJpeEZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgZml4ZWQgdmFsdWUgYW5kIGFkZHMKKyAqIGFub3RoZXIgZml4ZWQgdmFsdWUuIElnbm9yZXMgdGhlIGFscGhhIGNoYW5uZWwgb2YgYm90aCBhcmd1bWVudHMuCisgKi8KK3N0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFMaWdodGluZ0ZpbHRlcihpbnQgbXVsdGlwbHksIGludCBhZGQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBHTGZsb2F0IG1NdWxSLCBtTXVsRywgbU11bEI7CisgICAgR0xmbG9hdCBtQWRkUiwgbUFkZEcsIG1BZGRCOworfTsgLy8gc3RydWN0IFNraWFMaWdodGluZ0ZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IGJsZW5kcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBzcGVjaWZpZWQgZGVzdGluYXRpb24gY29sb3IKKyAqIGFuZCBQb3J0ZXJEdWZmIGJsZW5kaW5nIG1vZGUuCisgKi8KK3N0cnVjdCBTa2lhQmxlbmRGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFCbGVuZEZpbHRlcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7CisgICAgR0xmbG9hdCBtUiwgbUcsIG1CLCBtQTsKK307IC8vIHN0cnVjdCBTa2lhQmxlbmRGaWx0ZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTY5ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFTaGFkZXIuY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3VwcG9ydAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgR0xlbnVtIGdUZXh0dXJlVW5pdHNNYXBbXSA9IHsKKyAgICAgICAgR0xfVEVYVFVSRTAsCisgICAgICAgIEdMX1RFWFRVUkUxLAorICAgICAgICBHTF9URVhUVVJFMgorfTsKKworc3RhdGljIGNvbnN0IEdMaW50IGdUaWxlTW9kZXNbXSA9IHsKKyAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgICAvLyA9PSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlCisgICAgICAgIEdMX1JFUEVBVCwgICAgICAgICAgLy8gPT0gU2tTaGFkZXI6OmtSZXBlYXRfTW9kZQorICAgICAgICBHTF9NSVJST1JFRF9SRVBFQVQgIC8vID09IFNrU2hhZGVyOjprTWlycm9yX1RpbGVNb2RlCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhU2hhZGVyOjpTa2lhU2hhZGVyKFR5cGUgdHlwZSwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUtleShrZXkpLCBtVGlsZVgodGlsZVgpLCBtVGlsZVkodGlsZVkpLCBtTWF0cml4KG1hdHJpeCksIG1CbGVuZChibGVuZCkgeworfQorCitTa2lhU2hhZGVyOjp+U2tpYVNoYWRlcigpIHsKK30KKwordm9pZCBTa2lhU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6YmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpIHsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlVW5pdF0pOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB3cmFwUyk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB3cmFwVCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJpdG1hcCBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUJpdG1hcFNoYWRlcjo6U2tpYUJpdG1hcFNoYWRlcihTa0JpdG1hcCogYml0bWFwLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIoa0JpdG1hcCwga2V5LCB0aWxlWCwgdGlsZVksIG1hdHJpeCwgYmxlbmQpLCBtQml0bWFwKGJpdG1hcCksIG1UZXh0dXJlKE5VTEwpIHsKK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlQ2FjaGUtPmdldChtQml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBtVGV4dHVyZSA9IHRleHR1cmU7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCA9IHRydWU7CisgICAgLy8gVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG5vbi1wb3dlciBvZiB0d28gbWlycm9yZWQvcmVwZWF0ZWQKKyAgICAvLyB0ZXh0dXJlcywgc28gZG8gaXQgb3Vyc2VsdmVzCisgICAgaWYgKCFleHRlbnNpb25zLmhhc05Qb3QoKSAmJiAoIWlzUG93ZXJPZlR3byh3aWR0aCkgfHwgIWlzUG93ZXJPZlR3byhoZWlnaHQpKSAmJgorICAgICAgICAgICAgKG1UaWxlWCAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlIHx8IG1UaWxlWSAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKSkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QgPSB0cnVlOworICAgICAgICBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwUyA9IGdUaWxlTW9kZXNbbVRpbGVYXTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFQgPSBnVGlsZU1vZGVzW21UaWxlWV07CisgICAgfQorfQorCit2b2lkIFNraWFCaXRtYXBTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIEdMdWludCB0ZXh0dXJlU2xvdCA9ICgqdGV4dHVyZVVuaXQpKys7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVNsb3RdKTsKKworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZTsKKyAgICBtVGV4dHVyZSA9IE5VTEw7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTsKKyAgICBpZiAobU1hdHJpeCkgeworICAgICAgICBTa01hdHJpeCBpbnZlcnNlOworICAgICAgICBtTWF0cml4LT5pbnZlcnQoJmludmVyc2UpOworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLmxvYWQoaW52ZXJzZSk7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubXVsdGlwbHkobW9kZWxWaWV3KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLmxvYWQobW9kZWxWaWV3KTsKKyAgICB9CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImJpdG1hcFNhbXBsZXIiKSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJ0ZXh0dXJlVHJhbnNmb3JtIiksIDEsCisgICAgICAgICAgICBHTF9GQUxTRSwgJnRleHR1cmVUcmFuc2Zvcm0uZGF0YVswXSk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZURpbWVuc2lvbiIpLCAxLjBmIC8gd2lkdGgsIDEuMGYgLyBoZWlnaHQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaW5lYXIgZ3JhZGllbnQgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLAorICAgICAgICBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcihrTGluZWFyR3JhZGllbnQsIGtleSwgdGlsZU1vZGUsIHRpbGVNb2RlLCBtYXRyaXgsIGJsZW5kKSwKKyAgICAgICAgbUJvdW5kcyhib3VuZHMpLCBtQ29sb3JzKGNvbG9ycyksIG1Qb3NpdGlvbnMocG9zaXRpb25zKSwgbUNvdW50KGNvdW50KSB7Cit9CisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6flNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpIHsKKyAgICBkZWxldGVbXSBtQm91bmRzOworICAgIGRlbGV0ZVtdIG1Db2xvcnM7CisgICAgZGVsZXRlW10gbVBvc2l0aW9uczsKK30KKwordm9pZCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbUdyYWRpZW50Q2FjaGUtPmdldChtS2V5KTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5hZGRMaW5lYXJHcmFkaWVudChtS2V5LCBtQm91bmRzLCBtQ29sb3JzLCBtUG9zaXRpb25zLAorICAgICAgICAgICAgICAgIG1Db3VudCwgbVRpbGVYKTsKKyAgICB9CisKKyAgICBSZWN0IHN0YXJ0KG1Cb3VuZHNbMF0sIG1Cb3VuZHNbMV0sIG1Cb3VuZHNbMl0sIG1Cb3VuZHNbM10pOworICAgIGlmIChtTWF0cml4KSB7CisgICAgICAgIG1hdDQgc2hhZGVyTWF0cml4KCptTWF0cml4KTsKKyAgICAgICAgc2hhZGVyTWF0cml4Lm1hcFJlY3Qoc3RhcnQpOworICAgIH0KKyAgICBzbmFwc2hvdC50cmFuc2Zvcm0ubWFwUmVjdChzdGFydCk7CisKKyAgICBjb25zdCBmbG9hdCBncmFkaWVudFggPSBzdGFydC5yaWdodCAtIHN0YXJ0LmxlZnQ7CisgICAgY29uc3QgZmxvYXQgZ3JhZGllbnRZID0gc3RhcnQuYm90dG9tIC0gc3RhcnQudG9wOworCisgICAgbWF0NCBzY3JlZW5TcGFjZShzbmFwc2hvdC50cmFuc2Zvcm0pOworICAgIHNjcmVlblNwYWNlLm11bHRpcGx5KG1vZGVsVmlldyk7CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50U2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTdGFydCIpLCBzdGFydC5sZWZ0LCBzdGFydC50b3ApOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50IiksIGdyYWRpZW50WCwgZ3JhZGllbnRZKTsKKyAgICBnbFVuaWZvcm0xZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudExlbmd0aCIpLAorICAgICAgICAgICAgMS4wZiAvIChncmFkaWVudFggKiBncmFkaWVudFggKyBncmFkaWVudFkgKiBncmFkaWVudFkpKTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2NyZWVuU3BhY2UiKSwgMSwgR0xfRkFMU0UsICZzY3JlZW5TcGFjZS5kYXRhWzBdKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcG9zZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNvbXBvc2VTaGFkZXI6OlNraWFDb21wb3NlU2hhZGVyKFNraWFTaGFkZXIqIGZpcnN0LCBTa2lhU2hhZGVyKiBzZWNvbmQsCisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgU2tTaGFkZXIqIGtleSk6CisgICAgICAgIFNraWFTaGFkZXIoa0NvbXBvc2UsIGtleSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwKKyAgICAgICAgTlVMTCwgZmlyc3QtPmJsZW5kKCkgfHwgc2Vjb25kLT5ibGVuZCgpKSwgbUZpcnN0KGZpcnN0KSwgbVNlY29uZChzZWNvbmQpLCBtTW9kZShtb2RlKSB7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldChUZXh0dXJlQ2FjaGUqIHRleHR1cmVDYWNoZSwgR3JhZGllbnRDYWNoZSogZ3JhZGllbnRDYWNoZSkgeworICAgIFNraWFTaGFkZXI6OnNldCh0ZXh0dXJlQ2FjaGUsIGdyYWRpZW50Q2FjaGUpOworICAgIG1GaXJzdC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbVNlY29uZC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBtRmlyc3QtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBtU2Vjb25kLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgZXh0ZW5zaW9ucyk7CisgICAgaWYgKG1GaXJzdC0+dHlwZSgpID09IGtCaXRtYXApIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBGaXJzdCA9IHRydWU7CisgICAgfQorICAgIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIG1GaXJzdC0+c2V0dXBQcm9ncmFtKHByb2dyYW0sIG1vZGVsVmlldywgc25hcHNob3QsIHRleHR1cmVVbml0KTsKKyAgICBtU2Vjb25kLT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmggYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWUzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2Ugc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVwcmVzZW50cyBhIFNraWEgc2hhZGVyLiBBIHNoYWRlciB3aWxsIG1vZGlmeSB0aGUgR0wgY29udGV4dCBhbmQgYWN0aXZlCisgKiBwcm9ncmFtIHRvIHJlY3JlYXRlIHRoZSBvcmlnaW5hbCBlZmZlY3QuCisgKi8KK3N0cnVjdCBTa2lhU2hhZGVyIHsKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIFNraWEgc2hhZGVyIGluIHVzZS4KKyAgICAgKi8KKyAgICBlbnVtIFR5cGUgeworICAgICAgICBrTm9uZSwKKyAgICAgICAga0JpdG1hcCwKKyAgICAgICAga0xpbmVhckdyYWRpZW50LAorICAgICAgICBrQ2lyY3VsYXJHcmFkaWVudCwKKyAgICAgICAga1N3ZWVwR3JhZGllbnQsCisgICAgICAgIGtDb21wb3NlCisgICAgfTsKKworICAgIFNraWFTaGFkZXIoVHlwZSB0eXBlLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwKKyAgICAgICAgICAgIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFTaGFkZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgICAgIG1UZXh0dXJlQ2FjaGUgPSB0ZXh0dXJlQ2FjaGU7CisgICAgICAgIG1HcmFkaWVudENhY2hlID0gZ3JhZGllbnRDYWNoZTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgICAgIG1NYXRyaXggPSBtYXRyaXg7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpOworCisgICAgVHlwZSBtVHlwZTsKKyAgICBTa1NoYWRlciogbUtleTsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVYOworICAgIFNrU2hhZGVyOjpUaWxlTW9kZSBtVGlsZVk7CisgICAgU2tNYXRyaXgqIG1NYXRyaXg7CisgICAgYm9vbCBtQmxlbmQ7CisKKyAgICBUZXh0dXJlQ2FjaGUqIG1UZXh0dXJlQ2FjaGU7CisgICAgR3JhZGllbnRDYWNoZSogbUdyYWRpZW50Q2FjaGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYVNoYWRlcgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBiaXRtYXAuCisgKi8KK3N0cnVjdCBTa2lhQml0bWFwU2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUJpdG1hcFNoYWRlcihTa0JpdG1hcCogYml0bWFwLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgZm9yIG4gPT0gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvd2VyT2ZUd28odW5zaWduZWQgaW50IG4pIHsKKyAgICAgICAgcmV0dXJuICEobiAmIChuIC0gMSkpOworICAgIH0KKworICAgIFNrQml0bWFwKiBtQml0bWFwOworICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworfTsgLy8gc3RydWN0IFNraWFCaXRtYXBTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50LgorICovCitzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwKKyAgICAgICAgICAgIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgflNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtQm91bmRzOworICAgIHVpbnQzMl90KiBtQ29sb3JzOworICAgIGZsb2F0KiBtUG9zaXRpb25zOworICAgIGludCBtQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyB0d28gc2hhZGVycywgY29tcG9zaXRlZCB3aXRoIGFuIHhmZXJtb2RlLgorICovCitzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQ29tcG9zZVNoYWRlcihTa2lhU2hhZGVyKiBmaXJzdCwgU2tpYVNoYWRlciogc2Vjb25kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFNrU2hhZGVyKiBrZXkpOworCisgICAgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIFNraWFTaGFkZXIqIG1GaXJzdDsKKyAgICBTa2lhU2hhZGVyKiBtU2Vjb25kOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9TbmFwc2hvdC5oIGIvbGlicy9od3VpL1NuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc25hcHNob3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmluZworICogc3VyZmFjZS4gQSBzbmFwc2hvdCBpcyB1c3VhbGx5IGNyZWF0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2FsbHMgc2F2ZSgpCisgKiBhbmQgZGlzY2FyZGVkIHdoZW4gdGhlIHVzZXIgY2FsbHMgcmVzdG9yZSgpLiBPbmNlIGEgc25hcHNob3QgaXMgY3JlYXRlZCwKKyAqIGl0IGNhbiBob2xkIGluZm9ybWF0aW9uIGZvciBkZWZlcnJlZCByZW5kZXJpbmcuCisgKgorICogRWFjaCBzbmFwc2hvdCBoYXMgYSBsaW5rIHRvIGEgcHJldmlvdXMgc25hcHNob3QsIGluZGljYXRpbmcgdGhlIHByZXZpb3VzCisgKiBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIuCisgKi8KK2NsYXNzIFNuYXBzaG90OiBwdWJsaWMgTGlnaHRSZWZCYXNlPFNuYXBzaG90PiB7CitwdWJsaWM6CisgICAgU25hcHNob3QoKTogZmxhZ3MoMCksIHByZXZpb3VzKE5VTEwpLCBsYXllcihOVUxMKSwgZmJvKDApIHsgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBzcGVjaWZpZWQgc25hcHNob3QuIE9ubHkgdGhlIHRyYW5zZm9ybSBhbmQgY2xpcCByZWN0YW5nbGUKKyAgICAgKiBhcmUgY29waWVkLiBUaGUgbGF5ZXIgaW5mb3JtYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSB0cmFuc2Zvcm0gaXMKKyAgICAgKiBhc3N1bWVkIHRvIGJlIGRpcnR5LiBUaGUgc3BlY2lmaWVkIHNuYXBzaG90IGlzIHN0b3JlZCBhcyB0aGUgcHJldmlvdXMKKyAgICAgKiBzbmFwc2hvdC4KKyAgICAgKi8KKyAgICBTbmFwc2hvdChjb25zdCBzcDxTbmFwc2hvdD4mIHMpOgorICAgICAgICAgICAgaGVpZ2h0KHMtPmhlaWdodCksCisgICAgICAgICAgICB0cmFuc2Zvcm0ocy0+dHJhbnNmb3JtKSwKKyAgICAgICAgICAgIGNsaXBSZWN0KHMtPmNsaXBSZWN0KSwKKyAgICAgICAgICAgIGZsYWdzKDApLAorICAgICAgICAgICAgcHJldmlvdXMocyksCisgICAgICAgICAgICBsYXllcihOVUxMKSwKKyAgICAgICAgICAgIGZibyhzLT5mYm8pIHsKKyAgICAgICAgaWYgKChzLT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0NsaXBTZXQpICYmCisgICAgICAgICAgICAgICAgIShzLT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwKSkgeworICAgICAgICAgICAgbG9jYWxDbGlwLnNldChzLT5sb2NhbENsaXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYXJpb3VzIGZsYWdzIHNldCBvbiAjZmxhZ3MuCisgICAgICovCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY2xpcCByZWdpb24gd2FzIG1vZGlmaWVkLiBXaGVuIHRoaXMKKyAgICAgICAgICogc25hcHNob3QgaXMgcmVzdG9yZWQgc28gbXVzdCB0aGUgY2xpcC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnQ2xpcFNldCA9IDB4MSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgc25hcHNob3Qgd2FzIGNyZWF0ZWQgd2hlbiBzYXZpbmcKKyAgICAgICAgICogYSBuZXcgbGF5ZXIuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0lzTGF5ZXIgPSAweDIsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHNuYXBzaG90IGhhcyBjaGFuZ2VkIHRoZSBvcnRobyBtYXRyaXguCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0RpcnR5T3J0aG8gPSAweDQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYWwgY2xpcCBzaG91bGQgYmUgcmVjb21wdXRlZC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnRGlydHlMb2NhbENsaXAgPSAweDgsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEludGVyc2VjdHMgdGhlIGN1cnJlbnQgY2xpcCB3aXRoIHRoZSBuZXcgY2xpcCByZWN0YW5nbGUuCisgICAgICovCisgICAgYm9vbCBjbGlwKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgICAgIGJvb2wgY2xpcHBlZCA9IGZhbHNlOworCisgICAgICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICB0cmFuc2Zvcm0ubWFwUmVjdChyKTsKKworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprRGlmZmVyZW5jZV9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtJbnRlcnNlY3RfT3A6CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IGNsaXBSZWN0LmludGVyc2VjdChyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtVbmlvbl9PcDoKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gY2xpcFJlY3QudW5pb25XaXRoKHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1hPUl9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXZlcnNlRGlmZmVyZW5jZV9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXBsYWNlX09wOgorICAgICAgICAgICAgICAgIGNsaXBSZWN0LnNldChyKTsKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGlwcGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xpcHBlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGNsaXAuCisgICAgICovCisgICAgdm9pZCBzZXRDbGlwKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICBjbGlwUmVjdC5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgIH0KKworICAgIGNvbnN0IFJlY3QmIGdldExvY2FsQ2xpcCgpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXApIHsKKyAgICAgICAgICAgIG1hdDQgaW52ZXJzZTsKKyAgICAgICAgICAgIGludmVyc2UubG9hZEludmVyc2UodHJhbnNmb3JtKTsKKyAgICAgICAgICAgIGxvY2FsQ2xpcC5zZXQoY2xpcFJlY3QpOworICAgICAgICAgICAgaW52ZXJzZS5tYXBSZWN0KGxvY2FsQ2xpcCk7CisgICAgICAgICAgICBmbGFncyAmPSB+U25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsQ2xpcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWlnaHQgb2YgdGhlIGZyYW1lYnVmZmVyIHRoZSBzbmFwc2hvdCBpcyByZW5kZXJpbmcgaW50by4KKyAgICAgKi8KKyAgICBpbnQgaGVpZ2h0OworCisgICAgLyoqCisgICAgICogTG9jYWwgdHJhbnNmb3JtYXRpb24uIEhvbGRzIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uLCBzY2FsZSBhbmQKKyAgICAgKiByb3RhdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgbWF0NCB0cmFuc2Zvcm07CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNsaXAgcmVnaW9uLiBUaGUgY2xpcCBpcyBzdG9yZWQgaW4gY2FudmFzLXNwYWNlIGNvb3JkaW5hdGVzLAorICAgICAqIChzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXMgaW4gdGhlIHJlZ3VsYXIgY2FzZS4pCisgICAgICovCisgICAgUmVjdCBjbGlwUmVjdDsKKworICAgIC8qKgorICAgICAqIERpcnR5IGZsYWdzLgorICAgICAqLworICAgIGludCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIHNuYXBzaG90LgorICAgICAqLworICAgIHNwPFNuYXBzaG90PiBwcmV2aW91czsKKworICAgIC8qKgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBMYXllciogbGF5ZXI7CisgICAgR0x1aW50IGZibzsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHRoZSBwcmV2aW91cyBvcnRobyBtYXRyaXguCisgICAgICovCisgICAgbWF0NCBvcnRob01hdHJpeDsKKworcHJpdmF0ZToKKyAgICBSZWN0IGxvY2FsQ2xpcDsKKworfTsgLy8gY2xhc3MgU25hcHNob3QKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NOQVBTSE9UX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0dXJlLmggYi9saWJzL2h3dWkvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVEVYVFVSRV9ICisjZGVmaW5lIEFORFJPSURfVUlfVEVYVFVSRV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gT3BlbkdMIHRleHR1cmUuCisgKi8KK3N0cnVjdCBUZXh0dXJlIHsKKyAgICBUZXh0dXJlKCkgeworICAgICAgICBjbGVhbnVwID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdGV4dHVyZS4KKyAgICAgKi8KKyAgICBHTHVpbnQgaWQ7CisgICAgLyoqCisgICAgICogR2VuZXJhdGlvbiBvZiB0aGUgYmFja2luZyBiaXRtYXAsCisgICAgICovCisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dHVyZSByZXF1aXJlcyBibGVuZGluZy4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworICAgIC8qKgorICAgICAqIFdpZHRoIG9mIHRoZSBiYWNraW5nIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAvKioKKyAgICAgKiBIZWlnaHQgb2YgdGhlIGJhY2tpbmcgYml0bWFwLgorICAgICAqLworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRleHR1cmUgc2hvdWxkIGJlIGNsZWFuZWQgdXAgYWZ0ZXIgdXNlLgorICAgICAqLworICAgIGJvb2wgY2xlYW51cDsKK307IC8vIHN0cnVjdCBUZXh0dXJlCisKK2NsYXNzIEF1dG9UZXh0dXJlIHsKK3B1YmxpYzoKKyAgICBBdXRvVGV4dHVyZShjb25zdCBUZXh0dXJlKiB0ZXh0dXJlKTogbVRleHR1cmUodGV4dHVyZSkgeyB9CisgICAgfkF1dG9UZXh0dXJlKCkgeworICAgICAgICBpZiAobVRleHR1cmUgJiYgbVRleHR1cmUtPmNsZWFudXApIHsKKyAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlLT5pZCk7CisgICAgICAgICAgICBkZWxldGUgbVRleHR1cmU7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVGV4dHVyZSogbVRleHR1cmU7Cit9OyAvLyBjbGFzcyBBdXRvVGV4dHVyZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTY5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHR1cmVDYWNoZTo6VGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtTWF4VGV4dHVyZVNpemUpOworICAgIExPR0QoIk1heGltdW0gdGV4dHVyZSBkaW1lbnNpb24gaXMgJWQgcGl4ZWxzIiwgbU1heFRleHR1cmVTaXplKTsKK30KKworVGV4dHVyZUNhY2hlOjp+VGV4dHVyZUNhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0dXJlQ2FjaGU6Om9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgaWYgKGJpdG1hcCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLT5yb3dCeXRlcygpICogYml0bWFwLT5oZWlnaHQoKTsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OmdldChTa0JpdG1hcCogYml0bWFwKSB7CisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgaWYgKGJpdG1hcC0+d2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBiaXRtYXAtPmhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJCaXRtYXAgdG9vIGxhcmdlIHRvIGJlIHVwbG9hZGVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgZmFsc2UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIHRydWUpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6cmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBtQ2FjaGUucmVtb3ZlKGJpdG1hcCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC0+cmVhZHlUb0RyYXcoKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2VuZXJhdGUgdGV4dHVyZSBmcm9tIGJpdG1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFyZWdlbmVyYXRlKSB7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSBiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpOworICAgICAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICAgICAgdGV4dHVyZS0+aGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICBzd2l0Y2ggKGJpdG1hcC0+Z2V0Q29uZmlnKCkpIHsKKyAgICBjYXNlIFNrQml0bWFwOjprQThfQ29uZmlnOgorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtSR0JfNTY1X0NvbmZpZzoKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSBmYWxzZTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWc6CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gIWJpdG1hcC0+aXNPcGFxdWUoKTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmggYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNzE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc2ltcGxlIExSVSB0ZXh0dXJlIGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgVGV4dHVyZUNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2tCaXRtYXAqLCBUZXh0dXJlKj4geworcHVibGljOgorICAgIFRleHR1cmVDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHR1cmVDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShTa0JpdG1hcComIGJpdG1hcCwgVGV4dHVyZSomIHRleHR1cmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgVGV4dHVyZSogZ2V0KFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBSZXR1cm5zIE5VTEwKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBjYW5ub3QgYmUgZm91bmQuIFVwb24gcmVtb3ZlIHRoZSB0ZXh0dXJlIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdlbmVyYXRlIElmIHRydWUsIHRoZSBiaXRtYXAgZGF0YSBpcyByZXVwbG9hZGVkIGludG8gdGhlIHRleHR1cmUsIGJ1dAorICAgICAqICAgICAgICBubyBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSwgYm9vbCByZWdlbmVyYXRlID0gZmFsc2UpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEdMaW50IG1NYXhUZXh0dXJlU2l6ZTsKK307IC8vIGNsYXNzIFRleHR1cmVDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVmVydGV4LmggYi9saWJzL2h3dWkvVmVydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1NDA4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9WZXJ0ZXguaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1ZFUlRFWF9ICisjZGVmaW5lIEFORFJPSURfVUlfVkVSVEVYX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIFNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2ZXJ0ZXggd2l0aCBhIHBvc2l0aW9uIGFuZCBhIHRleHR1cmUuCisgKi8KK3N0cnVjdCBUZXh0dXJlVmVydGV4IHsKKyAgICBmbG9hdCBwb3NpdGlvblsyXTsKKyAgICBmbG9hdCB0ZXh0dXJlWzJdOworCisgICAgc3RhdGljIGlubGluZSB2b2lkIHNldChUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHUsIGZsb2F0IHYpIHsKKyAgICAgICAgdmVydGV4WzBdLnBvc2l0aW9uWzBdID0geDsKKyAgICAgICAgdmVydGV4WzBdLnBvc2l0aW9uWzFdID0geTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMF0gPSB1OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVsxXSA9IHY7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIHNldFVWKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgVGV4dHVyZVZlcnRleAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVkVSVEVYX0gKZGlmZiAtLWdpdCBhL2xpYnMvcnMvQW5kcm9pZC5tayBiL2xpYnMvcnMvQW5kcm9pZC5tawppbmRleCA5ODQ2NGEwLi4zN2M0MThiIDEwMDY0NAotLS0gYS9saWJzL3JzL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9BbmRyb2lkLm1rCkBAIC03NiwzNCArNzYsNDQgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlyc0FkYXB0ZXIuY3BwIFwKIAlyc0FsbG9jYXRpb24uY3BwIFwKKwlyc0FuaW1hdGlvbi5jcHAgXAogCXJzQ29tcG9uZW50LmNwcCBcCiAJcnNDb250ZXh0LmNwcCBcCiAJcnNEZXZpY2UuY3BwIFwKIAlyc0VsZW1lbnQuY3BwIFwKLSAgICAgICAgcnNGaWxlQTNELmNwcCBcCisJcnNGaWxlQTNELmNwcCBcCisJcnNGb250LmNwcCBcCiAJcnNMaWdodC5jcHAgXAogCXJzTG9ja2xlc3NGaWZvLmNwcCBcCiAJcnNPYmplY3RCYXNlLmNwcCBcCiAJcnNNYXRyaXguY3BwIFwKLSAgICAgICAgcnNNZXNoLmNwcCBcCi0JcnNOb2lzZS5jcHAgXAorCXJzTWVzaC5jcHAgXAorCXJzTXV0ZXguY3BwIFwKIAlyc1Byb2dyYW0uY3BwIFwKIAlyc1Byb2dyYW1GcmFnbWVudC5jcHAgXAotCXJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwIFwKKwlyc1Byb2dyYW1TdG9yZS5jcHAgXAogCXJzUHJvZ3JhbVJhc3Rlci5jcHAgXAogCXJzUHJvZ3JhbVZlcnRleC5jcHAgXAogCXJzU2FtcGxlci5jcHAgXAogCXJzU2NyaXB0LmNwcCBcCiAJcnNTY3JpcHRDLmNwcCBcCiAJcnNTY3JpcHRDX0xpYi5jcHAgXAotICAgICAgICByc1NoYWRlckNhY2hlLmNwcCBcCi0JcnNTaW1wbGVNZXNoLmNwcCBcCisJcnNTY3JpcHRDX0xpYkNMLmNwcCBcCisJcnNTY3JpcHRDX0xpYkdMLmNwcCBcCisJcnNTaGFkZXJDYWNoZS5jcHAgXAorCXJzU2lnbmFsLmNwcCBcCisJcnNTdHJlYW0uY3BwIFwKIAlyc1RocmVhZElPLmNwcCBcCiAJcnNUeXBlLmNwcCBcCiAJcnNWZXJ0ZXhBcnJheS5jcHAKIAogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJhY2MKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkVHTCBsaWJHTEVTdjFfQ00gbGliR0xFU3YyIGxpYnVpIGxpYmJjYworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ0MgorCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUKKwogTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCiBMT0NBTF9NT0RVTEU6PSBsaWJSUwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCmluZGV4IGQyODBmNTAuLjY2MzZmZWYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaApAQCAtMzAsMjAgKzMwLDIzIEBACiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIxRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWRhcHRlcjJEOwogdHlwZWRlZiB2b2lkICogUnNBbGxvY2F0aW9uOwordHlwZWRlZiB2b2lkICogUnNBbmltYXRpb247CiB0eXBlZGVmIHZvaWQgKiBSc0NvbnRleHQ7CiB0eXBlZGVmIHZvaWQgKiBSc0RldmljZTsKIHR5cGVkZWYgdm9pZCAqIFJzRWxlbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzRmlsZTsKK3R5cGVkZWYgdm9pZCAqIFJzRm9udDsKIHR5cGVkZWYgdm9pZCAqIFJzU2FtcGxlcjsKIHR5cGVkZWYgdm9pZCAqIFJzU2NyaXB0OwotdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwordHlwZWRlZiB2b2lkICogUnNNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNMaWdodDsKK3R5cGVkZWYgdm9pZCAqIFJzT2JqZWN0QmFzZTsKIAogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtVmVydGV4OwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1SYXN0ZXI7CiAKIHR5cGVkZWYgdm9pZCAoKiBSc0JpdG1hcENhbGxiYWNrX3QpKHZvaWQgKik7CkBAIC04Myw2ICs4Niw4IEBACiAgICAgUlNfVFlQRV9VTlNJR05FRF8zMiwKICAgICBSU19UWVBFX1VOU0lHTkVEXzY0LAogCisgICAgUlNfVFlQRV9CT09MRUFOLAorCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzZfNSwKICAgICBSU19UWVBFX1VOU0lHTkVEXzVfNV81XzEsCiAgICAgUlNfVFlQRV9VTlNJR05FRF80XzRfNF80LApAQCAtMTAxLDE5ICsxMDYsMTIgQEAKIAogZW51bSBSc0RhdGFLaW5kIHsKICAgICBSU19LSU5EX1VTRVIsCi0gICAgUlNfS0lORF9DT0xPUiwKLSAgICBSU19LSU5EX1BPU0lUSU9OLAotICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICBSU19LSU5EX05PUk1BTCwKLSAgICBSU19LSU5EX0lOREVYLAotICAgIFJTX0tJTkRfUE9JTlRfU0laRSwKIAotICAgIFJTX0tJTkRfUElYRUxfTCwKKyAgICBSU19LSU5EX1BJWEVMX0wgPSA3LAogICAgIFJTX0tJTkRfUElYRUxfQSwKICAgICBSU19LSU5EX1BJWEVMX0xBLAogICAgIFJTX0tJTkRfUElYRUxfUkdCLAogICAgIFJTX0tJTkRfUElYRUxfUkdCQSwKLQogfTsKIAogZW51bSBSc1NhbXBsZXJQYXJhbSB7CkBAIC0yMDUsOSArMjAzLDcxIEBACiBlbnVtIFJzRXJyb3IgewogICAgIFJTX0VSUk9SX05PTkUsCiAgICAgUlNfRVJST1JfQkFEX1NIQURFUiwKLSAgICBSU19FUlJPUl9CQURfU0NSSVBUCisgICAgUlNfRVJST1JfQkFEX1NDUklQVCwKKyAgICBSU19FUlJPUl9CQURfVkFMVUUsCisgICAgUlNfRVJST1JfT1VUX09GX01FTU9SWQogfTsKIAorZW51bSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24geworICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVAsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fTElORUFSLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JFWklFUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9DQVJESU5BTCwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9IRVJNSVRFLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JTUExJTkUKK307CisKK2VudW0gUnNBbmltYXRpb25FZGdlIHsKKyAgICBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ09OU1RBTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfR1JBRElFTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ1lDTEUsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfT1NDSUxMQVRFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZTEVfUkVMQVRJVkUKK307CisKK2VudW0gUnNBM0RDbGFzc0lEIHsKKyAgICBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTUVTSCwKKyAgICBSU19BM0RfQ0xBU1NfSURfVFlQRSwKKyAgICBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVgsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFLAorICAgIFJTX0EzRF9DTEFTU19JRF9TQU1QTEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT04sCisgICAgUlNfQTNEX0NMQVNTX0lEX0xJR0hULAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFELAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJELAorICAgIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQworfTsKKworZW51bSBSc0N1bGxNb2RlIHsKKyAgICBSU19DVUxMX0JBQ0ssCisgICAgUlNfQ1VMTF9GUk9OVCwKKyAgICBSU19DVUxMX05PTkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRDsKKyAgICBjb25zdCBjaGFyKiBvYmplY3ROYW1lOworfSBSc0ZpbGVJbmRleEVudHJ5OworCisvLyBTY3JpcHQgdG8gU2NyaXB0Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKKworfSBSc1NjcmlwdENhbGw7CisKICNpZm5kZWYgTk9fUlNfRlVOQ1MKICNpbmNsdWRlICJyc2dBcGlGdW5jRGVjbC5oIgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaAppbmRleCA5OWI4YzA0Li45MjI1OTA0IDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKQEAgLTksMTAgKzksMTAgQEAKIHR5cGVkZWYgdm9pZCAqIFJzRWxlbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzU2FtcGxlcjsKIHR5cGVkZWYgdm9pZCAqIFJzU2NyaXB0OwotdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwordHlwZWRlZiB2b2lkICogUnNNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZlZDdlLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gRmlsbQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNlOGExLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5maWxtIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iRmlsbSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkZpbG0iCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliOWJkYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjJjODIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2UyNmMwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzUyNDguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxMjYxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDkzOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzODc0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODI3ZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODlmNzEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMTZhNC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGJjYmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGM2OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChvcnRob1dpbmRvdykKLSNwcmFnbWEgc3RhdGVSYXN0ZXIoZmxhdCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQZ21GcmFnQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShNeUJsZW5kKQotCi0KLWludCBtYWluKHZvaWQqIGNvbiwgaW50IGZ0LCBpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY291bnQsIHRvdWNoLCB4LCB5LCByYXRlLCBtYXhMaWZlLCBsaWZlU2hpZnQ7Ci0gICAgaW50IGxpZmU7Ci0gICAgaW50IGN0LCBjdDI7Ci0gICAgaW50IG5ld1BhcnQ7Ci0gICAgaW50IGRyYXdDb3VudDsKLSAgICBpbnQgZHgsIGR5LCBpZHg7Ci0gICAgaW50IHBvc3gscG9zeTsKLSAgICBpbnQgYzsKLSAgICBpbnQgc3JjSWR4OwotICAgIGludCBkc3RJZHg7Ci0KLSAgICBjb3VudCA9IGxvYWRJMzIoY29uLCAwLCAxKTsKLSAgICB0b3VjaCA9IGxvYWRJMzIoY29uLCAwLCAyKTsKLSAgICB4ID0gbG9hZEkzMihjb24sIDAsIDMpOwotICAgIHkgPSBsb2FkSTMyKGNvbiwgMCwgNCk7Ci0KLSAgICByYXRlID0gNDsKLSAgICBtYXhMaWZlID0gKGNvdW50IC8gcmF0ZSkgLSAxOwotICAgIGxpZmVTaGlmdCA9IDA7Ci0gICAgewotICAgICAgICBsaWZlID0gbWF4TGlmZTsKLSAgICAgICAgd2hpbGUgKGxpZmUgPiAyNTUpIHsKLSAgICAgICAgICAgIGxpZmUgPSBsaWZlID4+IDE7Ci0gICAgICAgICAgICBsaWZlU2hpZnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3UmVjdChjb24sIDAsIDI1NiwgMCwgNTEyKTsKLSAgICBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIE5BTUVEX1BnbUZyYWdQYXJ0cyk7Ci0KLSAgICBpZiAodG91Y2gpIHsKLSAgICAgICAgbmV3UGFydCA9IGxvYWRJMzIoY29uLCAyLCAwKTsKLSAgICAgICAgZm9yIChjdDI9MDsgY3QyPHJhdGU7IGN0MisrKSB7Ci0gICAgICAgICAgICBkeCA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLSAgICAgICAgICAgIGR5ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotCi0gICAgICAgICAgICBpZHggPSBuZXdQYXJ0ICogNSArIDE7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDIsIG1heExpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAzLCB4IDw8IDE2KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgNCwgeSA8PCAxNik7Ci0KLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcmVJMzIoY29uLCAyLCAwLCBuZXdQYXJ0KTsKLSAgICB9Ci0KLSAgICBkcmF3Q291bnQgPSAwOwotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBzcmNJZHggPSBjdCAqIDUgKyAxOwotCi0gICAgICAgIGR4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCk7Ci0gICAgICAgIGR5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDEpOwotICAgICAgICBsaWZlID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDIpOwotICAgICAgICBwb3N4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDMpOwotICAgICAgICBwb3N5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDQpOwotCi0gICAgICAgIGlmIChsaWZlKSB7Ci0gICAgICAgICAgICBpZiAocG9zeSA8ICg0ODAgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgZHN0SWR4ID0gZHJhd0NvdW50ICogOTsKLSAgICAgICAgICAgICAgICBjID0gMHhmZmFmY2YgfCAoKGxpZmUgPj4gbGlmZVNoaWZ0KSA8PCAyNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAxLCBwb3N4KTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDIsIHBvc3kpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyAzLCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDQsIHBvc3ggKyAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDUsIHBvc3kgKyBkeSAqIDQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyA2LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDcsIHBvc3ggLSAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDgsIHBvc3kgKyBkeSAqIDQpOwotICAgICAgICAgICAgICAgIGRyYXdDb3VudCArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR5ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkeSA9ICgtZHkpID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3N4ID0gcG9zeCArIGR4OwotICAgICAgICAgICAgcG9zeSA9IHBvc3kgKyBkeTsKLSAgICAgICAgICAgIGR5ID0gZHkgKyAweDQwMDsKLSAgICAgICAgICAgIGxpZmUgLS07Ci0KLSAgICAgICAgICAgIC8vc3RvcmVJMzIoY29uLCAyLCBzcmNJZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAyLCBsaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMywgcG9zeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDQsIHBvc3kpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1RyaWFuZ2xlQXJyYXkoY29uLCBOQU1FRF9QYXJ0QnVmZmVyLCBkcmF3Q291bnQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU2NzUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChQVkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUEZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKFBTQmFja2dyb3VuZCkKLQotI2RlZmluZSBTVEFURV9UUklBTkdMRV9PRkZTRVRfQ09VTlQgMAotI2RlZmluZSBTVEFURV9MQVNUX0ZPQ1VTIDEKLQotCi0vLyBUaGUgc2NyaXB0IGVudmlyb21lbnQgaGFzIDMgZW52IGFsbG9jYXRpb25zLgotLy8gYmFuazA6IChyKSBUaGUgZW52aXJvbWVudCBzdHJ1Y3R1cmUKLS8vIGJhbmsxOiAocikgVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uCi0vLyBiYW5rMjogKHJ3KSBUaGUgdGVtcG9yYXJ5IHRleHR1cmUgc3RhdGUKLQotaW50IGxhc3RGb2N1czsKLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGZsb2F0IG1hdDFbMTZdOwotCi0gICAgZmxvYXQgdHJhbnMgPSBQb3MtPnRyYW5zbGF0ZTsKLSAgICBmbG9hdCByb3QgPSBQb3MtPnJvdGF0ZTsKLQotICAgIG1hdHJpeExvYWRTY2FsZShtYXQxLCAyLmYsIDIuZiwgMi5mKTsKLSAgICBtYXRyaXhUcmFuc2xhdGUobWF0MSwgMC5mLCAwLmYsIHRyYW5zKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgOTAuZiwgMC5mLCAwLmYsIDEuZik7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIHJvdCwgMS5mLCAwLmYsIDAuZik7Ci0gICAgdnBMb2FkTW9kZWxNYXRyaXgobWF0MSk7Ci0KLSAgICAvLyBEcmF3IHRoZSBsaWdodGluZyBlZmZlY3QgaW4gdGhlIHN0cmlwIGFuZCBmaWxsIHRoZSBaIGJ1ZmZlci4KLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9tZXNoKTsKLQotICAgIC8vIFN0YXJ0IG9mIGltYWdlcy4KLSAgICBiaW5kUHJvZ3JhbVN0b3JlKE5BTUVEX1BTSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbUZyYWdtZW50KE5BTUVEX1BGSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbVZlcnRleChOQU1FRF9QVkltYWdlcyk7Ci0KLSAgICBmbG9hdCBmb2N1c1BvcyA9IFBvcy0+Zm9jdXM7Ci0gICAgaW50IGZvY3VzSUQgPSAwOwotICAgIGludCBsYXN0Rm9jdXNJRCA9IGxvYWRJMzIoMiwgU1RBVEVfTEFTVF9GT0NVUyk7Ci0gICAgaW50IGltZ0NvdW50ID0gMTM7Ci0KLSAgICBpZiAodHJhbnMgPiAoLS4zZikpIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xLjBmIC0gZm9jdXNQb3M7Ci0gICAgICAgIGlmIChmb2N1c0lEID49IGltZ0NvdW50KSB7Ci0gICAgICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBpZiAoZm9jdXNJRCAhPSBsYXN0Rm9jdXNJRCkgewotICAgICAgICBpZiAobGFzdEZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbbGFzdEZvY3VzSURdLCAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtmb2N1c0lEXSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICBsYXN0Rm9jdXMgPSBmb2N1c0lEOwotCi0gICAgaW50IHRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gUG9zLT50cmlhbmdsZU9mZnNldENvdW50OwotCi0gICAgaW50IGltZ0lkID0gMDsKLSAgICBmb3IgKGltZ0lkPTE7IGltZ0lkIDw9IGltZ0NvdW50OyBpbWdJZCsrKSB7Ci0gICAgICAgIGZsb2F0IHBvcyA9IGZvY3VzUG9zICsgaW1nSWQgKyAwLjRmOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClmbG9vcmYocG9zICogMi5mKTsKLSAgICAgICAgcG9zID0gcG9zIC0gMC43NWY7Ci0KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyOwotICAgICAgICBpZiAoISgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkpKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmZzZXQgLTI7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB0cmlhbmdsZU9mZnNldHNDb3VudC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiaW5kVGV4dHVyZShOQU1FRF9QRkltYWdlcywgMCwgbG9hZEkzMigwLCBpbWdJZCAtIDEpKTsKLSAgICAgICAgICAgIG1hdHJpeExvYWRUcmFuc2xhdGUobWF0MSwgLXBvcyAtIGxvYWRGKDUsIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMiksIDAsIDApOwotICAgICAgICAgICAgdnBMb2FkVGV4dHVyZU1hdHJpeChtYXQxKTsKLSAgICAgICAgICAgIGRyYXdTaW1wbGVNZXNoUmFuZ2UoTkFNRURfbWVzaCwgbG9hZEkzMig0LCBzdGFydCksIChsb2FkSTMyKDQsIGVuZCkgLSBsb2FkSTMyKDQsIHN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTk4MTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmlsbSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwotCi0gICAgcHJpdmF0ZSBGaWxtVmlldyBtVmlldzsKLQotICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCi0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCi0gICAgICAgIC8vIEFjdGl2aXR5Ci0gICAgICAgIG1WaWV3ID0gbmV3IEZpbG1WaWV3KHRoaXMpOwotICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOwotICAgIH0KLQotCi0gICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChMT0dfRU5BQkxFRCkgewotICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA0NTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsbVJTIHsKLSAgICBjbGFzcyBTdHJpcFBvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGZsb2F0IHRyYW5zbGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IHJvdGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IGZvY3VzOwotICAgICAgICBwdWJsaWMgaW50IHRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0gICAgfQotICAgIFN0cmlwUG9zaXRpb24gbVBvcyA9IG5ldyBTdHJpcFBvc2l0aW9uKCk7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIEZpbG1SUygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbG1TdHJpcFBvc2l0aW9uKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmICh4IDwgNTApIHsKLSAgICAgICAgICAgIHggPSA1MDsKLSAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDI3MCkgewotICAgICAgICAgICAgeCA9IDI3MDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGFuaW0gPSAoKGZsb2F0KXgtNTApIC8gMjcwLmY7Ci0gICAgICAgIG1Qb3MudHJhbnNsYXRlID0gMmYgKiBhbmltICsgMC41ZjsgICAvLyB0cmFuc2xhdGlvbgotICAgICAgICBtUG9zLnJvdGF0ZSA9IChhbmltICogNDApOyAgLy8gcm90YXRpb24KLSAgICAgICAgbVBvcy5mb2N1cyA9ICgoZmxvYXQpeSkgLyAxNi5mIC0gMTAuZjsgIC8vIGZvY3VzUG9zCi0gICAgICAgIG1Qb3MudHJpYW5nbGVPZmZzZXRDb3VudCA9IG1GU00ubVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotICAgICAgICBtQWxsb2NQb3MuZGF0YShtUG9zKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdFN0cmlwOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRJbWFnZTsKLSAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOwotICAgIHByaXZhdGUgVHlwZSBtU3RyaXBQb3NpdGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUltYWdlc1tdOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NJRHM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BvczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jU3RhdGU7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzVGV4OwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOwotICAgIHByaXZhdGUgTGlnaHQgbUxpZ2h0OwotCi0gICAgcHJpdmF0ZSBGaWxtU3RyaXBNZXNoIG1GU007Ci0KLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJJRHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1CdWZmZXJQb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVyU3RhdGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKLSAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKHRydWUpOwotICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQuc2V0TmFtZSgiUFNCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5FUVVBTCk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2soZmFsc2UpOwotICAgICAgICBiLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkUpOwotICAgICAgICBtUFNJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNJbWFnZXMuc2V0TmFtZSgiUFNJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgewotICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ly9fTUlQX0xJTkVBUik7Ci0gICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ci0gICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOwotICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOwotICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOwotCi0gICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQuc2V0TmFtZSgiUEZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAotICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOwotICAgICAgICBtUEZJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZJbWFnZXMuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOwotICAgICAgICBtUEZJbWFnZXMuc2V0TmFtZSgiUEZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgewotICAgICAgICBtTGlnaHQgPSAobmV3IExpZ2h0LkJ1aWxkZXIobVJTKSkuY3JlYXRlKCk7Ci0gICAgICAgIG1MaWdodC5zZXRQb3NpdGlvbigwLCAtMC41ZiwgLTEuMGYpOwotCi0gICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vcHZiLmFkZExpZ2h0KG1MaWdodCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuc2V0TmFtZSgiUFZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICBwdmIuc2V0VGV4dHVyZU1hdHJpeEVuYWJsZSh0cnVlKTsKLSAgICAgICAgbVBWSW1hZ2VzID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZJbWFnZXMuc2V0TmFtZSgiUFZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLSAgICAgICAgbUJ1ZmZlcklEcyA9IG5ldyBpbnRbMTNdOwotICAgICAgICBtSW1hZ2VzID0gbmV3IEFsbG9jYXRpb25bMTNdOwotICAgICAgICBtQWxsb2NJRHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlcklEcy5sZW5ndGgpOwotCi0gICAgICAgIEVsZW1lbnQgaWUgPSBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF81XzZfNSwgRWxlbWVudC5EYXRhS2luZC5QSVhFTF9SR0IpOwotICAgICAgICBtSW1hZ2VzWzBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAxLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1syXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzNdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA0LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDUsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s1XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzZdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA3LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbN10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDgsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s4XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzldID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEwLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDExLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEzLCBpZSwgdHJ1ZSk7Ci0KLSAgICAgICAgaW50IGJsYWNrW10gPSBuZXcgaW50WzEwMjRdOwotICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUltYWdlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgIEFsbG9jYXRpb24uQWRhcHRlcjJEIGEgPSBtSW1hZ2VzW2N0XS5jcmVhdGVBZGFwdGVyMkQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSA1MTI7Ci0gICAgICAgICAgICBpbnQgbWlwID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKHNpemUtMiwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIHNpemUtMiwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIHNpemUgPj49IDE7Ci0gICAgICAgICAgICAgICAgbWlwKys7Ci0gICAgICAgICAgICAgICAgYS5zZXRDb25zdHJhaW50KERpbWVuc2lvbi5MT0QsIG1pcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbWFnZXNbY3RdLnVwbG9hZFRvVGV4dHVyZSgxKTsKLSAgICAgICAgICAgIG1CdWZmZXJJRHNbY3RdID0gbUltYWdlc1tjdF0uZ2V0SUQoKTsKLSAgICAgICAgfQotICAgICAgICBtQWxsb2NJRHMuZGF0YShtQnVmZmVySURzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZSA9IG5ldyBpbnRbMTBdOwotICAgICAgICBtQWxsb2NTdGF0ZSA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVyU3RhdGUubGVuZ3RoKTsKLSAgICAgICAgbUJ1ZmZlclN0YXRlW1NUQVRFX0xBU1RfRk9DVVNdID0gLTE7Ci0gICAgICAgIG1BbGxvY1N0YXRlLmRhdGEobUJ1ZmZlclN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtRlNNID0gbmV3IEZpbG1TdHJpcE1lc2goKTsKLSAgICAgICAgbU1lc2ggPSBtRlNNLmluaXQobVJTKTsKLSAgICAgICAgbU1lc2guc2V0TmFtZSgibWVzaCIpOwotCi0gICAgICAgIGluaXRQRlMoKTsKLSAgICAgICAgaW5pdFBGKCk7Ci0gICAgICAgIGluaXRQVigpOwotCi0gICAgICAgIExvZy5lKCJycyIsICJEb25lIGxvYWRpbmcgbmFtZWQiKTsKLQotICAgICAgICBtU3RyaXBQb3NpdGlvblR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFN0cmlwUG9zaXRpb24uY2xhc3MsIDEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZpbG1zdHJpcCk7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVN0cmlwUG9zaXRpb25UeXBlLCAiUG9zIiwgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBtQWxsb2NQb3MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVN0cmlwUG9zaXRpb25UeXBlKTsKLQotICAgICAgICBsb2FkSW1hZ2VzKCk7Ci0gICAgICAgIGluaXRTdGF0ZSgpOwotCi0gICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkltYWdlcy5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKDMyMCwgNDgwKTsKLQotCi0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NJRHMsIDApOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jUG9zLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1N0YXRlLCAyKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1QVkEubUFsbG9jLCAzKTsKLQotCi0gICAgICAgIG1BbGxvY09mZnNldHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzLmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHMuZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHMpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0cywgNCk7Ci0KLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleCA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleC5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4LmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4KTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHNUZXgsIDUpOwotCi0gICAgICAgIHNldEZpbG1TdHJpcFBvc2l0aW9uKDAsIDApOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHRTdHJpcCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhjY2UwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNpbXBsZU1lc2g7Ci0KLQotY2xhc3MgRmlsbVN0cmlwTWVzaCB7Ci0KLSAgICBjbGFzcyBWZXJ0ZXggewotICAgICAgICBmbG9hdCBueDsKLSAgICAgICAgZmxvYXQgbnk7Ci0gICAgICAgIGZsb2F0IG56OwotICAgICAgICBmbG9hdCBzOwotICAgICAgICBmbG9hdCB0OwotICAgICAgICBmbG9hdCB4OwotICAgICAgICBmbG9hdCB5OwotICAgICAgICBmbG9hdCB6OwotCi0gICAgICAgIFZlcnRleCgpIHsKLSAgICAgICAgICAgIG54ID0gMDsKLSAgICAgICAgICAgIG55ID0gMDsKLSAgICAgICAgICAgIG56ID0gMDsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgdCA9IDA7Ci0gICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgeiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICB4ID0gX3g7Ci0gICAgICAgICAgICB5ID0gX3k7Ci0gICAgICAgICAgICB6ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG54eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgbnggPSBfeDsKLSAgICAgICAgICAgIG55ID0gX3k7Ci0gICAgICAgICAgICBueiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdChmbG9hdCBfcywgZmxvYXQgX3QpIHsKLSAgICAgICAgICAgIHMgPSBfczsKLSAgICAgICAgICAgIHQgPSBfdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZU5vcm0oVmVydGV4IHYxLCBWZXJ0ZXggdjIpIHsKLSAgICAgICAgICAgIGZsb2F0IGR4ID0gdjEueCAtIHYyLng7Ci0gICAgICAgICAgICBmbG9hdCBkeSA9IHYxLnkgLSB2Mi55OwotICAgICAgICAgICAgZmxvYXQgZHogPSB2MS56IC0gdjIuejsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkgKyBkeipkeik7Ci0gICAgICAgICAgICBkeCAvPSBsZW47Ci0gICAgICAgICAgICBkeSAvPSBsZW47Ci0gICAgICAgICAgICBkeiAvPSBsZW47Ci0KLSAgICAgICAgICAgIG54ID0gZHggKiBkejsKLSAgICAgICAgICAgIG55ID0gZHkgKiBkejsKLSAgICAgICAgICAgIG56ID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7Ci0KLSAgICAgICAgICAgIGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KG54Km54ICsgbnkqbnkgKyBueipueik7Ci0gICAgICAgICAgICBueCAvPSBsZW47Ci0gICAgICAgICAgICBueSAvPSBsZW47Ci0gICAgICAgICAgICBueiAvPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRbXSBtVHJpYW5nbGVPZmZzZXRzOwotICAgIGZsb2F0W10gbVRyaWFuZ2xlT2Zmc2V0c1RleDsKLSAgICBpbnQgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotCi0gICAgU2ltcGxlTWVzaCBpbml0KFJlbmRlclNjcmlwdCBycykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHZ0eFtdID0gbmV3IGZsb2F0W10gewotICAgICAgICAgICAgNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYsCi0gICAgICAgICAgICA2MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgIDYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICA2NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgIDY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICA3MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgIDc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgIDgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICA4NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgIDEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgIDE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA4MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAyMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC02MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAtMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIC0xNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgICAtMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgICAtMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgIC0yNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgICAtMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgICAtODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgICAtODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgICAtNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgICAtNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICAgLTcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgIC02OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgICAtNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICAgLTY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgIC02Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgICAtNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICAgLTYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgIC02MC40MzEwMDNmLCAxMjQuNDgyMDUwZgotICAgICAgICB9OwotCi0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0cyA9IG5ldyBpbnRbNjRdOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4ID0gbmV3IGZsb2F0WzY0XTsKLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzWzBdID0gMDsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gMTsKLQotICAgICAgICBWZXJ0ZXggdCA9IG5ldyBWZXJ0ZXgoKTsKLSAgICAgICAgdC5ueHl6KDEsIDAsIDApOwotICAgICAgICBpbnQgY291bnQgPSB2dHgubGVuZ3RoIC8gMjsKLQotICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG0gPSBuZXcgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKAotICAgICAgICAgICAgcnMsIDMsCi0gICAgICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuTk9STUFMIHwgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7Ci0KLSAgICAgICAgZmxvYXQgcnVubmluZ1MgPSAwOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0xKTsgY3QrKykgewotICAgICAgICAgICAgdC54ID0gLXZ0eFtjdCoyXSAvIDEwMC5mOwotICAgICAgICAgICAgdC56ID0gdnR4W2N0KjIrMV0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQucyA9IHJ1bm5pbmdTOwotICAgICAgICAgICAgdC5ueCA9ICAodnR4W2N0KjIrM10gLSB2dHhbY3QqMiArMV0pOwotICAgICAgICAgICAgdC5ueSA9ICAodnR4W2N0KjIrMl0gLSB2dHhbY3QqMiAgIF0pOwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQodC5ueCAqIHQubnggKyB0Lm55ICogdC5ueSk7Ci0gICAgICAgICAgICBydW5uaW5nUyArPSBsZW4gLyAxMDA7Ci0gICAgICAgICAgICB0Lm54IC89IGxlbjsKLSAgICAgICAgICAgIHQubnkgLz0gbGVuOwotICAgICAgICAgICAgdC55ID0gLTAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAwOwotICAgICAgICAgICAgdG0uc2V0Tm9ybWFsKHQubngsIHQubnksIHQubnopOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLSAgICAgICAgICAgIHQueSA9IC41ZjsKLSAgICAgICAgICAgIHQudCA9IDE7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotCi0gICAgICAgICAgICBpZigocnVubmluZ1MqMikgPiBtVHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzW21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSBjdCoyICogMzsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4W21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSB0LnM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAoY291bnQgKiAyIC0gMik7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTIpOyBjdCs9IDIpIHsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0LCBjdCsxLCBjdCsyKTsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0KzEsIGN0KzMsIGN0KzIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bS5jcmVhdGUoKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjMjgxMS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWxtVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgewotCi0gICAgcHVibGljIEZpbG1WaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBGaWxtUlMgbVJlbmRlcjsKLQotCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgewotICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7Ci0gICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOwotICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGaWxtUlMoKTsKLSAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZihtUlMgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gbnVsbDsKLSAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCi0gICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOwotICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtUmVuZGVyLnNldEZpbG1TdHJpcFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSAvIDUpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCmluZGV4IGY3ZTUzYTguLjcxOTQ0YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCkBAIC0xNCwxNCArMTQsMTggQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGb3VudGFpbgogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I4MTliLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotI3ByYWdtYSB2ZXJzaW9uKDEpCi0KLWludCBuZXdQYXJ0ID0gMDsKLQotaW50IG1haW4oaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGN0OwotICAgIGludCBjb3VudCA9IENvbnRyb2wtPmNvdW50OwotICAgIGludCByYXRlID0gQ29udHJvbC0+cmF0ZTsKLSAgICBmbG9hdCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLSAgICBzdHJ1Y3QgcG9pbnRfcyAqIHAgPSAoc3RydWN0IHBvaW50X3MgKilwb2ludDsKLQotICAgIGlmIChyYXRlKSB7Ci0gICAgICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOwotICAgICAgICBpbnQgeCA9IENvbnRyb2wtPng7Ci0gICAgICAgIGludCB5ID0gQ29udHJvbC0+eTsKLSAgICAgICAgaW50IGNvbG9yID0gKChpbnQpKENvbnRyb2wtPnIgKiAyNTUuZikpIHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmcgKiAyNTUuZikpIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+YiAqIDI1NS5mKSkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAoMHhmMCA8PCAyNCk7Ci0gICAgICAgIHN0cnVjdCBwb2ludF9zICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICB2ZWMyUmFuZCgoZmxvYXQgKikmbnAtPmRlbHRhLngsIHJNYXgpOwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnggPSB4OwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnkgPSB5OwotICAgICAgICAgICAgbnAtPmNvbG9yID0gY29sb3I7Ci0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBucCsrOwotICAgICAgICAgICAgaWYgKG5ld1BhcnQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBucCA9ICZwW25ld1BhcnRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGZsb2F0IGR5ID0gcC0+ZGVsdGEueSArIDAuMTVmOwotICAgICAgICBmbG9hdCBwb3N5ID0gcC0+cG9zaXRpb24ueSArIGR5OwotICAgICAgICBpZiAoKHBvc3kgPiBoZWlnaHQpICYmIChkeSA+IDApKSB7Ci0gICAgICAgICAgICBkeSAqPSAtMC4zZjsKLSAgICAgICAgfQotICAgICAgICBwLT5kZWx0YS55ID0gZHk7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnggKz0gcC0+ZGVsdGEueDsKLSAgICAgICAgcC0+cG9zaXRpb24ueSA9IHBvc3k7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICB1cGxvYWRUb0J1ZmZlck9iamVjdChOQU1FRF9QYXJ0QnVmZmVyKTsKLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9QYXJ0TWVzaCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDExNDAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi0jaW5jbHVkZSAicnNfdHlwZXMucnNoIgotI2luY2x1ZGUgInJzX21hdGgucnNoIgotI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKLQotc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKLQotdHlwZWRlZiBzdHJ1Y3QgQ29udHJvbF9zIHsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgcmF0ZTsKLSAgICBpbnQgY291bnQ7Ci0gICAgZmxvYXQgciwgZywgYjsKLSAgICByc19hbGxvY2F0aW9uIHBhcnRCdWZmZXI7Ci0gICAgcnNfbWVzaCBwYXJ0TWVzaDsKLX0gQ29udHJvbF90OwotQ29udHJvbF90ICpDb250cm9sOwotCi10eXBlZGVmIHN0cnVjdCBQb2ludF9zewotICAgIGZsb2F0MiBkZWx0YTsKLSAgICBmbG9hdDIgcG9zaXRpb247Ci0gICAgdW5zaWduZWQgaW50IGNvbG9yOwotfSBQb2ludF90OwotUG9pbnRfdCAqcG9pbnQ7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKLQotICAgIGlmIChyYXRlKSB7Ci0gICAgICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOwotICAgICAgICBpbnQgeCA9IENvbnRyb2wtPng7Ci0gICAgICAgIGludCB5ID0gQ29udHJvbC0+eTsKLSAgICAgICAgaW50IGNvbG9yID0gKChpbnQpKENvbnRyb2wtPnIgKiAyNTUuZikpIHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmcgKiAyNTUuZikpIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+YiAqIDI1NS5mKSkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAoMHhmMCA8PCAyNCk7Ci0gICAgICAgIFBvaW50X3QgKiBucCA9ICZwW25ld1BhcnRdOwotCi0gICAgICAgIHdoaWxlIChyYXRlLS0pIHsKLSAgICAgICAgICAgIG5wLT5kZWx0YSA9IHZlYzJSYW5kKHJNYXgpOwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnggPSB4OwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnkgPSB5OwotICAgICAgICAgICAgbnAtPmNvbG9yID0gY29sb3I7Ci0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBucCsrOwotICAgICAgICAgICAgaWYgKG5ld1BhcnQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBucCA9ICZwW25ld1BhcnRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGZsb2F0IGR5ID0gcC0+ZGVsdGEueSArIDAuMTVmOwotICAgICAgICBmbG9hdCBwb3N5ID0gcC0+cG9zaXRpb24ueSArIGR5OwotICAgICAgICBpZiAoKHBvc3kgPiBoZWlnaHQpICYmIChkeSA+IDApKSB7Ci0gICAgICAgICAgICBkeSAqPSAtMC4zZjsKLSAgICAgICAgfQotICAgICAgICBwLT5kZWx0YS55ID0gZHk7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnggKz0gcC0+ZGVsdGEueDsKLSAgICAgICAgcC0+cG9zaXRpb24ueSA9IHBvc3k7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICB1cGxvYWRUb0J1ZmZlck9iamVjdChDb250cm9sLT5wYXJ0QnVmZmVyKTsKLSAgICBkcmF3U2ltcGxlTWVzaChDb250cm9sLT5wYXJ0TWVzaCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCmluZGV4IDkzNTY1NzkuLjI5N2VhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCkBAIC0yMiw5NCArMjIsNTAgQEAKIAogCiBwdWJsaWMgY2xhc3MgRm91bnRhaW5SUyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDIwMDAwOwotCi0gICAgc3RhdGljIGNsYXNzIFNvbWVEYXRhIHsKLSAgICAgICAgcHVibGljIGludCB4OwotICAgICAgICBwdWJsaWMgaW50IHk7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmF0ZTsKLSAgICAgICAgcHVibGljIGludCBjb3VudDsKLSAgICAgICAgcHVibGljIGZsb2F0IHI7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBnOwotICAgICAgICBwdWJsaWMgZmxvYXQgYjsKLSAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDUwMDAwOwogCiAgICAgcHVibGljIEZvdW50YWluUlMoKSB7CiAgICAgfQogCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjcmlwdENfRm91bnRhaW4gbVNjcmlwdDsKICAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgbVJTID0gcnM7CiAgICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIHBmYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihycyk7CisgICAgICAgIHBmYi5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIHJzLmNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHBmYi5jcmVhdGUoKSk7CisKKyAgICAgICAgU2NyaXB0RmllbGRfUG9pbnQgcG9pbnRzID0gbmV3IFNjcmlwdEZpZWxkX1BvaW50KG1SUywgUEFSVF9DT1VOVCk7CisKKyAgICAgICAgTWVzaC5BbGxvY2F0aW9uQnVpbGRlciBzbWIgPSBuZXcgTWVzaC5BbGxvY2F0aW9uQnVpbGRlcihtUlMpOworICAgICAgICBzbWIuYWRkVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpKTsKKyAgICAgICAgc21iLmFkZEluZGV4VHlwZShQcmltaXRpdmUuUE9JTlQpOworICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Gb3VudGFpbihtUlMsIG1SZXMsIFIucmF3LmZvdW50YWluLCB0cnVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcGFydE1lc2goc20pOworICAgICAgICBtU2NyaXB0LmJpbmRfcG9pbnQocG9pbnRzKTsKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50IHJhdGUpIHsKLSAgICAgICAgaWYgKG1TRC5yYXRlID09IDApIHsKLSAgICAgICAgICAgIG1TRC5yID0gKCh4ICYgMHgxKSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIG1TRC5nID0gKCh4ICYgMHgyKSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIG1TRC5iID0gKCh4ICYgMHg0KSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIGlmICgobVNELnIgKyBtU0QuZyArIG1TRC5iKSA8IDAuOWYpIHsKLSAgICAgICAgICAgICAgICBtU0QuciA9IDAuOGY7Ci0gICAgICAgICAgICAgICAgbVNELmcgPSAwLjVmOwotICAgICAgICAgICAgICAgIG1TRC5iID0gMS5mOwotICAgICAgICAgICAgfQorICAgIGJvb2xlYW4gaG9sZGluZ0NvbG9yW10gPSBuZXcgYm9vbGVhblsxMF07CisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgICAgIGlmIChpZCA+IGhvbGRpbmdDb2xvci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtU0QucmF0ZSA9IHJhdGU7Ci0gICAgICAgIG1TRC54ID0geDsKLSAgICAgICAgbVNELnkgPSB5OwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOworICAgICAgICBpbnQgcmF0ZSA9IChpbnQpKHByZXNzdXJlICogcHJlc3N1cmUgKiA1MDAuZik7CisgICAgICAgIGlmKHJhdGUgPiA1MDApIHsKKyAgICAgICAgICAgIHJhdGUgPSA1MDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgaWQsICFob2xkaW5nQ29sb3JbaWRdKTsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IGZhbHNlOworICAgICAgICB9CisKICAgICB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JbnRBbGxvYzsKLSAgICBwcml2YXRlIFNpbXBsZU1lc2ggbVNNOwotICAgIHByaXZhdGUgU29tZURhdGEgbVNEOwotICAgIHByaXZhdGUgVHlwZSBtU0RUeXBlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKLSAgICAgICAgbVNEID0gbmV3IFNvbWVEYXRhKCk7Ci0gICAgICAgIG1TRFR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFNvbWVEYXRhLmNsYXNzLCAxLCAiU29tZURhdGEiKTsKLSAgICAgICAgbUludEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1TRFR5cGUpOwotICAgICAgICBtU0QuY291bnQgPSBQQVJUX0NPVU5UOwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOwotCi0gICAgICAgIEVsZW1lbnQuQnVpbGRlciBlYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgMiksICJkZWx0YSIpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLCAyKSwgInBvc2l0aW9uIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuVU5TSUdORURfOCwgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwgNCksICJjb2xvciIpOwotICAgICAgICBFbGVtZW50IHByaW1FbGVtZW50ID0gZWIuY3JlYXRlKCk7Ci0KLQotICAgICAgICBTaW1wbGVNZXNoLkJ1aWxkZXIgc21iID0gbmV3IFNpbXBsZU1lc2guQnVpbGRlcihtUlMpOwotICAgICAgICBpbnQgdnR4U2xvdCA9IHNtYi5hZGRWZXJ0ZXhUeXBlKHByaW1FbGVtZW50LCBQQVJUX0NPVU5UKTsKLSAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuUE9JTlQpOwotICAgICAgICBtU00gPSBzbWIuY3JlYXRlKCk7Ci0gICAgICAgIG1TTS5zZXROYW1lKCJQYXJ0TWVzaCIpOwotCi0gICAgICAgIEFsbG9jYXRpb24gcGFydEFsbG9jID0gbVNNLmNyZWF0ZVZlcnRleEFsbG9jYXRpb24odnR4U2xvdCk7Ci0gICAgICAgIHBhcnRBbGxvYy5zZXROYW1lKCJQYXJ0QnVmZmVyIik7Ci0gICAgICAgIG1TTS5iaW5kVmVydGV4QWxsb2NhdGlvbihwYXJ0QWxsb2MsIDApOwotCi0gICAgICAgIC8vIEFsbCBzZXR1cCBvZiBuYW1lZCBvYmplY3RzIHNob3VsZCBiZSBkb25lIGJ5IHRoaXMgcG9pbnQKLSAgICAgICAgLy8gYmVjYXVzZSB3ZSBhcmUgYWJvdXQgdG8gY29tcGlsZSB0aGUgc2NyaXB0LgotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFNjcmlwdChtUmVzLCBSLnJhdy5mb3VudGFpbik7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNEVHlwZSwgIkNvbnRyb2wiLCAwKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtU00uZ2V0VmVydGV4VHlwZSgwKSwgInBvaW50IiwgMSk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgc2NyaXB0LnNldENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1JbnRBbGxvYywgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihwYXJ0QWxsb2MsIDEpOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KHNjcmlwdCk7Ci0gICAgfQotCiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKaW5kZXggZGZkNmE0OS4uYzE0MTE2NTZiIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKQEAgLTcxLDE3ICs3MSwzMyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKICAgICB7Ci0gICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOwogICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewotICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CiAgICAgICAgIH0KLSAgICAgICAgZmxvYXQgcmF0ZSA9IChldi5nZXRQcmVzc3VyZSgpICogNTAuZik7Ci0gICAgICAgIHJhdGUgKj0gcmF0ZTsKLSAgICAgICAgaWYocmF0ZSA+IDIwMDAuZikgewotICAgICAgICAgICAgcmF0ZSA9IDIwMDAuZjsKKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCksIChpbnQpcmF0ZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIEZvdW50YWluIHRlc3Qgc2NyaXB0CisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5mb3VudGFpbikKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3JzX21lc2ggcGFydE1lc2g7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBvaW50IHsKKyAgICBmbG9hdDIgZGVsdGE7CisgICAgZmxvYXQyIHBvc2l0aW9uOworICAgIHVjaGFyNCBjb2xvcjsKK30gUG9pbnRfdDsKK1BvaW50X3QgKnBvaW50OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIocG9pbnQsIHBhcnRNZXNoKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhhZGRQYXJ0aWNsZXMpCisKK2ludCByb290KCkgeworICAgIGZsb2F0IGR0ID0gbWluKHJzR2V0RHQoKSwgMC4xZik7CisgICAgcnNnQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICBmbG9hdCBkeTIgPSBkdCAqICgxMC5mKTsKKyAgICBQb2ludF90ICogcCA9IHBvaW50OworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgc2l6ZTsgY3QrKykgeworICAgICAgICBwLT5kZWx0YS55ICs9IGR5MjsKKyAgICAgICAgcC0+cG9zaXRpb24gKz0gcC0+ZGVsdGE7CisgICAgICAgIGlmICgocC0+cG9zaXRpb24ueSA+IGhlaWdodCkgJiYgKHAtPmRlbHRhLnkgPiAwKSkgeworICAgICAgICAgICAgcC0+ZGVsdGEueSAqPSAtMC4zZjsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorCisgICAgcnNnRHJhd01lc2gocGFydE1lc2gpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgZmxvYXQ0IHBhcnRDb2xvclsxMF07Cit2b2lkIGFkZFBhcnRpY2xlcyhpbnQgcmF0ZSwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGluZGV4LCBib29sIG5ld0NvbG9yKQoreworICAgIGlmIChuZXdDb2xvcikgeworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnggPSByc1JhbmQoMC41ZiwgMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueSA9IHJzUmFuZCgxLjBmKTsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS56ID0gcnNSYW5kKDEuMGYpOworICAgIH0KKyAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDJmOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcltpbmRleF0pOworCisgICAgUG9pbnRfdCAqIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgIGZsb2F0MiBwID0ge3gsIHl9OworICAgIHdoaWxlIChyYXRlLS0pIHsKKyAgICAgICAgZmxvYXQgYW5nbGUgPSByc1JhbmQoMy4xNGYgKiAyLmYpOworICAgICAgICBmbG9hdCBsZW4gPSByc1JhbmQock1heCk7CisgICAgICAgIG5wLT5kZWx0YS54ID0gbGVuICogc2luKGFuZ2xlKTsKKyAgICAgICAgbnAtPmRlbHRhLnkgPSBsZW4gKiBjb3MoYW5nbGUpOworICAgICAgICBucC0+cG9zaXRpb24gPSBwOworICAgICAgICBucC0+Y29sb3IgPSBjOworICAgICAgICBuZXdQYXJ0Kys7CisgICAgICAgIG5wKys7CisgICAgICAgIGlmIChuZXdQYXJ0ID49IHNpemUpIHsKKyAgICAgICAgICAgIG5ld1BhcnQgPSAwOworICAgICAgICAgICAgbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA4MzM0MjdiLi43ZmEzMGQwIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCkBAIC0xNCwxNCArMTQsMTkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAgICAgICAgICAgICAgICAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gSW1hZ2VQcm9jZXNzaW5nCiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGI0OGQyMDguLmQ2YTJkYjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTYsNyArNiw4IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkltYWdlIFByb2Nlc3NpbmciPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE4N2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCmluZGV4IDY3NzBjMTguLmM2ZWM3MjkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTI1LDkgKzI1LDE0NyBAQAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rpc3BsYXkiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMjBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjY2ZGlwIiAvPgotICAgIAorCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JlbmNobWFyayIKKyAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJiZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmVuY2htYXJrVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKworICAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luU2F0dXJhdGlvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb25UZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2F0dXJhdGlvbiIvPgorCiAgICAgPFNlZWtCYXIKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aHJlc2hvbGQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkdhbW1hVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjExMmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2dhbW1hIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dFdoaXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dFdoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL291dF93aGl0ZSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luV2hpdGVUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9pbl93aGl0ZSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRCbGFjayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRCbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfYmxhY2siLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFjayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkJsYWNrVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fYmxhY2siLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmFkaXVzIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgpAQCAtMzUsNCArMTczLDE1IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CiAKKyAgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmx1clRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JsdXJfZGVzY3JpcHRpb24iLz4KKwogPC9tZXJnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4ZjBjZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLS8vIGJsb2NrIG9mIGRlZmluZXMgbWF0Y2hpbmcgd2hhdCBSUyB3aWxsIGluc2VydCBhdCBydW50aW1lLgotc3RydWN0IFBhcmFtc19zewotICAgIGludCBpbkhlaWdodDsKLSAgICBpbnQgaW5XaWR0aDsKLSAgICBpbnQgb3V0SGVpZ2h0OwotICAgIGludCBvdXRXaWR0aDsKLSAgICBmbG9hdCB0aHJlc2hvbGQ7Ci19Owotc3RydWN0IFBhcmFtc19zICogUGFyYW1zOwotc3RydWN0IEluUGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IEluUGl4ZWxfcyAqIEluUGl4ZWw7Ci1zdHJ1Y3QgT3V0UGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IE91dFBpeGVsX3MgKiBPdXRQaXhlbDsKLSovCi0KLXN0cnVjdCBjb2xvcl9zIHsKLSAgICBjaGFyIGI7Ci0gICAgY2hhciBnOwotICAgIGNoYXIgcjsKLSAgICBjaGFyIGE7Ci19OwotCi12b2lkIG1haW4oKSB7Ci0gICAgaW50IHQgPSB1cHRpbWVNaWxsaXMoKTsKLQotICAgIHN0cnVjdCBjb2xvcl9zICppbiA9IChzdHJ1Y3QgY29sb3JfcyAqKSBJblBpeGVsOwotICAgIHN0cnVjdCBjb2xvcl9zICpvdXQgPSAoc3RydWN0IGNvbG9yX3MgKikgT3V0UGl4ZWw7Ci0KLSAgICBpbnQgY291bnQgPSBQYXJhbXMtPmluV2lkdGggKiBQYXJhbXMtPmluSGVpZ2h0OwotICAgIGludCBpOwotICAgIGZsb2F0IHRocmVzaG9sZCA9IChQYXJhbXMtPnRocmVzaG9sZCAqIDI1NS5mKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IGx1bWluYW5jZSA9IDAuMjEyNWYgKiBpbi0+ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzE1NGYgKiBpbi0+ZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDcyMWYgKiBpbi0+YjsKLSAgICAgICAgaWYgKGx1bWluYW5jZSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgKm91dCA9ICppbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICooKGludCAqKW91dCkgPSAqKChpbnQgKilpbikgJiAweGZmMDAwMDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW4rKzsKLSAgICAgICAgb3V0Kys7Ci0gICAgfQotCi0gICAgdD0gdXB0aW1lTWlsbGlzKCkgLSB0OwotICAgIGRlYnVnSTMyKCJGaWx0ZXIgdGltZSIsIHQpOwotCi0gICAgc2VuZFRvQ2xpZW50KCZjb3VudCwgMSwgNCwgMCk7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1Y2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gR2VuZXJhbCAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS1zbGlkZXIgbGFiZWwgLS0+CisgICAgPHN0cmluZyBuYW1lPSJibHVyX2Rlc2NyaXB0aW9uIj5CbHVyIFJhZGl1czwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fd2hpdGUiPkluIFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfd2hpdGUiPk91dCBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fYmxhY2siPkluIEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfYmxhY2siPk91dCBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtbWEiPkdhbW1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmF0aW9uIj5TYXR1cmF0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCmluZGV4IDljZTUzZDguLjI0ZWY1NDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQpAQCAtMzEsNTMgKzMxLDU2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLXB1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKLSAgICBwcml2YXRlIFBhcmFtcyBtUGFyYW1zOwotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBtSW52b2thYmxlOwotICAgIHByaXZhdGUgaW50W10gbUluRGF0YTsKLSAgICBwcml2YXRlIGludFtdIG1PdXREYXRhOworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBJbjsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwT3V0OworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBTY3JhdGNoOworICAgIHByaXZhdGUgU2NyaXB0Q19UaHJlc2hvbGQgbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfVmVydGljYWxfYmx1ciBtU2NyaXB0VkJsdXI7CisgICAgcHJpdmF0ZSBTY3JpcHRDX0hvcml6b250YWxfYmx1ciBtU2NyaXB0SEJsdXI7CisgICAgcHJpdmF0ZSBTY3JpcHRDX0xldmVscyBtU2NyaXB0TGV2ZWxzOworICAgIHByaXZhdGUgaW50IG1SYWRpdXMgPSAwOworICAgIHByaXZhdGUgU2Vla0JhciBtUmFkaXVzU2Vla0JhcjsKKworICAgIHByaXZhdGUgZmxvYXQgbUluQmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5CbGFja1NlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0QmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtT3V0QmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbUluV2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1JbldoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1PdXRXaGl0ZSA9IDI1NS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dFdoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1HYW1tYSA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1HYW1tYVNlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1TYXR1cmF0aW9uID0gMS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVNhdHVyYXRpb25TZWVrQmFyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmVuY2htYXJrUmVzdWx0OwogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIFR5cGUgbVBhcmFtc1R5cGU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbVBhcmFtc0FsbG9jYXRpb247Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFR5cGUgbVBpeGVsVHlwZTsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1PdXRQaXhlbHNBbGxvY2F0aW9uOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjsKIAogICAgIHByaXZhdGUgU3VyZmFjZVZpZXcgbVN1cmZhY2VWaWV3OwogICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1EaXNwbGF5VmlldzsKIAotICAgIHN0YXRpYyBjbGFzcyBQYXJhbXMgewotICAgICAgICBwdWJsaWMgaW50IGluV2lkdGg7Ci0gICAgICAgIHB1YmxpYyBpbnQgb3V0V2lkdGg7Ci0gICAgICAgIHB1YmxpYyBpbnQgaW5IZWlnaHQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgb3V0SGVpZ2h0OwotCi0gICAgICAgIHB1YmxpYyBmbG9hdCB0aHJlc2hvbGQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBpeGVsIHsKLSAgICAgICAgcHVibGljIGJ5dGUgYTsKLSAgICAgICAgcHVibGljIGJ5dGUgcjsKLSAgICAgICAgcHVibGljIGJ5dGUgZzsKLSAgICAgICAgcHVibGljIGJ5dGUgYjsKLSAgICB9Ci0KICAgICBjbGFzcyBGaWx0ZXJDYWxsYmFjayBleHRlbmRzIFJlbmRlclNjcmlwdC5SU01lc3NhZ2UgewogICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1BY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24ucmVhZERhdGEobU91dERhdGEpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0UGl4ZWxzKG1PdXREYXRhLCAwLCBtUGFyYW1zLm91dFdpZHRoLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5vdXRXaWR0aCwgbVBhcmFtcy5vdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC04OSwyOSArOTIsMjE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgamF2YUZpbHRlcigpIHsKKyAgICBpbnQgaW5bXTsKKyAgICBpbnQgaW50ZXJtW107CisgICAgaW50IG91dFtdOworICAgIGludCBNQVhfUkFESVVTID0gMjU7CisgICAgLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCisgICAgZmxvYXQgZ2F1c3NpYW5bXTsKKworICAgIHByaXZhdGUgbG9uZyBqYXZhRmlsdGVyKCkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtQml0bWFwSW4uZ2V0V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1CaXRtYXBJbi5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIGluID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBpbnRlcm0gPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgZ2F1c3NpYW4gPSBuZXcgZmxvYXRbTUFYX1JBRElVUyAqIDIgKyAxXTsKKyAgICAgICAgICAgIG1CaXRtYXBJbi5nZXRQaXhlbHMoaW4sIDAsIHdpZHRoLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorCiAgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKLSAgICAgICAgZmxvYXQgdGhyZXNob2xkID0gbVBhcmFtcy50aHJlc2hvbGQgKiAyNTUuZjsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDApICYgMHhmZik7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBnID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgYiA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gMTYpICYgMHhmZik7CisgICAgICAgIGludCB3LCBoLCByOwogCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogYjsKLSAgICAgICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1PdXREYXRhW2ldID0gbUluRGF0YVtpXSAmIDB4ZmYwMDAwMDA7CisgICAgICAgIGZsb2F0IGZSYWRpdXMgPSAoZmxvYXQpbVJhZGl1czsKKyAgICAgICAgaW50IHJhZGl1cyA9IChpbnQpbVJhZGl1czsKKworICAgICAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgICAgIC8vIGUgaXMgdGhlIGV1bGVyJ3MgbnVtYmVyCisgICAgICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAgICAgLy8gZyh4KSA9ICggMSAvIHNxcnQoIDIgKiBwaSApICogc2lnbWEpICogZSBeICggLXheMiAvIDIgKiBzaWdtYV4yICkKKyAgICAgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAgICAgLy8gQmFzZWQgb24gc29tZSBleHBlcmltZW50YWwgcmFkaXVzIHZhbHVlcyBhbmQgc2lnbWEncworICAgICAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgICAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAgICAgLy8gVGhlIGxhcmdlciB0aGUgcmFkaXVzIGdldHMsIHRoZSBtb3JlIG91ciBnYXVzc2lhbiBibHVyCisgICAgICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICAgICAgZmxvYXQgc2lnbWEgPSAwLjRmICogZlJhZGl1cyArIDAuNmY7CisgICAgICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgICAgICAvLyBXZSB3aWxsIHN0b3JlIHNvbWUgcmVkdW5kYW50IHZhbHVlcyB0byBzYXZlIHNvbWUgbWF0aCBkdXJpbmcKKyAgICAgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICAgICAgZmxvYXQgY29lZmYxID0gMS4wZiAvIChmbG9hdCkoTWF0aC5zcXJ0KCAyLjBmICogcGkgKSAqIHNpZ21hKTsKKyAgICAgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKyAgICAgICAgZmxvYXQgbm9ybWFsaXplRmFjdG9yID0gMC4wZjsKKyAgICAgICAgZmxvYXQgZmxvYXRSID0gMC4wZjsKKyAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIChmbG9hdClNYXRoLnBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworICAgICAgICB9CisKKyAgICAgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxBID0gMC4wZjsKKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKworICAgICAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0gdyArIHI7CisgICAgICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoIG1heCgpIGlzbid0IGV4cG9zZWQgZm9yIGludHMgeWV0CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQgPSBpbltoKndpZHRoICsgdmFsaWRXXTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgUiA9ICgoaW5wdXQgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBHID0gKChpbnB1dCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEIgPSAoKGlucHV0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBBID0gKGlucHV0ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiArPSAoZmxvYXQpKFIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyArPSAoZmxvYXQpKEcpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiArPSAoZmxvYXQpKEIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSArPSAoZmxvYXQpKEEpKndlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgUiA9IChpbnQpYmx1cnJlZFBpeGVsUjsKKyAgICAgICAgICAgICAgICBpbnQgRyA9IChpbnQpYmx1cnJlZFBpeGVsRzsKKyAgICAgICAgICAgICAgICBpbnQgQiA9IChpbnQpYmx1cnJlZFBpeGVsQjsKKyAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnQpYmx1cnJlZFBpeGVsQTsKKworICAgICAgICAgICAgICAgIGludGVybVtoKndpZHRoICsgd10gPSAoUiA8PCAyNCkgfCAoRyA8PCAxNikgfCAoQiA8PCA4KSB8IChBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgPSAwLjBmOworICAgICAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IGggKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQgPSBpbnRlcm1bdmFsaWRIKndpZHRoICsgd107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBvdXRbaCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiSmF2YSBmcmFtZSB0aW1lIG1zICIgKyB0KTsKKyAgICAgICAgbUJpdG1hcE91dC5zZXRQaXhlbHMob3V0LCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KIAotICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJmcmFtZSB0aW1lIG1zICIgKyB0KTsKKyAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICBpZiAoZnJvbVVzZXIpIHsKKworICAgICAgICAgICAgaWYoc2Vla0JhciA9PSBtUmFkaXVzU2Vla0JhcikgeworICAgICAgICAgICAgICAgIGZsb2F0IGZSYWRpdXMgPSBwcm9ncmVzcyAvIDEwMC4wZjsKKyAgICAgICAgICAgICAgICBmUmFkaXVzICo9IChmbG9hdCkoTUFYX1JBRElVUyk7CisgICAgICAgICAgICAgICAgbVJhZGl1cyA9IChpbnQpZlJhZGl1czsKKworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtSW5CbGFja1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtSW5CbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0TGV2ZWxzLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0TGV2ZWxzLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluV2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluV2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdExldmVscy5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRXaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0V2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdExldmVscy5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1HYW1tYVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSAoZmxvYXQpcHJvZ3Jlc3MvMTAwLjBmOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IE1hdGgubWF4KG1HYW1tYSwgMC4xZik7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gMS4wZiAvIG1HYW1tYTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0TGV2ZWxzLmludm9rZV9zZXRHYW1tYShtR2FtbWEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1TYXR1cmF0aW9uU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1TYXR1cmF0aW9uID0gKGZsb2F0KXByb2dyZXNzIC8gNTAuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdExldmVscy5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgICAgICAgICAgbVJTLmZpbmlzaCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqYXZhRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTksNDUgKzMxMSw1NCBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKIAotICAgICAgICBtQml0bWFwID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwSW4gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBPdXQgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBTY3JhdGNoID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOwogCiAgICAgICAgIG1TdXJmYWNlVmlldyA9IChTdXJmYWNlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3VyZmFjZSk7CiAgICAgICAgIG1TdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKIAogICAgICAgICBtRGlzcGxheVZpZXcgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5KTsKLSAgICAgICAgbURpc3BsYXlWaWV3LnNldEltYWdlQml0bWFwKG1CaXRtYXApOworICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcE91dCk7CiAKLSAgICAgICAgKChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC50aHJlc2hvbGQpKS5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXJhbXMudGhyZXNob2xkID0gcHJvZ3Jlc3MgLyAxMDAuMGY7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uLmRhdGEobVBhcmFtcyk7CisgICAgICAgIG1SYWRpdXNTZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnJhZGl1cyk7CisgICAgICAgIG1SYWRpdXNTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0UGl4ZWxzKG1PdXREYXRhLCAwLCBtUGFyYW1zLm91dFdpZHRoLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLm91dFdpZHRoLCBtUGFyYW1zLm91dEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBtSW5CbGFja1NlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbkJsYWNrKTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRQcm9ncmVzcygwKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dEJsYWNrKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRQcm9ncmVzcygwKTsKIAotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbldoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluV2hpdGUpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldFByb2dyZXNzKDEyOCk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5vdXRXaGl0ZSk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKIAotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbkdhbW1hKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRNYXgoMTUwKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRQcm9ncmVzcygxMDApOworCisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluU2F0dXJhdGlvbik7CisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldFByb2dyZXNzKDUwKTsKKworICAgICAgICBtQmVuY2htYXJrUmVzdWx0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5iZW5jaG1hcmtUZXh0KTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJCZW5jaG1hcmsgbm8geWV0IHJ1biIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIG1QYXJhbXMgPSBjcmVhdGVQYXJhbXMoKTsKLSAgICAgICAgbUludm9rYWJsZSA9IGNyZWF0ZVNjcmlwdCgpOwotCi0gICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOworICAgICAgICBjcmVhdGVTY3JpcHQoKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgIG1SUy5maW5pc2goKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CkBAIC0xNjYsNTQgKzM2NywzNCBAQAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKICAgICB9CiAKLSAgICBwcml2YXRlIFNjcmlwdC5JbnZva2FibGUgY3JlYXRlU2NyaXB0KCkgeworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY3JpcHQoKSB7CiAgICAgICAgIG1SUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUoKTsKICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sgPSBuZXcgRmlsdGVyQ2FsbGJhY2soKTsKIAotICAgICAgICBtUGFyYW1zVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgUGFyYW1zLmNsYXNzLCAxLCAiUGFyYW1ldGVycyIpOwotICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtUGFyYW1zVHlwZSk7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uLmRhdGEobVBhcmFtcyk7CisgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBJbik7CisgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVCaXRtYXBSZWYobVJTLCBtQml0bWFwT3V0KTsKKyAgICAgICAgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVCaXRtYXBSZWYobVJTLCBtQml0bWFwU2NyYXRjaCk7CiAKLSAgICAgICAgZmluYWwgaW50IHBpeGVsQ291bnQgPSBtUGFyYW1zLmluV2lkdGggKiBtUGFyYW1zLmluSGVpZ2h0OworICAgICAgICBtU2NyaXB0VkJsdXIgPSBuZXcgU2NyaXB0Q19WZXJ0aWNhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LnZlcnRpY2FsX2JsdXIsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdEhCbHVyID0gbmV3IFNjcmlwdENfSG9yaXpvbnRhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3Lmhvcml6b250YWxfYmx1ciwgZmFsc2UpOworICAgICAgICBtU2NyaXB0TGV2ZWxzID0gbmV3IFNjcmlwdENfTGV2ZWxzKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LmxldmVscywgZmFsc2UpOwogCi0gICAgICAgIG1QaXhlbFR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFBpeGVsLmNsYXNzLCAxLCAiUGl4ZWwiKTsKLSAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwKLSAgICAgICAgICAgICAgICBwaXhlbENvdW50KTsKLSAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UaHJlc2hvbGQobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGVpZ2h0KG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKIAotICAgICAgICBtSW5EYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbUJpdG1hcC5nZXRQaXhlbHMobUluRGF0YSwgMCwgbVBhcmFtcy5pbldpZHRoLCAwLCAwLCBtUGFyYW1zLmluV2lkdGgsIG1QYXJhbXMuaW5IZWlnaHQpOwotICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmRhdGEobUluRGF0YSk7CisgICAgICAgIG1TY3JpcHRMZXZlbHMuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgbVNjcmlwdExldmVscy5pbnZva2Vfc2V0R2FtbWEobUdhbW1hKTsKKyAgICAgICAgbVNjcmlwdExldmVscy5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CiAKLSAgICAgICAgbU91dERhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbi5kYXRhKG1PdXREYXRhKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX0luUGl4ZWwobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9PdXRQaXhlbChtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uKTsKIAotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBhcmFtc1R5cGUsICJQYXJhbXMiLCAwKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGl4ZWxUeXBlLCAiSW5QaXhlbCIsIDEpOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJPdXRQaXhlbCIsIDIpOwotICAgICAgICBzYi5zZXRUeXBlKHRydWUsIDIpOwotICAgICAgICBTY3JpcHQuSW52b2thYmxlIGludm9rYWJsZSA9IHNiLmFkZEludm9rYWJsZSgibWFpbiIpOwotICAgICAgICBzYi5zZXRTY3JpcHQoZ2V0UmVzb3VyY2VzKCksIFIucmF3LnRocmVzaG9sZCk7Ci0gICAgICAgIC8vc2Iuc2V0Um9vdCh0cnVlKTsKLQotICAgICAgICBTY3JpcHRDIHNjcmlwdCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obVBhcmFtc0FsbG9jYXRpb24sIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obUluUGl4ZWxzQWxsb2NhdGlvbiwgMSk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtT3V0UGl4ZWxzQWxsb2NhdGlvbiwgMik7Ci0KLSAgICAgICAgcmV0dXJuIGludm9rYWJsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhcmFtcyBjcmVhdGVQYXJhbXMoKSB7Ci0gICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbXMgPSBuZXcgUGFyYW1zKCk7Ci0gICAgICAgIHBhcmFtcy5pbldpZHRoID0gcGFyYW1zLm91dFdpZHRoID0gbUJpdG1hcC5nZXRXaWR0aCgpOwotICAgICAgICBwYXJhbXMuaW5IZWlnaHQgPSBwYXJhbXMub3V0SGVpZ2h0ID0gbUJpdG1hcC5nZXRIZWlnaHQoKTsKLSAgICAgICAgcGFyYW1zLnRocmVzaG9sZCA9IDAuNWY7Ci0gICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3ZCbHVyU2NyaXB0KG1TY3JpcHRWQmx1cik7CisgICAgICAgIG1TY3JpcHQuc2V0X2hCbHVyU2NyaXB0KG1TY3JpcHRIQmx1cik7CisgICAgICAgIG1TY3JpcHQuc2V0X2xldmVsc1NjcmlwdChtU2NyaXB0TGV2ZWxzKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNvdXJjZSkgewpAQCAtMjI5LDQgKzQxMCwzMCBAQAogICAgICAgICBzb3VyY2UucmVjeWNsZSgpOwogICAgICAgICByZXR1cm4gYjsKICAgICB9CisKKyAgICAvLyBidXR0b24gaG9vaworICAgIHB1YmxpYyB2b2lkIGJlbmNobWFyayhWaWV3IHYpIHsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiQmVuY2htYXJraW5nIik7CisgICAgICAgIGludCBvbGRSYWRpdXMgPSBtUmFkaXVzOworICAgICAgICBtUmFkaXVzID0gTUFYX1JBRElVUzsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXJCZW5jaG1hcmsoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworCisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKworICAgICAgICBsb25nIGphdmFUaW1lID0gamF2YUZpbHRlcigpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMgIEphdmE6ICIgKyBqYXZhVGltZSArICIgbXMiKTsKKyAgICAgICAgLy9tQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMiKTsKKworICAgICAgICBtUmFkaXVzID0gb2xkUmFkaXVzOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNWFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKQEAgLTAsMCArMSw1MCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHVjaGFyNCAqb3V0cHV0ID0gKHVjaGFyNCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCB1Y2hhcjQgKmlucHV0ID0gKGNvbnN0IHVjaGFyNCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIDAsIHkpOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgZmxvYXQzIGN1cnJlbnRQaXhlbCA9IDA7CisKKyAgICBjb25zdCBmbG9hdCAqZ1B0ciA9IGZzLT5nYXVzc2lhbjsKKyAgICBpZiAoKHggPiBmcy0+cmFkaXVzKSAmJiAoeCA8IChmcy0+d2lkdGggLSBmcy0+cmFkaXVzKSkpIHsKKyAgICAgICAgY29uc3QgdWNoYXI0ICppID0gaW5wdXQgKyAoeCAtIGZzLT5yYWRpdXMpOworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueCA9IChmbG9hdCkoaS0+eCk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaS0+eSk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueiA9IChmbG9hdCkoaS0+eik7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgIGludCB2YWxpZFcgPSB4ICsgcjsKKyAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoIG1heCgpIGlzbid0IGV4cG9zZWQgZm9yIGludHMgeWV0CisgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsaWRXID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHZhbGlkVyA+IGZzLT53aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFcgPSBmcy0+d2lkdGggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9pbnQgdmFsaWRXID0gcnNDbGFtcCh3ICsgciwgMCwgd2lkdGggLSAxKTsKKworICAgICAgICAgICAgY3VycmVudFBpeGVsLnggPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10ueCk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS55KTsKKyAgICAgICAgICAgIGN1cnJlbnRQaXhlbC56ID0gKGZsb2F0KShpbnB1dFt2YWxpZFddLnopOworCisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC54OworICAgIG91dHB1dC0+eSA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC55OworICAgIG91dHB1dC0+eiA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC56OworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2ggYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyMTNmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaApAQCAtMCwwICsxLDE1IEBACisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmltYWdlKQorCisjZGVmaW5lIE1BWF9SQURJVVMgMjUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHJzX2FsbG9jYXRpb24gYWluOworCisgICAgZmxvYXQgKmdhdXNzaWFuOyAvL1tNQVhfUkFESVVTICogMiArIDFdOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHdpZHRoOworICAgIGludCByYWRpdXM7CisKK30gRmlsdGVyU3RydWN0OworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2xldmVscy5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2xldmVscy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhhNmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvbGV2ZWxzLnJzCkBAIC0wLDAgKzEsODYgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCisKK3N0YXRpYyBmbG9hdCBpbkJsYWNrOworc3RhdGljIGZsb2F0IG91dEJsYWNrOworc3RhdGljIGZsb2F0IGluV2hpdGU7CitzdGF0aWMgZmxvYXQgb3V0V2hpdGU7CitzdGF0aWMgZmxvYXQzIGdhbW1hOworc3RhdGljIGZsb2F0IHNhdHVyYXRpb247CisKK3N0YXRpYyBmbG9hdCBpbldNaW5JbkI7CitzdGF0aWMgZmxvYXQgb3V0V01pbk91dEI7CitzdGF0aWMgZmxvYXQgb3ZlckluV01pbkluQjsKK3N0YXRpYyByc19tYXRyaXgzeDMgY29sb3JNYXQ7CisKKy8vI3ByYWdtYSBycyBleHBvcnRfdmFyKGhlaWdodCwgd2lkdGgsIHJhZGl1cywgSW5QaXhlbCwgT3V0UGl4ZWwsIFNjcmF0Y2hQaXhlbCwgaW5CbGFjaywgb3V0QmxhY2ssIGluV2hpdGUsIG91dFdoaXRlLCBnYW1tYSwgc2F0dXJhdGlvbiwgSW5QaXhlbCwgT3V0UGl4ZWwsIFNjcmF0Y2hQaXhlbCwgdkJsdXJTY3JpcHQsIGhCbHVyU2NyaXB0KQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhzZXRMZXZlbHMsIHNldFNhdHVyYXRpb24sIHNldEdhbW1hKTsKKwordm9pZCBzZXRMZXZlbHMoZmxvYXQgaUJsaywgZmxvYXQgb0JsaywgZmxvYXQgaVdodCwgZmxvYXQgb1dodCkgeworICAgIGluQmxhY2sgPSBpQmxrOworICAgIG91dEJsYWNrID0gb0JsazsKKyAgICBpbldoaXRlID0gaVdodDsKKyAgICBvdXRXaGl0ZSA9IG9XaHQ7CisKKyAgICBpbldNaW5JbkIgPSBpbldoaXRlIC0gaW5CbGFjazsKKyAgICBvdXRXTWluT3V0QiA9IG91dFdoaXRlIC0gb3V0QmxhY2s7CisgICAgb3ZlckluV01pbkluQiA9IDEuZiAvIGluV01pbkluQjsKK30KKwordm9pZCBzZXRTYXR1cmF0aW9uKGZsb2F0IHNhdCkgeworICAgIHNhdHVyYXRpb24gPSBzYXQ7CisKKyAgICAvLyBTYXR1cmF0aW9uCisgICAgLy8gTGluZWFyIHdlaWdodHMKKyAgICAvL2Zsb2F0IHJXZWlnaHQgPSAwLjMwODZmOworICAgIC8vZmxvYXQgZ1dlaWdodCA9IDAuNjA5NGY7CisgICAgLy9mbG9hdCBiV2VpZ2h0ID0gMC4wODIwZjsKKworICAgIC8vIEdhbW1hIDIuMiB3ZWlnaHRzICh3ZSBoYXZlbid0IGNvbnZlcnRlZCBvdXIgaW1hZ2UgdG8gbGluZWFyIHNwYWNlIHlldCBmb3IgcGVyZiByZWFzb25zKQorICAgIGZsb2F0IHJXZWlnaHQgPSAwLjI5OWY7CisgICAgZmxvYXQgZ1dlaWdodCA9IDAuNTg3ZjsKKyAgICBmbG9hdCBiV2VpZ2h0ID0gMC4xMTRmOworCisgICAgZmxvYXQgb25lTWludXNTID0gMS4wZiAtIHNhdHVyYXRpb247CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAwLCBvbmVNaW51c1MgKiByV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDIsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMCwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAyLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMSwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAyLCBvbmVNaW51c1MgKiBiV2VpZ2h0ICsgc2F0dXJhdGlvbik7Cit9CisKK3ZvaWQgc2V0R2FtbWEoZmxvYXQgZykgeworICAgIGdhbW1hID0gKGZsb2F0MylnOworfQorCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIGNvbnN0IHVjaGFyNCAqaW5wdXQgPSB2X2luOworICAgIHVjaGFyNCAqb3V0cHV0ID0gdl9vdXQ7CisKKyAgICBmbG9hdDMgY3VycmVudFBpeGVsID0gMDsKKworICAgIC8vY3VycmVudFBpeGVsLnh5eiA9IGNvbnZlcnRfZmxvYXQzKGlucHV0Lnh5eik7CisgICAgY3VycmVudFBpeGVsLnggPSAoZmxvYXQpKGlucHV0LT54KTsKKyAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXQtPnkpOworICAgIGN1cnJlbnRQaXhlbC56ID0gKGZsb2F0KShpbnB1dC0+eik7CisKKyAgICBmbG9hdDMgdGVtcCA9IHJzTWF0cml4TXVsdGlwbHkoJmNvbG9yTWF0LCBjdXJyZW50UGl4ZWwpOworICAgIHRlbXAgPSAoY2xhbXAodGVtcCwgMC5mLCAyNTUuZikgLSBpbkJsYWNrKSAqIG92ZXJJbldNaW5JbkI7CisgICAgaWYgKGdhbW1hLnggIT0gMS4wZikKKyAgICAgICAgdGVtcCA9IHBvdyh0ZW1wLCAoZmxvYXQzKWdhbW1hKTsKKyAgICBjdXJyZW50UGl4ZWwgPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC5mLCAyNTUuZik7CisKKyAgICAvL291dHB1dC54eXogPSBjb252ZXJ0X3VjaGFyMyhjdXJyZW50UGl4ZWwueHl6KTsKKyAgICBvdXRwdXQtPnggPSAodWludDhfdCljdXJyZW50UGl4ZWwueDsKKyAgICBvdXRwdXQtPnkgPSAodWludDhfdCljdXJyZW50UGl4ZWwueTsKKyAgICBvdXRwdXQtPnogPSAodWludDhfdCljdXJyZW50UGl4ZWwuejsKKyAgICBvdXRwdXQtPncgPSBpbnB1dC0+dzsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTk4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKQEAgLTAsMCArMSwxMDAgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCitpbnQgaGVpZ2h0OworaW50IHdpZHRoOworaW50IHJhZGl1czsKKwordWNoYXI0ICogSW5QaXhlbDsKK3VjaGFyNCAqIE91dFBpeGVsOwordWNoYXI0ICogU2NyYXRjaFBpeGVsOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoaGVpZ2h0LCB3aWR0aCwgcmFkaXVzLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsLCB2Qmx1clNjcmlwdCwgaEJsdXJTY3JpcHQsIGxldmVsc1NjcmlwdCkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoZmlsdGVyLCBmaWx0ZXJCZW5jaG1hcmspOworCityc19zY3JpcHQgdkJsdXJTY3JpcHQ7Cityc19zY3JpcHQgaEJsdXJTY3JpcHQ7Cityc19zY3JpcHQgbGV2ZWxzU2NyaXB0OworCitjb25zdCBpbnQgQ01EX0ZJTklTSEVEID0gMTsKKworLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCitzdGF0aWMgZmxvYXQgZ2F1c3NpYW5bTUFYX1JBRElVUyAqIDIgKyAxXTsKKworCitzdGF0aWMgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCkgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC40ICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZmxvYXQgZmxvYXRSID0gMC4wZjsKKyAgICBpbnQgcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgfQorCisgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdICo9IG5vcm1hbGl6ZUZhY3RvcjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgYmx1cigpIHsKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCk7CisKKyAgICBGaWx0ZXJTdHJ1Y3QgZnM7CisgICAgZnMuZ2F1c3NpYW4gPSBnYXVzc2lhbjsKKyAgICBmcy53aWR0aCA9IHdpZHRoOworICAgIGZzLmhlaWdodCA9IGhlaWdodDsKKyAgICBmcy5yYWRpdXMgPSByYWRpdXM7CisKKyAgICBmcy5haW4gPSByc0dldEFsbG9jYXRpb24oSW5QaXhlbCk7CisgICAgcnNGb3JFYWNoKGhCbHVyU2NyaXB0LCBmcy5haW4sIHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwpLCAmZnMpOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbCk7CisgICAgcnNGb3JFYWNoKHZCbHVyU2NyaXB0LCBmcy5haW4sIHJzR2V0QWxsb2NhdGlvbihPdXRQaXhlbCksICZmcyk7Cit9CisKK3ZvaWQgZmlsdGVyKCkgeworICAgIC8vUlNfREVCVUcocmFkaXVzKTsKKworICAgIGlmKHJhZGl1cyA+IDApIHsKKyAgICAgICAgYmx1cigpOworICAgICAgICByc0ZvckVhY2gobGV2ZWxzU2NyaXB0LCByc0dldEFsbG9jYXRpb24oT3V0UGl4ZWwpLCByc0dldEFsbG9jYXRpb24oT3V0UGl4ZWwpLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByc0ZvckVhY2gobGV2ZWxzU2NyaXB0LCByc0dldEFsbG9jYXRpb24oSW5QaXhlbCksIHJzR2V0QWxsb2NhdGlvbihPdXRQaXhlbCksIDApOworICAgIH0KKworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0ZJTklTSEVEKTsKK30KKwordm9pZCBmaWx0ZXJCZW5jaG1hcmsoKSB7CisgICAgYmx1cigpOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0ZJTklTSEVEKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2OTI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKQEAgLTAsMCArMSwyOSBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHVjaGFyNCAqb3V0cHV0ID0gKHVjaGFyNCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCB1Y2hhcjQgKmlucHV0ID0gKGNvbnN0IHVjaGFyNCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIHgsIDApOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgY29uc3QgZmxvYXQgKmdQdHIgPSBmcy0+Z2F1c3NpYW47CisgICAgaWYgKCh5ID4gZnMtPnJhZGl1cykgJiYgKHkgPCAoZnMtPmhlaWdodCAtIGZzLT5yYWRpdXMpKSkgeworICAgICAgICBjb25zdCB1Y2hhcjQgKmkgPSBpbnB1dCArICgoeSAtIGZzLT5yYWRpdXMpICogZnMtPndpZHRoKTsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGNvbnZlcnRfZmxvYXQzKGktPnh5eikgKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgaSArPSBmcy0+d2lkdGg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBpbnQgdmFsaWRIID0gcnNDbGFtcCh5ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT5oZWlnaHQgLSAxKSk7CisgICAgICAgICAgICBjb25zdCB1Y2hhcjQgKmkgPSBpbnB1dCArIHZhbGlkSCAqIGZzLT53aWR0aDsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjb252ZXJ0X2Zsb2F0MyhpLT54eXopICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRwdXQtPnh5eiA9IGNvbnZlcnRfdWNoYXIzKGJsdXJyZWRQaXhlbCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNzdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNb2RlbFZpZXdlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiZTc0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1vZGVsdmlld2VyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTW9kZWxWaWV3ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNb2RlbFZpZXdlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ZDMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5MTc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgTW9kZWxWaWV3ZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIE1vZGVsVmlld2VyVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBNb2RlbFZpZXdlclZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWFhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlclJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIE1vZGVsVmlld2VyUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19Nb2RlbHZpZXdlciBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX01vZGVsdmlld2VyKG1SUywgbVJlcywgUi5yYXcubW9kZWx2aWV3ZXIsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9Nb2RlbFZpZXdlclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFjZjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9Nb2RlbFZpZXdlclZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlclZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBNb2RlbFZpZXdlclZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIE1vZGVsVmlld2VyUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBNb2RlbFZpZXdlclJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9tb2RlbHZpZXdlci5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvbW9kZWx2aWV3ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiNjA5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvbW9kZWx2aWV3ZXIucnMKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUFZCYWNrZ3JvdW5kLCBnUEZCYWNrZ3JvdW5kLCBnVEdyaWQsIGdUZXN0TWVzaCwgZ1BGU0JhY2tncm91bmQsIGdSb3RhdGUsIGdJdGFsaWMsIGdUZXh0QWxsb2MpCisKK2Zsb2F0IGdEVDsKK2ludDY0X3QgZ0xhc3RUaW1lOworCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZSA9IDAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgLTAuM2YsIDEuMmYpOworICAgIHJzTWF0cml4U2NhbGUoJm1hdHJpeCwgMC4yZiwgMC4yZiwgMC4yZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgLTI1LjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlLCAwLjBmLCAxLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnRHJhd01lc2goZ1Rlc3RNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IG1vZGVsIHRlc3QiLCAzMCwgNjk1KTsKKworICAgIHJzZ0JpbmRGb250KGdJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KGdUZXh0QWxsb2MsIDMwLCA3MzApOworCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9ycy5zcGVjIGIvbGlicy9ycy9ycy5zcGVjCmluZGV4IDVhZThkMDEuLjU3MWIxNDUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnMuc3BlYworKysgYi9saWJzL3JzL3JzLnNwZWMKQEAgLTEsMTEgKzEsMTQgQEAKIAorQ29udGV4dEZpbmlzaCB7CisJaGFuZGNvZGVBcGkKKwl9CiAKIENvbnRleHRCaW5kUm9vdFNjcmlwdCB7CiAJcGFyYW0gUnNTY3JpcHQgc2FtcGxlcgogCX0KIAotQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB7Ci0JcGFyYW0gUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZ20KK0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIHsKKwlwYXJhbSBSc1Byb2dyYW1TdG9yZSBwZ20KIAl9CiAKIENvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IHsKQEAgLTIwLDYgKzIzLDEwIEBACiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHBnbQogCX0KIAorQ29udGV4dEJpbmRGb250IHsKKwlwYXJhbSBSc0ZvbnQgcGdtCisJfQorCiBDb250ZXh0UGF1c2UgewogCX0KIApAQCAtNTEsNiArNTgsMTEgQEAKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitHZXROYW1lIHsKKwlwYXJhbSB2b2lkICpvYmoKKwlwYXJhbSBjb25zdCBjaGFyICoqbmFtZQorCX0KKwogT2JqRGVzdHJveSB7CiAJcGFyYW0gdm9pZCAqb2JqCiAJfQpAQCAtNzEsNiArODMsMTkgQEAKIAlyZXQgUnNFbGVtZW50CiAJfQogCitFbGVtZW50R2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqZWxlbURhdGEKKwlwYXJhbSB1aW50MzJfdCBlbGVtRGF0YVNpemUKKwl9CisKK0VsZW1lbnRHZXRTdWJFbGVtZW50cyB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqaWRzCisJcGFyYW0gY29uc3QgY2hhciAqKm5hbWVzCisJcGFyYW0gdWludDMyX3QgZGF0YVNpemUKKwl9CisKIFR5cGVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IHR5cGUKIAl9CkBAIC04NCw2ICsxMDksMTIgQEAKIAlyZXQgUnNUeXBlCiAJfQogCitUeXBlR2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNUeXBlIHR5cGUKKwlwYXJhbSB1aW50MzJfdCAqIHR5cGVEYXRhCisJcGFyYW0gdWludDMyX3QgdHlwZURhdGFTaXplCisJfQorCiBBbGxvY2F0aW9uQ3JlYXRlVHlwZWQgewogCXBhcmFtIFJzVHlwZSB0eXBlCiAJcmV0IFJzQWxsb2NhdGlvbgpAQCAtMjI0LDYgKzI1NSwxMSBAQAogCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKIAl9CiAKK0FsbG9jYXRpb25HZXRUeXBlIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlyZXQgY29uc3Qgdm9pZCoKKwl9CisKIFNhbXBsZXJCZWdpbiB7CiAJfQogCkBAIC0yNDgsMTMgKzI4NCw2IEBACiBTY3JpcHRDQmVnaW4gewogCX0KIAotU2NyaXB0U2V0Q2xlYXJDb2xvciB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IHIKLQlwYXJhbSBmbG9hdCBnCi0JcGFyYW0gZmxvYXQgYgotCXBhcmFtIGZsb2F0IGEKLQl9CiAKIFNjcmlwdFNldFRpbWVab25lIHsKIAlwYXJhbSBSc1NjcmlwdCBzCkBAIC0yNjIsMzcgKzI5MSw0MSBAQAogCXBhcmFtIHVpbnQzMl90IGxlbmd0aAogCX0KIAotU2NyaXB0U2V0Q2xlYXJEZXB0aCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IGRlcHRoCi0JfQotCi1TY3JpcHRTZXRDbGVhclN0ZW5jaWwgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSB1aW50MzJfdCBzdGVuY2lsCi0JfQotCi1TY3JpcHRTZXRUeXBlIHsKLQlwYXJhbSBSc1R5cGUgdHlwZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQlwYXJhbSBib29sIGlzV3JpdGFibGUKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCX0KLQotU2NyaXB0U2V0SW52b2tlIHsKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQl9CiAKIFNjcmlwdEludm9rZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNjcmlwdFNldFJvb3QgewotCXBhcmFtIGJvb2wgaXNSb290CitTY3JpcHRJbnZva2VWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQogCX0KIAorU2NyaXB0U2V0VmFySSB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBpbnQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhckYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gZmxvYXQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhclYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CisJfQogCiAKIFNjcmlwdENTZXRTY3JpcHQgewpAQCAtMzA4LDUyICszNDEsNDEgQEAKIAlyZXQgUnNTY3JpcHQKIAl9CiAKLVNjcmlwdENTZXREZWZpbmVGIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gZmxvYXQgdmFsdWUKLSAgICB9CiAKLVNjcmlwdENTZXREZWZpbmVJMzIgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBpbnQzMl90IHZhbHVlCi0gICAgfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIHsKK1Byb2dyYW1TdG9yZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgaW4KIAlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayB7CitQcm9ncmFtU3RvcmVDb2xvck1hc2sgewogCXBhcmFtIGJvb2wgcgogCXBhcmFtIGJvb2wgZwogCXBhcmFtIGJvb2wgYgogCXBhcmFtIGJvb2wgYQogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMgeworUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIHsKIAlwYXJhbSBSc0JsZW5kU3JjRnVuYyBzcmNGdW5jCiAJcGFyYW0gUnNCbGVuZERzdEZ1bmMgZGVzdEZ1bmMKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIHsKK1Byb2dyYW1TdG9yZURlcHRoTWFzayB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIgeworUHJvZ3JhbVN0b3JlRGl0aGVyIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyB7CitQcm9ncmFtU3RvcmVEZXB0aEZ1bmMgewogCXBhcmFtIFJzRGVwdGhGdW5jIGZ1bmMKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUgewotCXJldCBSc1Byb2dyYW1GcmFnbWVudFN0b3JlCitQcm9ncmFtU3RvcmVDcmVhdGUgeworCXJldCBSc1Byb2dyYW1TdG9yZQogCX0KIAogUHJvZ3JhbVJhc3RlckNyZWF0ZSB7Ci0JcGFyYW0gUnNFbGVtZW50IGluCi0JcGFyYW0gUnNFbGVtZW50IG91dAogCXBhcmFtIGJvb2wgcG9pbnRTbW9vdGgKIAlwYXJhbSBib29sIGxpbmVTbW9vdGgKIAlwYXJhbSBib29sIHBvaW50U3ByaXRlCkBAIC0zNjUsMTIgKzM4NywxMSBAQAogCXBhcmFtIGZsb2F0IGx3CiB9CiAKLVByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemV7CitQcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgewogCXBhcmFtIFJzUHJvZ3JhbVJhc3RlciBwcgotCXBhcmFtIGZsb2F0IHBzCisJcGFyYW0gUnNDdWxsTW9kZSBtb2RlCiB9CiAKLQogUHJvZ3JhbUJpbmRDb25zdGFudHMgewogCXBhcmFtIFJzUHJvZ3JhbSB2cAogCXBhcmFtIHVpbnQzMl90IHNsb3QKQEAgLTQ0NywzNiArNDY4LDkxIEBACiAJcGFyYW0gZmxvYXQgYgogCX0KIAorRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSB7CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSBzaXplX3QgbGVuCisJcmV0IFJzRmlsZQorCX0KKwogRmlsZU9wZW4gewogCXJldCBSc0ZpbGUKIAlwYXJhbSBjb25zdCBjaGFyICpuYW1lCiAJcGFyYW0gc2l6ZV90IGxlbgogCX0KIAorRmlsZUEzREdldE51bUluZGV4RW50cmllcyB7CisJcGFyYW0gaW50MzJfdCAqIG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCX0KIAotU2ltcGxlTWVzaENyZWF0ZSB7Ci0JcmV0IFJzU2ltcGxlTWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JcGFyYW0gUnNBbGxvY2F0aW9uIGluZGV4Ci0JcGFyYW0gUnNBbGxvY2F0aW9uICp2dHgKK0ZpbGVBM0RHZXRJbmRleEVudHJpZXMgeworCXBhcmFtIFJzRmlsZUluZGV4RW50cnkgKiBmaWxlRW50cmllcworCXBhcmFtIHVpbnQzMl90IG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZUEzRAorCX0KKworRmlsZUEzREdldEVudHJ5QnlJbmRleCB7CisJcGFyYW0gdWludDMyX3QgaW5kZXgKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCXJldCBSc09iamVjdEJhc2UKKwl9CisKK0ZvbnRDcmVhdGVGcm9tRmlsZSB7CisJcGFyYW0gY29uc3QgY2hhciAqbmFtZQorCXBhcmFtIHVpbnQzMl90IGZvbnRTaXplCisJcGFyYW0gdWludDMyX3QgZHBpCisJcmV0IFJzRm9udAorCX0KKworTWVzaENyZWF0ZSB7CisJcmV0IFJzTWVzaAogCXBhcmFtIHVpbnQzMl90IHZ0eENvdW50Ci0JcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhDb3VudAogCX0KIAotCi1TaW1wbGVNZXNoQmluZEluZGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRJbmRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gaWR4CisJcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TaW1wbGVNZXNoQmluZFByaW1pdGl2ZSB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCX0KLQotU2ltcGxlTWVzaEJpbmRWZXJ0ZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZFZlcnRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gdnR4CiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAorTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bVZ0eAorCX0KKworTWVzaEdldEluZGV4Q291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtSWR4CisJfQorCitNZXNoR2V0VmVydGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4RGF0YQorCXBhcmFtIHVpbnQzMl90IHZ0eERhdGFDb3VudAorCX0KKworTWVzaEdldEluZGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdmEKKwlwYXJhbSB1aW50MzJfdCAqcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhEYXRhQ291bnQKKwl9CisKK0FuaW1hdGlvbkNyZWF0ZSB7CisJcGFyYW0gY29uc3QgZmxvYXQgKmluVmFsdWVzCisJcGFyYW0gY29uc3QgZmxvYXQgKm91dFZhbHVlcworCXBhcmFtIHVpbnQzMl90IHZhbHVlQ291bnQKKwlwYXJhbSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwCisJcGFyYW0gUnNBbmltYXRpb25FZGdlIHByZQorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwb3N0CisJcmV0IFJzQW5pbWF0aW9uCisJfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5jcHAgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKaW5kZXggMGQzMWZhYy4uYjRlYzI1MCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTcwLDYgKzc0LDE2IEBACiAgICAgICAgICAgIG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpKTsKIH0KIAordm9pZCBBZGFwdGVyMUQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FkYXB0ZXIxRCAqQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtMTg1LDYgKzE5OSwxNSBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjJEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMkQgKkFkYXB0ZXIyRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5oIGIvbGlicy9ycy9yc0FkYXB0ZXIuaAppbmRleCBjYjI4NzJlLi40NDllN2FkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWRhcHRlci5oCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFEOyB9CisgICAgc3RhdGljIEFkYXB0ZXIxRCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOwogICAgIHVpbnQzMl90IG1ZOwpAQCAtODIsNiArODYsMTAgQEAKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMkQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAppbmRleCA0ZTgyNzhkLi43ZDMxYmQ2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKKysrIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCkBAIC0xMywxMiArMTMsMTggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKworI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTE2Nyw5ICsxNzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgIDAsIGZvcm1hdCwgdHlwZSwgcHRyKTsKICAgICB9CiAgICAgaWYgKG1UZXh0dXJlR2VuTWlwbWFwKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICAgICAgZ2xHZW5lcmF0ZU1pcG1hcChHTF9URVhUVVJFXzJEKTsKKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICB9CiAKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvVGV4dHVyZSIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChjb25zdCBDb250ZXh0ICpyc2MpCkBAIC0yMDEsNiArMjEwLDcgQEAKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQnVmZmVySUQpOwogICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSwgZ2V0UHRyKCksIEdMX0RZTkFNSUNfRFJBVyk7CiAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgcnNjLT5jaGVja0Vycm9yKCJBbGxvY2F0aW9uOjp1cGxvYWRUb0J1ZmZlck9iamVjdCIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnVwbG9hZENoZWNrKGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIyNCw2ICsyMzQsMTIgQEAKICAgICAgICAgTE9HRSgiQWxsb2NhdGlvbjo6ZGF0YSBjYWxsZWQgd2l0aCBtaXNtYXRjaGVkIHNpemUgZXhwZWN0ZWQgJWksIGdvdCAlaSIsIHNpemUsIHNpemVCeXRlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGluY1JlZnMoZGF0YSwgc2l6ZUJ5dGVzIC8gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgICAgICBkZWNSZWZzKG1QdHIsIHNpemVCeXRlcyAvIG1UeXBlLT5nZXRFbGVtZW50KCktPmdldFNpemVCeXRlcygpKTsKKyAgICB9CisKICAgICBtZW1jcHkobVB0ciwgZGF0YSwgc2l6ZSk7CiAgICAgc2VuZERpcnR5KCk7CiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwpAQCAtMjQ2LDYgKzI2MiwxMiBAQAogICAgICAgICBtVHlwZS0+ZHVtcExPR1YoInR5cGUgaW5mbyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBpbmNSZWZzKGRhdGEsIGNvdW50KTsKKyAgICAgICAgZGVjUmVmcyhwdHIsIGNvdW50KTsKKyAgICB9CisKICAgICBtZW1jcHkocHRyLCBkYXRhLCBzaXplKTsKICAgICBzZW5kRGlydHkoKTsKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CkBAIC0yNjksNiArMjkxLDEwIEBACiAKICAgICBmb3IgKHVpbnQzMl90IGxpbmU9eW9mZjsgbGluZSA8ICh5b2ZmK2gpOyBsaW5lKyspIHsKICAgICAgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgIGluY1JlZnMoc3JjLCB3KTsKKyAgICAgICAgICAgIGRlY1JlZnMoZHN0LCB3KTsKKyAgICAgICAgfQogICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGxpbmVTaXplKTsKICAgICAgICAgc3JjICs9IGxpbmVTaXplOwogICAgICAgICBkc3QgKz0gZGVzdFcgKiBlU2l6ZTsKQEAgLTI4NCw3ICszMTAsNyBAQAogCiB2b2lkIEFsbG9jYXRpb246OmFkZFByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKnApCiB7Ci0gICAgbVRvRGlydHlMaXN0LmFkZChwKTsKKyAgICBtVG9EaXJ0eUxpc3QucHVzaChwKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjpyZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQpAQCAtMzE2LDYgKzM0Miw2MSBAQAogCiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgLy8gRmlyc3QgdGhpbmcgd2UgbmVlZCB0byBzZXJpYWxpemUgaXMgdGhlIHR5cGUgb2JqZWN0IHNpbmNlIGl0IHdpbGwgYmUgbmVlZGVkCisgICAgLy8gdG8gaW5pdGlhbGl6ZSB0aGUgY2xhc3MKKyAgICBtVHlwZS0+c2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IG1UeXBlLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAvLyBXcml0ZSBob3cgbXVjaCBkYXRhIHdlIGFyZSBzdG9yaW5nCisgICAgc3RyZWFtLT5hZGRVMzIoZGF0YVNpemUpOworICAgIC8vIE5vdyB3cml0ZSB0aGUgZGF0YQorICAgIHN0cmVhbS0+YWRkQnl0ZUFycmF5KG1QdHIsIGRhdGFTaXplKTsKK30KKworQWxsb2NhdGlvbiAqQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT04pIHsKKyAgICAgICAgTE9HRSgiYWxsb2NhdGlvbiBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIFR5cGUgKnR5cGUgPSBUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighdHlwZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdHlwZS0+Y29tcHV0ZSgpOworCisgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdlIHdyb3RlIG91dCBmb3IgdGhpcyBhbGxvY2F0aW9uCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihkYXRhU2l6ZSAhPSB0eXBlLT5nZXRTaXplQnl0ZXMoKSkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcmVhZCBhbGxvY2F0aW9uIGJlY2F1c2UgbnVtYnl0ZXMgd3JpdHRlbiBpcyBub3QgdGhlIHNhbWUgbG9hZGVkIHR5cGUgd2FudHNcbiIpOworICAgICAgICBkZWxldGUgdHlwZTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBuZXcgQWxsb2NhdGlvbihyc2MsIHR5cGUpOworICAgIGFsbG9jLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIC8vIFJlYWQgaW4gYWxsIG9mIG91ciBhbGxvY2F0aW9uIGRhdGEKKyAgICBhbGxvYy0+ZGF0YShzdHJlYW0tPmdldFB0cigpICsgc3RyZWFtLT5nZXRQb3MoKSwgZGF0YVNpemUpOworICAgIHN0cmVhbS0+cmVzZXQoc3RyZWFtLT5nZXRQb3MoKSArIGRhdGFTaXplKTsKKworICAgIHJldHVybiBhbGxvYzsKK30KKwogdm9pZCBBbGxvY2F0aW9uOjpzZW5kRGlydHkoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbVRvRGlydHlMaXN0LnNpemUoKTsgY3QrKykgewpAQCAtMzIzLDYgKzQwNCwzMiBAQAogICAgIH0KIH0KIAordm9pZCBBbGxvY2F0aW9uOjppbmNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICB3aGlsZSAoY3QgPiAwKSB7CisgICAgICAgIGUtPmluY1JlZnMocCk7CisgICAgICAgIGN0IC0tOworICAgICAgICBwICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3QKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpOworICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworCisgICAgd2hpbGUgKGN0ID4gMCkgeworICAgICAgICBlLT5kZWNSZWZzKHApOworICAgICAgICBjdCAtLTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLwogLy8KIApAQCAtNDk1LDcgKzYwMiw3IEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQiAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODhfdG9fNTY1OwogICAgIH0KQEAgLTUwMywxNSArNjEwLDIxIEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQkEgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4OF90b181NjU7CiAgICAgfQogCiAgICAgTE9HRSgicGlja0NvbnZlcnRlciwgdW5zdXBvcnRlZCBjb21ibywgc3JjICVwLCAgZHN0ICVwIiwgc3JjLCBkc3QpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHNyY0dMVHlwZSA9ICV4LCAgc3JjR0xGbXQgPSAleCIsIHNyY0dMVHlwZSwgc3JjR0xGbXQpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIGRzdEdMVHlwZSA9ICV4LCAgZHN0R0xGbXQgPSAleCIsIGRzdEdMVHlwZSwgZHN0R0xGbXQpOworICAgIHNyYy0+ZHVtcExPR1YoIlNSQyAiKTsKKyAgICBkc3QtPmR1bXBMT0dWKCJEU1QgIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiBSc0FsbG9jYXRpb24gcnNpX0FsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoQ29udGV4dCAqcnNjLCBSc1R5cGUgdnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYm1wLCB2b2lkICpjYWxsYmFja0RhdGEsIFJzQml0bWFwQ2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKQEAgLTYxMyw2ICs3MjYsMTUgQEAKICAgICBhLT5yZWFkKGRhdGEpOwogfQogCitjb25zdCB2b2lkKiByc2lfQWxsb2NhdGlvbkdldFR5cGUoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPmdldFR5cGUoKS0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGEtPmdldFR5cGUoKTsKK30KKworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li4xNzdkNWE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTcyLDkgKzcyLDE4IEBACiAgICAgdm9pZCByZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICopOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjsgfQorICAgIHN0YXRpYyBBbGxvY2F0aW9uICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpOwogCisgICAgYm9vbCBnZXRJc1RleHR1cmUoKSBjb25zdCB7cmV0dXJuIG1Jc1RleHR1cmU7fQorICAgIGJvb2wgZ2V0SXNCdWZmZXJPYmplY3QoKSBjb25zdCB7cmV0dXJuIG1Jc1ZlcnRleEJ1ZmZlcjt9CisKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QpIGNvbnN0OworICAgIHZvaWQgZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2b2lkIHNlbmREaXJ0eSgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uZmJhYTc1ZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTE0OCwxMSArMTUyLDE5IEBACiAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzY0OgogICAgICAgICBtVHlwZUJpdHMgPSA2NDsKICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgbVR5cGVCaXRzID0gODsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgbUJpdHMgPSBtVHlwZUJpdHMgKiBtVmVjdG9yU2l6ZTsKIH0KIAorYm9vbCBDb21wb25lbnQ6OmlzUmVmZXJlbmNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCk7Cit9CiAKIAogCkBAIC0xODgsODIgKzIwMCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogZ0NUeXBlU3RyaW5nc1tdID0gewotICAgIDAsCi0gICAgMCwvLyJGMTYiLAotICAgICJmbG9hdCIsCi0gICAgImRvdWJsZSIsCi0gICAgImNoYXIiLAotICAgICJzaG9ydCIsCi0gICAgImludCIsCi0gICAgMCwvLyJTNjQiLAotICAgICJjaGFyIiwvL1U4IiwKLSAgICAic2hvcnQiLC8vVTE2IiwKLSAgICAiaW50IiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVmVjVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAidmVjRjMyIiwKLSAgICAidmVjRjY0IiwKLSAgICAidmVjSTgiLAotICAgICJ2ZWNJMTYiLAotICAgICJ2ZWNJMzIiLAotICAgIDAsLy8iUzY0IiwKLSAgICAidmVjVTgiLC8vVTgiLAotICAgICJ2ZWNVMTYiLC8vVTE2IiwKLSAgICAidmVjVTMyIiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1TdHJpbmc4IENvbXBvbmVudDo6Z2V0Q1R5cGUoKSBjb25zdAotewotICAgIGNoYXIgYnVmWzY0XTsKLSAgICBpZiAobVZlY3RvclNpemUgPT0gMSkgewotICAgICAgICByZXR1cm4gU3RyaW5nOChnQ1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgfQotCi0gICAgLy8gWXVjaywgYWNjIFdBUgotICAgIC8vIEFwcGVhcnMgdG8gaGF2ZSBwcm9ibGVtcyBwYWNraW5nIGNoYXJzCi0gICAgaWYgKG1WZWN0b3JTaXplID09IDQgJiYgbVR5cGUgPT0gUlNfVFlQRV9VTlNJR05FRF84KSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJpbnQiKTsKLSAgICB9Ci0KLQotICAgIFN0cmluZzggcyhnQ1ZlY1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgc3ByaW50ZihidWYsICJfJWlfdCIsIG1WZWN0b3JTaXplKTsKLSAgICBzLmFwcGVuZChidWYpOwotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IENvbXBvbmVudDo6Z2V0R0xTTFR5cGUoKSBjb25zdAogewogICAgIGlmIChtVHlwZSA9PSBSU19UWVBFX1NJR05FRF8zMikgewpAQCAtMjk4LDYgKzIzNCw3IEBACiAgICAgIlUxNiIsCiAgICAgIlUzMiIsCiAgICAgIlU2NCIsCisgICAgIkJPT0xFQU4iLAogICAgICJVUF81NjUiLAogICAgICJVUF81NTUxIiwKICAgICAiVVBfNDQ0NCIsCkBAIC0zMzQsNCArMjcxLDI1IEBACiAgICAgICAgICBwcmVmaXgsIGdUeXBlU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CiB9CiAKK3ZvaWQgQ29tcG9uZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVR5cGUpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbUtpbmQpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1Ob3JtYWxpemVkID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVjdG9yU2l6ZSk7Cit9CisKK3ZvaWQgQ29tcG9uZW50Ojpsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pCit7CisgICAgbVR5cGUgPSAoUnNEYXRhVHlwZSlzdHJlYW0tPmxvYWRVOCgpOworICAgIG1LaW5kID0gKFJzRGF0YUtpbmQpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB1aW50OF90IHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIG1Ob3JtYWxpemVkID0gdGVtcCAhPSAwOworICAgIG1WZWN0b3JTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICBzZXQobVR5cGUsIG1LaW5kLCBtTm9ybWFsaXplZCwgbVZlY3RvclNpemUpOworfQorCisKKwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29tcG9uZW50LmggYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKaW5kZXggNzFkZTMyNC4uYTc3NTA1MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5oCisrKyBiL2xpYnMvcnMvcnNDb21wb25lbnQuaApAQCAtMzUsNyArMzUsNiBAQAogCiAgICAgdWludDMyX3QgZ2V0R0xUeXBlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0R0xGb3JtYXQoKSBjb25zdDsKLSAgICBTdHJpbmc4IGdldENUeXBlKCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSgpIGNvbnN0OwogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKIApAQCAtNDgsNiArNDcsMTIgQEAKICAgICBib29sIGdldElzU2lnbmVkKCkgY29uc3Qge3JldHVybiBtSXNTaWduZWQ7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAorICAgIC8vIEhlbHBlcnMgZm9yIHJlYWRpbmcgLyB3cml0aW5nIHRoaXMgY2xhc3Mgb3V0CisgICAgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2b2lkIGxvYWRGcm9tU3RyZWFtKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICBib29sIGlzUmVmZXJlbmNlKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICBSc0RhdGFUeXBlIG1UeXBlOwogICAgIFJzRGF0YUtpbmQgbUtpbmQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5jcHAgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKaW5kZXggNTk2ZjUzMy4uMmE5NDY1MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuY3BwCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTEyNywxOSArMTI4LDIxIEBACiB9CiAKIAotdWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpCit1aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzKQogewogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBmcmFnKG1GcmFnbWVudCk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiB2dHgobVZlcnRleCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiByYXN0ZXIobVJhc3Rlcik7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBmb250KG1Gb250KTsKIAotICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzLCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMpOwogCiAgICAgbUZyYWdtZW50LnNldChmcmFnKTsKICAgICBtVmVydGV4LnNldCh2dHgpOwogICAgIG1GcmFnbWVudFN0b3JlLnNldChzdG9yZSk7CiAgICAgbVJhc3Rlci5zZXQocmFzdGVyKTsKKyAgICBtRm9udC5zZXQoZm9udCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTUzLDI5ICsxNTYsMTEgQEAKIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwogICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewpAQCAtMjc0LDYgKzI1OSwyNCBAQAogICAgIHJldHVybiAwICE9IHN0cmNtcChidWYsICIwIik7CiB9CiAKK3ZvaWQgQ29udGV4dDo6ZGlzcGxheURlYnVnU3RhdHMoKQoreworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3ByaW50ZihidWZmZXIsICJGcmFtZSAlaSBtcywgU2NyaXB0ICVpIG1zIiwgbVRpbWVNU0xhc3RGcmFtZSwgbVRpbWVNU0xhc3RTY3JpcHQpOworICAgIGZsb2F0IG9sZFIsIG9sZEcsIG9sZEIsIG9sZEE7CisgICAgbVN0YXRlRm9udC5nZXRGb250Q29sb3IoJm9sZFIsICZvbGRHLCAmb2xkQiwgJm9sZEEpOworCisgICAgZmxvYXQgc2hhZG93Q29sID0gMC4yZjsKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihzaGFkb3dDb2wsIHNoYWRvd0NvbCwgc2hhZG93Q29sLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCA1LCBnZXRIZWlnaHQoKSAtIDUpOworCisgICAgZmxvYXQgdGV4dENvbCA9IDAuOWY7CisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3IodGV4dENvbCwgdGV4dENvbCwgdGV4dENvbCwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgNCwgZ2V0SGVpZ2h0KCkgLSA2KTsKKworICAgIG1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKG9sZFIsIG9sZEcsIG9sZEIsIG9sZEEpOworfQorCiB2b2lkICogQ29udGV4dDo6dGhyZWFkUHJvYyh2b2lkICp2cnNjKQogewogICAgICBDb250ZXh0ICpyc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpAQCAtMjg2LDYgKzI4OSw3IEBACiAgICAgIHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zY3JpcHQiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nT2JqZWN0cyA9IGdldFByb3AoImRlYnVnLnJzLm9iamVjdCIpOwogICAgICByc2MtPnByb3BzLm1Mb2dTaGFkZXJzID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCA9IGdldFByb3AoImRlYnVnLnJzLnZpc3VhbCIpOwogCiAgICAgIFNjcmlwdFRMU1N0cnVjdCAqdGxzU3RydWN0ID0gbmV3IFNjcmlwdFRMU1N0cnVjdDsKICAgICAgaWYgKCF0bHNTdHJ1Y3QpIHsKQEAgLTMwMCwxNCArMzA0LDE2IEBACiAgICAgIH0KIAogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKLSAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFJhc3RlcihOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFZlcnRleChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShOVUxMKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5pbml0KHJzYyk7CisgICAgICAgICByc2MtPnNldEZvbnQoTlVMTCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleEFycmF5LmluaXQocnNjKTsKICAgICAgfQogCkBAIC0zMjEsNiArMzI3LDExIEBACiAgICAgICAgICB1aW50MzJfdCB0YXJnZXRUaW1lID0gMDsKICAgICAgICAgIGlmIChtRHJhdyAmJiByc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgICAgIHRhcmdldFRpbWUgPSByc2MtPnJ1blJvb3RTY3JpcHQoKTsKKworICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCkgeworICAgICAgICAgICAgICAgICByc2MtPmRpc3BsYXlEZWJ1Z1N0YXRzKCk7CisgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgbURyYXcgPSB0YXJnZXRUaW1lICYmICFyc2MtPm1QYXVzZWQ7CiAgICAgICAgICAgICAgcnNjLT50aW1lclNldChSU19USU1FUl9DTEVBUl9TV0FQKTsKICAgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhyc2MtPm1FR0wubURpc3BsYXksIHJzYy0+bUVHTC5tU3VyZmFjZSk7CkBAIC0zNDYsMTEgKzM1NywxMyBAQAogICAgICAgICAgcnNjLT5tRnJhZ21lbnQuY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bVZlcnRleC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOworICAgICAgICAgcnNjLT5tRm9udC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tUm9vdFNjcmlwdC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuZGVpbml0KHJzYyk7CisgICAgICAgICByc2MtPm1TdGF0ZUZvbnQuZGVpbml0KHJzYyk7CiAgICAgIH0KICAgICAgT2JqZWN0QmFzZTo6emVyb0FsbFVzZXJSZWYocnNjKTsKIApAQCAtMzY3LDYgKzM4MCw0OSBAQAogICAgICByZXR1cm4gTlVMTDsKIH0KIAordm9pZCAqIENvbnRleHQ6OmhlbHBlclRocmVhZFByb2Modm9pZCAqdnJzYykKK3sKKyAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKKyAgICAgdWludDMyX3QgaWR4ID0gKHVpbnQzMl90KWFuZHJvaWRfYXRvbWljX2luYygmcnNjLT5tV29ya2Vycy5tTGF1bmNoQ291bnQpOworCisgICAgIExPR1YoIlJTIGhlbHBlclRocmVhZCBzdGFydGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisKKyAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLmluaXQoKTsKKyAgICAgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSA9IGdldHRpZCgpOworCisgICAgIC8vY3B1X3NldF90IGNwc2V0WzE2XTsKKyAgICAgLy9pbnQgcmV0ID0gc2NoZWRfZ2V0YWZmaW5pdHkocnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwgc2l6ZW9mKGNwc2V0KSwgJmNwc2V0KTsKKyAgICAgLy9MT0dFKCJyZXQgPSAlaSIsIHJldCk7CisKKy8vc2NoZWRfc2V0YWZmaW5pdHkKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0sIHJzYy0+bVRocmVhZFByaW9yaXR5KTsKKyAgICAgd2hpbGUocnNjLT5tUnVubmluZykgeworICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLndhaXQoKTsKKyAgICAgICAgIGlmIChyc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjaykgeworICAgICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2socnNjLT5tV29ya2Vycy5tTGF1bmNoRGF0YSwgaWR4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGFuZHJvaWRfYXRvbWljX2RlYygmcnNjLT5tV29ya2Vycy5tUnVubmluZ0NvdW50KTsKKyAgICAgICAgIHJzYy0+bVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLnNldCgpOworICAgICB9CisKKyAgICAgTE9HVigiUlMgaGVscGVyVGhyZWFkIGV4aXRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDb250ZXh0OjpsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKQoreworICAgIG1Xb3JrZXJzLm1MYXVuY2hEYXRhID0gZGF0YTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBjYms7CisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IChpbnQpbVdvcmtlcnMubUNvdW50OworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tjdF0uc2V0KCk7CisgICAgfQorICAgIHdoaWxlKG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpIHsKKyAgICAgICAgbVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLndhaXQoKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6c2V0UHJpb3JpdHkoaW50MzJfdCBwKQogewogICAgIC8vIE5vdGU6IElmIHdlIHB1dCB0aGlzIGluIHRoZSBwcm9wZXIgImJhY2tncm91bmQiIHBvbGljeQpAQCAtMzgzLDcgKzQzOSwxMCBAQAogICAgICAgICAvLyBzdWNjZXNzOyByZXNldCB0aGUgcHJpb3JpdHkgYXMgd2VsbAogICAgIH0KICNlbHNlCi0gICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1OYXRpdmVUaHJlYWRJZCwgcCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtjdF0sIHApOworICAgIH0KICNlbmRpZgogfQogCkBAIC00MzMsMTYgKzQ5MiwzNiBAQAogICAgIHRpbWVySW5pdCgpOwogICAgIHRpbWVyU2V0KFJTX1RJTUVSX0lOVEVSTkFMKTsKIAotICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQiKTsKKyAgICBpbnQgY3B1ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisgICAgTE9HVigiUlMgTGF1bmNoaW5nIHRocmVhZChzKSwgcmVwb3J0ZWQgQ1BVIGNvdW50ICVpIiwgY3B1KTsKKyAgICBpZiAoY3B1IDwgMikgY3B1ID0gMDsKKworICAgIG1Xb3JrZXJzLm1Db3VudCA9ICh1aW50MzJfdCljcHU7CisgICAgbVdvcmtlcnMubVRocmVhZElkID0gKHB0aHJlYWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocHRocmVhZF90KSk7CisgICAgbVdvcmtlcnMubU5hdGl2ZVRocmVhZElkID0gKHBpZF90ICopIGNhbGxvYyhtV29ya2Vycy5tQ291bnQsIHNpemVvZihwaWRfdCkpOworICAgIG1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzID0gbmV3IFNpZ25hbFttV29ya2Vycy5tQ291bnRdOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayA9IE5VTEw7CiAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRJZCwgJnRocmVhZEF0dHIsIHRocmVhZFByb2MsIHRoaXMpOwogICAgIGlmIChzdGF0dXMpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJzIGNvbnRleHQgdGhyZWFkLiIpOworICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgd2hpbGUoIW1SdW5uaW5nKSB7CiAgICAgICAgIHVzbGVlcCgxMDApOwogICAgIH0KIAorICAgIG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQgPSAwOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDb3VudCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmbVdvcmtlcnMubVRocmVhZElkW2N0XSwgJnRocmVhZEF0dHIsIGhlbHBlclRocmVhZFByb2MsIHRoaXMpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBtV29ya2Vycy5tQ291bnQgPSBjdDsKKyAgICAgICAgICAgIExPR0UoIkNyZWF0ZWQgZmV3ZXIgdGhhbiBleHBlY3RlZCBudW1iZXIgb2YgUlMgdGhyZWFkcy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisKICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkQXR0cik7CiB9CiAKQEAgLTQ4NiwxNCArNTY1LDE0IEBACiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbERlc3Ryb3lTdXJmYWNlIiwgcmV0KTsKIAogICAgICAgICBtRUdMLm1TdXJmYWNlID0gTlVMTDsKLSAgICAgICAgbUVHTC5tV2lkdGggPSAwOwotICAgICAgICBtRUdMLm1IZWlnaHQgPSAwOwogICAgICAgICBtV2lkdGggPSAwOwogICAgICAgICBtSGVpZ2h0ID0gMDsKICAgICB9CiAKICAgICBtV25kU3VyZmFjZSA9IHN1cjsKICAgICBpZiAobVduZFN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBtV2lkdGggPSB3OworICAgICAgICBtSGVpZ2h0ID0gaDsKICAgICAgICAgYm9vbCBmaXJzdCA9IGZhbHNlOwogICAgICAgICBpZiAoIW1FR0wubUNvbnRleHQpIHsKICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKQEAgLTUxMSwxNSArNTkwLDcgQEAKICAgICAgICAgcmV0ID0gZWdsTWFrZUN1cnJlbnQobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tQ29udGV4dCk7CiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0KTsKIAotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX1dJRFRILCAmbUVHTC5tV2lkdGgpOwotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgICAgIG1XaWR0aCA9IHc7Ci0gICAgICAgIG1IZWlnaHQgPSBoOwotICAgICAgICBtU3RhdGVWZXJ0ZXgudXBkYXRlU2l6ZSh0aGlzLCB3LCBoKTsKLQotICAgICAgICBpZiAoKGludCltV2lkdGggIT0gbUVHTC5tV2lkdGggfHwgKGludCltSGVpZ2h0ICE9IG1FR0wubUhlaWdodCkgewotICAgICAgICAgICAgTE9HRSgiRUdML1N1cmZhY2UgbWlzbWF0Y2ggIEVHTCAoJWkgeCAlaSkgIFNGICglaSB4ICVpKSIsIG1FR0wubVdpZHRoLCBtRUdMLm1IZWlnaHQsIG1XaWR0aCwgbUhlaWdodCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcyk7CiAKICAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAgICBtR0wubVZlcnNpb24gPSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKQEAgLTU4Myw3ICs2NTQsNyBAQAogICAgIG1Sb290U2NyaXB0LnNldChzKTsKIH0KIAotdm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMpCit2b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICpwZnMpCiB7CiAgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKICAgICBpZiAocGZzID09IE5VTEwpIHsKQEAgLTYyMyw2ICs2OTQsMTYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ29udGV4dDo6c2V0Rm9udChGb250ICpmKQoreworICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBtRm9udC5zZXQobVN0YXRlRm9udC5tRGVmYXVsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZvbnQuc2V0KGYpOworICAgIH0KK30KKwogdm9pZCBDb250ZXh0Ojphc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIHJzQXNzZXJ0KCFvYmotPmdldE5hbWUoKSk7CkBAIC02NDAsMzIgKzcyMSw5IEBACiAgICAgfQogfQogCi1PYmplY3RCYXNlICogQ29udGV4dDo6bG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAotewotICAgIGZvcihzaXplX3QgY3Q9MDsgY3QgPCBtTmFtZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIG1OYW1lc1tjdF0tPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZXNbY3RdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIENvbnRleHQ6OmFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSBOQU1FRF8iKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobU5hbWVzW2N0XS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlaVxuIiwgKGludCltTmFtZXNbY3RdKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KIGJvb2wgQ29udGV4dDo6b2JqRGVzdHJveU9PQkluaXQoKQogewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1PYmpEZXN0cm95Lm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgeworICAgIGlmICghbU9iakRlc3Ryb3kubU11dGV4LmluaXQoKSkgewogICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CSW5pdCBtdXRleCBpbml0IGZhaWx1cmUiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTY3NSw5ICs3MzMsOCBAQAogdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CUnVuKCkKIHsKICAgICBpZiAobU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOworICAgICAgICBpZiAoIW1PYmpEZXN0cm95Lm1NdXRleC5sb2NrKCkpIHsKKyAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yIGxvY2tpbmcgZm9yIE9PQlJ1bi4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02ODYsMzUgKzc0MywyNSBAQAogICAgICAgICB9CiAgICAgICAgIG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdC5jbGVhcigpOwogICAgICAgICBtT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkgPSBmYWxzZTsKLQotICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQlJ1bjogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIH0KKyAgICAgICAgbU9iakRlc3Ryb3kubU11dGV4LnVubG9jaygpOwogICAgIH0KIH0KIAogdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CRGVzdHJveSgpCiB7CiAgICAgcnNBc3NlcnQoIW1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtT2JqRGVzdHJveS5tTXV0ZXgpOwogfQogCiB2b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lBZGQoT2JqZWN0QmFzZSAqb2JqKQogewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKKyAgICBpZiAoIW1PYmpEZXN0cm95Lm1NdXRleC5sb2NrKCkpIHsKKyAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQlJ1bjogZXJyb3IgbG9ja2luZyBmb3IgT09CUnVuLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuYWRkKG9iaik7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KKyAgICBtT2JqRGVzdHJveS5tTXV0ZXgudW5sb2NrKCk7CiB9CiAKIHVpbnQzMl90IENvbnRleHQ6OmdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCkKQEAgLTc1MSwxNSArNzk4LDE5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCF3YWl0Rm9yU3BhY2UpIHsKLSAgICAgICAgaWYgKG1JTy5tVG9DbGllbnQuZ2V0RnJlZVNwYWNlKCkgPCBsZW4pIHsKKyAgICAgICAgaWYgKG1JTy5tVG9DbGllbnQuZ2V0RnJlZVNwYWNlKCkgPD0gKGxlbiArIDgpKSB7CiAgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHJvb20sIGFuZCBub3Qgd2FpdGluZy4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICAvL0xPR0UoInNlbmRNZXNzYWdlVG9DbGllbnQgMiIpOwotICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKLSAgICBtZW1jcHkocCwgZGF0YSwgbGVuKTsKLSAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICB2b2lkICpwID0gbUlPLm1Ub0NsaWVudC5yZXNlcnZlKGxlbik7CisgICAgICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgMCk7CisgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAzIik7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC03OTksOCArODUwLDcgQEAKICAgICBMT0dFKCJSUyBDb250ZXh0IGRlYnVnIik7CiAKICAgICBMT0dFKCIgRUdMIHZlciAlaSAlaSIsIG1FR0wubU1ham9yVmVyc2lvbiwgbUVHTC5tTWlub3JWZXJzaW9uKTsKLSAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICB3PSVpIGg9JWkgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LAotICAgICAgICAgbUVHTC5tU3VyZmFjZSwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbUVHTC5tRGlzcGxheSk7CisgICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsIG1FR0wubVN1cmZhY2UsIG1FR0wubURpc3BsYXkpOwogICAgIExPR0UoIiBHTCB2ZW5kb3I6ICVzIiwgbUdMLm1WZW5kb3IpOwogICAgIExPR0UoIiBHTCByZW5kZXJlcjogJXMiLCBtR0wubVJlbmRlcmVyKTsKICAgICBMT0dFKCIgR0wgVmVyc2lvbjogJXMiLCBtR0wubVZlcnNpb24pOwpAQCAtODIyLDYgKzg3Miw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfQ29udGV4dEZpbmlzaChDb250ZXh0ICpyc2MpCit7Cit9CiAKIHZvaWQgcnNpX0NvbnRleHRCaW5kUm9vdFNjcmlwdChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzKQogewpAQCAtODQxLDkgKzg5NCw5IEBACiAgICAgcy0+YmluZFRvQ29udGV4dCgmcnNjLT5tU3RhdGVTYW1wbGVyLCBzbG90KTsKIH0KIAotdm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgdnBmcykKK3ZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtU3RvcmUgdnBmcykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50U3RvcmUgKj4odnBmcyk7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtU3RvcmUgKj4odnBmcyk7CiAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKHBmcyk7CiB9CiAKQEAgLTg2NSwxMiArOTE4LDI0IEBACiAgICAgcnNjLT5zZXRWZXJ0ZXgocHYpOwogfQogCit2b2lkIHJzaV9Db250ZXh0QmluZEZvbnQoQ29udGV4dCAqcnNjLCBSc0ZvbnQgdmZvbnQpCit7CisgICAgRm9udCAqZm9udCA9IHN0YXRpY19jYXN0PEZvbnQgKj4odmZvbnQpOworICAgIHJzYy0+c2V0Rm9udChmb250KTsKK30KKwogdm9pZCByc2lfQXNzaWduTmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKICAgICByc2MtPmFzc2lnbk5hbWUob2IsIG5hbWUsIGxlbik7CiB9CiAKK3ZvaWQgcnNpX0dldE5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKyAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKKyAgICAoKm5hbWUpID0gb2ItPmdldE5hbWUoKTsKK30KKwogdm9pZCByc2lfT2JqRGVzdHJveShDb250ZXh0ICpyc2MsIHZvaWQgKm9iaikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0LmggYi9saWJzL3JzL3JzQ29udGV4dC5oCmluZGV4IDcwOTczMGUuLjJkYTNhYjUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmgKKysrIGIvbGlicy9ycy9yc0NvbnRleHQuaApAQCAtMTgsMTIgKzE4LDEyIEBACiAjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9ICiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNNdXRleC5oIgogCiAjaW5jbHVkZSAicnNUaHJlYWRJTy5oIgogI2luY2x1ZGUgInJzVHlwZS5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCiAjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCi0jaW5jbHVkZSAicnNTaW1wbGVNZXNoLmgiCiAjaW5jbHVkZSAicnNNZXNoLmgiCiAjaW5jbHVkZSAicnNEZXZpY2UuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKQEAgLTMxLDggKzMxLDkgQEAKICNpbmNsdWRlICJyc0FkYXB0ZXIuaCIKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKICNpbmNsdWRlICJyc0xpZ2h0LmgiCisjaW5jbHVkZSAicnNGb250LmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKICNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCkBAIC02NCwxNyArNjUsMTkgQEAKICAgICAgICAgU2NyaXB0ICogbVNjcmlwdDsKICAgICB9OwogCisgICAgdHlwZWRlZiB2b2lkICgqV29ya2VyQ2FsbGJhY2tfdCkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpOwogCiAgICAgLy9TdHJ1Y3R1cmVkQWxsb2NhdGlvbkNvbnRleHQgbVN0YXRlQWxsb2NhdGlvbjsKICAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKICAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKICAgICBTYW1wbGVyU3RhdGUgbVN0YXRlU2FtcGxlcjsKICAgICBQcm9ncmFtRnJhZ21lbnRTdGF0ZSBtU3RhdGVGcmFnbWVudDsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUgbVN0YXRlUmFzdGVyOwogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSBtU3RhdGVWZXJ0ZXg7CiAgICAgTGlnaHRTdGF0ZSBtU3RhdGVMaWdodDsKICAgICBWZXJ0ZXhBcnJheVN0YXRlIG1TdGF0ZVZlcnRleEFycmF5OworICAgIEZvbnRTdGF0ZSBtU3RhdGVGb250OwogCiAgICAgU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOwogICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKQEAgLTg0LDE0ICs4NywxNiBAQAogICAgIHZvaWQgc2V0UmFzdGVyKFByb2dyYW1SYXN0ZXIgKik7CiAgICAgdm9pZCBzZXRWZXJ0ZXgoUHJvZ3JhbVZlcnRleCAqKTsKICAgICB2b2lkIHNldEZyYWdtZW50KFByb2dyYW1GcmFnbWVudCAqKTsKLSAgICB2b2lkIHNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKik7CisgICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSAqKTsKKyAgICB2b2lkIHNldEZvbnQoRm9udCAqKTsKIAogICAgIHZvaWQgdXBkYXRlU3VyZmFjZSh2b2lkICpzdXIpOwogCiAgICAgY29uc3QgUHJvZ3JhbUZyYWdtZW50ICogZ2V0RnJhZ21lbnQoKSB7cmV0dXJuIG1GcmFnbWVudC5nZXQoKTt9Ci0gICAgY29uc3QgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBnZXRGcmFnbWVudFN0b3JlKCkge3JldHVybiBtRnJhZ21lbnRTdG9yZS5nZXQoKTt9CisgICAgY29uc3QgUHJvZ3JhbVN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQogICAgIGNvbnN0IFByb2dyYW1SYXN0ZXIgKiBnZXRSYXN0ZXIoKSB7cmV0dXJuIG1SYXN0ZXIuZ2V0KCk7fQogICAgIGNvbnN0IFByb2dyYW1WZXJ0ZXggKiBnZXRWZXJ0ZXgoKSB7cmV0dXJuIG1WZXJ0ZXguZ2V0KCk7fQorICAgIEZvbnQgKiBnZXRGb250KCkge3JldHVybiBtRm9udC5nZXQoKTt9CiAKICAgICBib29sIHNldHVwQ2hlY2soKTsKICAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBtRUdMLm1TdXJmYWNlICE9IDA7fQpAQCAtMTAzLDEyICsxMDgsMTAgQEAKIAogICAgIHZvaWQgYXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbik7CiAgICAgdm9pZCByZW1vdmVOYW1lKE9iamVjdEJhc2UgKm9iaik7Ci0gICAgT2JqZWN0QmFzZSAqIGxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7Ci0gICAgdm9pZCBhcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0OwogCiAgICAgdWludDMyX3QgZ2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KTsKICAgICBib29sIHNlbmRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgdWludDMyX3QgY21kSUQsIHNpemVfdCBsZW4sIGJvb2wgd2FpdEZvclNwYWNlKTsKLSAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcyk7CiAKICAgICB2b2lkIGluaXRUb0NsaWVudCgpOwogICAgIHZvaWQgZGVpbml0VG9DbGllbnQoKTsKQEAgLTExOSwxNSArMTIyLDE4IEBACiAgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlVmVydGV4Lm1EZWZhdWx0LmdldCgpOwogICAgIH0KLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnRTdG9yZSgpIGNvbnN0IHsKKyAgICBQcm9ncmFtU3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbVN0b3JlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlRnJhZ21lbnRTdG9yZS5tRGVmYXVsdC5nZXQoKTsKICAgICB9CiAgICAgUHJvZ3JhbVJhc3RlciAqIGdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlUmFzdGVyLm1EZWZhdWx0LmdldCgpOwogICAgIH0KKyAgICBGb250KiBnZXREZWZhdWx0Rm9udCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZUZvbnQubURlZmF1bHQuZ2V0KCk7CisgICAgfQogCi0gICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1FR0wubVdpZHRoO30KLSAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1FR0wubUhlaWdodDt9CisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtSGVpZ2h0O30KIAogCiAgICAgVGhyZWFkSU8gbUlPOwpAQCAtMTU2LDE3ICsxNjIsMjEgQEAKICAgICAgICAgYm9vbCBtTG9nU2NyaXB0czsKICAgICAgICAgYm9vbCBtTG9nT2JqZWN0czsKICAgICAgICAgYm9vbCBtTG9nU2hhZGVyczsKKyAgICAgICAgYm9vbCBtTG9nVmlzdWFsOwogICAgIH0gcHJvcHM7CiAKICAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0OwogICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKiBnZXRFcnJvcihSc0Vycm9yICopOwotICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cpOworICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKTsKIAogICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOwogCiAgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQogCisgICAgdm9pZCBsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKTsKKyAgICB1aW50MzJfdCBnZXRXb3JrZXJQb29sU2l6ZSgpIGNvbnN0IHtyZXR1cm4gKHVpbnQzMl90KW1Xb3JrZXJzLm1SdW5uaW5nQ291bnQ7fQorCiBwcm90ZWN0ZWQ6CiAgICAgRGV2aWNlICptRGV2OwogCkBAIC0xNzcsOCArMTg3LDYgQEAKICAgICAgICAgRUdMQ29uZmlnIG1Db25maWc7CiAgICAgICAgIEVHTENvbnRleHQgbUNvbnRleHQ7CiAgICAgICAgIEVHTFN1cmZhY2UgbVN1cmZhY2U7Ci0gICAgICAgIEVHTGludCBtV2lkdGg7Ci0gICAgICAgIEVHTGludCBtSGVpZ2h0OwogICAgICAgICBFR0xEaXNwbGF5IG1EaXNwbGF5OwogICAgIH0gbUVHTDsKIApAQCAtMjE5LDE1ICsyMjcsMjkgQEAKICAgICBwdGhyZWFkX3QgbVRocmVhZElkOwogICAgIHBpZF90IG1OYXRpdmVUaHJlYWRJZDsKIAorICAgIHN0cnVjdCBXb3JrZXJzIHsKKyAgICAgICAgdm9sYXRpbGUgaW50IG1SdW5uaW5nQ291bnQ7CisgICAgICAgIHZvbGF0aWxlIGludCBtTGF1bmNoQ291bnQ7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgcHRocmVhZF90ICptVGhyZWFkSWQ7CisgICAgICAgIHBpZF90ICptTmF0aXZlVGhyZWFkSWQ7CisgICAgICAgIFNpZ25hbCBtQ29tcGxldGVTaWduYWw7CisKKyAgICAgICAgU2lnbmFsICptTGF1bmNoU2lnbmFsczsKKyAgICAgICAgV29ya2VyQ2FsbGJhY2tfdCBtTGF1bmNoQ2FsbGJhY2s7CisgICAgICAgIHZvaWQgKm1MYXVuY2hEYXRhOworICAgIH07CisgICAgV29ya2VycyBtV29ya2VyczsKKwogICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0PiBtUm9vdFNjcmlwdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZyYWdtZW50OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotCisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRm9udDsKIAogICAgIHN0cnVjdCBPYmpEZXN0cm95T09CIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICAgICAgTXV0ZXggbU11dGV4OwogICAgICAgICBWZWN0b3I8T2JqZWN0QmFzZSAqPiBtRGVzdHJveUxpc3Q7CiAgICAgICAgIGJvb2wgbU5lZWRUb0VtcHR5OwogICAgIH07CkBAIC0yMzYsNiArMjU4LDggQEAKICAgICB2b2lkIG9iakRlc3Ryb3lPT0JSdW4oKTsKICAgICB2b2lkIG9iakRlc3Ryb3lPT0JEZXN0cm95KCk7CiAKKyAgICB2b2lkIGRpc3BsYXlEZWJ1Z1N0YXRzKCk7CisKIHByaXZhdGU6CiAgICAgQ29udGV4dCgpOwogCkBAIC0yNDUsNiArMjY5LDcgQEAKICAgICB1aW50MzJfdCBydW5Sb290U2NyaXB0KCk7CiAKICAgICBzdGF0aWMgdm9pZCAqIHRocmVhZFByb2Modm9pZCAqKTsKKyAgICBzdGF0aWMgdm9pZCAqIGhlbHBlclRocmVhZFByb2Modm9pZCAqKTsKIAogICAgIEFOYXRpdmVXaW5kb3cgKm1XbmRTdXJmYWNlOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmggYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNzYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorLy8jaW5jbHVkZSAicnNNdXRleC5oIgorCisvLyNpbmNsdWRlICJyc1RocmVhZElPLmgiCisjaW5jbHVkZSAicnNUeXBlLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc01lc2guaCIKKy8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNBZGFwdGVyLmgiCisjaW5jbHVkZSAicnNTYW1wbGVyLmgiCisjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CisgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKworICAgIC8vU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOworICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKKworCisgICAgLy9ib29sIHNldHVwQ2hlY2soKTsKKyAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CisKKyAgICBQcm9ncmFtRnJhZ21lbnQgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICAvLyBUaW1lcnMKKyAgICBlbnVtIFRpbWVycyB7CisgICAgICAgIFJTX1RJTUVSX0lETEUsCisgICAgICAgIFJTX1RJTUVSX0lOVEVSTkFMLAorICAgICAgICBSU19USU1FUl9TQ1JJUFQsCisgICAgICAgIFJTX1RJTUVSX0NMRUFSX1NXQVAsCisgICAgICAgIF9SU19USU1FUl9UT1RBTAorICAgIH07CisKKyAgICBib29sIGNoZWNrVmVyc2lvbjFfMSgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKworICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wgbUxvZ1RpbWVzOworICAgICAgICBib29sIG1Mb2dTY3JpcHRzOworICAgICAgICBib29sIG1Mb2dPYmplY3RzOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorCitwcm90ZWN0ZWQ6CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlbmRvcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1SZW5kZXJlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZXJzaW9uOworICAgICAgICBjb25zdCB1aW50OF90ICogbUV4dGVuc2lvbnM7CisKKyAgICAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgbU1pbm9yVmVyc2lvbjsKKworICAgICAgICBpbnQzMl90IG1NYXhWYXJ5aW5nVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczsKKworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhBdHRyaWJzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOworCisgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICB9IG1HTDsKKworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRGV2aWNlLmNwcCBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCmluZGV4IGI2NzBhZDQuLmE5NmIxMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwCisrKyBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICovCiAKICNpbmNsdWRlICJyc0RldmljZS5oIgorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzMsNyArMzcsNyBAQAogCiB2b2lkIERldmljZTo6YWRkQ29udGV4dChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbUNvbnRleHRzLmFkZChyc2MpOworICAgIG1Db250ZXh0cy5wdXNoKHJzYyk7CiB9CiAKIHZvaWQgRGV2aWNlOjpyZW1vdmVDb250ZXh0KENvbnRleHQgKnJzYykKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcCBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcAppbmRleCA2Mjg4YmM0Li41ZGVlMWZiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCkBAIC0xNCw5ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjksNiArMzQsNyBAQAogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiAKQEAgLTQ4LDYgKzU0LDcgQEAKICAgICBkZWxldGUgW10gbUZpZWxkczsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiBzaXplX3QgRWxlbWVudDo6Z2V0U2l6ZUJpdHMoKSBjb25zdApAQCAtNjMsMTUgKzcwLDYgQEAKICAgICByZXR1cm4gdG90YWw7CiB9CiAKLXNpemVfdCBFbGVtZW50OjpnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdAotewotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGNvbXBvbmVudE51bWJlcjsgY3QrKykgewotICAgICAgICBvZmZzZXQgKz0gbUZpZWxkc1tjdF0uZS0+bUJpdHM7Ci0gICAgfQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KIHZvaWQgRWxlbWVudDo6ZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdAogewogICAgIE9iamVjdEJhc2U6OmR1bXBMT0dWKHByZWZpeCk7CkBAIC04Myw2ICs4MSw5OCBAQAogICAgIH0KIH0KIAordm9pZCBFbGVtZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICBtQ29tcG9uZW50LnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgLy8gTm93IHNlcmlhbGl6ZSBhbGwgdGhlIGZpZWxkcworICAgIHN0cmVhbS0+YWRkVTMyKG1GaWVsZENvdW50KTsKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IG1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZtRmllbGRzW2N0XS5uYW1lKTsKKyAgICAgICAgbUZpZWxkc1tjdF0uZS0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgfQorfQorCitFbGVtZW50ICpFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVCkgeworICAgICAgICBMT0dFKCJlbGVtZW50IGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgRWxlbWVudCAqZWxlbSA9IG5ldyBFbGVtZW50KHJzYyk7CisgICAgZWxlbS0+bUNvbXBvbmVudC5sb2FkRnJvbVN0cmVhbShzdHJlYW0pOworICAgIGVsZW0tPm1CaXRzID0gZWxlbS0+bUNvbXBvbmVudC5nZXRCaXRzKCk7CisgICAgZWxlbS0+bUhhc1JlZmVyZW5jZSA9IGVsZW0tPm1Db21wb25lbnQuaXNSZWZlcmVuY2UoKTsKKworICAgIGVsZW0tPm1GaWVsZENvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZWxlbS0+bUZpZWxkQ291bnQpIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZWxlbS0+bUZpZWxkcyA9IG5ldyBFbGVtZW50RmllbGRfdCBbZWxlbS0+bUZpZWxkQ291bnRdOworICAgICAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGVsZW0tPm1GaWVsZENvdW50OyBjdCArKykgeworICAgICAgICAgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZlbGVtLT5tRmllbGRzW2N0XS5uYW1lKTsKKyAgICAgICAgICAgIEVsZW1lbnQgKmZpZWxkRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0uZS5zZXQoZmllbGRFbGVtKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLm9mZnNldEJpdHMgPSBvZmZzZXQ7CisgICAgICAgICAgICBvZmZzZXQgKz0gZmllbGRFbGVtLT5nZXRTaXplQml0cygpOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb3VyIHN1Yi1lbGVtZW50cyBoYXZlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIGlmKGZpZWxkRWxlbS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIGVsZW0tPm1IYXNSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGFscmVhZHkgZXhpc3RzCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIEVsZW1lbnQgKmVlID0gcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50c1tjdF07CisKKyAgICAgICAgaWYgKCFlZS0+Z2V0RmllbGRDb3VudCgpICkgeworCisgICAgICAgICAgICBpZigoZWUtPmdldENvbXBvbmVudCgpLmdldFR5cGUoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldEtpbmQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIE1hdGNoCisgICAgICAgICAgICAgICAgZGVsZXRlIGVsZW07CisgICAgICAgICAgICAgICAgZWUtPmluY1VzZXJSZWYoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChlZS0+Z2V0RmllbGRDb3VudCgpID09IGVsZW0tPm1GaWVsZENvdW50KSB7CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBlbGVtLT5tRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChlZS0+bUZpZWxkc1tpXS5lLmdldCgpICE9IGVsZW0tPm1GaWVsZHNbaV0uZS5nZXQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBlbGVtLT5tRmllbGRzW2ldLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZWxlbSk7CisgICAgcmV0dXJuIGVsZW07Cit9CisKIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpCkBAIC0xMDQsNiArMTk0LDcgQEAKICAgICBFbGVtZW50ICplID0gbmV3IEVsZW1lbnQocnNjKTsKICAgICBlLT5tQ29tcG9uZW50LnNldChkdCwgZGssIGlzTm9ybSwgdmVjU2l6ZSk7CiAgICAgZS0+bUJpdHMgPSBlLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlLT5tSGFzUmVmZXJlbmNlID0gZS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOwogICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlKTsKICAgICByZXR1cm4gZTsKIH0KQEAgLTEzNCw1NCArMjI1LDIyIEBACiAgICAgRWxlbWVudCAqZSA9IG5ldyBFbGVtZW50KHJzYyk7CiAgICAgZS0+bUZpZWxkcyA9IG5ldyBFbGVtZW50RmllbGRfdCBbY291bnRdOwogICAgIGUtPm1GaWVsZENvdW50ID0gY291bnQ7CisgICAgc2l6ZV90IGJpdHMgPSAwOwogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKICAgICAgICAgZS0+bUZpZWxkc1tjdF0uZS5zZXQoZWluW2N0XSk7CiAgICAgICAgIGUtPm1GaWVsZHNbY3RdLm5hbWUuc2V0VG8obmluW2N0XSwgbGVuZ3Roc1tjdF0pOworICAgICAgICBlLT5tRmllbGRzW2N0XS5vZmZzZXRCaXRzID0gYml0czsKKyAgICAgICAgYml0cyArPSBlaW5bY3RdLT5nZXRTaXplQml0cygpOworCisgICAgICAgIGlmIChlaW5bY3RdLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBlLT5tSGFzUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlKTsKICAgICByZXR1cm4gZTsKIH0KIAotU3RyaW5nOCBFbGVtZW50OjpnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBzaTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgaW5kZW50OyBjdCsrKSB7Ci0gICAgICAgIHNpLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIFN0cmluZzggcyhzaSk7Ci0gICAgcy5hcHBlbmQoIntcbiIpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1GaWVsZENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHMuYXBwZW5kKHNpKTsKLSAgICAgICAgcy5hcHBlbmQobUZpZWxkc1tjdF0uZS0+Z2V0Q1R5cGUoaW5kZW50KzQpKTsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy5hcHBlbmQobUZpZWxkc1tjdF0ubmFtZSk7Ci0gICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy5hcHBlbmQoc2kpOwotICAgIHMuYXBwZW5kKCJ9Iik7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLVN0cmluZzggRWxlbWVudDo6Z2V0Q1R5cGUodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggczsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgaW5kZW50OyBjdCsrKSB7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgaWYgKCFtRmllbGRDb3VudCkgewotICAgICAgICAvLyBCYXNpYyBjb21wb25lbnQuCi0gICAgICAgIHMuYXBwZW5kKG1Db21wb25lbnQuZ2V0Q1R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgcy5hcHBlbmQoZ2V0Q1N0cnVjdEJvZHkoaW5kZW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci19Ci0KIFN0cmluZzggRWxlbWVudDo6Z2V0R0xTTFR5cGUodWludDMyX3QgaW5kZW50KSBjb25zdAogewogICAgIFN0cmluZzggczsKQEAgLTIwMSw2ICsyNjAsNDMgQEAKICAgICByZXR1cm4gczsKIH0KIAordm9pZCBFbGVtZW50OjppbmNSZWZzKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKK3sKKyAgICBpZiAoIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKmNvbnN0Km9icCA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKmNvbnN0Kj4ocHRyKTsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKm9iID0gb2JwWzBdOworICAgICAgICAgICAgb2ItPmluY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmluY1JlZnMoJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbGVtZW50OjpkZWNSZWZzKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKK3sKKyAgICBpZiAoIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKmNvbnN0Km9icCA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKmNvbnN0Kj4ocHRyKTsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKm9iID0gb2JwWzBdOworICAgICAgICAgICAgb2ItPmRlY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmRlY1JlZnMoJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdKTsKKyAgICAgICAgfQorICAgIH0KK30KIAogCiBFbGVtZW50U3RhdGU6OkVsZW1lbnRTdGF0ZSgpCkBAIC0yNDMsNiArMzM5LDMyIEBACiAgICAgcmV0dXJuIChSc0VsZW1lbnQpZTsKIH0KIAordm9pZCByc2lfRWxlbWVudEdldE5hdGl2ZURhdGEoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmVsZW1EYXRhLCB1aW50MzJfdCBlbGVtRGF0YVNpemUpCit7CisgICAgcnNBc3NlcnQoZWxlbURhdGFTaXplID09IDUpOworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0VHlwZSgpOworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0S2luZCgpOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA/IDEgOiAwOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCk7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldEZpZWxkQ291bnQoKTsKKworfQorCit2b2lkIHJzaV9FbGVtZW50R2V0U3ViRWxlbWVudHMoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmlkcywgY29uc3QgY2hhciAqKm5hbWVzLCB1aW50MzJfdCBkYXRhU2l6ZSkKK3sKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKyAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkgPT0gZGF0YVNpemUpOworCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgaWRzW2ldID0gKHVpbnQzMl90KWUtPmdldEZpZWxkKGkpOworICAgICAgICBuYW1lc1tpXSA9IGUtPmdldEZpZWxkTmFtZShpKTsKKyAgICB9CisKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5oIGIvbGlicy9ycy9yc0VsZW1lbnQuaAppbmRleCAwMmExY2EyLi5iNWRhZDdhMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuaAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5oCkBAIC00MCw5ICs0MCwxMSBAQAogICAgICAgICByZXR1cm4gKGdldFNpemVCaXRzKCkgKyA3KSA+PiAzOwogICAgIH0KIAotICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHM7CisgICAgfQogICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJ5dGVzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKGdldEZpZWxkT2Zmc2V0Qml0cyhjb21wb25lbnROdW1iZXIpICsgNykgPj4gMzsKKyAgICAgICAgcmV0dXJuIG1GaWVsZHNbY29tcG9uZW50TnVtYmVyXS5vZmZzZXRCaXRzID4+IDM7CiAgICAgfQogCiAgICAgdWludDMyX3QgZ2V0RmllbGRDb3VudCgpIGNvbnN0IHtyZXR1cm4gbUZpZWxkQ291bnQ7fQpAQCAtNTQsMTcgKzU2LDIyIEBACiAgICAgUnNEYXRhS2luZCBnZXRLaW5kKCkgY29uc3Qge3JldHVybiBtQ29tcG9uZW50LmdldEtpbmQoKTt9CiAgICAgdWludDMyX3QgZ2V0Qml0cygpIGNvbnN0IHtyZXR1cm4gbUJpdHM7fQogCi0gICAgU3RyaW5nOCBnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDsgfQorICAgIHN0YXRpYyBFbGVtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHN0YXRpYyBjb25zdCBFbGVtZW50ICogY3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSk7CiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBzaXplX3QgY291bnQsIGNvbnN0IEVsZW1lbnQgKiosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3Rocyk7CiAKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICB2b2lkIGRlY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICBib29sIGdldEhhc1JlZmVyZW5jZXMoKSBjb25zdCB7cmV0dXJuIG1IYXNSZWZlcmVuY2U7fQorCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZGVhbGxvY2F0ZSBhbnkgY29tcG9uZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgZWxlbWVudC4KICAgICB2b2lkIGNsZWFyKCk7CkBAIC03Miw5ICs3OSwxMSBAQAogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgU3RyaW5nOCBuYW1lOwogICAgICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IEVsZW1lbnQ+IGU7CisgICAgICAgIHVpbnQzMl90IG9mZnNldEJpdHM7CiAgICAgfSBFbGVtZW50RmllbGRfdDsKICAgICBFbGVtZW50RmllbGRfdCAqbUZpZWxkczsKICAgICBzaXplX3QgbUZpZWxkQ291bnQ7CisgICAgYm9vbCBtSGFzUmVmZXJlbmNlOwogCiAKICAgICBFbGVtZW50KENvbnRleHQgKik7CkBAIC05MCw3ICs5OSw3IEBACiAgICAgfkVsZW1lbnRTdGF0ZSgpOwogCiAgICAgLy8gQ2FjaGUgb2YgYWxsIGV4aXN0aW5nIGVsZW1lbnRzLgotICAgIFZlY3Rvcjxjb25zdCBFbGVtZW50ICo+IG1FbGVtZW50czsKKyAgICBWZWN0b3I8RWxlbWVudCAqPiBtRWxlbWVudHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmNwcCBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcAppbmRleCBlMzI3MmM1Li41NzA5ZjJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCkBAIC0xNSwyOSArMTUsMTU2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAicnNGaWxlQTNELmgiCiAKICNpbmNsdWRlICJyc01lc2guaCIKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotCi0KLUZpbGVBM0Q6OkZpbGVBM0QoKQorRmlsZUEzRDo6RmlsZUEzRChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7Ci0gICAgbVJzYyA9IE5VTEw7CisgICAgbUFsbG9jID0gTlVMTDsKKyAgICBtRGF0YSA9IE5VTEw7CisgICAgbVdyaXRlU3RyZWFtID0gTlVMTDsKKyAgICBtUmVhZFN0cmVhbSA9IE5VTEw7CisKKyAgICBtTWFqb3JWZXJzaW9uID0gMDsKKyAgICBtTWlub3JWZXJzaW9uID0gMTsKKyAgICBtRGF0YVNpemUgPSAwOwogfQogCiBGaWxlQTNEOjp+RmlsZUEzRCgpCiB7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbmRleFtpXTsKKyAgICB9CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1Xcml0ZUluZGV4LnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbVdyaXRlSW5kZXhbaV07CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtUmVhZFN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtQWxsb2MpIHsKKyAgICAgICAgZnJlZShtQWxsb2MpOworICAgIH0KIH0KIAotYm9vbCBGaWxlQTNEOjpsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZikKK3ZvaWQgRmlsZUEzRDo6cGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKQoreworICAgIG1NYWpvclZlcnNpb24gPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtTWlub3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKKworICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICB1aW50MzJfdCBudW1JbmRleEVudHJpZXMgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1JbmRleEVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgQTNESW5kZXhFbnRyeSAqZW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgICAgICBoZWFkZXJTdHJlYW0tPmxvYWRTdHJpbmcoJmVudHJ5LT5tT2JqZWN0TmFtZSk7CisgICAgICAgIExPR0UoIkhlYWRlciBkYXRhLCBlbnRyeSBuYW1lID0gJXMiLCBlbnRyeS0+bU9iamVjdE5hbWUuc3RyaW5nKCkpOworICAgICAgICBlbnRyeS0+bVR5cGUgPSAoUnNBM0RDbGFzc0lEKWhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIH0KKyAgICAgICAgZW50cnktPm1Sc09iaiA9IE5VTEw7CisgICAgICAgIG1JbmRleC5wdXNoKGVudHJ5KTsKKyAgICB9Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIExPR0UoIkxvYWRpbmcgZGF0YS4gU2l6ZTogJXUiLCBsZW5ndGgpOworICAgIGNvbnN0IHVpbnQ4X3QgKmxvY2FsRGF0YSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIHNpemVfdCBsZW5ndGhSZW1haW5pbmcgPSBsZW5ndGg7CisgICAgc2l6ZV90IG1hZ2ljU3RyTGVuID0gMTI7CisgICAgaWYgKChsZW5ndGggPCBtYWdpY1N0ckxlbikgfHwKKyAgICAgICAgbWVtY21wKGRhdGEsICJBbmRyb2lkM0RfZmYiLCBtYWdpY1N0ckxlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxvY2FsRGF0YSArPSBtYWdpY1N0ckxlbjsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gbWFnaWNTdHJMZW47CisKKyAgICAvLyBOZXh0IHdlIGdldCBvdXIgaGVhZGVyIHNpemUKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YoaGVhZGVyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweSgmaGVhZGVyU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YoaGVhZGVyU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihoZWFkZXJTaXplKTsKKworICAgIExPR0UoIkxvYWRpbmcgZGF0YSwgaGVhZGVyU2l6ZSA9ICVsbGkiLCBoZWFkZXJTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KGhlYWRlckRhdGEsIGxvY2FsRGF0YSwgaGVhZGVyU2l6ZSk7CisKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CisKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgbG9jYWxEYXRhICs9IGhlYWRlclNpemU7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IGhlYWRlclNpemU7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YobURhdGFTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgIG1lbWNweSgmbURhdGFTaXplLCBsb2NhbERhdGEsIHNpemVvZihtRGF0YVNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihtRGF0YVNpemUpOworCisgICAgTE9HRSgiTG9hZGluZyBkYXRhLCBtRGF0YVNpemUgPSAlbGxpIiwgbURhdGFTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IG1EYXRhU2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBpZiAoIW1BbGxvYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltQWxsb2M7CisgICAgbWVtY3B5KG1BbGxvYywgbG9jYWxEYXRhLCBtRGF0YVNpemUpOworCisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWxlQTNEOjpsb2FkKEZJTEUgKmYpCiB7CiAgICAgY2hhciBtYWdpY1N0cmluZ1sxMl07CiAgICAgc2l6ZV90IGxlbjsKQEAgLTQ5LDQ3ICsxNzYsMzkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAyIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NYWpvclZlcnNpb24sIDEsIHNpemVvZihtTWFqb3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1ham9yVmVyc2lvbikpIHsKKyAgICAvLyBOZXh0IHRoaW5nIGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBsZW4gPSBmcmVhZCgmaGVhZGVyU2l6ZSwgMSwgc2l6ZW9mKGhlYWRlclNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihoZWFkZXJTaXplKSB8fCBoZWFkZXJTaXplID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAzIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NaW5vclZlcnNpb24sIDEsIHNpemVvZihtTWlub3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1pbm9yVmVyc2lvbikpIHsKKyAgICB1aW50OF90ICpoZWFkZXJEYXRhID0gKHVpbnQ4X3QgKiltYWxsb2MoaGVhZGVyU2l6ZSk7CisgICAgaWYoIWhlYWRlckRhdGEpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiA0Iik7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgbGVuID0gZnJlYWQoJmZsYWdzLCAxLCBzaXplb2YoZmxhZ3MpLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihmbGFncykpIHsKKyAgICBsZW4gPSBmcmVhZChoZWFkZXJEYXRhLCAxLCBoZWFkZXJTaXplLCBmKTsKKyAgICBpZiAobGVuICE9IGhlYWRlclNpemUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKIAotICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisgICAgLy8gTm93IG9wZW4gdGhlIHN0cmVhbSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgSVN0cmVhbSBoZWFkZXJTdHJlYW0oaGVhZGVyRGF0YSwgZmFsc2UpOworICAgIHBhcnNlSGVhZGVyKCZoZWFkZXJTdHJlYW0pOwogCi0gICAgaWYgKG1Vc2U2NEJpdE9mZnNldHMpIHsKLSAgICAgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOwotICAgICAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZ0bXAsIDEsIHNpemVvZih0bXApLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YodG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1EYXRhU2l6ZSA9IHRtcDsKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOworICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1EYXRhU2l6ZSkgfHwgbURhdGFTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIExPR0UoImZpbGUgb3BlbiBzaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CiAKICAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgotICAgIGZzZWVrKGYsIFNFRUtfU0VULCAwKTsKLSAgICBtQWxsb2M9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOwogICAgIGlmICghbUFsbG9jKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05OSwyODIgKzIxOCwyNTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgc3RhcnQgcHJvY2Vzc2luZyIpOwotICAgIHJldHVybiBwcm9jZXNzKHJzYyk7CisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICBMT0dFKCJIZWFkZXIgaXMgcmVhZCBhbiBzdHJlYW0gaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaWxlQTNEOjpwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBib29sIHJldCA9IGZhbHNlOwotICAgIElPIGlvKG1EYXRhICsgaWUtPm1PZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOworc2l6ZV90IEZpbGVBM0Q6OmdldE51bUluZGV4RW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGV4LnNpemUoKTsKK30KIAotICAgIExPR0UoInByb2Nlc3MgaW5kZXgsIHR5cGUgJWkiLCBpZS0+bVR5cGUpOwotCi0gICAgc3dpdGNoKGllLT5tVHlwZSkgewotICAgIGNhc2UgQ0hVTktfRUxFTUVOVDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnQocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19WRVJUSUNJRVM6Ci0gICAgICAgIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19NRVNIOgotICAgICAgICBwcm9jZXNzQ2h1bmtfTWVzaChyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX1BSSU1JVElWRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJGaWxlQTNEIFVua25vd24gY2h1bmsgdHlwZSIpOwotICAgICAgICBicmVhazsKK2NvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKkZpbGVBM0Q6OmdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYoaW5kZXggPCBtSW5kZXguc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtSW5kZXhbaW5kZXhdOwogICAgIH0KLSAgICByZXR1cm4gKGllLT5tUnNPYmogIT0gTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2VzcyhDb250ZXh0ICpyc2MpCi17Ci0gICAgTE9HRSgicHJvY2VzcyIpOwotICAgIElPIGlvKG1EYXRhICsgMTIsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLQotICAgIC8vIEJ1aWxkIHRoZSBpbmRleCBmaXJzdAotICAgIExPR0UoInByb2Nlc3MgMSIpOwotICAgIGlvLmxvYWRVMzIoKTsgLy8gbWFqb3IgdmVyc2lvbiwgYWxyZWFkeSBsb2FkZWQKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1pbm9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgTE9HRSgicHJvY2VzcyAyIik7Ci0KLSAgICBpby5sb2FkVTMyKCk7ICAvLyBmbGFncwotICAgIGlvLmxvYWRPZmZzZXQoKTsgLy8gZmlsZXNpemUsIGFscmVhZHkgbG9hZGVkLgotICAgIExPR0UoInByb2Nlc3MgNCIpOwotICAgIHVpbnQ2NF90IG1JbmRleE9mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLSAgICB1aW50NjRfdCBtU3RyaW5nT2Zmc2V0ID0gaW8ubG9hZE9mZnNldCgpOwotCi0gICAgTE9HRSgicHJvY2VzcyBtSW5kZXhPZmZzZXQ9IDB4JTAxNmxseCIsIG1JbmRleE9mZnNldCk7Ci0gICAgTE9HRSgicHJvY2VzcyBtU3RyaW5nT2Zmc2V0PSAweCUwMTZsbHgiLCBtU3RyaW5nT2Zmc2V0KTsKLQotICAgIElPIGluZGV4KG1EYXRhICsgbUluZGV4T2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBJTyBzdHJpbmdUYWJsZShtRGF0YSArIG1TdHJpbmdPZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotCi0gICAgdWludDMyX3Qgc3RyaW5nRW50cnlDb3VudCA9IHN0cmluZ1RhYmxlLmxvYWRVMzIoKTsKLSAgICBMT0dFKCJzdHJpbmdFbnRyeUNvdW50ICVpIiwgc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ3Muc2V0Q2FwYWNpdHkoc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ0luZGV4VmFsdWVzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIGlmIChzdHJpbmdFbnRyeUNvdW50KSB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ1R5cGUgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoInN0cmluZ1R5cGUgJWkiLCBzdHJpbmdUeXBlKTsKLSAgICAgICAgcnNBc3NlcnQoc3RyaW5nVHlwZT09MCk7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHN0cmluZ0VudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCA9IHN0cmluZ1RhYmxlLmxvYWRPZmZzZXQoKTsKLSAgICAgICAgICAgIExPR0UoInN0cmluZyBvZmZzZXQgMHglMDE2bGx4Iiwgb2Zmc2V0KTsKLSAgICAgICAgICAgIElPIHRtcChtRGF0YSArIG9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICB0bXAubG9hZFN0cmluZygmcyk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgJXMiLCBzLnN0cmluZygpKTsKLSAgICAgICAgICAgIG1TdHJpbmdzLnB1c2gocyk7Ci0gICAgICAgIH0KK09iamVjdEJhc2UgKkZpbGVBM0Q6OmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KSB7CisgICAgaWYoaW5kZXggPj0gbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBMT0dFKCJzdHJpbmdzIGRvbmUiKTsKLSAgICB1aW50MzJfdCBpbmRleEVudHJ5Q291bnQgPSBpbmRleC5sb2FkVTMyKCk7Ci0gICAgTE9HRSgiaW5kZXggY291bnQgJWkiLCBpbmRleEVudHJ5Q291bnQpOwotICAgIG1JbmRleC5zZXRDYXBhY2l0eShpbmRleEVudHJ5Q291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGluZGV4RW50cnlDb3VudDsgY3QrKykgewotICAgICAgICBBM0RJbmRleEVudHJ5IGU7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ0luZGV4ID0gaW5kZXgubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJpbmRleCAlaSIsIGN0KTsKLSAgICAgICAgTE9HRSgiICBzdHJpbmcgaW5kZXggJWkiLCBzdHJpbmdJbmRleCk7Ci0gICAgICAgIGUubVR5cGUgPSAoQTNEQ2h1bmtUeXBlKWluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiICB0eXBlICVpIiwgZS5tVHlwZSk7Ci0gICAgICAgIGUubU9mZnNldCA9IGluZGV4LmxvYWRPZmZzZXQoKTsKLSAgICAgICAgTE9HRSgiICBvZmZzZXQgMHglMDE2bGx4IiwgZS5tT2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3RyaW5nSW5kZXggJiYgKHN0cmluZ0luZGV4IDwgbVN0cmluZ3Muc2l6ZSgpKSkgewotICAgICAgICAgICAgZS5tSUQgPSBtU3RyaW5nc1tzdHJpbmdJbmRleF07Ci0gICAgICAgICAgICBtU3RyaW5nSW5kZXhWYWx1ZXMuZWRpdEl0ZW1BdChzdHJpbmdJbmRleCkgPSBjdDsKLSAgICAgICAgICAgIExPR0UoIiAgaWQgJXMiLCBlLm1JRC5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW5kZXgucHVzaChlKTsKLSAgICB9Ci0gICAgTE9HRSgiaW5kZXggZG9uZSIpOwotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaW5kZXggc2hvdWxkIGJlIGZ1bGx5IHBvcHVsYXRlZC4KLSAgICAvLyBXZSBjYW4gbm93IHdhbGsgdGhvdWdoIGl0IGFuZCBsb2FkIGFsbCB0aGUgb2JqZWN0cy4KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgTE9HRSgicHJvY2Vzc2luZyBpbmRleCBlbnRyeSAlaSIsIGN0KTsKLSAgICAgICAgcHJvY2Vzc0luZGV4KHJzYywgJm1JbmRleC5lZGl0SXRlbUF0KGN0KSk7CisgICAgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBtSW5kZXhbaW5kZXhdOworICAgIGlmKCFlbnRyeSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLUZpbGVBM0Q6OklPOjpJTyhjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCi17Ci0gICAgbURhdGEgPSBidWY7Ci0gICAgbVBvcyA9IDA7Ci0gICAgbVVzZTY0ID0gdXNlNjQ7Ci19Ci0KLXVpbnQ2NF90IEZpbGVBM0Q6OklPOjpsb2FkT2Zmc2V0KCkKLXsKLSAgICB1aW50NjRfdCB0bXA7Ci0gICAgaWYgKG1Vc2U2NCkgewotICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7Ci0gICAgICAgIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgbVBvcyArPSBzaXplb2YodWludDY0X3QpOwotICAgICAgICByZXR1cm4gdG1wOworICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gZW50cnktPm1Sc09iajsKICAgICB9Ci0gICAgcmV0dXJuIGxvYWRVMzIoKTsKLX0KIAotdm9pZCBGaWxlQTNEOjpJTzo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQotewotICAgIExPR0UoImxvYWRTdHJpbmciKTsKLSAgICB1aW50MzJfdCBsZW4gPSBsb2FkVTMyKCk7Ci0gICAgTE9HRSgibG9hZFN0cmluZyBsZW4gJWkiLCBsZW4pOwotICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOwotICAgIG1Qb3MgKz0gbGVuOwotfQotCi0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2ggKiBtID0gbmV3IE1lc2gocnNjKTsKLQotICAgIG0tPm1QcmltaXRpdmVzQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIG0tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbbS0+bVByaW1pdGl2ZXNDb3VudF07Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtLT5tUHJpbWl0aXZlc0NvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgICAgICBtLT5tUHJpbWl0aXZlc1tjdF0gPSAoTWVzaDo6UHJpbWl0aXZlX3QgKiltSW5kZXhbaW5kZXhdLm1Sc09iajsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IG07Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6UHJpbWl0aXZlX3QgKiBwID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OwotCi0gICAgcC0+bUluZGV4Q291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IHZlcnRJZHggPSBpby0+bG9hZFUzMigpOwotICAgIHAtPm1SZXN0YXJ0Q291bnRzID0gaW8tPmxvYWRVMTYoKTsKLSAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgIHAtPm1UeXBlID0gKFJzUHJpbWl0aXZlKWlvLT5sb2FkVTgoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19QcmltaXRpdmUgY291bnQgJWksIGJpdHMgJWkiLCBwLT5tSW5kZXhDb3VudCwgYml0cyk7Ci0KLSAgICBwLT5tVmVydGljaWVzID0gKE1lc2g6OlZlcnRpY2llc190ICopbUluZGV4W3ZlcnRJZHhdLm1Sc09iajsKLQotICAgIHAtPm1JbmRpY2llcyA9IG5ldyB1aW50MTZfdFtwLT5tSW5kZXhDb3VudF07Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bUluZGV4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTgoKTsKKyAgICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2Ygb2JqZWN0CisgICAgbVJlYWRTdHJlYW0tPnJlc2V0KGVudHJ5LT5tT2Zmc2V0KTsKKyAgICBzd2l0Y2ggKGVudHJ5LT5tVHlwZSkgeworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUxNigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMzIoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1SYXN0ZXI6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBTYW1wbGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT046CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9MSUdIVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBMaWdodDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMUQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjJEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7Cit9CisKK2Jvb2wgRmlsZUEzRDo6d3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYobVdyaXRlU3RyZWFtLT5nZXRQb3MoKSA9PSAwKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRklMRSAqd3JpdGVIYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYoIXdyaXRlSGFuZGxlKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IG9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmdcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT3BlbiBhIG5ldyBzdHJlYW0gdG8gbWFrZSB3cml0aW5nIHRoZSBoZWFkZXIgZWFzaWVyCisgICAgT1N0cmVhbSBoZWFkZXJTdHJlYW0oNSoxMDI0LCBmYWxzZSk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWFqb3JWZXJzaW9uKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NaW5vclZlcnNpb24pOworICAgIHVpbnQzMl90IGlzNjRCaXQgPSAwOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoaXM2NEJpdCk7CisKKyAgICB1aW50MzJfdCB3cml0ZUluZGV4U2l6ZSA9IG1Xcml0ZUluZGV4LnNpemUoKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKHdyaXRlSW5kZXhTaXplKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZUluZGV4U2l6ZTsgaSArKykgeworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkU3RyaW5nKCZtV3JpdGVJbmRleFtpXS0+bU9iamVjdE5hbWUpOworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKCh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bVR5cGUpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQpOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bUxlbmd0aCk7CiAgICAgICAgIH0KLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tSW5kaWNpZXNbY3RdKTsKLSAgICB9Ci0KLSAgICBpZiAocC0+bVJlc3RhcnRDb3VudHMpIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gbmV3IHVpbnQxNl90W3AtPm1SZXN0YXJ0Q291bnRzXTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKLSAgICAgICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tUmVzdGFydHNbY3RdKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQ7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1MZW5ndGg7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBOVUxMOwogICAgIH0KIAotICAgIGllLT5tUnNPYmogPSBwOworICAgIC8vIFdyaXRlIG91ciBtYWdpYyBzdHJpbmcgc28gd2Uga25vdyB3ZSBhcmUgcmVhZGluZyB0aGUgcmlnaHQgZmlsZQorICAgIFN0cmluZzggbWFnaWNTdHJpbmcoQTNEX01BR0lDX0tFWSk7CisgICAgZndyaXRlKG1hZ2ljU3RyaW5nLnN0cmluZygpLCBzaXplb2YoY2hhciksIG1hZ2ljU3RyaW5nLnNpemUoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciB0byBtYWtlIGl0IGVhc2llciB0byBwYXJzZSB3aGVuIHdlIHJlYWQgaXQKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gaGVhZGVyU3RyZWFtLmdldFBvcygpOworICAgIGZ3cml0ZSgmaGVhZGVyU2l6ZSwgc2l6ZW9mKGhlYWRlclNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgb3VyIGhlYWRlcgorICAgIGZ3cml0ZShoZWFkZXJTdHJlYW0uZ2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgaGVhZGVyU3RyZWFtLmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiB0aGUgZmlsZSBmb3IgZWFzaWVyIHBhcnNpbmcgbGF0ZXIKKyAgICB1aW50NjRfdCBmaWxlRGF0YVNpemUgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGZ3cml0ZSgmZmlsZURhdGFTaXplLCBzaXplb2YoZmlsZURhdGFTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgZndyaXRlKG1Xcml0ZVN0cmVhbS0+Z2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgaW50IHN0YXR1cyA9IGZjbG9zZSh3cml0ZUhhbmRsZSk7CisKKyAgICBpZihzdGF0dXMgIT0gMCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjbG9zZSBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlZlcnRpY2llc190ICpjdiA9IG5ldyBNZXNoOjpWZXJ0aWNpZXNfdDsKLSAgICBjdi0+bUFsbG9jYXRpb25Db3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgY3YtPm1BbGxvY2F0aW9ucyA9IG5ldyBBbGxvY2F0aW9uICpbY3YtPm1BbGxvY2F0aW9uQ291bnRdOwotICAgIExPR0UoInByb2Nlc3NDaHVua19WZXJ0aWNpZXMgY291bnQgJWkiLCBjdi0+bUFsbG9jYXRpb25Db3VudCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY3YtPm1BbGxvY2F0aW9uQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgaSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgIGN2LT5tQWxsb2NhdGlvbnNbY3RdID0gKEFsbG9jYXRpb24gKiltSW5kZXhbaV0ubVJzT2JqOwotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIGkpOwordm9pZCBGaWxlQTNEOjphcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKSB7CisgICAgaWYoIW9iaikgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGllLT5tUnNPYmogPSBjdjsKLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgLyoKLSAgICByc2lfRWxlbWVudEJlZ2luKHJzYyk7Ci0KLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY291bnQgJWkiLCBjb3VudCk7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgUnNEYXRhS2luZCBkayA9IChSc0RhdGFLaW5kKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgUnNEYXRhVHlwZSBkdCA9IChSc0RhdGFUeXBlKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgYm9vbCBpc05vcm0gPSBpby0+bG9hZFU4KCkgIT0gMDsKLSAgICAgICAgTE9HRSgiICAlaSAlaSAlaSAlaSIsIGRrLCBkdCwgYml0cywgaXNOb3JtKTsKLSAgICAgICAgcnNpX0VsZW1lbnRBZGQocnNjLCBkaywgZHQsIGlzTm9ybSwgYml0cywgMCk7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCBpbml0aWFsU3RyZWFtU2l6ZSA9IDI1NioxMDI0OworICAgICAgICBtV3JpdGVTdHJlYW0gPSBuZXcgT1N0cmVhbShpbml0aWFsU3RyZWFtU2l6ZSwgZmFsc2UpOwogICAgIH0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjcmVhdGUiKTsKLSAgICBpZS0+bVJzT2JqID0gcnNpX0VsZW1lbnRDcmVhdGUocnNjKTsKLSAgICAqLwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotCi0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UgY291bnQgJWksIGluZGV4ICVpIiwgY291bnQsIGluZGV4KTsKLQotICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCltSW5kZXhbaW5kZXhdLm1Sc09iajsKLQotICAgIFJzQWxsb2NhdGlvbiBhID0gcnNpX0FsbG9jYXRpb25DcmVhdGVTaXplZChyc2MsIGUsIGNvdW50KTsKLSAgICBBbGxvY2F0aW9uICogYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOwotCi0gICAgZmxvYXQgKiBkYXRhID0gKGZsb2F0ICopYWxsb2MtPmdldFB0cigpOwotICAgIHdoaWxlKGNvdW50LS0pIHsKLSAgICAgICAgKmRhdGEgPSBpby0+bG9hZEYoKTsKLSAgICAgICAgTE9HRSgiICAlZiIsICpkYXRhKTsKLSAgICAgICAgZGF0YSsrOwotICAgIH0KLSAgICBpZS0+bVJzT2JqID0gYWxsb2M7CisgICAgQTNESW5kZXhFbnRyeSAqaW5kZXhFbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgaW5kZXhFbnRyeS0+bU9iamVjdE5hbWUuc2V0VG8ob2JqLT5nZXROYW1lKCkpOworICAgIGluZGV4RW50cnktPm1UeXBlID0gb2JqLT5nZXRDbGFzc0lkKCk7CisgICAgaW5kZXhFbnRyeS0+bU9mZnNldCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgaW5kZXhFbnRyeS0+bVJzT2JqID0gb2JqOworICAgIG1Xcml0ZUluZGV4LnB1c2goaW5kZXhFbnRyeSk7CisgICAgb2JqLT5zZXJpYWxpemUobVdyaXRlU3RyZWFtKTsKKyAgICBpbmRleEVudHJ5LT5tTGVuZ3RoID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSAtIGluZGV4RW50cnktPm1PZmZzZXQ7CisgICAgbVdyaXRlU3RyZWFtLT5hbGlnbig0KTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKK3ZvaWQgcnNpX0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBpbnQzMl90ICpudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKGZhM2QpIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpudW1FbnRyaWVzID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcywgdWludDMyX3QgbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZpbGVFbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgaWYobnVtRmlsZUVudHJpZXMgIT0gbnVtRW50cmllcyB8fCBudW1FbnRyaWVzID09IDAgfHwgZmlsZUVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIEludmFsaWQgbnVtYmVyIHJlcXVlc3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgY29uc3QgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBmYTNkLT5nZXRJbmRleEVudHJ5KGkpOworICAgICAgICBmaWxlRW50cmllc1tpXS5jbGFzc0lEID0gZW50cnktPmdldFR5cGUoKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSA9IGVudHJ5LT5nZXRPYmplY3ROYW1lKCkuc3RyaW5nKCk7CisgICAgfQorCit9CisKK1JzT2JqZWN0QmFzZSByc2lfRmlsZUEzREdldEVudHJ5QnlJbmRleChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGluZGV4LCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGVudHJ5LiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE9iamVjdEJhc2UgKm9iaiA9IGZhM2QtPmluaXRpYWxpemVGcm9tRW50cnkoaW5kZXgpOworICAgIExPR0UoIlJldHVybmluZyBvYmplY3Qgd2l0aCBuYW1lICVzIiwgb2JqLT5nZXROYW1lKCkpOworCisgICAgcmV0dXJuIG9iajsKK30KKworUnNGaWxlIHJzaV9GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRmlsZSBsb2FkIGZhaWxlZC4gQXNzZXQgc3RyZWFtIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CisKKyAgICBmYTNkLT5sb2FkKGRhdGEsIGxlbik7CisgICAgZmEzZC0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGZhM2Q7Cit9CisKIAogUnNGaWxlIHJzaV9GaWxlT3BlbihDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKnBhdGgsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0gICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEOworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOwogCiAgICAgRklMRSAqZiA9IGZvcGVuKCIvc2RjYXJkL3Rlc3QuYTNkIiwgInJiIik7CiAgICAgaWYgKGYpIHsKLSAgICAgICAgZmEzZC0+bG9hZChyc2MsIGYpOworICAgICAgICBmYTNkLT5sb2FkKGYpOwogICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKICAgICAgICAgcmV0dXJuIGZhM2Q7CiAgICAgfQogICAgIGRlbGV0ZSBmYTNkOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0QuaCBiL2xpYnMvcnMvcnNGaWxlQTNELmgKaW5kZXggOWVlMDhlYy4uYjk4NTkwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuaAorKysgYi9saWJzL3JzL3JzRmlsZUEzRC5oCkBAIC0xOCwyMCArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ICiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLSNpbmNsdWRlICJyc0ZpbGVBM0REZWNscy5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgeworCiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotY2xhc3MgRmlsZUEzRAorY2xhc3MgRmlsZUEzRCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6Ci0gICAgRmlsZUEzRCgpOworICAgIEZpbGVBM0QoQ29udGV4dCAqcnNjKTsKICAgICB+RmlsZUEzRCgpOwogCiAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKQEAgLTQwLDc4ICs0Myw1MyBAQAogICAgIHVpbnQ2NF90IG1TdHJpbmdUYWJsZU9mZnNldDsKICAgICBib29sIG1Vc2U2NEJpdE9mZnNldHM7CiAKLSAgICBzdHJ1Y3QgQTNESW5kZXhFbnRyeSB7Ci0gICAgICAgIFN0cmluZzggbUlEOwotICAgICAgICBBM0RDaHVua1R5cGUgbVR5cGU7CisgICAgY2xhc3MgQTNESW5kZXhFbnRyeSB7CisgICAgICAgIFN0cmluZzggbU9iamVjdE5hbWU7CisgICAgICAgIFJzQTNEQ2xhc3NJRCBtVHlwZTsKICAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdm9pZCAqIG1Sc09iajsKKyAgICAgICAgdWludDY0X3QgbUxlbmd0aDsKKyAgICAgICAgT2JqZWN0QmFzZSAqbVJzT2JqOworICAgIHB1YmxpYzoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZpbGVBM0Q7CisgICAgICAgIGNvbnN0IFN0cmluZzggJmdldE9iamVjdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgUnNBM0RDbGFzc0lEIGdldFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KICAgICB9OwogCi0gICAgYm9vbCBsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZik7CisgICAgYm9vbCBsb2FkKEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHNpemVfdCBnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdDsKKyAgICBjb25zdCBBM0RJbmRleEVudHJ5KiBnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgT2JqZWN0QmFzZSAqaW5pdGlhbGl6ZUZyb21FbnRyeShzaXplX3QgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKTsKKyAgICBib29sIHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgSU8KLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBJTyhjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOwotICAgIAotICAgICAgICBmbG9hdCBsb2FkRigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGZsb2F0IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBsb2FkSTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgaW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBsb2FkVTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MTZfdCBsb2FkVTE2KCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOwotICAgICAgICAgICAgdWludDE2X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGxvYWRVOCgpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOwotICAgICAgICB2b2lkIGxvYWRTdHJpbmcoU3RyaW5nOCAqcyk7Ci0gICAgICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHtyZXR1cm4gbVBvczt9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdDsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKLSAgICAgICAgdWludDY0X3QgbVBvczsKLSAgICAgICAgYm9vbCBtVXNlNjQ7Ci0gICAgfTsKIAotCi0gICAgYm9vbCBwcm9jZXNzKENvbnRleHQgKnJzYyk7Ci0gICAgYm9vbCBwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICopOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOworICAgIHZvaWQgcGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKICAgICB2b2lkICogbUFsbG9jOwogICAgIHVpbnQ2NF90IG1EYXRhU2l6ZTsKLSAgICBDb250ZXh0ICogbVJzYzsKIAotICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5PiBtSW5kZXg7Ci0gICAgVmVjdG9yPFN0cmluZzg+IG1TdHJpbmdzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVN0cmluZ0luZGV4VmFsdWVzOworICAgIE9TdHJlYW0gKm1Xcml0ZVN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1Xcml0ZUluZGV4OwogCisgICAgSVN0cmVhbSAqbVJlYWRTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtSW5kZXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaCBiL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGJkMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ERUNMU19ICi0KLQotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0gICAgZW51bSBBM0RDaHVua1R5cGUgewotICAgICAgICBDSFVOS19FTVBUWSwKLQotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCi0KLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19GSUxFX0EzRF9ICi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzYmVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDcyNyBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1IYXNLZXJuaW5nID0gZmFsc2U7CisgICAgbUZhY2UgPSBOVUxMOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250LmdldExpYigpLCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcl9TaXplKG1GYWNlLCBmb250U2l6ZSAqIDY0LCAwLCBkcGksIDApOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZm9udCBzaXplIG9uICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUhhc0tlcm5pbmcgPSBGVF9IQVNfS0VSTklORyhtRmFjZSk7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKS0+bUlzVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSkKK3sKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgLSBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgc3RhdGUtPmFwcGVuZE1lc2hRdWFkKG5QZW5YLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1heFUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSAtIChpbnQpZ2x5cGgtPm1CaXRtYXBIZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1pblYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWluVSwgZ2x5cGgtPm1CaXRtYXBNaW5WKTsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGlmKCFtSW5pdGlhbGl6ZWQgfHwgbnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcGVuWCA9IHgsIHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZihudW1HbHlwaHMgPiAwKSB7CisgICAgICAgIGdseXBoc0xlZnQgPSBudW1HbHlwaHM7CisgICAgfQorCisgICAgc2l6ZV90IGluZGV4ID0gc3RhcnQ7CisgICAgc2l6ZV90IG5leHRJbmRleCA9IDA7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKworICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSB1dGYzMl9hdCh0ZXh0LCBsZW4sIGluZGV4LCAmbmV4dEluZGV4KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBlbmNvdW50ZXJlZAorICAgICAgICBpZih1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgYXJyYXkKKyAgICAgICAgaW5kZXggPSBuZXh0SW5kZXg7CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVGb3IoKHVpbnQzMl90KXV0ZkNoYXIpOworCisgICAgICAgIGlmKGNhY2hlZEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaCgodWludDMyX3QpdXRmQ2hhcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gSXMgdGhlIGdseXBoIHN0aWxsIGluIHRleHR1cmUgY2FjaGU/CisgICAgICAgIGlmKCFjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIHVwZGF0ZUdseXBoQ2FjaGUoY2FjaGVkR2x5cGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmKGNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZKTsKKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gKGNhY2hlZEdseXBoLT5tQWR2YW5jZS54ID4+IDYpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICAgICAgZ2x5cGhzTGVmdCAtLTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGb250Ojp1cGRhdGVHbHlwaENhY2hlKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpCit7CisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBtRmFjZSwgZ2x5cGgtPm1HbHlwaEluZGV4LCBGVF9MT0FEX1JFTkRFUiApOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IGxvYWQgZ2x5cGguIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbHlwaC0+bUFkdmFuY2UgPSBtRmFjZS0+Z2x5cGgtPmFkdmFuY2U7CisgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gbUZhY2UtPmdseXBoLT5iaXRtYXBfbGVmdDsKKyAgICBnbHlwaC0+bUJpdG1hcFRvcCA9IG1GYWNlLT5nbHlwaC0+Yml0bWFwX3RvcDsKKworICAgIEZUX0JpdG1hcCAqYml0bWFwID0gJm1GYWNlLT5nbHlwaC0+Yml0bWFwOworCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgLy8gTGV0IHRoZSBmb250IHN0YXRlIGZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IHRoZSBiaXRtYXAKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gc3RhdGUtPmNhY2hlQml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisKKyAgICBpZighZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgYml0bWFwLT53aWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgYml0bWFwLT5yb3dzOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5YID0gc3RhcnRYOworICAgIGdseXBoLT5tQml0bWFwTWluWSA9IHN0YXJ0WTsKKyAgICBnbHlwaC0+bUJpdG1hcFdpZHRoID0gYml0bWFwLT53aWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IGJpdG1hcC0+cm93czsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBzdGF0ZS0+Z2V0Q2FjaGVUZXh0dXJlVHlwZSgpLT5nZXREaW1YKCk7CisgICAgdWludDMyX3QgY2FjaGVIZWlnaHQgPSBzdGF0ZS0+Z2V0Q2FjaGVUZXh0dXJlVHlwZSgpLT5nZXREaW1ZKCk7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblUgPSAoZmxvYXQpc3RhcnRYIC8gKGZsb2F0KWNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5WID0gKGZsb2F0KXN0YXJ0WSAvIChmbG9hdCljYWNoZUhlaWdodDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFUgPSAoZmxvYXQpZW5kWCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWF4ViA9IChmbG9hdCllbmRZIC8gKGZsb2F0KWNhY2hlSGVpZ2h0OworfQorCitGb250OjpDYWNoZWRHbHlwaEluZm8gKkZvbnQ6OmNhY2hlR2x5cGgodWludDMyX3QgZ2x5cGgpCit7CisgICAgQ2FjaGVkR2x5cGhJbmZvICpuZXdHbHlwaCA9IG5ldyBDYWNoZWRHbHlwaEluZm8oKTsKKyAgICBtQ2FjaGVkR2x5cGhzLmFkZChnbHlwaCwgbmV3R2x5cGgpOworCisgICAgbmV3R2x5cGgtPm1HbHlwaEluZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgobUZhY2UsIGdseXBoKTsKKyAgICBuZXdHbHlwaC0+bUlzVmFsaWQgPSBmYWxzZTsKKworICAgIHVwZGF0ZUdseXBoQ2FjaGUobmV3R2x5cGgpOworCisgICAgcmV0dXJuIG5ld0dseXBoOworfQorCitGb250ICogRm9udDo6Y3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBWZWN0b3I8Rm9udCo+ICZhY3RpdmVGb250cyA9IHJzYy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHM7CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgRm9udCAqaXRoRm9udCA9IGFjdGl2ZUZvbnRzW2ldOworICAgICAgICBpZihpdGhGb250LT5tRm9udE5hbWUgPT0gbmFtZSAmJiBpdGhGb250LT5tRm9udFNpemUgPT0gZm9udFNpemUgJiYgaXRoRm9udC0+bURwaSA9PSBkcGkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGhGb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCAqbmV3Rm9udCA9IG5ldyBGb250KHJzYyk7CisgICAgYm9vbCBpc0luaXRpYWxpemVkID0gbmV3Rm9udC0+aW5pdChuYW1lLCBmb250U2l6ZSwgZHBpKTsKKyAgICBpZihpc0luaXRpYWxpemVkKSB7CisgICAgICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgICAgIHJldHVybiBuZXdGb250OworICAgIH0KKworICAgIGRlbGV0ZSBuZXdGb250OworICAgIHJldHVybiBOVUxMOworCit9CisKK0ZvbnQ6On5Gb250KCkKK3sKKyAgICBpZihtRmFjZSkgeworICAgICAgICBGVF9Eb25lX0ZhY2UobUZhY2UpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBpZiAobVJTQy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHNbY3RdID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7CisgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIHNldEZvbnRDb2xvcigwLjFmLCAwLjFmLCAwLjFmLCAxLjBmKTsKK30KKworRm9udFN0YXRlOjp+Rm9udFN0YXRlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKworICAgIHJzQXNzZXJ0KCFtQWN0aXZlRm9udHMuc2l6ZSgpKTsKK30KKworRlRfTGlicmFyeSBGb250U3RhdGU6OmdldExpYigpCit7CisgICAgaWYoIW1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0Vycm9yIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbUxpYnJhcnkpOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZnJlZXR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MaWJyYXJ5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbVJTQyA9IHJzYzsKK30KKwordm9pZCBGb250U3RhdGU6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpCit7CisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRTdGF0ZTo6Y2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkKK3sKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKS0xXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwgKGludCliaXRtYXAtPndpZHRoLCAoaW50KWJpdG1hcC0+cm93cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpdCBpdCBhZ2FpbgorICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgZml0LCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kIHdlIHNob3VsZG4ndCBkcmF3CisgICAgICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJldE9yaWdpblggPSBzdGFydFg7CisgICAgKnJldE9yaWdpblkgPSBzdGFydFk7CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgYml0bWFwLT53aWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IGdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworCisgICAgdW5zaWduZWQgY2hhciAqY2FjaGVCdWZmZXIgPSAodW5zaWduZWQgY2hhciopbVRleHRUZXh0dXJlLT5nZXRQdHIoKTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaXRtYXBCdWZmZXIgPSBiaXRtYXAtPmJ1ZmZlcjsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvcihjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYICsrLCBiWCArKykgeworICAgICAgICBmb3IoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSArKywgYlkgKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIGJpdG1hcC0+d2lkdGggKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkqY2FjaGVXaWR0aCArIGNhY2hlWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGRpcnR5IHRoZSB0ZXh0dXJlIGFuZCB0aGUgc2hhZGVyIHNvIG5leHQgdGltZQorICAgIC8vIHdlIGRyYXcgaXQgd2lsbCB1cGxvYWQgdGhlIGRhdGEKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworICAgIG1Gb250U2hhZGVyRi0+YmluZFRleHR1cmUoMCwgbVRleHRUZXh0dXJlLmdldCgpKTsKKworICAgIC8vIFNvbWUgZGVidWcgY29kZQorICAgIC8qZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIExPR0UoIkNhY2hlIExpbmU6IEg6ICV1IEVtcHR5IFNwYWNlOiAlZiIsCisgICAgICAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICgxLjBmIC0gKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbC8oZmxvYXQpbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCkqMTAwLjBmKTsKKworICAgIH0qLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0UmVuZGVyU3RhdGUoKQoreworICAgIHVpbnQzMl90IHRtcFtdID0geworICAgICAgICBSU19URVhfRU5WX01PREVfUkVQTEFDRSwgMSwKKyAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCisgICAgICAgIDAsIDAKKyAgICB9OworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KG1SU0MsIHRtcCwgNik7CisgICAgbUZvbnRTaGFkZXJGLnNldChwZik7CisgICAgbUZvbnRTaGFkZXJGLT5pbml0KG1SU0MpOworCisgICAgU2FtcGxlciAqc2FtcGxlciA9IG5ldyBTYW1wbGVyKG1SU0MsIFJTX1NBTVBMRVJfTkVBUkVTVCwgUlNfU0FNUExFUl9ORUFSRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QKTsKKyAgICBtRm9udFNhbXBsZXIuc2V0KHNhbXBsZXIpOworICAgIG1Gb250U2hhZGVyRi0+YmluZFNhbXBsZXIoMCwgc2FtcGxlcik7CisKKyAgICBQcm9ncmFtU3RvcmUgKmZvbnRTdG9yZSA9IG5ldyBQcm9ncmFtU3RvcmUobVJTQyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuc2V0KGZvbnRTdG9yZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoRnVuYyhSU19ERVBUSF9GVU5DX0FMV0FZUyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldEJsZW5kRnVuYyhSU19CTEVORF9TUkNfU1JDX0FMUEhBLCBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoTWFzayhmYWxzZSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0VGV4dFRleHR1cmUoKQoreworICAgIGNvbnN0IEVsZW1lbnQgKmFscGhhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzgsIFJTX0tJTkRfUElYRUxfQSwgdHJ1ZSwgMSk7CisKKyAgICAvLyBXZSB3aWxsIGFsbG9jYXRlIGEgdGV4dHVyZSB0byBpbml0aWFsbHkgaG9sZCAzMiBjaGFyYWN0ZXIgYml0bWFwcworICAgIFR5cGUgKnRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB0ZXhUeXBlLT5zZXRFbGVtZW50KGFscGhhRWxlbSk7CisgICAgdGV4VHlwZS0+c2V0RGltWCgxMDI0KTsKKyAgICB0ZXhUeXBlLT5zZXREaW1ZKDI1Nik7CisgICAgdGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqY2FjaGVBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHRleFR5cGUpOworICAgIG1UZXh0VGV4dHVyZS5zZXQoY2FjaGVBbGxvYyk7CisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMTYsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDI0LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMzIsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDQwLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSh0ZXhUeXBlLT5nZXREaW1ZKCkgLSBuZXh0TGluZSwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworfQorCisvLyBBdm9pZCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlbmRlciBxdWFkIGJ5IHF1YWQKK3ZvaWQgRm9udFN0YXRlOjppbml0VmVydGV4QXJyYXlCdWZmZXJzKCkKK3sKKyAgICAvLyBOb3cgbGV0cyB3cml0ZSBpbmRleCBkYXRhCisgICAgY29uc3QgRWxlbWVudCAqaW5kZXhFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfMTYsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIFR5cGUgKmluZGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbU1heE51bWJlck9mUXVhZHMgKiA2OworICAgIGluZGV4VHlwZS0+c2V0RGltWChudW1JbmRpY2llcyk7CisgICAgaW5kZXhUeXBlLT5zZXRFbGVtZW50KGluZGV4RWxlbSk7CisgICAgaW5kZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgaW5kZXhUeXBlKTsKKyAgICB1aW50MTZfdCAqaW5kZXhQdHIgPSAodWludDE2X3QqKWluZGV4QWxsb2MtPmdldFB0cigpOworCisgICAgLy8gRm91ciB2ZXJ0cywgdHdvIHRyaWFuZ2xlcyAsIHNpeCBpbmRpY2VzIHBlciBxdWFkCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbU1heE51bWJlck9mUXVhZHM7IGkgKyspIHsKKyAgICAgICAgaW50IGk2ID0gaSAqIDY7CisgICAgICAgIGludCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4UHRyW2k2ICsgMF0gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAzXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBpbmRleEFsbG9jLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QobVJTQyk7CisgICAgbUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKnBvc0VsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMyk7CisgICAgY29uc3QgRWxlbWVudCAqdGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAyKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmVsZW1BcnJheVsyXTsKKyAgICBlbGVtQXJyYXlbMF0gPSBwb3NFbGVtOworICAgIGVsZW1BcnJheVsxXSA9IHRleEVsZW07CisKKyAgICBTdHJpbmc4IHBvc05hbWUoInBvc2l0aW9uIik7CisgICAgU3RyaW5nOCB0ZXhOYW1lKCJ0ZXh0dXJlMCIpOworCisgICAgY29uc3QgY2hhciAqbmFtZUFycmF5WzJdOworICAgIG5hbWVBcnJheVswXSA9IHBvc05hbWUuc3RyaW5nKCk7CisgICAgbmFtZUFycmF5WzFdID0gdGV4TmFtZS5zdHJpbmcoKTsKKyAgICBzaXplX3QgbGVuZ3Roc1syXTsKKyAgICBsZW5ndGhzWzBdID0gcG9zTmFtZS5zaXplKCk7CisgICAgbGVuZ3Roc1sxXSA9IHRleE5hbWUuc2l6ZSgpOworCisgICAgY29uc3QgRWxlbWVudCAqdmVydGV4RGF0YUVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgMiwgZWxlbUFycmF5LCBuYW1lQXJyYXksIGxlbmd0aHMpOworCisgICAgVHlwZSAqdmVydGV4RGF0YVR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+c2V0RGltWChtTWF4TnVtYmVyT2ZRdWFkcyAqIDQpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXRFbGVtZW50KHZlcnRleERhdGFFbGVtKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCB2ZXJ0ZXhEYXRhVHlwZSk7CisgICAgbVRleHRNZXNoUHRyID0gKGZsb2F0Kil2ZXJ0ZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICBtVmVydGV4QXJyYXkuc2V0KHZlcnRleEFsbG9jKTsKK30KKworLy8gV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbnl0aGluZyB1bmxlc3Mgd2UgYWN0dWFsbHkgZHJhdyB0ZXh0Cit2b2lkIEZvbnRTdGF0ZTo6Y2hlY2tJbml0KCkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGluaXRSZW5kZXJTdGF0ZSgpOworCisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcFYobVJTQy0+Z2V0VmVydGV4KCkpOworICAgIG1SU0MtPnNldFZlcnRleChtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVJhc3Rlcj4gdG1wUihtUlNDLT5nZXRSYXN0ZXIoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKG1SU0MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtRnJhZ21lbnQ+IHRtcEYobVJTQy0+Z2V0RnJhZ21lbnQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQobUZvbnRTaGFkZXJGLmdldCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVN0b3JlPiB0bXBQUyhtUlNDLT5nZXRGcmFnbWVudFN0b3JlKCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUobUZvbnRQcm9ncmFtU3RvcmUuZ2V0KCkpOworCisgICAgaWYobUZvbnRDb2xvckRpcnR5KSB7CisgICAgICAgIG1Gb250U2hhZGVyRi0+c2V0Q29uc3RhbnRDb2xvcihtRm9udENvbG9yWzBdLCBtRm9udENvbG9yWzFdLCBtRm9udENvbG9yWzJdLCBtRm9udENvbG9yWzNdKTsKKyAgICAgICAgbUZvbnRDb2xvckRpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtUlNDLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudCgoUHJvZ3JhbUZyYWdtZW50ICopdG1wRi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0ICp2dHggPSAoZmxvYXQqKW1WZXJ0ZXhBcnJheS0+Z2V0UHRyKCk7CisgICAgZmxvYXQgKnRleCA9IHZ0eCArIDM7CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDIwLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgInBvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCAyMCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJ0ZXh0dXJlMCIpOworICAgIHZhLnNldHVwR0wyKG1SU0MsICZtUlNDLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJm1SU0MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKG1SU0MpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1DdXJyZW50UXVhZEluZGV4ICogNiwgR0xfVU5TSUdORURfU0hPUlQsICh1aW50MTZfdCAqKSgwKSk7CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdGUKKyAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICBtUlNDLT5zZXRSYXN0ZXIoKFByb2dyYW1SYXN0ZXIgKil0bXBSLmdldCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudCgoUHJvZ3JhbUZyYWdtZW50ICopdG1wRi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZSgoUHJvZ3JhbVN0b3JlICopdG1wUFMuZ2V0KCkpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6YXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgY29uc3QgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBmbG9hdHNQZXJWZXJ0ID0gNTsKKyAgICBmbG9hdCAqY3VycmVudFBvcyA9IG1UZXh0TWVzaFB0ciArIG1DdXJyZW50UXVhZEluZGV4ICogdmVydHNQZXJRdWFkICogZmxvYXRzUGVyVmVydDsKKworICAgIC8vIEN1bGwgdGhpbmdzIHRoYXQgYXJlIG9mZiB0aGUgc2NyZWVuCisgICAgZmxvYXQgd2lkdGggPSAoZmxvYXQpbVJTQy0+Z2V0V2lkdGgoKTsKKyAgICBmbG9hdCBoZWlnaHQgPSAoZmxvYXQpbVJTQy0+Z2V0SGVpZ2h0KCk7CisKKyAgICBpZih4MSA+IHdpZHRoIHx8IHkxIDwgMC4wZiB8fCB4MiA8IDAgfHwgeTQgPiBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qTE9HRSgiVjAgeDogJWYgeTogJWYgejogJWYiLCB4MSwgeTEsIHoxKTsKKyAgICBMT0dFKCJWMSB4OiAlZiB5OiAlZiB6OiAlZiIsIHgyLCB5MiwgejIpOworICAgIExPR0UoIlYyIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDMsIHkzLCB6Myk7CisgICAgTE9HRSgiVjMgeDogJWYgeTogJWYgejogJWYiLCB4NCwgeTQsIHo0KTsqLworCisgICAgKCpjdXJyZW50UG9zKyspID0geDE7CisgICAgKCpjdXJyZW50UG9zKyspID0geTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gejE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjE7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MjsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgzOworICAgICgqY3VycmVudFBvcysrKSA9IHkzOworICAgICgqY3VycmVudFBvcysrKSA9IHozOworICAgICgqY3VycmVudFBvcysrKSA9IHUzOworICAgICgqY3VycmVudFBvcysrKSA9IHYzOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDQ7CisgICAgKCpjdXJyZW50UG9zKyspID0geTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gejQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjQ7CisKKyAgICBtQ3VycmVudFF1YWRJbmRleCArKzsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ID09IG1NYXhOdW1iZXJPZlF1YWRzKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpCit7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICAvL1N0cmluZzggdGV4dDgodGV4dCk7CisKKyAgICAvLyBSZW5kZXIgY29kZSBoZXJlCisgICAgRm9udCAqY3VycmVudEZvbnQgPSBtUlNDLT5nZXRGb250KCk7CisgICAgaWYoIWN1cnJlbnRGb250KSB7CisgICAgICAgIGlmKCFtRGVmYXVsdC5nZXQoKSkgeworICAgICAgICAgICAgbURlZmF1bHQuc2V0KEZvbnQ6OmNyZWF0ZShtUlNDLCAiRHJvaWRTYW5zLnR0ZiIsIDE2LCA5NikpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRGb250ID0gbURlZmF1bHQuZ2V0KCk7CisgICAgfQorICAgIGlmKCFjdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhbnkgZm9udHMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN1cnJlbnRGb250LT5yZW5kZXJVVEYodGV4dCwgbGVuLCBzdGFydEluZGV4LCBudW1HbHlwaHMsIHgsIHkpOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSkKK3sKKyAgICBzaXplX3QgdGV4dExlbiA9IHN0cmxlbih0ZXh0KTsKKyAgICByZW5kZXJUZXh0KHRleHQsIHRleHRMZW4sIDAsIC0xLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighYWxsb2MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAoY29uc3QgY2hhciAqKWFsbG9jLT5nZXRQdHIoKTsKKyAgICBzaXplX3QgYWxsb2NTaXplID0gYWxsb2MtPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCBhbGxvY1NpemUsIDAsIC0xLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCBzdGFydCwgbGVuLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnNldEZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgbUZvbnRDb2xvclswXSA9IHI7CisgICAgbUZvbnRDb2xvclsxXSA9IGc7CisgICAgbUZvbnRDb2xvclsyXSA9IGI7CisgICAgbUZvbnRDb2xvclszXSA9IGE7CisgICAgbUZvbnRDb2xvckRpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6OmdldEZvbnRDb2xvcihmbG9hdCAqciwgZmxvYXQgKmcsIGZsb2F0ICpiLCBmbG9hdCAqYSkgY29uc3QgeworICAgICpyID0gbUZvbnRDb2xvclswXTsKKyAgICAqZyA9IG1Gb250Q29sb3JbMV07CisgICAgKmIgPSBtRm9udENvbG9yWzJdOworICAgICphID0gbUZvbnRDb2xvclszXTsKK30KKwordm9pZCBGb250U3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBtSW5kZXhCdWZmZXIuY2xlYXIoKTsKKyAgICBtVmVydGV4QXJyYXkuY2xlYXIoKTsKKworICAgIG1Gb250U2hhZGVyRi5jbGVhcigpOworICAgIG1Gb250U2FtcGxlci5jbGVhcigpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLmNsZWFyKCk7CisKKyAgICBtVGV4dFRleHR1cmUuY2xlYXIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKyAgICBtQ2FjaGVMaW5lcy5jbGVhcigpOworCisgICAgbURlZmF1bHQuY2xlYXIoKTsKKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGZvbnRzVG9EZXJlZmVyZW5jZS5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZm9udHNUb0RlcmVmZXJlbmNlW2ldLT56ZXJvVXNlclJlZigpOworICAgIH0KKworICAgIGlmKG1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIG1MaWJyYXJ5ICk7CisgICAgICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyAgICB9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0ZvbnQgcnNpX0ZvbnRDcmVhdGVGcm9tRmlsZShDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgRm9udCAqbmV3Rm9udCA9IEZvbnQ6OmNyZWF0ZShyc2MsIG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKG5ld0ZvbnQpIHsKKyAgICAgICAgbmV3Rm9udC0+aW5jVXNlclJlZigpOworICAgIH0KKyAgICByZXR1cm4gbmV3Rm9udDsKK30KKworfSAvLyByZW5kZXJzY3JpcHQKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZvbnQuaCBiL2xpYnMvcnMvcnNGb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMjliZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfRk9OVF9ICisjZGVmaW5lIEFORFJPSURfUlNfRk9OVF9ICisKKyNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBGb250U3RhdGU7CisKK2NsYXNzIEZvbnQgOiBwdWJsaWMgT2JqZWN0QmFzZQoreworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSB1dGYgZGF0YSwgbGVuZ3RoIG9mIGRhdGEsIHdoZXJlIHRvIHN0YXJ0LCBudW1iZXIgb2YgZ2x5cGhzIG90IHJlYWQKKyAgICAvLyAoZWFjaCBnbHlwaCBtYXkgYmUgbG9uZ2VyIHRoYW4gYSBjaGFyIGJlY2F1c2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCB1dGYgZGF0YSkKKyAgICAvLyBMYXN0IHR3byB2YXJpYWJsZXMgYXJlIHRoZSBpbml0aWFsIHBlbiBwb3NpdGlvbgorICAgIHZvaWQgcmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnQsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQorCisgICAgc3RhdGljIEZvbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIEZvbnRTdGF0ZTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8KKyAgICB7CisgICAgICAgIC8vIEhhcyB0aGUgY2FjaGUgYmVlbiBpbnZhbGlkYXRlZD8KKyAgICAgICAgYm9vbCBtSXNWYWxpZDsKKyAgICAgICAgLy8gTG9jYXRpb24gb2YgdGhlIGNhY2hlZCBnbHlwaCBpbiB0aGUgYml0bWFwCisgICAgICAgIC8vIGluIGNhc2Ugd2UgbmVlZCB0byByZXNpemUgdGhlIHRleHR1cmUKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBNaW5ZOworICAgICAgICB1aW50MzJfdCBtQml0bWFwV2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBIZWlnaHQ7CisgICAgICAgIC8vIEFsc28gY2FjaGUgdGV4dHVyZSBjb29yZHMgZm9yIHRoZSBxdWFkCisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5VOworICAgICAgICBmbG9hdCBtQml0bWFwTWluVjsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhWOworICAgICAgICAvLyBNaW5pbWl6ZSBob3cgbXVjaCB3ZSBjYWxsIGZyZWV0eXBlCisgICAgICAgIEZUX1VJbnQgbUdseXBoSW5kZXg7CisgICAgICAgIEZUX1ZlY3RvciBtQWR2YW5jZTsKKyAgICAgICAgLy8gVmFsdWVzIGJlbG93IGNvbnRhaW4gYSBnbHlwaCdzIG9yaWdpbiBpbiB0aGUgYml0bWFwCisgICAgICAgIEZUX0ludCBtQml0bWFwTGVmdDsKKyAgICAgICAgRlRfSW50IG1CaXRtYXBUb3A7CisgICAgfTsKKworICAgIFN0cmluZzggbUZvbnROYW1lOworICAgIHVpbnQzMl90IG1Gb250U2l6ZTsKKyAgICB1aW50MzJfdCBtRHBpOworCisgICAgRm9udChDb250ZXh0ICpyc2MpOworICAgIGJvb2wgaW5pdChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworICAgIEZUX0ZhY2UgbUZhY2U7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSGFzS2VybmluZzsKKworICAgIERlZmF1bHRLZXllZFZlY3Rvcjx1aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKiA+IG1DYWNoZWRHbHlwaHM7CisKKyAgICBDYWNoZWRHbHlwaEluZm8gKmNhY2hlR2x5cGgodWludDMyX3QgZ2x5cGgpOworICAgIHZvaWQgdXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpOworfTsKKworY2xhc3MgRm9udFN0YXRlCit7CitwdWJsaWM6CisgICAgRm9udFN0YXRlKCk7CisgICAgfkZvbnRTdGF0ZSgpOworCisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKKworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtTGFzdDsKKworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0YXJ0SW5kZXgsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCByZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCByZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3Qgc3RhcnQsIGludCBsZW4sIGludCB4LCBpbnQgeSk7CisKKyAgICB2b2lkIHNldEZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKKyAgICB2b2lkIGdldEZvbnRDb2xvcihmbG9hdCAqciwgZmxvYXQgKmcsIGZsb2F0ICpiLCBmbG9hdCAqYSkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKworICAgIGZyaWVuZCBjbGFzcyBGb250OworCisgICAgc3RydWN0IENhY2hlVGV4dHVyZUxpbmUKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworCisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUodWludDMyX3QgbWF4SGVpZ2h0LCB1aW50MzJfdCBtYXhXaWR0aCwgdWludDMyX3QgY3VycmVudFJvdywgdWludDMyX3QgY3VycmVudENvbCkgOgorICAgICAgICAgICAgbU1heEhlaWdodChtYXhIZWlnaHQpLCBtTWF4V2lkdGgobWF4V2lkdGgpLCBtQ3VycmVudFJvdyhjdXJyZW50Um93KSwgbUN1cnJlbnRDb2woY3VycmVudENvbCkgeworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmaXRCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkgeworICAgICAgICAgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1NYXhIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1DdXJyZW50Q29sICsgKHVpbnQzMl90KWJpdG1hcC0+d2lkdGggPCBtTWF4V2lkdGgpIHsKKyAgICAgICAgICAgICAgICpyZXRPcmlnaW5YID0gbUN1cnJlbnRDb2w7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgbUN1cnJlbnRDb2wgKz0gYml0bWFwLT53aWR0aDsKKyAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKworICAgIENvbnRleHQgKm1SU0M7CisKKyAgICBmbG9hdCBtRm9udENvbG9yWzRdOworICAgIGJvb2wgbUZvbnRDb2xvckRpcnR5OworCisgICAgLy8gRnJlZSB0eXBlIGxpYnJhcnksIHdlIG9ubHkgbmVlZCBvbmUgY29weQorICAgIEZUX0xpYnJhcnkgbUxpYnJhcnk7CisgICAgRlRfTGlicmFyeSBnZXRMaWIoKTsKKyAgICBWZWN0b3I8Rm9udCo+IG1BY3RpdmVGb250czsKKworICAgIC8vIFJlbmRlciBzdGF0ZSBmb3IgdGhlIGZvbnQKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZvbnRTaGFkZXJGOworICAgIE9iamVjdEJhc2VSZWY8U2FtcGxlcj4gbUZvbnRTYW1wbGVyOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRm9udFByb2dyYW1TdG9yZTsKKyAgICB2b2lkIGluaXRSZW5kZXJTdGF0ZSgpOworCisgICAgLy8gVGV4dHVyZSB0byBjYWNoZSBnbHlwaCBiaXRtYXBzCisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVGV4dFRleHR1cmU7CisgICAgdm9pZCBpbml0VGV4dFRleHR1cmUoKTsKKworICAgIGJvb2wgY2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSk7CisgICAgY29uc3QgVHlwZSogZ2V0Q2FjaGVUZXh0dXJlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0VGV4dHVyZS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVmVydGV4QXJyYXk7CisKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjaGVja0luaXQoKTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworCisgICAgdm9pZCBhcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpOworCit9OworCisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzSGFuZGNvZGUuaCBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCmluZGV4IDgwMGVkZGQuLjM1M2I3M2EgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNIYW5kY29kZS5oCisrKyBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCkBAIC0xLDYgKzEsNTcgQEAKIAogI2RlZmluZSBEQVRBX1NZTkNfU0laRSAxMDI0CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0NvbnRleHRGaW5pc2ggKFJzQ29udGV4dCByc2MpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9Db250ZXh0RmluaXNoKTsKKyAgICBSU19DTURfQ29udGV4dEZpbmlzaCAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX0NvbnRleHRGaW5pc2ggKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfQ29udGV4dEZpbmlzaCwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdEludm9rZVYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0SW52b2tlVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRJbnZva2VWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0SW52b2tlViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfU2NyaXB0U2V0VmFyViAoUnNDb250ZXh0IHJzYywgUnNTY3JpcHQgdmEsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9TY3JpcHRTZXRWYXJWKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX1NjcmlwdFNldFZhclYgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9TY3JpcHRTZXRWYXJWICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+cyA9IHZhOworICAgIGNtZC0+c2xvdCA9IHNsb3Q7CisgICAgY21kLT5kYXRhTGVuID0gc2l6ZUJ5dGVzOworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0KK30KKwogc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQWxsb2NhdGlvbkRhdGEgKFJzQ29udGV4dCByc2MsIFJzQWxsb2NhdGlvbiB2YSwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmNwcCBiL2xpYnMvcnMvcnNMaWdodC5jcHAKaW5kZXggNmYyY2YzZS4uZWFiOWEwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xpZ2h0LmNwcAorKysgYi9saWJzL3JzL3JzTGlnaHQuY3BwCkBAIC0xNCw5ICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTY1LDYgKzY5LDE2IEBACiAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIG51bSwgR0xfUE9TSVRJT04sIG1Qb3NpdGlvbik7CiB9CiAKK3ZvaWQgTGlnaHQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0xpZ2h0ICpMaWdodDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTGlnaHRTdGF0ZTo6TGlnaHRTdGF0ZSgpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTGlnaHQuaCBiL2xpYnMvcnMvcnNMaWdodC5oCmluZGV4IGQ4Nzk2ZTYuLmJkNTg5NzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5oCisrKyBiL2xpYnMvcnMvcnNMaWdodC5oCkBAIC0zNyw2ICszNyw5IEBACiAgICAgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKIAogICAgIHZvaWQgc2V0dXBHTCh1aW50MzJfdCBudW0pIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0xJR0hUOyB9CisgICAgc3RhdGljIExpZ2h0ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIGZsb2F0IG1Db2xvcls0XTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKaW5kZXggYzc5NjUyMC4uNzZjYTMyZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogTG9ja2xlc3NDb21tYW5kRmlmbzo6TG9ja2xlc3NDb21tYW5kRmlmbygpCiB7CkBAIC0xMjgsMTUgKzEyOCwxOSBAQAogICAgIC8vZHVtcFN0YXRlKCJmbHVzaCAyIik7CiB9CiAKK3ZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6d2FpdCgpCit7CisgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgeworICAgICAgICBtU2lnbmFsVG9Db250cm9sLnNldCgpOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOworICAgIH0KK30KKwogY29uc3Qgdm9pZCAqIExvY2tsZXNzQ29tbWFuZEZpZm86OmdldCh1aW50MzJfdCAqY29tbWFuZCwgdWludDMyX3QgKmJ5dGVzRGF0YSkKIHsKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIC8vZHVtcFN0YXRlKCJnZXQiKTsKLSAgICAgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgewotICAgICAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKLSAgICAgICAgICAgIG1TaWduYWxUb1dvcmtlci53YWl0KCk7Ci0gICAgICAgIH0KLQorICAgICAgICB3YWl0KCk7CiAgICAgICAgIGlmIChtSW5TaHV0ZG93bikgewogICAgICAgICAgICAgKmNvbW1hbmQgPSAwOwogICAgICAgICAgICAgKmJ5dGVzRGF0YSA9IDA7CkBAIC0xOTIsNzkgKzE5NiwzIEBACiAgICAgTE9HVigiJXMgIHB1dCAlcCwgZ2V0ICVwLCAgYnVmICVwLCAgZW5kICVwIiwgcywgbVB1dCwgbUdldCwgbUJ1ZmZlciwgbUVuZCk7CiB9CiAKLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6U2lnbmFsKCkKLXsKLSAgICBtU2V0ID0gdHJ1ZTsKLX0KLQotTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp+U2lnbmFsKCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm1Db25kaXRpb24pOwotfQotCi1ib29sIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6aW5pdCgpCi17Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBtdXRleCBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZGl0aW9uLCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBjb25kaXRpb24gaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6c2V0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVNldCA9IHRydWU7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtQ29uZGl0aW9uKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIG9uIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OndhaXQoKQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbVNldCkgewotICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbUNvbmRpdGlvbiwgJm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHdhaXRpbmcgb24gY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVNldCA9IGZhbHNlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCmluZGV4IGQwYTQzNTYuLmFlOTA2Y2EgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAorKysgYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKQEAgLTE5LDggKzE5LDEwIEBACiAKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAogCiAvLyBBIHNpbXBsZSBGSUZPIHRvIGJlIHVzZWQgYXMgYSBwcm9kdWNlciAvIGNvbnN1bWVyIGJldHdlZW4gdHdvCkBAIC0zNywyNCArMzksNyBAQAogICAgIExvY2tsZXNzQ29tbWFuZEZpZm8oKTsKICAgICB+TG9ja2xlc3NDb21tYW5kRmlmbygpOwogCi0KIHByb3RlY3RlZDoKLSAgICBjbGFzcyBTaWduYWwgewotICAgIHB1YmxpYzoKLSAgICAgICAgU2lnbmFsKCk7Ci0gICAgICAgIH5TaWduYWwoKTsKLQotICAgICAgICBib29sIGluaXQoKTsKLQotICAgICAgICB2b2lkIHNldCgpOwotICAgICAgICB2b2lkIHdhaXQoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgYm9vbCBtU2V0OwotICAgICAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OwotICAgICAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZGl0aW9uOwotICAgIH07Ci0KICAgICB1aW50OF90ICogdm9sYXRpbGUgbVB1dDsKICAgICB1aW50OF90ICogdm9sYXRpbGUgbUdldDsKICAgICB1aW50OF90ICogbUJ1ZmZlcjsKQEAgLTY1LDE0ICs1MCwxNCBAQAogICAgIFNpZ25hbCBtU2lnbmFsVG9Xb3JrZXI7CiAgICAgU2lnbmFsIG1TaWduYWxUb0NvbnRyb2w7CiAKLQotCiBwdWJsaWM6CiAgICAgdm9pZCAqIHJlc2VydmUodWludDMyX3QgYnl0ZXMpOwogICAgIHZvaWQgY29tbWl0KHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdFN5bmModWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYnl0ZXMpOwogCiAgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgd2FpdCgpOworCiAgICAgY29uc3Qgdm9pZCAqIGdldCh1aW50MzJfdCAqY29tbWFuZCwgdWludDMyX3QgKmJ5dGVzRGF0YSk7CiAgICAgdm9pZCBuZXh0KCk7CiAKQEAgLTg4LDQgKzczLDUgQEAKIAogCiB9Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNYXRyaXguY3BwIGIvbGlicy9ycy9yc01hdHJpeC5jcHAKaW5kZXggMmYyMTQwNS4uOTRlZWYxMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01hdHJpeC5jcHAKKysrIGIvbGlicy9ycy9yc01hdHJpeC5jcHAKQEAgLTczLDcgKzczLDcgQEAKICAgICBzID0gc2luZihyb3QpOwogCiAgICAgY29uc3QgZmxvYXQgbGVuID0gc3FydGYoeCp4ICsgeSp5ICsgeip6KTsKLSAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICBpZiAobGVuICE9IDEpIHsKICAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBsZW47CiAgICAgICAgIHggKj0gcmVjaXBMZW47CiAgICAgICAgIHkgKj0gcmVjaXBMZW47CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5jcHAgYi9saWJzL3JzL3JzTWVzaC5jcHAKaW5kZXggZDU5NWI0ZS4uOTAyNjU3OCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guY3BwCisrKyBiL2xpYnMvcnMvcnNNZXNoLmNwcApAQCAtMTQsMjggKzE0LDIxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKKworCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiBNZXNoOjpNZXNoKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1WZXJ0aWNpZXMgPSBOVUxMOwotICAgIG1WZXJ0aWNpZXNDb3VudCA9IDA7CiAgICAgbVByaW1pdGl2ZXMgPSBOVUxMOwogICAgIG1QcmltaXRpdmVzQ291bnQgPSAwOworICAgIG1WZXJ0ZXhCdWZmZXJzID0gTlVMTDsKKyAgICBtVmVydGV4QnVmZmVyQ291bnQgPSAwOwogfQogCiBNZXNoOjp+TWVzaCgpCiB7CisgICAgaWYobVZlcnRleEJ1ZmZlcnMpIHsKKyAgICAgICAgZGVsZXRlW10gbVZlcnRleEJ1ZmZlcnM7CisgICAgfQorCisgICAgaWYobVByaW1pdGl2ZXMpIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbVByaW1pdGl2ZXNDb3VudDsgaSArKykgeworICAgICAgICAgICAgZGVsZXRlIG1QcmltaXRpdmVzW2ldOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZVtdIG1QcmltaXRpdmVzOworICAgIH0KIH0KIAordm9pZCBNZXNoOjpyZW5kZXIoQ29udGV4dCAqcnNjKSBjb25zdAoreworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVByaW1pdGl2ZXNDb3VudDsgY3QgKyspIHsKKyAgICAgICAgcmVuZGVyUHJpbWl0aXZlKHJzYywgY3QpOworICAgIH0KK30KKwordm9pZCBNZXNoOjpyZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAocHJpbUluZGV4ID49IG1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBwcmltaXRpdmUgaW5kZXgiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFByaW1pdGl2ZV90ICpwcmltID0gbVByaW1pdGl2ZXNbcHJpbUluZGV4XTsKKworICAgIGlmIChwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIDAsIHByaW0tPm1JbmRleEJ1ZmZlci0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIDAsIG1WZXJ0ZXhCdWZmZXJzWzBdLT5nZXRUeXBlKCktPmdldERpbVgoKSk7Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0Cit7CisgICAgaWYgKGxlbiA8IDEgfHwgcHJpbUluZGV4ID49IG1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UgMSIpOworICAgIFZlcnRleEFycmF5IHZhOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0KyspIHsKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOworICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRJc0J1ZmZlck9iamVjdCgpKSB7CisgICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpKTsKKyAgICAgICAgfQorICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmdldFR5cGUoKS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoJnZhKTsKKyAgICB9CisgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UgMiIpOworICAgIFByaW1pdGl2ZV90ICpwcmltID0gbVByaW1pdGl2ZXNbcHJpbUluZGV4XTsKKyAgICBpZiAocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBwcmltLT5tSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgICAgICBnbERyYXdFbGVtZW50cyhwcmltLT5tR0xQcmltaXRpdmUsIGxlbiwgR0xfVU5TSUdORURfU0hPUlQsICh1aW50MTZfdCAqKShzdGFydCAqIDIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERyYXdBcnJheXMocHJpbS0+bUdMUHJpbWl0aXZlLCBzdGFydCwgbGVuKTsKKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIik7Cit9CisKKwordm9pZCBNZXNoOjp1cGxvYWRBbGwoQ29udGV4dCAqcnNjKQoreworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgeworICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1QcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmIChtUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgbVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjp1cGxvYWRBbGwiKTsKK30KKwordm9pZCBNZXNoOjp1cGRhdGVHTFByaW1pdGl2ZXMoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgc3dpdGNoKG1QcmltaXRpdmVzW2ldLT5tUHJpbWl0aXZlKSB7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXNoOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4QnVmZmVyQ291bnQpOworICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1t2Q291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmFkZFUzMihtUHJpbWl0aXZlc0NvdW50KTsKKyAgICAvLyBTdG9yZSB0aGUgcHJpbWl0aXZlcworICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgIFByaW1pdGl2ZV90ICogcHJpbSA9IG1QcmltaXRpdmVzW3BDb3VudF07CisKKyAgICAgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdClwcmltLT5tUHJpbWl0aXZlKTsKKworICAgICAgICBpZihwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDEpOworICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDApOworICAgICAgICB9CisgICAgfQorfQorCitNZXNoICpNZXNoOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfTUVTSCkgeworICAgICAgICBMT0dFKCJtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNZXNoICogbWVzaCA9IG5ldyBNZXNoKHJzYyk7CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKyAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCkgeworICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W21lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudF07CisKKyAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgICAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+bVByaW1pdGl2ZXNDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlX3QgKlttZXNoLT5tUHJpbWl0aXZlc0NvdW50XTsKKworICAgICAgICAvLyBsb2FkIGFsbCBwcmltaXRpdmVzCisgICAgICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbWVzaC0+bVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgICAgICBtZXNoLT5tUHJpbWl0aXZlc1twQ291bnRdID0gcHJpbTsKKworICAgICAgICAgICAgcHJpbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlzdHJlYW0tPmxvYWRVOCgpOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGluZGV4IGJ1ZmZlciB3YXMgc3RvcmVkCisgICAgICAgICAgICB1aW50MzJfdCBpc0luZGV4UHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgaWYoaXNJbmRleFByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1lc2gtPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworICAgIG1lc2gtPnVwbG9hZEFsbChyc2MpOworCisgICAgcmV0dXJuIG1lc2g7Cit9CiAKIAogTWVzaENvbnRleHQ6Ok1lc2hDb250ZXh0KCkKQEAgLTQ2LDMgKzIzMyw4MyBAQAogewogfQogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworUnNNZXNoIHJzaV9NZXNoQ3JlYXRlKENvbnRleHQgKnJzYywgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IGlkeENvdW50KQoreworICAgIE1lc2ggKnNtID0gbmV3IE1lc2gocnNjKTsKKyAgICBzbS0+aW5jVXNlclJlZigpOworCisgICAgc20tPm1QcmltaXRpdmVzQ291bnQgPSBpZHhDb3VudDsKKyAgICBzbS0+bVByaW1pdGl2ZXMgPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3QgKltzbS0+bVByaW1pdGl2ZXNDb3VudF07CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhDb3VudDsgY3QgKyspIHsKKyAgICAgICAgc20tPm1QcmltaXRpdmVzW2N0XSA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKKyAgICB9CisKKyAgICBzbS0+bVZlcnRleEJ1ZmZlckNvdW50ID0gdnR4Q291bnQ7CisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOworCisgICAgcmV0dXJuIHNtOworfQorCit2b2lkIHJzaV9NZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4QnVmZmVyQ291bnQpOworCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBwcmltVHlwZSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBzbS0+bVByaW1pdGl2ZXNbc2xvdF0tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7CisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOworICAgIHNtLT51cGRhdGVHTFByaW1pdGl2ZXMoKTsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1WdHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtVnR4ID0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldEluZGV4Q291bnQoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIGludDMyX3QgKm51bUlkeCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgICpudW1JZHggPSBzbS0+bVByaW1pdGl2ZXNDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZ0eERhdGEsIHVpbnQzMl90IHZ0eERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHZ0eERhdGFDb3VudCA9PSBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgdnR4RGF0YUNvdW50OyBjdCArKykgeworICAgICAgICB2dHhEYXRhW2N0XSA9IHNtLT5tVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCk7CisgICAgICAgIHNtLT5tVmVydGV4QnVmZmVyc1tjdF0tPmluY1VzZXJSZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZhLCB1aW50MzJfdCAqcHJpbVR5cGUsIHVpbnQzMl90IGlkeERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KGlkeERhdGFDb3VudCA9PSBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGlkeERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdmFbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpOworICAgICAgICBwcmltVHlwZVtjdF0gPSBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tUHJpbWl0aXZlOworICAgICAgICBpZihzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+aW5jVXNlclJlZigpOworICAgICAgICB9CisgICAgfQorCit9CisKKworCisKK319CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5oIGIvbGlicy9ycy9yc01lc2guaAppbmRleCA1MjAxYWJkLi43NjVhOTcxIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5oCisrKyBiL2xpYnMvcnMvcnNNZXNoLmgKQEAgLTMyLDQ1ICszMiwzNSBAQAogICAgIE1lc2goQ29udGV4dCAqKTsKICAgICB+TWVzaCgpOwogCi0gICAgc3RydWN0IFZlcnRpY2llc190Ci0gICAgewotICAgICAgICBBbGxvY2F0aW9uICoqIG1BbGxvY2F0aW9uczsKLSAgICAgICAgdWludDMyX3QgbUFsbG9jYXRpb25Db3VudDsKKyAgICAvLyBDb250YWlucyB2ZXJ0ZXggZGF0YQorICAgIC8vIFBvc2l0aW9uLCBub3JtYWwsIHRleGNvb3JkLCBldGMgY291bGQgZWl0aGVyIGJlIHN0cmlkZWQgaW4gb25lIGFsbG9jYXRpb24KKyAgICAvLyBvZiBwcm92aWRlZCBzZXBhcmV0ZWx5IGluIG11bHRpcGxlIG9uZXMKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKKyAgICB1aW50MzJfdCBtVmVydGV4QnVmZmVyQ291bnQ7CiAKLSAgICAgICAgc2l6ZV90IG1WZXJ0ZXhEYXRhU2l6ZTsKLQotICAgICAgICBzaXplX3QgbU9mZnNldENvb3JkOwotICAgICAgICBzaXplX3QgbU9mZnNldFRleDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXROb3JtOwotCi0gICAgICAgIHNpemVfdCBtU2l6ZUNvb3JkOwotICAgICAgICBzaXplX3QgbVNpemVUZXg7Ci0gICAgICAgIHNpemVfdCBtU2l6ZU5vcm07Ci0KLSAgICAgICAgdWludDMyX3QgbUJ1ZmZlck9iamVjdDsKLSAgICB9OwotCisgICAgLy8gRWl0aGVyIG1JbmRleEJ1ZmZlciwgbVByaW1pdGl2ZUJ1ZmZlciBvciBib3RoIGNvdWxkIGhhdmUgYSBOVUxMIHJlZmVyZW5jZQorICAgIC8vIElmIGJvdGggYXJlIG51bGwsIG1QcmltaXRpdmUgb25seSB3b3VsZCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgbWVzaAogICAgIHN0cnVjdCBQcmltaXRpdmVfdAogICAgIHsKLSAgICAgICAgUnNQcmltaXRpdmUgbVR5cGU7Ci0gICAgICAgIFZlcnRpY2llc190ICptVmVydGljaWVzOworICAgICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKIAotICAgICAgICB1aW50MzJfdCBtSW5kZXhDb3VudDsKLSAgICAgICAgdWludDE2X3QgKm1JbmRpY2llczsKLQotICAgICAgICB1aW50MzJfdCBtUmVzdGFydENvdW50czsKLSAgICAgICAgdWludDE2X3QgKm1SZXN0YXJ0czsKKyAgICAgICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKKyAgICAgICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwogICAgIH07CiAKLSAgICBWZXJ0aWNpZXNfdCAqIG1WZXJ0aWNpZXM7Ci0gICAgdWludDMyX3QgbVZlcnRpY2llc0NvdW50OwotCiAgICAgUHJpbWl0aXZlX3QgKiogbVByaW1pdGl2ZXM7CiAgICAgdWludDMyX3QgbVByaW1pdGl2ZXNDb3VudDsKIAorICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OworICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZXMoKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX01FU0g7IH0KKyAgICBzdGF0aWMgTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKLSAgICB2b2lkIGFuYWx5emVFbGVtZW50KCk7CiBwcm90ZWN0ZWQ6CiB9OwogCkBAIC04OCwzICs3OCw0IEBACiAjZW5kaWYgLy9BTkRST0lEX1JTX1RSSUFOR0xFX01FU0hfSAogCiAKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmNwcCBiL2xpYnMvcnMvcnNNdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNNdXRleC5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc011dGV4LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitNdXRleDo6TXV0ZXgoKQoreworfQorCitNdXRleDo6fk11dGV4KCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Cit9CisKK2Jvb2wgTXV0ZXg6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDo6TXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXV0ZXg6OmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXg6IGVycm9yICVpIGxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6dW5sb2NrKCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXggZXJyb3IgJWkgdW5sb2NraW5nLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmggYi9saWJzL3JzL3JzTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19NVVRFWF9ICisjZGVmaW5lIEFORFJPSURfUlNfTVVURVhfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBNdXRleCB7CitwdWJsaWM6CisgICAgTXV0ZXgoKTsKKyAgICB+TXV0ZXgoKTsKKworICAgIGJvb2wgaW5pdCgpOworICAgIGJvb2wgbG9jaygpOworICAgIGJvb2wgdW5sb2NrKCk7CisKK3Byb3RlY3RlZDoKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc05vaXNlLmNwcCBiL2xpYnMvcnMvcnNOb2lzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjc1ODYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbm9pc2UgZnVuY3Rpb25zIHdhcyBwb3J0ZWQgZnJvbSB0aGUgSmF2YQotICogaW1wbGVtZW50YXRpb24gYnkgSmVycnkgSHV4dGFibGUgKGh0dHA6Ly93d3cuamhsYWJzLmNvbSkgdW5kZXIKLSAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoc2VlIGh0dHA6Ly9qaGxhYnMuY29tL2lwL2ZpbHRlcnMvZG93bmxvYWQuaHRtbCkKLSAqCi0gKiBPcmlnaW5hbCBoZWFkZXI6Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSmVycnkgSHV4dGFibGUKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzTm9pc2UuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0jZGVmaW5lIEIgMHgxMDAKLSNkZWZpbmUgQk0gMHhmZgotI2RlZmluZSBOIDB4MTAwMAotCi1zdGF0aWMgaW50IHBbQiArIEIgKyAyXTsKLXN0YXRpYyBmbG9hdCBnM1tCICsgQiArIDJdWzNdOwotc3RhdGljIGZsb2F0IGcyW0IgKyBCICsgMl1bMl07Ci1zdGF0aWMgZmxvYXQgZzFbQiArIEIgKyAyXTsKLXN0YXRpYyBib29sIG5vaXNlX3N0YXJ0ID0gdHJ1ZTsKLQotI2RlZmluZSBsZXJwZihzdGFydCwgc3RvcCwgYW1vdW50KSBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50Ci0KLXN0YXRpYyBpbmxpbmUgZmxvYXQgbm9pc2Vfc0N1cnZlKGZsb2F0IHQpCi17Ci0gICAgcmV0dXJuIHQgKiB0ICogKDMuMGYgLSAyLjBmICogdCk7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYyKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0pOwotICAgIHZbMF0gPSB2WzBdIC8gczsKLSAgICB2WzFdID0gdlsxXSAvIHM7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYzKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0gKyB2WzJdICogdlsyXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLSAgICB2WzJdID0gdlsyXSAvIHM7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vaXNlX2luaXQoKQotewotICAgIGludCBpLCBqLCBrOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCOyBpKyspIHsKLSAgICAgICAgcFtpXSA9IGk7Ci0gICAgICAgIAotICAgICAgICBnMVtpXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYyKGcyW2ldKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgICAgICAgICBnM1tpXVtqXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICBTQ19ub3JtYWxpemVmMyhnM1tpXSk7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IEItMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgayA9IHBbaV07Ci0gICAgICAgIHBbaV0gPSBwW2ogPSByYW5kKCkgJSBCXTsKLSAgICAgICAgcFtqXSA9IGs7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCICsgMjsgaSsrKSB7Ci0gICAgICAgIHBbQiArIGldID0gcFtpXTsKLSAgICAgICAgZzFbQiArIGldID0gZzFbaV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBnMltCICsgaV1bal0gPSBnMltpXVtqXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW0IgKyBpXVtqXSA9IGczW2ldW2pdOwotICAgIH0KLX0KLQotZmxvYXQgU0Nfbm9pc2VmKGZsb2F0IHgpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxOwotICAgIGZsb2F0IHJ4MCwgcngxLCBzeCwgdCwgdSwgdjsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgCi0gICAgdSA9IHJ4MCAqIGcxW3BbYngwXV07Ci0gICAgdiA9IHJ4MSAqIGcxW3BbYngxXV07Ci0gICAgcmV0dXJuIDIuM2YgKiBsZXJwZih1LCB2LCBzeCk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCBzeCwgc3ksIGEsIGIsIHQsIHUsIHY7Ci0gICAgZmxvYXQgKnE7Ci0gICAgaW50IGksIGo7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLQkKLSAgICB0ID0geSArIE47Ci0gICAgYnkwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieTEgPSAoYnkwKzEpICYgQk07Ci0gICAgcnkwID0gdCAtIChpbnQpdDsKLSAgICByeTEgPSByeTAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICAKLSAgICBxID0gZzJbYjAwXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdOwotICAgIHEgPSBnMltiMTBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICBxID0gZzJbYjAxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdOwotICAgIHEgPSBnMltiMTFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICByZXR1cm4gMS41ZipsZXJwZihhLCBiLCBzeSk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiejAsIGJ6MSwgYjAwLCBiMTAsIGIwMSwgYjExOwotICAgIGZsb2F0IHJ4MCwgcngxLCByeTAsIHJ5MSwgcnowLCByejEsIHN5LCBzeiwgYSwgYiwgYywgZCwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgdCA9IHogKyBOOwotICAgIGJ6MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnoxID0gKGJ6MCsxKSAmIEJNOwotICAgIHJ6MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnoxID0gcnowIC0gMS4wZjsKLQkKLSAgICBpID0gcFtieDBdOwotICAgIGogPSBwW2J4MV07Ci0gICAgCi0gICAgYjAwID0gcFtpICsgYnkwXTsKLSAgICBiMTAgPSBwW2ogKyBieTBdOwotICAgIGIwMSA9IHBbaSArIGJ5MV07Ci0gICAgYjExID0gcFtqICsgYnkxXTsKLSAgICAKLSAgICB0ICA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIHN5ID0gbm9pc2Vfc0N1cnZlKHJ5MCk7Ci0gICAgc3ogPSBub2lzZV9zQ3VydmUocnowKTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MF07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MF07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGMgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcSA9IGczW2IwMCArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMCArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIHEgPSBnM1tiMDEgKyBiejFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIHEgPSBnM1tiMTEgKyBiejFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIGIgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBkID0gbGVycGYoYSwgYiwgc3kpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGMsIGQsIHN6KTsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYyKGYgKiB4LCBmICogeSkpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYzKGYgKiB4LCBmICogeSwgZiAqIHopKSAvIGY7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5oIGIvbGlicy9ycy9yc05vaXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDA3NTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX05PSVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19OT0lTRV9ICi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKTsKLXZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKTsKLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KTsKLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSk7Ci1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpOwotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCmluZGV4IDY3NzQxM2UuLjQ4ZjFmZWUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNCw3ICsyOSw2IEBACiB7CiAgICAgbVVzZXJSZWZDb3VudCA9IDA7CiAgICAgbVN5c1JlZkNvdW50ID0gMDsKLSAgICBtTmFtZSA9IE5VTEw7CiAgICAgbVJTQyA9IE5VTEw7CiAgICAgbU5leHQgPSBOVUxMOwogICAgIG1QcmV2ID0gTlVMTDsKQEAgLTM5LDE0ICs0MywxMyBAQAogICAgIHJzQXNzZXJ0KCFtVXNlclJlZkNvdW50KTsKICAgICByc0Fzc2VydCghbVN5c1JlZkNvdW50KTsKICAgICByZW1vdmUoKTsKLSAgICBkZWxldGVbXSBtTmFtZTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpkdW1wTE9HVihjb25zdCBjaGFyICpvcCkgY29uc3QKIHsKLSAgICBpZiAobU5hbWUpIHsKKyAgICBpZiAobU5hbWUuc2l6ZSgpKSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuYW1lICVzLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKLSAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKKyAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUuc3RyaW5nKCksIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbm8tbmFtZSwgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCiAgICAgICAgICAgICAgb3AsIHRoaXMsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKQEAgLTExMywxOCArMTE2LDEyIEBACiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKQogewotICAgIHNldE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICBtTmFtZS5zZXRUbyhuYW1lKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKLSAgICBkZWxldGUgbU5hbWU7Ci0gICAgbU5hbWUgPSBOVUxMOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgICAgIG1lbWNweShtTmFtZSwgbmFtZSwgbGVuKTsKLSAgICAgICAgbU5hbWVbbGVuXSA9IDA7Ci0gICAgfQorICAgIG1OYW1lLnNldFRvKG5hbWUsIGxlbik7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6YWRkKCkgY29uc3QKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmggYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCmluZGV4IGJiMDNiODcuLmFkOTViODEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIGNsYXNzIENvbnRleHQ7CitjbGFzcyBPU3RyZWFtOwogCiAvLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgogY2xhc3MgT2JqZWN0QmFzZQpAQCAtNDAsNyArNDEsNyBAQAogICAgIGJvb2wgemVyb1VzZXJSZWYoKSBjb25zdDsKIAogICAgIGNvbnN0IGNoYXIgKiBnZXROYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIHJldHVybiBtTmFtZS5zdHJpbmcoKTsKICAgICB9CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKik7CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKiwgdWludDMyX3QgbGVuKTsKQEAgLTUyLDYgKzUzLDggQEAKICAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKENvbnRleHQgKnJzYyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICptQWxsb2NGaWxlOwpAQCAtNjQsNyArNjcsNyBAQAogCiAgICAgYm9vbCBjaGVja0RlbGV0ZSgpIGNvbnN0OwogCi0gICAgY2hhciAqIG1OYW1lOworICAgIFN0cmluZzggbU5hbWU7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1TeXNSZWZDb3VudDsKICAgICBtdXRhYmxlIGludDMyX3QgbVVzZXJSZWZDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCmluZGV4IDcwZTI4NjguLmM0ZjhiMmUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IGMxN2I5NGMuLmEwNDUwNDMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzIsMTMgKzM4LDIxIEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9IDUpOworICAgIHJzQXNzZXJ0KHBhcmFtTGVuZ3RoID09IDYpOworCisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMV0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSAxLmY7CiAKICAgICBtRW52TW9kZXNbMF0gPSAoUnNUZXhFbnZNb2RlKXBhcmFtc1swXTsKICAgICBtVGV4dHVyZUZvcm1hdHNbMF0gPSBwYXJhbXNbMV07CiAgICAgbUVudk1vZGVzWzFdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMl07CiAgICAgbVRleHR1cmVGb3JtYXRzWzFdID0gcGFyYW1zWzNdOwogICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IHBhcmFtc1s0XSAhPSAwOworICAgIG1WYXJ5aW5nQ29sb3IgPSBmYWxzZTsKKyAgICBpZiAocGFyYW1MZW5ndGggPiA1KQorICAgICAgICBtVmFyeWluZ0NvbG9yID0gcGFyYW1zWzVdICE9IDA7CiAKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAwOwogICAgIGlmIChtRW52TW9kZXNbMF0pIHsKQEAgLTQ3LDcgKzYxLDE3IEBACiAgICAgaWYgKG1FbnZNb2Rlc1sxXSkgewogICAgICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgfD0gMjsKICAgICB9Ci0gICAgaW5pdChyc2MpOworCisgICAgbVVuaWZvcm1Db3VudCA9IDA7CisgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKCJ1bmlfVGV4MCIpOworICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbygidW5pX1RleDEiKTsKKworICAgIG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4ID0gLTE7CisgICAgLy9pZiAoIW1WYXJ5aW5nQ29sb3IpIHsKKyAgICAgICAgbUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXggPSBtVW5pZm9ybUNvdW50OworICAgICAgICBtVW5pZm9ybU5hbWVzW21Vbmlmb3JtQ291bnQrK10uc2V0VG8oInVuaV9Db2xvciIpOworICAgIC8vfQorICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCiBQcm9ncmFtRnJhZ21lbnQ6OlByb2dyYW1GcmFnbWVudChDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKiBzaGFkZXJUZXh0LApAQCAtNTgsNyArODIsMTkgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogCi0gICAgaW5pdChyc2MpOworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOworCisgICAgTE9HRSgiQ3VzdG9tIEZQIik7CisKKyAgICBtVW5pZm9ybUNvdW50ID0gMjsKKyAgICBtVW5pZm9ybU5hbWVzWzBdLnNldFRvKCJ1bmlfVGV4MCIpOworICAgIG1Vbmlmb3JtTmFtZXNbMV0uc2V0VG8oInVuaV9UZXgxIik7CisKKyAgICBjcmVhdGVTaGFkZXIoKTsKKwogICAgIG1UZXh0dXJlRW5hYmxlTWFzayA9ICgxIDw8IG1UZXh0dXJlQ291bnQpIC0xOwogfQogCkBAIC02Nyw3NiArMTAzLDE3IEBACiB7CiB9CiAKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXRDb25zdGFudENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSByOworICAgIG1Db25zdGFudENvbG9yWzFdID0gZzsKKyAgICBtQ29uc3RhbnRDb2xvclsyXSA9IGI7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSBhOworICAgIG1EaXJ0eSA9IHRydWU7Cit9CisKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlKQogewotICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9URVhUVVJFOyBjdCsrKSB7Ci0gICAgICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCArIGN0KTsKLSAgICAgICAgaWYgKCEobVRleHR1cmVFbmFibGVNYXNrICYgKDEgPDwgY3QpKSB8fCAhbVRleHR1cmVzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMV8xKCkpIHsKLSAgICAgICAgICAgIGlmIChtUG9pbnRTcHJpdGVFbmFibGUpIHsKLSAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1BPSU5UX1NQUklURV9PRVMsIEdMX0NPT1JEX1JFUExBQ0VfT0VTLCBtUG9pbnRTcHJpdGVFbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXh0dXJlc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVzW2N0XS0+Z2V0VGV4dHVyZUlEKCkpOwotCi0gICAgICAgIHN3aXRjaChtRW52TW9kZXNbY3RdKSB7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX05PTkU6Ci0gICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9SRVBMQUNFOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9NT0RVTEFURToKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfTU9EVUxBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX0RFQ0FMOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9ERUNBTCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2FtcGxlcnNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBtU2FtcGxlcnNbY3RdLT5zZXR1cEdMKHJzYywgbVRleHR1cmVzW2N0XS0+Z2V0VHlwZSgpLT5nZXRJc05wMigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHcm9zcyBoYWNrLgotICAgICAgICBpZiAoY3QgPT0gMikgewotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9DT01CSU5FKTsKLQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9DT01CSU5FX1JHQiwgR0xfQUREKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMF9SR0IsIEdMX1BSRVZJT1VTKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMV9SR0IsIEdMX1RFWFRVUkUpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMF9SR0IsIEdMX1NSQ19DT0xPUik7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQxX1JHQiwgR0xfU1JDX0NPTE9SKTsKLQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9DT01CSU5FX0FMUEhBLCBHTF9BREQpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMwX0FMUEhBLCBHTF9QUkVWSU9VUyk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzFfQUxQSEEsIEdMX1RFWFRVUkUpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMF9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDFfQUxQSEEsIEdMX1NSQ19BTFBIQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBtRGlydHkgPSBmYWxzZTsKLSAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTCIpOwogfQogCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykKQEAgLTE0NCwxMSArMTIxLDE5IEBACiAKICAgICAvL0xPR0UoInNnbDIgZnJhZzEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiBzdGFydCIpOworCisgICAgaWYgKCFtVmFyeWluZ0NvbG9yICYmCisgICAgICAgIChzYy0+ZnJhZ1VuaWZvcm1TbG90KG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4KSA+PSAwKSkgeworICAgICAgICAvL0xPR0UoIm1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4ICVpICVpIiwgbUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgsIHNjLT5mcmFnVW5pZm9ybVNsb3QobUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgpKTsKKyAgICAgICAgZ2xVbmlmb3JtNGZ2KHNjLT5mcmFnVW5pZm9ybVNsb3QobUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgpLCAxLCBtQ29uc3RhbnRDb2xvcik7CisgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50Ojpjb2xvciBzZXR1cCIpOworICAgIH0KKwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVEVYVFVSRTsgY3QrKykgewogICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyBjdCk7CiAgICAgICAgIGlmICghKG1UZXh0dXJlRW5hYmxlTWFzayAmICgxIDw8IGN0KSkgfHwgIW1UZXh0dXJlc1tjdF0uZ2V0KCkpIHsKQEAgLTE4NCw4ICsxNjksOSBAQAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlcigpCiB7CiAgICAgbVNoYWRlci5zZXRUbygicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iKTsKLSAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhckNvbG9yO1xuIik7CisgICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgbG93cCB2ZWM0IHZhckNvbG9yO1xuIik7CiAgICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIik7CisgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjNCB1bmlfQ29sb3I7XG4iKTsKIAogICAgIGlmIChtVXNlclNoYWRlci5sZW5ndGgoKSA+IDEpIHsKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1UZXh0dXJlQ291bnQ7IGN0KyspIHsKQEAgLTIxMiw3ICsxOTgsMTEgQEAKIAogCiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiIpOworICAgICAgICBpZiAobVZhcnlpbmdDb2xvcikgeworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IHZhckNvbG9yO1xuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBsb3dwIHZlYzQgY29sID0gdW5pX0NvbG9yO1xuIik7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobVRleHR1cmVFbmFibGVNYXNrKSB7CiAgICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7CkBAIC0yODIsMTEgKzI3MiwxNiBAQAogCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6aW5pdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbVVuaWZvcm1Db3VudCA9IDI7Ci0gICAgbVVuaWZvcm1OYW1lc1swXS5zZXRUbygidW5pX1RleDAiKTsKLSAgICBtVW5pZm9ybU5hbWVzWzFdLnNldFRvKCJ1bmlfVGV4MSIpOworfQogCi0gICAgY3JlYXRlU2hhZGVyKCk7Cit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtRnJhZ21lbnQgKlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHJvZ3JhbUZyYWdtZW50U3RhdGU6OlByb2dyYW1GcmFnbWVudFN0YXRlKCkKQEAgLTMwMCwxNCArMjk1LDE0IEBACiAKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgdWludDMyX3QgdG1wWzVdID0geworICAgIHVpbnQzMl90IHRtcFtdID0gewogICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKICAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCi0gICAgICAgIDAKKyAgICAgICAgMCwgMAogICAgIH07Ci0gICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCB0bXAsIDUpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgdG1wLCA2KTsKICAgICBtRGVmYXVsdC5zZXQocGYpOwogICAgIHBmLT5pbml0KHJzYyk7CiB9CkBAIC0zMjgsNiArMzIzLDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApAQCAtMzM3LDYgKzMzMyw3IEBACiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAppbmRleCA5ZmE1NjVkLi43YzE1OThlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCkBAIC00MCw2ICs0MCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVTaGFkZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICpyc2MpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVDsgfQorICAgIHN0YXRpYyBQcm9ncmFtRnJhZ21lbnQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCisgICAgdm9pZCBzZXRDb25zdGFudENvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAogcHJvdGVjdGVkOgogICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwpAQCAtNDgsNiArNTMsMTAgQEAKICAgICBSc1RleEVudk1vZGUgbUVudk1vZGVzW01BWF9URVhUVVJFXTsKICAgICB1aW50MzJfdCBtVGV4dHVyZUVuYWJsZU1hc2s7CiAgICAgYm9vbCBtUG9pbnRTcHJpdGVFbmFibGU7CisgICAgYm9vbCBtVmFyeWluZ0NvbG9yOworCisgICAgZmxvYXQgbUNvbnN0YW50Q29sb3JbNF07CisgICAgaW50MzJfdCBtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleDsKIH07CiAKIGNsYXNzIFByb2dyYW1GcmFnbWVudFN0YXRlCkBAIC01Nyw3ICs2Niw3IEBACiAgICAgflByb2dyYW1GcmFnbWVudFN0YXRlKCk7CiAKICAgICBQcm9ncmFtRnJhZ21lbnQgKm1QRjsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbVRleHR1cmVUeXBlc1tQcm9ncmFtRnJhZ21lbnQ6Ok1BWF9URVhUVVJFXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNTdmLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6OlByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYykgOgotICAgIFByb2dyYW0ocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbURpdGhlckVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLQotCi0gICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLQotCi19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKQotewotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKLXsKLSAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaChmdW5jKSB7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKLSAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCi17Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgotICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgewotICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc3JjKSB7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZHN0KSB7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOwotfQotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OlByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIG1QRlMgPSBOVUxMOwotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgZGVsZXRlIG1QRlM7Ci0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotICAgIG1EZWZhdWx0LnNldChwZnMpOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCi17Ci0gICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtTGFzdC5jbGVhcigpOwotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKLXsKLSAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLQotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICBwZnMtPmluY1VzZXJSZWYoKTsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7Ci0gICAgcmV0dXJuIHBmczsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMmM5OS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0KLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKik7Ci0gICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotCi0gICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwotICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwotCi0gICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOwotICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwotCi0gICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1EaXRoZXJFbmFibGU7Ci0KLSAgICBib29sIG1CbGVuZEVuYWJsZTsKLSAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1CbGVuZFNyYzsKLSAgICBpbnQzMl90IG1CbGVuZERzdDsKLQotICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKLSAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbURlcHRoRnVuYzsKLQotICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOwotfTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKLSAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbURlZmF1bHQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUxhc3Q7Ci0KLQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOwotfTsKLQotCi19Ci19Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAppbmRleCAxMzg4N2QxLi41YjY5MzcwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zNSw5ICs0MSw4IEBACiAgICAgbVBvaW50U21vb3RoID0gcG9pbnRTbW9vdGg7CiAgICAgbUxpbmVTbW9vdGggPSBsaW5lU21vb3RoOwogICAgIG1Qb2ludFNwcml0ZSA9IHBvaW50U3ByaXRlOwotCi0gICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CisgICAgbUN1bGwgPSBSU19DVUxMX0JBQ0s7CiB9CiAKIFByb2dyYW1SYXN0ZXI6On5Qcm9ncmFtUmFzdGVyKCkKQEAgLTQ3LDIxICs1MiwyMyBAQAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRMaW5lV2lkdGgoZmxvYXQgcykKIHsKICAgICBtTGluZVdpZHRoID0gczsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1SYXN0ZXI6OnNldFBvaW50U2l6ZShmbG9hdCBzKQordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpCiB7Ci0gICAgbVBvaW50U2l6ZSA9IHM7CisgICAgbUN1bGwgPSBtb2RlOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzICYmICFtRGlydHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1EaXJ0eSA9IGZhbHNlOwogCi0gICAgZ2xQb2ludFNpemUobVBvaW50U2l6ZSk7CiAgICAgaWYgKG1Qb2ludFNtb290aCkgewogICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TTU9PVEgpOwogICAgIH0gZWxzZSB7CkBAIC03NiwyMyArODMsNjIgQEAKICAgICB9CiAKICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGlmIChtUG9pbnRTcHJpdGUpIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisgICAgfQorCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CiAKK30KKworUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzE0OCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CkBAIC0xMTgsNyArMTY0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0LAorUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNwcml0ZSkKQEAgLTEzMSwxOCArMTc3LDE4IEBACiAgICAgcmV0dXJuIHByOwogfQogCi12b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCi17Ci0gICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7Ci0gICAgcHItPnNldFBvaW50U2l6ZShzKTsKLX0KLQogdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwogICAgIHByLT5zZXRMaW5lV2lkdGgocyk7CiB9CiAKK3ZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBSc0N1bGxNb2RlIG1vZGUpCit7CisgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CisgICAgcHItPnNldEN1bGxNb2RlKG1vZGUpOworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmggYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCmluZGV4IGMzYTljOTAuLjgwMWFiMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtMzYsMTkgKzM2LDE5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKLSAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKKyAgICB2b2lkIHNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSk7CiAKIHByb3RlY3RlZDoKICAgICBib29sIG1Qb2ludFNtb290aDsKICAgICBib29sIG1MaW5lU21vb3RoOwogICAgIGJvb2wgbVBvaW50U3ByaXRlOwotCi0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotCi0KKyAgICBSc0N1bGxNb2RlIG1DdWxsOwogfTsKIAogY2xhc3MgUHJvZ3JhbVJhc3RlclN0YXRlCkBAIC01Niw3ICs1Niw3IEBACiBwdWJsaWM6CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlKCk7CiAgICAgflByb2dyYW1SYXN0ZXJTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtRGVmYXVsdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKKyAgICBQcm9ncmFtKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisKKworICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisKKworfQorCitQcm9ncmFtU3RvcmU6On5Qcm9ncmFtU3RvcmUoKQoreworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1TdG9yZVN0YXRlICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworCisgICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKKyAgICBpZiAobUJsZW5kRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorCisgICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7CisKKyAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7CisgICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KKworICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1TdG9yZSAqUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKKworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKKyAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICBtQmxlbmRFbmFibGUgPSB0cnVlOworICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCisgICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7CisgICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChzcmMpIHsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChkc3QpIHsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOworfQorCisKK1Byb2dyYW1TdG9yZVN0YXRlOjpQcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgbVBGUyA9IE5VTEw7Cit9CisKK1Byb2dyYW1TdG9yZVN0YXRlOjp+UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIGRlbGV0ZSBtUEZTOworCit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworICAgIG1EZWZhdWx0LnNldChwZnMpOworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisgICAgbUxhc3QuY2xlYXIoKTsKK30KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQoreworICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Cit9CisKK1JzUHJvZ3JhbVN0b3JlIHJzaV9Qcm9ncmFtU3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcGZzLT5pbmNVc2VyUmVmKCk7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOworICAgIHJldHVybiBwZnM7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKK30KKworCit9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGU7CisKK2NsYXNzIFByb2dyYW1TdG9yZSA6IHB1YmxpYyBQcm9ncmFtCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworCisgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOworICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOworCisgICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOworICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOworCisgICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOyB9CisgICAgc3RhdGljIFByb2dyYW1TdG9yZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1EaXRoZXJFbmFibGU7CisKKyAgICBib29sIG1CbGVuZEVuYWJsZTsKKyAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1CbGVuZFNyYzsKKyAgICBpbnQzMl90IG1CbGVuZERzdDsKKworICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKKyAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOworICAgIGludDMyX3QgbURlcHRoRnVuYzsKKworICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOworfTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGUKK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIH5Qcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1MYXN0OworCisKKyAgICBQcm9ncmFtU3RvcmUgKm1QRlM7Cit9OworCisKK30KK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLjYwZGUwNGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTgxLDkgKzg3LDEyIEBACiAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICBpZiAobUxpZ2h0Q291bnQpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVCAvLyBHTEVTIE9ubHkKICAgICAgICAgaW50IHYgPSAwOwogICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisKICAgICAgICAgZ2xMaWdodE1vZGVseHYoR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsICZ2KTsKKwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtTGlnaHRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgTGlnaHQgKmwgPSBtTGlnaHRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUMCArIGN0KTsKQEAgLTkyLDYgKzEwMSw3IEBACiAgICAgICAgIGZvciAodWludDMyX3QgY3QgPSBtTGlnaHRDb3VudDsgY3QgPCBNQVhfTElHSFRTOyBjdCsrKSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfTElHSFQwICsgY3QpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKICAgICB9CkBAIC0xMjgsNiArMTM4LDExIEBACiAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CiAgICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CkBAIC0xNDAsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOwogICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTUwLDYgKzE2NSwxMSBAQAogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNyArMTgyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX0xlZ2FjeU5vcm1hbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9jb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX25vcm1hbDtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX3RleHR1cmUwO1xuIik7CiAKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Vbmlmb3JtQ291bnQ7IGN0KyspIHsKICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgIik7CkBAIC0xODEsMTggKzIwMCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gMS4wO1xuIik7CiAKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfTGVnYWN5Q29sb3I7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iKTsKICAgICAgICAgaWYgKG1UZXh0dXJlTWF0cml4RW5hYmxlKSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwO1xuIik7CiAgICAgICAgIH0KLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueCA9IHBvcy54IC8gNDgwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueSA9IHBvcy55IC8gODAwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IHBvcztcbiIpOwogICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CiAgICAgfQogfQpAQCAtMjAxLDExICsyMTcsMTAgQEAKIHsKICAgICAvL0xPR0UoInNnbDIgdnR4MSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHN0YXRlLT5jb2xvclswXSwgc3RhdGUtPmNvbG9yWzFdLCBzdGF0ZS0+Y29sb3JbMl0sIHN0YXRlLT5jb2xvclszXSk7CiAKICAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKIApAQCAtMzUxLDYgKzM2NiwxNiBAQAogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbVZlcnRleCAqUHJvZ3JhbVZlcnRleDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCkBAIC0zNjIsOCArMzg3LDkgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCkgRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CiAKICAgICByc2lfVHlwZUJlZ2luKHJzYywgZSk7CkBAIC0zNzIsMjMgKzM5OCwyMSBAQAogCiAgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIGZhbHNlKTsKICAgICBBbGxvY2F0aW9uICphbGxvYyA9IChBbGxvY2F0aW9uICopcnNpX0FsbG9jYXRpb25DcmVhdGVUeXBlZChyc2MsIG1BbGxvY1R5cGUuZ2V0KCkpOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7CiAgICAgcHYtPmluaXQocnNjKTsKICAgICBwdi0+YmluZEFsbG9jYXRpb24oYWxsb2MsIDApOwogCi0gICAgY29sb3JbMF0gPSAxLmY7Ci0gICAgY29sb3JbMV0gPSAxLmY7Ci0gICAgY29sb3JbMl0gPSAxLmY7Ci0gICAgY29sb3JbM10gPSAxLmY7CisgICAgdXBkYXRlU2l6ZShyc2MpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCi0gICAgdXBkYXRlU2l6ZShyc2MsIHcsIGgpOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKQogewogICAgIE1hdHJpeCBtOwotICAgIG0ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKKyAgICBtLmxvYWRPcnRobygwLHJzYy0+Z2V0V2lkdGgoKSwgcnNjLT5nZXRIZWlnaHQoKSwwLCAtMSwxKTsKICAgICBtRGVmYXVsdEFsbG9jLT5zdWJEYXRhKFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CiAKICAgICBtLmxvYWRJZGVudGl0eSgpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaCBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKaW5kZXggMjg1NTRjYy4uMWM4YjljOCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCkBAIC01Miw2ICs1Miw5IEBACiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVZlcnRleCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICB1aW50MzJfdCBtTGlnaHRDb3VudDsKQEAgLTcxLDE4ICs3NCwxNSBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1EZWZhdWx0QWxsb2M7CiAKICAgICBPYmplY3RCYXNlUmVmPFR5cGU+IG1BbGxvY1R5cGU7Ci0KLQotICAgIGZsb2F0IGNvbG9yWzRdOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5jcHAgYi9saWJzL3JzL3JzU2FtcGxlci5jcHAKaW5kZXggNzFmNTA4Zi4uZjQxZjI5NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NhbXBsZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcApAQCAtMTQsMTAgKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKIAogCkBAIC05NCw2ICsxMDAsMTcgQEAKICAgICBtQm91bmRTbG90ID0gLTE7CiAgICAgc3MtPm1TYW1wbGVyc1tzbG90XS5jbGVhcigpOwogfQorCit2b2lkIFNhbXBsZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK1NhbXBsZXIgKlNhbXBsZXI6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8qCiB2b2lkIFNhbXBsZXJTdGF0ZTo6c2V0dXBHTCgpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5oIGIvbGlicy9ycy9yc1NhbXBsZXIuaAppbmRleCAwNTA2MDgxLi4zNzg2NDM5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5oCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAgICAgdm9pZCBiaW5kVG9Db250ZXh0KFNhbXBsZXJTdGF0ZSAqLCB1aW50MzJfdCBzbG90KTsKICAgICB2b2lkIHVuYmluZEZyb21Db250ZXh0KFNhbXBsZXJTdGF0ZSAqKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI7IH0KKyAgICBzdGF0aWMgU2FtcGxlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBSc1NhbXBsZXJWYWx1ZSBtTWFnRmlsdGVyOwogICAgIFJzU2FtcGxlclZhbHVlIG1NaW5GaWx0ZXI7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmNwcCBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCmluZGV4IGEzMzkzM2IuLmZjMjJmYzMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCkBAIC0yNCwxOSArMjQsMjUgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1lbXNldCgmbUVudmlyb21lbnQsIDAsIHNpemVvZihtRW52aXJvbWVudCkpOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJEZXB0aCA9IDE7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IDA7Ci0gICAgbUVudmlyb21lbnQubUlzUm9vdCA9IGZhbHNlOwogfQogCiBTY3JpcHQ6On5TY3JpcHQoKQogewogfQogCit2b2lkIFNjcmlwdDo6c2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKQoreworICAgIGludDMyX3QgKmRlc3RQdHIgPSAoKGludDMyX3QgKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbc2xvdF07CisgICAgaWYgKGRlc3RQdHIpIHsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgZjEgICVmIiwgKChjb25zdCBmbG9hdCAqKWRlc3RQdHIpWzBdKTsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgJXAgJWkiLCBkZXN0UHRyLCBsZW4pOworICAgICAgICBtZW1jcHkoZGVzdFB0ciwgdmFsLCBsZW4pOworICAgICAgICAvL0xPR0UoInNldFZhciBmMiAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbGxpbmcgc2V0VmFyIG9uIHNsb3QgPSAlaSB3aGljaCBpcyBudWxsIiwgc2xvdCk7CisgICAgfQorfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtNDQsMTYgKzUwLDkgQEAKIHZvaWQgcnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJDb2xvcihDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcy0+bVNsb3RzW3Nsb3RdLnNldChhKTsKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRCaW5kQWxsb2NhdGlvbiAlaSAgJXAgICVwIiwgc2xvdCwgYSwgYS0+Z2V0UHRyKCkpOwogfQogCiB2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCB1aW50MzJfdCBsZW5ndGgpCkBAIC02Miw1MyArNjEsNTEgQEAKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJEZXB0aChDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgdikKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gdjsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IHY7Ci19Ci0KIHZvaWQgcnNpX1NjcmlwdFNldFR5cGUoQ29udGV4dCAqIHJzYywgUnNUeXBlIHZ0LCB1aW50MzJfdCBzbG90LCBib29sIHdyaXRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQogewogICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKICAgICBjb25zdCBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSAqPih2dCk7CiAgICAgc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW3Nsb3RdLnNldCh0KTsKICAgICBzcy0+bVNsb3RXcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKCIiKTsKLSAgICB9Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldEludm9rZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW52b2thYmxlTmFtZXNbc2xvdF0gPSBuYW1lOworICAgIExPR0UoInJzaV9TY3JpcHRTZXRUeXBlIik7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdEludm9rZShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90KQogewogICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgaWYgKHMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW3Nsb3RdID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHMtPnNldHVwU2NyaXB0KCk7Ci0gICAgcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0oKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBOVUxMLCAwKTsKIH0KIAogCi12b2lkIHJzaV9TY3JpcHRTZXRSb290KENvbnRleHQgKiByc2MsIGJvb2wgaXNSb290KQordm9pZCByc2lfU2NyaXB0SW52b2tlRGF0YShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCB2b2lkICpkYXRhKQogewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bVNjcmlwdC0+bUVudmlyb21lbnQubUlzUm9vdCA9IGlzUm9vdDsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOworfQorCit2b2lkIHJzaV9TY3JpcHRJbnZva2VWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIGRhdGEsIGxlbik7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckkoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgaW50IHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgZmxvYXQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgY29uc3QgZmxvYXQgKmZwID0gKGNvbnN0IGZsb2F0ICopZGF0YTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCBkYXRhLCBsZW4pOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuaCBiL2xpYnMvcnMvcnNTY3JpcHQuaAppbmRleCA1ZjRhNTM2Li40NTVlY2U3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0LmgKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5oCkBAIC0yNyw5ICsyNyw5IEBACiBjbGFzcyBQcm9ncmFtVmVydGV4OwogY2xhc3MgUHJvZ3JhbUZyYWdtZW50OwogY2xhc3MgUHJvZ3JhbVJhc3RlcjsKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlOworY2xhc3MgUHJvZ3JhbVN0b3JlOwogCi0jZGVmaW5lIE1BWF9TQ1JJUFRfQkFOS1MgMTYKKyNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAzMgogCiBjbGFzcyBTY3JpcHQgOiBwdWJsaWMgT2JqZWN0QmFzZQogewpAQCAtMzksMzggKzM5LDQxIEBACiAgICAgU2NyaXB0KENvbnRleHQgKik7CiAgICAgdmlydHVhbCB+U2NyaXB0KCk7CiAKLQogICAgIHN0cnVjdCBFbnZpcm9tZW50X3QgewotICAgICAgICBib29sIG1Jc1Jvb3Q7Ci0gICAgICAgIGZsb2F0IG1DbGVhckNvbG9yWzRdOwotICAgICAgICBmbG9hdCBtQ2xlYXJEZXB0aDsKLSAgICAgICAgdWludDMyX3QgbUNsZWFyU3RlbmNpbDsKLQotICAgICAgICB1aW50MzJfdCBtU3RhcnRUaW1lTWlsbGlzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbUxhc3REdFRpbWU7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKLQotCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtU2xvdHNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKIAorICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKTsKIAorICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdCgpID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCmluZGV4IGY0ZDI0NTEuLjdjN2IwMzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKQEAgLTE3LDggKzE3LDcgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotCi0jaW5jbHVkZSAiYWNjL2FjYy5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2V4dGVybmFsL2xsdm0vbGliYmNjL2luY2x1ZGUvYmNjL2JjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgpAQCAtMzcsNDAgKzM2LDc0IEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtQWNjU2NyaXB0ID0gTlVMTDsKKyAgICBtQmNjU2NyaXB0ID0gTlVMTDsKICAgICBtZW1zZXQoJm1Qcm9ncmFtLCAwLCBzaXplb2YobVByb2dyYW0pKTsKIH0KIAogU2NyaXB0Qzo6flNjcmlwdEMoKQogewotICAgIGlmIChtQWNjU2NyaXB0KSB7Ci0gICAgICAgIGFjY0RlbGV0ZVNjcmlwdChtQWNjU2NyaXB0KTsKKyAgICBpZiAobUJjY1NjcmlwdCkgeworICAgICAgICBiY2NEZWxldGVTY3JpcHQobUJjY1NjcmlwdCk7CiAgICAgfQogICAgIGZyZWUobUVudmlyb21lbnQubVNjcmlwdFRleHQpOwogICAgIG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0ID0gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdCgpCit2b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KENvbnRleHQgKnJzYykKIHsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKSB7Ci0gICAgICAgICAgICAqbVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0gPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICBzZXR1cEdMU3RhdGUocnNjKTsKKyAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCisgICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdm9pZCAqcHRyID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgICAgIHZvaWQgKipkZXN0ID0gKCh2b2lkICoqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtjdF07CisgICAgICAgIC8vTE9HRSgic2V0dXBTY3JpcHQgJWkgJXAgPSAlcCAgICAlcCAlaSIsIGN0LCBkZXN0LCBwdHIsIG1TbG90c1tjdF0tPmdldFR5cGUoKSwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworCisgICAgICAgIC8vY29uc3QgdWludDMyX3QgKnAzMiA9IChjb25zdCB1aW50MzJfdCAqKXB0cjsKKyAgICAgICAgLy9mb3IgKHVpbnQzMl90IGN0Mj0wOyBjdDIgPCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKTsgY3QyKyspIHsKKyAgICAgICAgICAgIC8vTE9HRSgiICAlaSA9IDB4JTA4eCAiLCBjdDIsIHAzMltjdDJdKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgaWYgKGRlc3QpIHsKKyAgICAgICAgICAgICpkZXN0ID0gcHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiU2NyaXB0Qzo6c2V0dXBTY3JpcHQsIE5VTEwgdmFyIGJpbmRpbmcgYWRkcmVzcy4iKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotCi11aW50MzJfdCBTY3JpcHRDOjpydW4oQ29udGV4dCAqcnNjLCB1aW50MzJfdCBsYXVuY2hJbmRleCkKK2NvbnN0IEFsbG9jYXRpb24gKlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpIGNvbnN0CiB7Ci0gICAgaWYgKG1Qcm9ncmFtLm1TY3JpcHQgPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1TbG90c1tjdF0tPmdldFB0cigpID09IHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1TbG90c1tjdF0uZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uLCBmYWlsZWQgdG8gZmluZCAlcCIsIHB0cik7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKLSAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPQotICAgIChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKilwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOworU2NyaXB0ICogU2NyaXB0Qzo6c2V0VExTKFNjcmlwdCAqc2MpCit7CisgICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0gKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CiAgICAgcnNBc3NlcnQodGxzKTsKKyAgICBTY3JpcHQgKm9sZCA9IHRscy0+bVNjcmlwdDsKKyAgICB0bHMtPm1TY3JpcHQgPSBzYzsKKyAgICByZXR1cm4gb2xkOworfQogCisKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBHTFN0YXRlKENvbnRleHQgKnJzYykKK3sKICAgICBpZiAobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpIHsKICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKTsKICAgICB9CkBAIC04MywyMCArMTE2LDIxNCBAQAogICAgIGlmIChtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0UmFzdGVyKG1FbnZpcm9tZW50Lm1SYXN0ZXIuZ2V0KCkpOwogICAgIH0KK30KIAotICAgIGlmIChsYXVuY2hJbmRleCA9PSAwKSB7Ci0gICAgICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKLSAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOwordWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYykKK3sKKyAgICBpZiAobVByb2dyYW0ubVJvb3QgPT0gTlVMTCkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHNldHVwU2NyaXB0KCk7CisKKyAgICBzZXR1cFNjcmlwdChyc2MpOwogCiAgICAgdWludDMyX3QgcmV0ID0gMDsKLSAgICB0bHMtPm1TY3JpcHQgPSB0aGlzOwotICAgIHJldCA9IG1Qcm9ncmFtLm1TY3JpcHQobGF1bmNoSW5kZXgpOwotICAgIHRscy0+bVNjcmlwdCA9IE5VTEw7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuICVwIiwgbVByb2dyYW0ubVJvb3QpOworICAgIHJldCA9IG1Qcm9ncmFtLm1Sb290KCk7CisgICAgc2V0VExTKG9sZFRMUyk7CisgICAgLy9MT0dFKCJTY3JpcHRDOjpydW4gcmV0ICVpIiwgcmV0KTsKICAgICByZXR1cm4gcmV0OwogfQogCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDb250ZXh0ICpyc2M7CisgICAgU2NyaXB0QyAqc2NyaXB0OworICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW47CisgICAgQWxsb2NhdGlvbiAqIGFvdXQ7CisgICAgY29uc3Qgdm9pZCAqIHVzcjsKKworICAgIHVpbnQzMl90IG1TbGljZVNpemU7CisgICAgdm9sYXRpbGUgaW50IG1TbGljZU51bTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluOworICAgIHVpbnQzMl90IGVTdHJpZGVJbjsKKyAgICB1aW50OF90ICpwdHJPdXQ7CisgICAgdWludDMyX3QgZVN0cmlkZU91dDsKKworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7CisKKyAgICB1aW50MzJfdCBkaW1YOworICAgIHVpbnQzMl90IGRpbVk7CisgICAgdWludDMyX3QgZGltWjsKKyAgICB1aW50MzJfdCBkaW1BcnJheTsKK30gTVRMYXVuY2hTdHJ1Y3Q7Cit0eXBlZGVmIGludCAoKnJzX3QpKGNvbnN0IHZvaWQgKiwgdm9pZCAqLCBjb25zdCB2b2lkICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90KTsKKworc3RhdGljIHZvaWQgd2NfeHkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgKm10bHMgPSAoTVRMYXVuY2hTdHJ1Y3QgKil1c3I7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50MzJfdCBzbGljZSA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJm10bHMtPm1TbGljZU51bSk7CisgICAgICAgIHVpbnQzMl90IHlTdGFydCA9IG10bHMtPnlTdGFydCArIHNsaWNlICogbXRscy0+bVNsaWNlU2l6ZTsKKyAgICAgICAgdWludDMyX3QgeUVuZCA9IHlTdGFydCArIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHlFbmQgPSByc01pbih5RW5kLCBtdGxzLT55RW5kKTsKKyAgICAgICAgaWYgKHlFbmQgPD0geVN0YXJ0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvL0xPR0UoInVzciBpZHggJWksIHggJWksJWkgIHkgJWksJWkiLCBpZHgsIG10bHMtPnhTdGFydCwgbXRscy0+eEVuZCwgeVN0YXJ0LCB5RW5kKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSB5U3RhcnQ7IHkgPCB5RW5kOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMtPmRpbVggKiB5OworICAgICAgICAgICAgdWludDhfdCAqeFB0ck91dCA9IG10bHMtPnB0ck91dCArIChtdGxzLT5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnhQdHJJbiA9IG10bHMtPnB0ckluICsgKG10bHMtPmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeCA9IG10bHMtPnhTdGFydDsgeCA8IG10bHMtPnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICgocnNfdCltdGxzLT5zY3JpcHQtPm1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCBtdGxzLT51c3IsIHgsIHksIDAsIDApOworICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLT5lU3RyaWRlSW47CisgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLT5lU3RyaWRlT3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgbXRsczsKKyAgICBtZW1zZXQoJm10bHMsIDAsIHNpemVvZihtdGxzKSk7CisKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMuZGltWCA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1aKCk7CisgICAgICAgIC8vbXRscy5kaW1BcnJheSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSBpZiAoYW91dCkgeworICAgICAgICBtdGxzLmRpbVggPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVgoKTsKKyAgICAgICAgbXRscy5kaW1ZID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbUFycmF5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAicnNGb3JFYWNoIGNhbGxlZCB3aXRoIG51bGwgYWxsb2NhdGlvbnMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT54RW5kID09IDApKSB7CisgICAgICAgIG10bHMueEVuZCA9IG10bHMuZGltWDsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eFN0YXJ0IDwgbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhFbmQgPD0gbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IHNjLT54RW5kKTsKKyAgICAgICAgbXRscy54U3RhcnQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54U3RhcnQpOworICAgICAgICBtdGxzLnhFbmQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54RW5kKTsKKyAgICAgICAgaWYgKG10bHMueFN0YXJ0ID49IG10bHMueEVuZCkgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT55RW5kID09IDApKSB7CisgICAgICAgIG10bHMueUVuZCA9IG10bHMuZGltWTsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eVN0YXJ0IDwgbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlFbmQgPD0gbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IHNjLT55RW5kKTsKKyAgICAgICAgbXRscy55U3RhcnQgPSByc01pbihtdGxzLmRpbVksIHNjLT55U3RhcnQpOworICAgICAgICBtdGxzLnlFbmQgPSByc01pbihtdGxzLmRpbVksIHNjLT55RW5kKTsKKyAgICAgICAgaWYgKG10bHMueVN0YXJ0ID49IG10bHMueUVuZCkgcmV0dXJuOworICAgIH0KKworICAgIG10bHMueEVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnhFbmQpOworICAgIG10bHMueUVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnlFbmQpOworICAgIG10bHMuekVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnpFbmQpOworICAgIG10bHMuYXJyYXlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy5hcnJheUVuZCk7CisKKyAgICByc0Fzc2VydChhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpID09IDApOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKworICAgIG10bHMucnNjID0gcnNjOworICAgIG10bHMuYWluID0gYWluOworICAgIG10bHMuYW91dCA9IGFvdXQ7CisgICAgbXRscy5zY3JpcHQgPSB0aGlzOworICAgIG10bHMudXNyID0gdXNyOworICAgIG10bHMubVNsaWNlU2l6ZSA9IDEwOworICAgIG10bHMubVNsaWNlTnVtID0gMDsKKworICAgIG10bHMucHRySW4gPSBOVUxMOworICAgIG10bHMuZVN0cmlkZUluID0gMDsKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMucHRySW4gPSAoY29uc3QgdWludDhfdCAqKWFpbi0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZUluID0gYWluLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBtdGxzLnB0ck91dCA9IE5VTEw7CisgICAgbXRscy5lU3RyaWRlT3V0ID0gMDsKKyAgICBpZiAoYW91dCkgeworICAgICAgICBtdGxzLnB0ck91dCA9ICh1aW50OF90ICopYW91dC0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZU91dCA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIH0KKworCisgICAgaWYgKChyc2MtPmdldFdvcmtlclBvb2xTaXplKCkgPiAxKSAmJgorICAgICAgICAoKG10bHMuZGltWSAqIG10bHMuZGltWiAqIG10bHMuZGltQXJyYXkpID4gMSkpIHsKKworICAgICAgICAvL0xPR0UoImxhdW5jaCAxIik7CisgICAgICAgIHJzYy0+bGF1bmNoVGhyZWFkcyh3Y194eSwgJm10bHMpOworICAgICAgICAvL0xPR0UoImxhdW5jaCAyIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBhciA9IG10bHMuYXJyYXlTdGFydDsgYXIgPCBtdGxzLmFycmF5RW5kOyBhcisrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHogPSBtdGxzLnpTdGFydDsgeiA8IG10bHMuekVuZDsgeisrKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gbXRscy55U3RhcnQ7IHkgPCBtdGxzLnlFbmQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLmRpbVggKiBtdGxzLmRpbVkgKiBtdGxzLmRpbVogKiBhciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIG10bHMuZGltWSAqIHogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGxzLmRpbVggKiB5OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp4UHRyT3V0ID0gbXRscy5wdHJPdXQgKyAobXRscy5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqeFB0ckluID0gbXRscy5wdHJJbiArIChtdGxzLmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gbXRscy54U3RhcnQ7IHggPCBtdGxzLnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKChyc190KW1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCB1c3IsIHgsIHksIHosIGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLmVTdHJpZGVJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy5lU3RyaWRlT3V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6SW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIC8vTE9HRSgicnNpX1NjcmlwdEludm9rZSAlaSIsIHNsb3QpOworICAgIGlmICgoc2xvdCA+PSBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCkgfHwKKyAgICAgICAgKG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnNbc2xvdF0gPT0gTlVMTCkpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisgICAgKCh2b2lkICgqKShjb25zdCB2b2lkICosIHVpbnQzMl90KSkKKyAgICAgICAgbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSkoZGF0YSwgbGVuKTsKKworICAgIHNldFRMUyhvbGRUTFMpOworfQorCiBTY3JpcHRDU3RhdGU6OlNjcmlwdENTdGF0ZSgpCiB7CiAgICAgbVNjcmlwdCA9IE5VTEw7CkBAIC0xMTMsMjEgKzM0MCwyNSBAQAogewogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7CiAgICAgICAgIG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5jbGVhcigpOwotICAgICAgICBtU2xvdE5hbWVzW2N0XS5zZXRUbygiIik7Ci0gICAgICAgIG1JbnZva2FibGVOYW1lc1tjdF0uc2V0VG8oIiIpOwogICAgICAgICBtU2xvdFdyaXRhYmxlW2N0XSA9IGZhbHNlOwogICAgIH0KIAogICAgIGRlbGV0ZSBtU2NyaXB0OwogICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0QyhOVUxMKTsKLQotICAgIG1JbnQzMkRlZmluZXMuY2xlYXIoKTsKLSAgICBtRmxvYXREZWZpbmVzLmNsZWFyKCk7CiB9CiAKLXN0YXRpYyBBQ0N2b2lkKiBzeW1ib2xMb29rdXAoQUNDdm9pZCogcENvbnRleHQsIGNvbnN0IEFDQ2NoYXIqIG5hbWUpCitzdGF0aWMgQkNDdm9pZCogc3ltYm9sTG9va3VwKEJDQ3ZvaWQqIHBDb250ZXh0LCBjb25zdCBCQ0NjaGFyKiBuYW1lKQogewotICAgIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW07CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKG5hbWUpOworICAgIGlmIChzeW0pIHsKKyAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKKyAgICB9CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChuYW1lKTsKICAgICBpZiAoc3ltKSB7CiAgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CiAgICAgfQpAQCAtMTM3LDY1ICszNjgsNTIgQEAKIAogdm9pZCBTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyKENvbnRleHQgKnJzYywgU2NyaXB0QyAqcykKIHsKLSAgICBzLT5tQWNjU2NyaXB0ID0gYWNjQ3JlYXRlU2NyaXB0KCk7Ci0gICAgU3RyaW5nOCB0bXA7CisgICAgTE9HVigiU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlciAiKTsKIAotICAgIHJzYy0+YXBwZW5kTmFtZURlZmluZXMoJnRtcCk7Ci0gICAgYXBwZW5kRGVjbHMoJnRtcCk7Ci0gICAgYXBwZW5kVmFyRGVmaW5lcyhyc2MsICZ0bXApOwotICAgIGFwcGVuZFR5cGVzKHJzYywgJnRtcCk7Ci0gICAgdG1wLmFwcGVuZCgiI2xpbmUgMVxuIik7Ci0KLSAgICBjb25zdCBjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0bXAuc3RyaW5nKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0fTsKLSAgICBpbnQgc2NyaXB0TGVuZ3RoW10gPSB7dG1wLmxlbmd0aCgpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aH0gOwotICAgIGFjY1NjcmlwdFNvdXJjZShzLT5tQWNjU2NyaXB0LCBzaXplb2Yoc2NyaXB0TGVuZ3RoKSAvIHNpemVvZihpbnQpLCBzY3JpcHRTb3VyY2UsIHNjcmlwdExlbmd0aCk7Ci0gICAgYWNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQWNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIE5VTEwpOwotICAgIGFjY0NvbXBpbGVTY3JpcHQocy0+bUFjY1NjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgIm1haW4iLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgImluaXQiLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOwotICAgIHJzQXNzZXJ0KHMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotCi0gICAgaWYgKCFzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7Ci0gICAgICAgIEFDQ2NoYXIgYnVmWzQwOTZdOwotICAgICAgICBBQ0NzaXplaSBsZW47Ci0gICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2cocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKGJ1ZiksICZsZW4sIGJ1Zik7Ci0gICAgICAgIExPR0UoIiVzIiwgYnVmKTsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiRXJyb3IgY29tcGlsaW5nIHVzZXIgc2NyaXB0LiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHMtPm1CY2NTY3JpcHQgPSBiY2NDcmVhdGVTY3JpcHQoKTsKKyAgICBiY2NTY3JpcHRCaXRjb2RlKHMtPm1CY2NTY3JpcHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aCk7CisgICAgYmNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQmNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIE5VTEwpOworICAgIGJjY0NvbXBpbGVTY3JpcHQocy0+bUJjY1NjcmlwdCk7CisgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgInJvb3QiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVJvb3QpOworICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJpbml0IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKKyAgICBMT0dWKCJyb290ICVwLCAgaW5pdCAlcCIsIHMtPm1Qcm9ncmFtLm1Sb290LCBzLT5tUHJvZ3JhbS5tSW5pdCk7CiAKICAgICBpZiAocy0+bVByb2dyYW0ubUluaXQpIHsKICAgICAgICAgcy0+bVByb2dyYW0ubUluaXQoKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbG90TmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKTsKLSAgICAgICAgfQorICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSAoU2NyaXB0OjpJbnZva2VGdW5jX3QqKSBjYWxsb2Mocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIHNpemVvZihTY3JpcHQ6Okludm9rZUZ1bmNfdCkpOworICAgICAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCBOVUxMLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgKEJDQ3ZvaWQgKiopIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobUludm9rYWJsZU5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGJjY0dldEV4cG9ydFZhcnMocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKTsKICAgICB9CisgICAgLy9mb3IgKGludCBjdDI9MDsgY3QyIDwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0MisrICkgeworICAgICAgICAvL0xPR0UoIlNjcmlwdCBmaWVsZCAlaSA9ICVwIiwgY3QyLCBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzW2N0Ml0pOworICAgIC8vfQogCiAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSk7CisgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpKTsKICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOwogCi0gICAgaWYgKHMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKKyAgICBpZiAocy0+bVByb2dyYW0ubVJvb3QpIHsKICAgICAgICAgY29uc3Qgc3RhdGljIGludCBwcmFnbWFNYXggPSAxNjsKLSAgICAgICAgQUNDc2l6ZWkgcHJhZ21hQ291bnQ7Ci0gICAgICAgIEFDQ2NoYXIgKiBzdHJbcHJhZ21hTWF4XTsKLSAgICAgICAgYWNjR2V0UHJhZ21hcyhzLT5tQWNjU2NyaXB0LCAmcHJhZ21hQ291bnQsIHByYWdtYU1heCwgJnN0clswXSk7CisgICAgICAgIEJDQ3NpemVpIHByYWdtYUNvdW50OworICAgICAgICBCQ0NjaGFyICogc3RyW3ByYWdtYU1heF07CisgICAgICAgIGJjY0dldFByYWdtYXMocy0+bUJjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOwogCiAgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgcHJhZ21hQ291bnQ7IGN0Kz0yKSB7CisgICAgICAgICAgICAvL0xPR0UoInByYWdtZSAlcyAlcyIsIHN0cltjdF0sIHN0cltjdCsxXSk7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJbY3RdLCAidmVyc2lvbiIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTEgKzQyNiw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1WZXJ0ZXggKiBwdiA9IChQcm9ncmFtVmVydGV4ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocHYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlVmVydGV4Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjI0LDExICs0MzcsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyICogcHIgPSAoUHJvZ3JhbVJhc3RlciAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1SYXN0ZXIuc2V0KHByKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVJhc3RlciIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCwxMSArNDQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgKiBwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnQuc2V0KHBmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZUZyYWdtZW50Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjU2LDEyICs0NTksNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBwZnMgPQotICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGZzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHBmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVTdG9yZSIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MywxMTEgKzQ3MCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmRFbGVtZW50Qm9keShTdHJpbmc4ICpzLCBjb25zdCBFbGVtZW50ICplKQotewotICAgIHMtPmFwcGVuZCgiIHtcbiIpOwotICAgIGZvciAoc2l6ZV90IGN0Mj0wOyBjdDIgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0MisrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmMgPSBlLT5nZXRGaWVsZChjdDIpOwotICAgICAgICBzLT5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGMtPmdldENUeXBlKCkpOwotICAgICAgICBzLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdDIpKTsKLSAgICAgICAgcy0+YXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy0+YXBwZW5kKCJ9Iik7Ci19Ci0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgTE9HRCgiYXBwZW5kVmFyRGVmaW5lcyBtSW50MzJEZWZpbmVzLnNpemUoKT0lZCBtRmxvYXREZWZpbmVzLnNpemUoKT0lZFxuIiwKLSAgICAgICAgICAgICAgICBtSW50MzJEZWZpbmVzLnNpemUoKSwgbUZsb2F0RGVmaW5lcy5zaXplKCkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1JbnQzMkRlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtSW50MzJEZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbUludDMyRGVmaW5lcy52YWx1ZUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZsb2F0RGVmaW5lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1GbG9hdERlZmluZXMua2V5QXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlZmZcbiIsIG1GbG9hdERlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIFN0cmluZzggdG1wOwotCi0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfMl9zIHtmbG9hdCB4OyBmbG9hdCB5O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl8zX3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzRfcyB7ZmxvYXQgeDsgZmxvYXQgeTsgZmxvYXQgejsgZmxvYXQgdzt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNVOF80X3Mge2NoYXIgcjsgY2hhciBnOyBjaGFyIGI7IGNoYXIgYTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzJfdCBzdHJ1Y3QgdmVjRjMyXzJfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzNfdCBzdHJ1Y3QgdmVjRjMyXzNfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzRfdCBzdHJ1Y3QgdmVjRjMyXzRfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjVThfNF90IHN0cnVjdCB2ZWNVOF80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0k4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlICp0ID0gbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpOwotICAgICAgICBpZiAoIXQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSB0LT5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlLT5nZXROYW1lKCkgJiYgKGUtPmdldEZpZWxkQ291bnQoKSA+IDEpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoInN0cnVjdCBzdHJ1Y3RfIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJfdCBzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgaWYgKGUtPmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbmFtZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgcy5zZXRUbyhlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gc3RydWN0IG5hbWVkIGZyb20gdGhlIHNsb3QuCi0gICAgICAgICAgICAgICAgcy5zZXRUbygic3RydWN0ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiX3MiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlLT5nZXRDU3RydWN0Qm9keSgpKTsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZEVsZW1lbnRCb2R5KCZzLCBlKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIgKiAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiJXMiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLT5hcHBlbmQocyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDIwLDcgKzUxMiw2IEBACiAgICAgcy0+c2V0Q29udGV4dChyc2MpOwogICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewogICAgICAgICBzLT5tVHlwZXNbY3RdLnNldChzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpKTsKLSAgICAgICAgcy0+bVNsb3ROYW1lc1tjdF0gPSBzcy0+bVNsb3ROYW1lc1tjdF07CiAgICAgICAgIHMtPm1TbG90V3JpdGFibGVbY3RdID0gc3MtPm1TbG90V3JpdGFibGVbY3RdOwogICAgIH0KIApAQCAtNDI4LDE4ICs1MTksNiBAQAogICAgIHJldHVybiBzOwogfQogCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lRihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bUZsb2F0RGVmaW5lcy5hZGQoU3RyaW5nOChuYW1lKSwgdmFsdWUpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lSTMyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnQzMkRlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQogfQogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5oIGIvbGlicy9ycy9yc1NjcmlwdEMuaAppbmRleCAzNWFiYWRmLi45ZDA5YjBiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5oCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKQEAgLTIxLDkgKzIxLDcgQEAKIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdEVudi5oIgogCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotc3RydWN0IEFDQ3NjcmlwdDsKK3N0cnVjdCBCQ0NzY3JpcHQ7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzQsNyArMzIsNyBAQAogY2xhc3MgU2NyaXB0QyA6IHB1YmxpYyBTY3JpcHQKIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIGludCAoKlJ1blNjcmlwdF90KSh1aW50MzJfdCBsYXVuY2hJbmRleCk7CisgICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkoKTsKICAgICB0eXBlZGVmIHZvaWQgKCpWb2lkRnVuY190KSgpOwogCiAgICAgU2NyaXB0QyhDb250ZXh0ICopOwpAQCAtNDQsMTggKzQyLDM1IEBACiAgICAgICAgIGludCBtVmVyc2lvbk1ham9yOwogICAgICAgICBpbnQgbVZlcnNpb25NaW5vcjsKIAotICAgICAgICBSdW5TY3JpcHRfdCBtU2NyaXB0OworICAgICAgICBSdW5TY3JpcHRfdCBtUm9vdDsKICAgICAgICAgVm9pZEZ1bmNfdCBtSW5pdDsKLQotICAgICAgICB2b2lkICoqIG1TbG90UG9pbnRlcnNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgfTsKIAogICAgIFByb2dyYW1fdCBtUHJvZ3JhbTsKIAotICAgIEFDQ3NjcmlwdCogICAgbUFjY1NjcmlwdDsKKyAgICBCQ0NzY3JpcHQqICAgIG1CY2NTY3JpcHQ7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqKSBjb25zdDsKKworCisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbik7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopOworCisgICAgdmlydHVhbCB2b2lkIHJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKSB7IHJldHVybiBOVUxMOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHNldHVwU2NyaXB0KENvbnRleHQgKik7CisgICAgdm9pZCBzZXR1cEdMU3RhdGUoQ29udGV4dCAqKTsKKyAgICBTY3JpcHQgKiBzZXRUTFMoU2NyaXB0ICopOwogfTsKIAogY2xhc3MgU2NyaXB0Q1N0YXRlCkBAIC02NywyNyArODIsMjEgQEAKICAgICBTY3JpcHRDICptU2NyaXB0OwogCiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtQ29uc3RhbnRCdWZmZXJUeXBlc1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CisgICAgLy9TdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgYm9vbCBtU2xvdFdyaXRhYmxlW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtSW52b2thYmxlTmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAKICAgICB2b2lkIGNsZWFyKCk7CiAgICAgdm9pZCBydW5Db21waWxlcihDb250ZXh0ICpyc2MsIFNjcmlwdEMgKnMpOwotICAgIHZvaWQgYXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7Ci0gICAgdm9pZCBhcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7CiAKICAgICBzdHJ1Y3QgU3ltYm9sVGFibGVfdCB7CiAgICAgICAgIGNvbnN0IGNoYXIgKiBtTmFtZTsKICAgICAgICAgdm9pZCAqIG1QdHI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKiBtUmV0OwotICAgICAgICBjb25zdCBjaGFyICogbVBhcmFtOwogICAgIH07Ci0gICAgc3RhdGljIFN5bWJvbFRhYmxlX3QgZ1N5bXNbXTsKKyAgICAvL3N0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CiAgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2woY29uc3QgY2hhciAqKTsKLSAgICBzdGF0aWMgdm9pZCBhcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxpbnQ+IG1JbnQzMkRlZmluZXM7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxmbG9hdD4gbUZsb2F0RGVmaW5lczsKKyAgICBzdGF0aWMgY29uc3QgU3ltYm9sVGFibGVfdCAqIGxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKik7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xHTChjb25zdCBjaGFyICopOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAppbmRleCAyMDJjYTNkLi5hYzMyODEwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKQEAgLTE3LDE4ICsxNywxMCBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0jaW5jbHVkZSAicnNOb2lzZS5oIgogCiAjaW5jbHVkZSAiYWNjL2FjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KICNpbmNsdWRlIDx0aW1lLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMzksMjUyICszMSwxMSBAQAogICAgIENvbnRleHQgKiByc2MgPSB0bHMtPm1Db250ZXh0OyBcCiAgICAgU2NyaXB0QyAqIHNjID0gKFNjcmlwdEMgKikgdGxzLT5tU2NyaXB0CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLX0gdmVjM190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci0gICAgZmxvYXQgdzsKLX0gdmVjNF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotfSB2ZWMyX3Q7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSU8gcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgZmxvYXQgU0NfbG9hZEYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIC8vTE9HRSgibG9hZEYgJWkgJWkgPSAlZiAleCIsIGJhbmssIG9mZnNldCwgZiwgKChpbnQgKikmZilbMF0pOwotICAgIHJldHVybiBmW29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQzMl90IFNDX2xvYWRJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQzMl90ICo+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+dyAqPSBzY2FsZTsKLX0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNYXRoIHJvdXRpbmVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBQSSAzLjE0MTU5MjZmCi0jZGVmaW5lIERFR19UT19SQUQgUEkgLyAxODAuMGYKLSNkZWZpbmUgUkFEX1RPX0RFRyAxODAuMGYgLyBQSQotCiBzdGF0aWMgZmxvYXQgU0Nfc2luZl9mYXN0KGZsb2F0IHgpCiB7CiAgICAgY29uc3QgZmxvYXQgQSA9ICAgMS4wZiAvICgyLjBmICogTV9QSSk7CkBAIC0zMjMsNiArNzQsNyBAQAogICAgIHJldHVybiAwLjIyMTVmICogKHkgKiBmYWJzZih5KSAtIHkpICsgeTsKIH0KIAorCiBzdGF0aWMgZmxvYXQgU0NfcmFuZGYoZmxvYXQgbWF4KQogewogICAgIGZsb2F0IHIgPSAoZmxvYXQpcmFuZCgpOwpAQCAtMzM1LDEwNCArODcsMjAgQEAKICAgICByZXR1cm4gciAvIFJBTkRfTUFYICogKG1heCAtIG1pbikgKyBtaW47CiB9CiAKLXN0YXRpYyBpbnQgU0Nfc2lnbihpbnQgdmFsdWUpCitzdGF0aWMgaW50IFNDX3JhbmRpKGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYobWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX3NpZ25mKGZsb2F0IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaTIoaW50IG1pbiwgaW50IG1heCkKIHsKLSAgICByZXR1cm4gKHZhbHVlID4gMCkgLSAodmFsdWUgPCAwKTsKKyAgICByZXR1cm4gKGludClTQ19yYW5kZjIobWluLCBtYXgpOwogfQogCi1zdGF0aWMgZmxvYXQgU0NfY2xhbXBmKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQorc3RhdGljIGZsb2F0IFNDX2ZyYWMoZmxvYXQgdikKIHsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGludCBTQ19jbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21heGYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21pbmYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3NxcmYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBpbnQgU0Nfc3FyKGludCB2KQotewotICAgIHJldHVybiB2ICogdjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2ZyYWNmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgLSBmbG9vcmYodik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19yb3VuZGYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gZmxvb3JmKHYgKyAwLjQ5OTk5OTk5OTkpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGlzdGYyKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIGZsb2F0IHogPSB6MiAtIHoxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjIoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYWdmMyhmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQotewotICAgIHJldHVybiBzcXJ0ZihhICogYSArIGIgKiBiICsgYyAqIGMpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfcmFkZihmbG9hdCBkZWdyZWVzKQotewotICAgIHJldHVybiBkZWdyZWVzICogREVHX1RPX1JBRDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2RlZ2YoZmxvYXQgcmFkaWFucykKLXsKLSAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9UT19ERUc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19sZXJwZihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQotewotICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfbm9ybWYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IHZhbHVlKQotewotICAgIHJldHVybiAodmFsdWUgLSBzdGFydCkgLyAoc3RvcCAtIHN0YXJ0KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hcGYoZmxvYXQgbWluU3RhcnQsIGZsb2F0IG1pblN0b3AsIGZsb2F0IG1heFN0YXJ0LCBmbG9hdCBtYXhTdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbWF4U3RhcnQgKyAobWF4U3RhcnQgLSBtYXhTdG9wKSAqICgodmFsdWUgLSBtaW5TdGFydCkgLyAobWluU3RvcCAtIG1pblN0YXJ0KSk7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTExLDM0OCArMTc5LDIyIEBACiAgICAgcmV0dXJuIHRpbWVpbmZvLT50bV95ZWFyOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTWlsbGlzKCkKIHsKICAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CiB9CiAKLXN0YXRpYyBpbnQzMl90IFNDX3N0YXJ0VGltZU1pbGxpcygpCitzdGF0aWMgaW50NjRfdCBTQ191cHRpbWVOYW5vcygpCit7CisgICAgcmV0dXJuIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2dldER0KCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19lbGFwc2VkVGltZU1pbGxpcygpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKQotICAgICAgICAgICAgLSBzYy0+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+bUVudmlyb21lbnQubUxhc3REdFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgcmV0dXJuICgoZmxvYXQpKHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZSAtIGwpKSAvIDEuMGU5OwogfQogCiAKQEAgLTg2MCw1MzEgKzIwMiwyNTMgQEAKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAiLCBhKTsKKyAgICAvL0xPR0UoIiB0eXBlPSVwIiwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOwotfQotCi1zdGF0aWMgaW50IFNDX2hzYlRvQWJncihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIHJldHVybiBpbnQoYSAgICAgICogMjU1LjBmKSA8PCAyNCB8Ci0gICAgICAgICAgIGludChyZ2JbMl0gKiAyNTUuMGYpIDw8IDE2IHwKLSAgICAgICAgICAgaW50KHJnYlsxXSAqIDI1NS4wZikgPDwgIDggfAotICAgICAgICAgICBpbnQocmdiWzBdICogMjU1LjBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1ZKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1MT0QoKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc3luY1RvR0woUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltRmFjZXMoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltRmFjZXMoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQorY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFgoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4KQogewotICAgIC8vTE9HRSgiYyAlZiAlZiAlZiAlZiIsIHIsIGcsIGIsIGEpOwotICAgIEdFVF9UTFMoKTsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdID0gYjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBUeXBlICp0ID0gYS0+Z2V0VHlwZSgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiB4XTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCitjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFkoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KQogewotICAgIExPR0UoIiVzICVmIiwgcywgZik7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqICh4ICsgeSp0LT5nZXREaW1YKCkpXTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCitjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFlaKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKIHsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgKigoaW50ICopICgmZikpKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogKHggKyB5KnQtPmdldERpbVgoKSldOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgJWkiLCBzLCBpKTsKKworc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpIHsKKyAgICBMT0dFKCIlcyAlZiwgMHglMDh4IiwgcywgZiwgKigoaW50ICopICgmZikpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYyKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMikgeworICAgIExPR0UoIiVzIHslZiwgJWZ9IiwgcywgZjEsIGYyKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYzKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZn0iLCBzLCBmMSwgZjIsIGYzKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnY0KGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMsIGZsb2F0IGY0KSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmfSIsIHMsIGYxLCBmMiwgZjMsIGY0KTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk00djQoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzRdLCBmWzhdLCBmWzEyXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmIiwgcywgZlsxXSwgZls1XSwgZls5XSwgZlsxM10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZiIsIHMsIGZbMl0sIGZbNl0sIGZbMTBdLCBmWzE0XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmfSIsIHMsIGZbM10sIGZbN10sIGZbMTFdLCBmWzE1XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNM3YzKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzNdLCBmWzZdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiIsIHMsIGZbMV0sIGZbNF0sIGZbN10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmfSIscywgZlsyXSwgZls1XSwgZls4XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNMnYyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiIsIHMsIGZbMF0sIGZbMl0pOworICAgIExPR0UoIiVzICAlZiwgJWZ9IixzLCBmWzFdLCBmWzNdKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKK3N0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkgeworICAgIExPR0UoIiVzICVpICAweCV4IiwgcywgaSwgaSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1UzMihjb25zdCBjaGFyICpzLCB1aW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3N0YXRpYyB2b2lkIFNDX2RlYnVnUChjb25zdCBjaGFyICpzLCBjb25zdCB2b2lkICpwKSB7CisgICAgTE9HRSgiJXMgJXAiLCBzLCBwKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50MihpbnQgY21kSUQsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPmdldFdpZHRoKCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudCAlaSAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgZmFsc2UpOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudChpbnQgY21kSUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnQgJWkiLCBjbWRJRCk7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChOVUxMLCBjbWRJRCwgMCwgZmFsc2UpOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIHVpbnQzMl90IGMgPSAwOwotICAgIGMgfD0gKHVpbnQzMl90KShyICogMjU1LmYgKyAwLjVmKTsKLSAgICBjIHw9ICgodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpKSA8PCA4OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41ZikpIDw8IDE2OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYSAqIDI1NS5mICsgMC41ZikpIDw8IDI0OwotICAgIHJldHVybiBjOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfY29sb3JGbG9hdFJHQkF0bzU2NShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIHVpbnQzMl90IGlyID0gKHVpbnQzMl90KShyICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpZyA9ICh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41Zik7Ci0gICAgdWludDMyX3QgaWIgPSAodWludDMyX3QpKGIgKiAyNTUuZiArIDAuNWYpOwotICAgIHJldHVybiByczg4OHRvNTY1KGlyLCBpZywgaWIpOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50QmxvY2tpbmcyKGludCBjbWRJRCwgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCB3YWl0Rm9yU3BhY2UgIT0gMCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudEJsb2NraW5nICVpICVpIiwgY21kSUQsIGxlbik7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc2NyaXB0Q2FsbChpbnQgc2NyaXB0SUQpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnRCbG9ja2luZyhpbnQgY21kSUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+cnVuU2NyaXB0KChTY3JpcHQgKilzY3JpcHRJRCwgMCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudEJsb2NraW5nICVpIiwgY21kSUQpOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoTlVMTCwgY21kSUQsIDAsIHRydWUpOwogfQogCitpbnQgU0NfZGl2c2kzKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAvIGI7Cit9CisKK2ludCBTQ19nZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWxsb2MgPSBzYy0+cHRyVG9BbGxvY2F0aW9uKHB0cik7CisgICAgcmV0dXJuIChpbnQpYWxsb2M7Cit9CisKKwordm9pZCBTQ19Gb3JFYWNoKFJzU2NyaXB0IHZzLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2aW4sCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB1c3IpOworfQorCit2b2lkIFNDX0ZvckVhY2gyKFJzU2NyaXB0IHZzLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2aW4sCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyLAorICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqY2FsbCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWluID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2aW4pOworICAgIEFsbG9jYXRpb24gKmFvdXQgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZvdXQpOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCwgdXNyLCBjYWxsKTsKK30KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBTY3JpcHRDU3RhdGU6OmdTeW1zW10gPSB7Ci0gICAgLy8gSU8KLSAgICB7ICJsb2FkSTMyIiwgKHZvaWQgKikmU0NfbG9hZEkzMiwKLSAgICAgICAgImludCIsICIoaW50LCBpbnQpIiB9LAotICAgIC8veyAibG9hZFUzMiIsICh2b2lkICopJlNDX2xvYWRVMzIsICJ1bnNpZ25lZCBpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkRiIsICh2b2lkICopJlNDX2xvYWRGLAotICAgICAgICAiZmxvYXQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlGIiwgKHZvaWQgKikmU0NfbG9hZEFycmF5RiwKLSAgICAgICAgImZsb2F0KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRBcnJheUkzMiIsICh2b2lkICopJlNDX2xvYWRBcnJheUkzMiwKLSAgICAgICAgImludCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkVmVjNCIsICh2b2lkICopJlNDX2xvYWRWZWM0LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgImxvYWRNYXRyaXgiLCAodm9pZCAqKSZTQ19sb2FkTWF0cml4LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgInN0b3JlSTMyIiwgKHZvaWQgKikmU0Nfc3RvcmVJMzIsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICAvL3sgInN0b3JlVTMyIiwgKHZvaWQgKikmU0Nfc3RvcmVVMzIsICJ2b2lkIiwgIihpbnQsIGludCwgdW5zaWduZWQgaW50KSIgfSwKLSAgICB7ICJzdG9yZUYiLCAodm9pZCAqKSZTQ19zdG9yZUYsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQpIiB9LAotICAgIHsgInN0b3JlVmVjNCIsICh2b2lkICopJlNDX3N0b3JlVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZU1hdHJpeCIsICh2b2lkICopJlNDX3N0b3JlTWF0cml4LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgImxvYWRTaW1wbGVNZXNoVmVydGljZXNGIiwgKHZvaWQgKikmU0NfbG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGRhdGVTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfdXBkYXRlU2ltcGxlTWVzaCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKIAotICAgIC8vIG1hdGgKLSAgICB7ICJtb2RmIiwgKHZvaWQgKikmZm1vZCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFicyIsICh2b2lkICopJmFicywKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJhYnNmIiwgKHZvaWQgKikmZmFic2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpbmZfZmFzdCIsICh2b2lkICopJlNDX3NpbmZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY29zZl9mYXN0IiwgKHZvaWQgKikmU0NfY29zZl9mYXN0LAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mIiwgKHZvaWQgKikmc2luZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY29zZiIsICh2b2lkICopJmNvc2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImFzaW5mIiwgKHZvaWQgKikmYXNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImFjb3NmIiwgKHZvaWQgKikmYWNvc2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImF0YW5mIiwgKHZvaWQgKikmYXRhbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImF0YW4yZiIsICh2b2lkICopJmF0YW4yZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImZhYnNmIiwgKHZvaWQgKikmZmFic2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJhbmRmIiwgKHZvaWQgKikmU0NfcmFuZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJhbmRmMiIsICh2b2lkICopJlNDX3JhbmRmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImZsb29yZiIsICh2b2lkICopJmZsb29yZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZnJhY2YiLCAodm9pZCAqKSZTQ19mcmFjZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY2VpbGYiLCAodm9pZCAqKSZjZWlsZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicm91bmRmIiwgKHZvaWQgKikmU0Nfcm91bmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJleHBmIiwgKHZvaWQgKikmZXhwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibG9nZiIsICh2b2lkICopJmxvZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInBvd2YiLCAodm9pZCAqKSZwb3dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWF4ZiIsICh2b2lkICopJlNDX21heGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtaW5mIiwgKHZvaWQgKikmU0NfbWluZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNxcnQiLCAodm9pZCAqKSZzcXJ0LAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNxcnRmIiwgKHZvaWQgKikmc3FydGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNxciIsICh2b2lkICopJlNDX3NxciwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJmIiwgKHZvaWQgKikmU0Nfc3FyZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2lnbiIsICh2b2lkICopJlNDX3NpZ24sCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic2lnbmYiLCAodm9pZCAqKSZTQ19zaWduZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY2xhbXAiLCAodm9pZCAqKSZTQ19jbGFtcCwKLSAgICAgICAgImludCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiY2xhbXBmIiwgKHZvaWQgKikmU0NfY2xhbXBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMiIsICh2b2lkICopJlNDX2Rpc3RmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlzdGYzIiwgKHZvaWQgKikmU0NfZGlzdGYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hZ2YyIiwgKHZvaWQgKikmU0NfbWFnZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMyIsICh2b2lkICopJlNDX21hZ2YzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInJhZGYiLCAodm9pZCAqKSZTQ19yYWRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJkZWdmIiwgKHZvaWQgKikmU0NfZGVnZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibGVycGYiLCAodm9pZCAqKSZTQ19sZXJwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub3JtZiIsICh2b2lkICopJlNDX25vcm1mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hcGYiLCAodm9pZCAqKSZTQ19tYXBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmIiwgKHZvaWQgKikmU0Nfbm9pc2VmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYyIiwgKHZvaWQgKikmU0Nfbm9pc2VmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZjMiLCAodm9pZCAqKSZTQ19ub2lzZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInR1cmJ1bGVuY2VmMiIsICh2b2lkICopJlNDX3R1cmJ1bGVuY2VmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjMiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAorc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIHsgIl9fZGl2c2kzIiwgKHZvaWQgKikmU0NfZGl2c2kzIH0sCisKKyAgICAvLyBhbGxvY2F0aW9uCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVgxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVggfSwKKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWSB9LAorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1aMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1aIH0sCisgICAgeyAiX1oyMXJzQWxsb2NhdGlvbkdldERpbUxPRDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltTE9EIH0sCisgICAgeyAiX1oyM3JzQWxsb2NhdGlvbkdldERpbUZhY2VzMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1GYWNlcyB9LAorICAgIHsgIl9aMTVyc0dldEFsbG9jYXRpb25QS3YiLCAodm9pZCAqKSZTQ19nZXRBbGxvY2F0aW9uIH0sCisKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WCB9LAorICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmpqIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WFkgfSwKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qamoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYWVogfSwKKworICAgIC8vIERlYnVnCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MyB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX2RlYnVnRk00djQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDN4MyIsICh2b2lkICopJlNDX2RlYnVnRk0zdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDJ4MiIsICh2b2lkICopJlNDX2RlYnVnRk0ydjIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjaSIsICh2b2lkICopJlNDX2RlYnVnSTMyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2oiLCAodm9pZCAqKSZTQ19kZWJ1Z1UzMiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQS3YiLCAodm9pZCAqKSZTQ19kZWJ1Z1AgfSwKKworICAgIC8vIFJTIE1hdGgKKyAgICB7ICJfWjZyc1JhbmRpIiwgKHZvaWQgKikmU0NfcmFuZGkgfSwKKyAgICB7ICJfWjZyc1JhbmRpaSIsICh2b2lkICopJlNDX3JhbmRpMiB9LAorICAgIHsgIl9aNnJzUmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiB9LAorICAgIHsgIl9aNnJzUmFuZGZmIiwgKHZvaWQgKikmU0NfcmFuZGYyIH0sCisgICAgeyAiX1o2cnNGcmFjZiIsICh2b2lkICopJlNDX2ZyYWMgfSwKIAogICAgIC8vIHRpbWUKLSAgICB7ICJzZWNvbmQiLCAodm9pZCAqKSZTQ19zZWNvbmQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImhvdXIiLCAodm9pZCAqKSZTQ19ob3VyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImRheSIsICh2b2lkICopJlNDX2RheSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtb250aCIsICh2b2lkICopJlNDX21vbnRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInllYXIiLCAodm9pZCAqKSZTQ195ZWFyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInVwdGltZU1pbGxpcyIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJzdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAiZWxhcHNlZFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX2VsYXBzZWRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKKyAgICB7ICJfWjhyc1NlY29uZHYiLCAodm9pZCAqKSZTQ19zZWNvbmQgfSwKKyAgICB7ICJfWjhyc01pbnV0ZXYiLCAodm9pZCAqKSZTQ19taW51dGUgfSwKKyAgICB7ICJfWjZyc0hvdXJ2IiwgKHZvaWQgKikmU0NfaG91ciB9LAorICAgIHsgIl9aNXJzRGF5diIsICh2b2lkICopJlNDX2RheSB9LAorICAgIHsgIl9aN3JzTW9udGh2IiwgKHZvaWQgKikmU0NfbW9udGggfSwKKyAgICB7ICJfWjZyc1llYXJ2IiwgKHZvaWQgKikmU0NfeWVhciB9LAorICAgIHsgIl9aMTRyc1VwdGltZU1pbGxpc3YiLCAodm9pZCopJlNDX3VwdGltZU1pbGxpcyB9LAorICAgIHsgIl9aMTNyc1VwdGltZU5hbm9zdiIsICh2b2lkKikmU0NfdXB0aW1lTmFub3MgfSwKKyAgICB7ICJfWjdyc0dldER0diIsICh2b2lkKikmU0NfZ2V0RHQgfSwKIAotICAgIC8vIG1hdHJpeAotICAgIHsgIm1hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRGbG9hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRGbG9hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpmKSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpuZXdtYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkUm90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkU2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkVHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpsaHMsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpIiwgKHZvaWQgKikmU0NfdG9DbGllbnQgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpUEt2aiIsICh2b2lkICopJlNDX3RvQ2xpZW50MiB9LAorICAgIHsgIl9aMjJyc1NlbmRUb0NsaWVudEJsb2NraW5naSIsICh2b2lkICopJlNDX3RvQ2xpZW50QmxvY2tpbmcgfSwKKyAgICB7ICJfWjIycnNTZW5kVG9DbGllbnRCbG9ja2luZ2lQS3ZqIiwgKHZvaWQgKikmU0NfdG9DbGllbnRCbG9ja2luZzIgfSwKIAotICAgIC8vIHZlY3RvcgotICAgIHsgInZlYzJSYW5kIiwgKHZvaWQgKikmU0NfdmVjMlJhbmQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pIiB9LAorICAgIHsgIl9aOXJzRm9yRWFjaDlyc19zY3JpcHQxM3JzX2FsbG9jYXRpb25TMF9QS3YiLCAodm9pZCAqKSZTQ19Gb3JFYWNoIH0sCisgICAgLy97ICJfWjlyc0ZvckVhY2g5cnNfc2NyaXB0MTNyc19hbGxvY2F0aW9uUzBfUEt2IiwgKHZvaWQgKikmU0NfRm9yRWFjaDIgfSwKIAotICAgIC8vIHZlYzMKLSAgICB7ICJ2ZWMzTm9ybSIsICh2b2lkICopJlNDX3ZlYzNOb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0xlbmd0aCIsICh2b2lkICopJlNDX3ZlYzNMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0FkZCIsICh2b2lkICopJlNDX3ZlYzNBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1N1YiIsICh2b2lkICopJlNDX3ZlYzNTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0Nyb3NzIiwgKHZvaWQgKikmU0NfdmVjM0Nyb3NzLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNEb3QiLCAodm9pZCAqKSZTQ192ZWMzRG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNTY2FsZSIsICh2b2lkICopJlNDX3ZlYzNTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICAvLyB2ZWM0Ci0gICAgeyAidmVjNE5vcm0iLCAodm9pZCAqKSZTQ192ZWM0Tm9ybSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRMZW5ndGgiLCAodm9pZCAqKSZTQ192ZWM0TGVuZ3RoLAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRBZGQiLCAodm9pZCAqKSZTQ192ZWM0QWRkLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTdWIiLCAodm9pZCAqKSZTQ192ZWM0U3ViLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzREb3QiLCAodm9pZCAqKSZTQ192ZWM0RG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTY2FsZSIsICh2b2lkICopJlNDX3ZlYzRTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKyAgICAvL3sgInNpbmZfZmFzdCIsICh2b2lkICopJlNDX3NpbmZfZmFzdCB9LAorICAgIC8veyAiY29zZl9mYXN0IiwgKHZvaWQgKikmU0NfY29zZl9mYXN0IH0sCiAKLSAgICAvLyBjb250ZXh0Ci0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1TdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1WZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFNhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImJpbmRUZXh0dXJlIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLQotICAgIC8vIHZwCi0gICAgeyAidnBMb2FkTW9kZWxNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCi0gICAgeyAidnBMb2FkVGV4dHVyZU1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICopIiB9LAotCi0KLQotICAgIC8vIGRyYXdpbmcKLSAgICB7ICJkcmF3UmVjdCIsICh2b2lkICopJlNDX2RyYXdSZWN0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopIiB9LAotICAgIHsgImRyYXdRdWFkIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KSIgfSwKLSAgICB7ICJkcmF3UXVhZFRleENvb3JkcyIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCwgZmxvYXQgY3gwLCBmbG9hdCBjeTAsIGZsb2F0IGN4MSwgZmxvYXQgY3kxKSIgfSwKLSAgICB7ICJkcmF3TGluZSIsICh2b2lkICopJlNDX2RyYXdMaW5lLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikiIH0sCi0gICAgeyAiZHJhd1BvaW50IiwgKHZvaWQgKikmU0NfZHJhd1BvaW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSkiIH0sCi0gICAgeyAiZHJhd1NpbXBsZU1lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20pIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoUmFuZ2UiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlLAotICAgICAgICAidm9pZCIsICIoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKSIgfSwKLQotCi0gICAgLy8gbWlzYwotICAgIHsgInBmQ2xlYXJDb2xvciIsICh2b2lkICopJlNDX0NsZWFyQ29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiY29sb3IiLCAodm9pZCAqKSZTQ19jb2xvciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJoc2IiLCAodm9pZCAqKSZTQ19oc2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiVG9SZ2IiLCAodm9pZCAqKSZTQ19oc2JUb1JnYiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KikiIH0sCi0gICAgeyAiaHNiVG9BYmdyIiwgKHZvaWQgKikmU0NfaHNiVG9BYmdyLAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYW1iaWVudCIsICh2b2lkICopJlNDX2FtYmllbnQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlmZnVzZSIsICh2b2lkICopJlNDX2RpZmZ1c2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3BlY3VsYXIiLCAodm9pZCAqKSZTQ19zcGVjdWxhciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJlbWlzc2lvbiIsICh2b2lkICopJlNDX2VtaXNzaW9uLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNoaW5pbmVzcyIsICh2b2lkICopJlNDX3NoaW5pbmVzcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb2ludEF0dGVudWF0aW9uIiwgKHZvaWQgKikmU0NfcG9pbnRBdHRlbnVhdGlvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0gICAgeyAidXBsb2FkVG9UZXh0dXJlIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwbG9hZFRvQnVmZmVyT2JqZWN0IiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAic3luY1RvR0wiLCAodm9pZCAqKSZTQ19zeW5jVG9HTCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLSAgICB7ICJjb2xvckZsb2F0UkdCQXRvVU5vcm04IiwgKHZvaWQgKikmU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOCwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yRmxvYXRSR0J0bzU2NSIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG81NjUsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0KLSAgICB7ICJnZXRXaWR0aCIsICh2b2lkICopJlNDX2dldFdpZHRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImdldEhlaWdodCIsICh2b2lkICopJlNDX2dldEhlaWdodCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLQotICAgIHsgInNlbmRUb0NsaWVudCIsICh2b2lkICopJlNDX3RvQ2xpZW50LAotICAgICAgICAiaW50IiwgIih2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpIiB9LAotCi0KLSAgICB7ICJkZWJ1Z0YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0kzMiIsICh2b2lkICopJlNDX2RlYnVnSTMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotICAgIHsgImRlYnVnSGV4RiIsICh2b2lkICopJlNDX2RlYnVnSGV4RiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgZmxvYXQpIiB9LAotICAgIHsgImRlYnVnSGV4STMyIiwgKHZvaWQgKikmU0NfZGVidWdIZXhJMzIsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGludCkiIH0sCi0KLSAgICB7ICJzY3JpcHRDYWxsIiwgKHZvaWQgKikmU0Nfc2NyaXB0Q2FsbCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLQotICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKnN5bSkKQEAgLTE0MDAsMTcgKzQ2NCwzIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpCi17Ci0gICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7Ci0gICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVJldCk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1OYW1lKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVBhcmFtKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIjtcbiIpOwotICAgICAgICBzeW1zKys7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThlN2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorCisvLyBJbXBsZW1lbnRzIHJzX2NsLnJzaAorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitzdGF0aWMgZmxvYXQgU0NfYWNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYWNvc2YodikvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFuMnBpKGZsb2F0IHksIGZsb2F0IHgpIHsKKyAgICByZXR1cm4gYXRhbjJmKHksIHgpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2Nvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gY29zZih2ICogTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19leHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKKworfQorCitzdGF0aWMgZmxvYXQgU0NfZnJhY3QoZmxvYXQgdiwgaW50ICppcHRyKSB7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIGlwdHJbMF0gPSBpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19sb2cyKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gbG9nMTAodikgLyBsb2cxMCgyLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfcG93bihmbG9hdCB2LCBpbnQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIChmbG9hdClwKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIHApOworfQorCitmbG9hdCBTQ19yb290bihmbG9hdCB2LCBpbnQgcikgeworICAgIHJldHVybiBwb3codiwgMS5mIC8gcik7Cit9CisKK2Zsb2F0IFNDX3JzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydGYodik7Cit9CisKK2Zsb2F0IFNDX3NpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvc2Yodik7CisgICAgcmV0dXJuIHNpbmYodik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbmYodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiB0YW5mKHYgKiBNX1BJKTsKK30KKworICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEludGVnZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB1aW50MzJfdCBTQ19hYnNfaTMyKGludDMyX3Qgdikge3JldHVybiBhYnModik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Fic19pMTYoaW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClhYnModik7fQorc3RhdGljIHVpbnQ4X3QgU0NfYWJzX2k4KGludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KWFicyh2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19jbHpfdTMyKHVpbnQzMl90IHYpIHtyZXR1cm4gX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDE2X3QgU0NfY2x6X3UxNih1aW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Nsel91OCh1aW50OF90IHYpIHtyZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50MzJfdCBTQ19jbHpfaTMyKGludDMyX3Qgdikge3JldHVybiAoaW50MzJfdClfX2J1aWx0aW5fY2x6KCh1aW50MzJfdCl2KTt9CitzdGF0aWMgaW50MTZfdCBTQ19jbHpfaTE2KGludDE2X3Qgdikge3JldHVybiAoaW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyBpbnQ4X3QgU0NfY2x6X2k4KGludDhfdCB2KSB7cmV0dXJuIChpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19tYXhfdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWF4X3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWF4X3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWF4X2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21heF9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21heF9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19taW5fdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWluX3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWluX3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWluX2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21pbl9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21pbl9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRmxvYXQgdXRpbAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBmbG9hdCBTQ19jbGFtcF9mMzIoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpCit7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19kZWdyZWVzKGZsb2F0IHJhZGlhbnMpCit7CisgICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwLmYgLyBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21heF9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWF4KHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21pbl9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWluKHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21peF9mMzIoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKK3sKKyAgICAvL0xPR0UoImxlcnBmICVmICAlZiAgJWYiLCBzdGFydCwgc3RvcCwgYW1vdW50KTsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KKworc3RhdGljIGZsb2F0IFNDX3JhZGlhbnMoZmxvYXQgZGVncmVlcykKK3sKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc3RlcF9mMzIoZmxvYXQgZWRnZSwgZmxvYXQgdikKK3sKKyAgICBpZiAodiA8IGVkZ2UpIHJldHVybiAwLmY7CisgICAgcmV0dXJuIDEuZjsKK30KKworc3RhdGljIGZsb2F0IFNDX3NpZ25fZjMyKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA+IDApIHJldHVybiAxLmY7CisgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHZhbHVlOworfQorCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIC8vIE9wZW5DTCBtYXRoCisgICAgeyAiX1o0YWNvc2YiLCAodm9pZCAqKSZhY29zZiB9LAorICAgIHsgIl9aNWFjb3NoZiIsICh2b2lkICopJmFjb3NoZiB9LAorICAgIHsgIl9aNmFjb3NwaWYiLCAodm9pZCAqKSZTQ19hY29zcGkgfSwKKyAgICB7ICJfWjRhc2luZiIsICh2b2lkICopJmFzaW5mIH0sCisgICAgeyAiX1o1YXNpbmhmIiwgKHZvaWQgKikmYXNpbmhmIH0sCisgICAgeyAiX1o2YXNpbnBpZiIsICh2b2lkICopJlNDX2FzaW5waSB9LAorICAgIHsgIl9aNGF0YW5mIiwgKHZvaWQgKikmYXRhbmYgfSwKKyAgICB7ICJfWjVhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYgfSwKKyAgICB7ICJfWjZhdGFucGlmIiwgKHZvaWQgKikmU0NfYXRhbnBpIH0sCisgICAgeyAiX1o3YXRhbjJwaWYiLCAodm9pZCAqKSZTQ19hdGFuMnBpIH0sCisgICAgeyAiX1o0Y2JydGYiLCAodm9pZCAqKSZjYnJ0ZiB9LAorICAgIHsgIl9aNGNlaWxmIiwgKHZvaWQgKikmY2VpbGYgfSwKKyAgICB7ICJfWjhjb3B5c2lnbmZmIiwgKHZvaWQgKikmY29weXNpZ25mIH0sCisgICAgeyAiX1ozY29zZiIsICh2b2lkICopJmNvc2YgfSwKKyAgICB7ICJfWjRjb3NoZiIsICh2b2lkICopJmNvc2hmIH0sCisgICAgeyAiX1o1Y29zcGlmIiwgKHZvaWQgKikmU0NfY29zcGkgfSwKKyAgICB7ICJfWjRlcmZjZiIsICh2b2lkICopJmVyZmNmIH0sCisgICAgeyAiX1ozZXJmZiIsICh2b2lkICopJmVyZmYgfSwKKyAgICB7ICJfWjNleHBmIiwgKHZvaWQgKikmZXhwZiB9LAorICAgIHsgIl9aNGV4cDJmIiwgKHZvaWQgKikmZXhwMmYgfSwKKyAgICB7ICJfWjVleHAxMGYiLCAodm9pZCAqKSZTQ19leHAxMCB9LAorICAgIHsgIl9aNWV4cG0xZiIsICh2b2lkICopJmV4cG0xZiB9LAorICAgIHsgIl9aNGZhYnNmIiwgKHZvaWQgKikmZmFic2YgfSwKKyAgICB7ICJfWjRmZGltZmYiLCAodm9pZCAqKSZmZGltZiB9LAorICAgIHsgIl9aNWZsb29yZiIsICh2b2lkICopJmZsb29yZiB9LAorICAgIHsgIl9aM2ZtYWZmZiIsICh2b2lkICopJmZtYWYgfSwKKyAgICB7ICJfWjRmbWF4ZmYiLCAodm9pZCAqKSZmbWF4ZiB9LAorICAgIHsgIl9aNGZtaW5mZiIsICh2b2lkICopJmZtaW5mIH0sICAvLyBmbG9hdCBmbWluKGZsb2F0LCBmbG9hdCkKKyAgICB7ICJfWjRmbW9kZmYiLCAodm9pZCAqKSZmbW9kZiB9LAorICAgIHsgIl9aNWZyYWN0ZlBmIiwgKHZvaWQgKikmU0NfZnJhY3QgfSwKKyAgICB7ICJfWjVmcmV4cGZQaSIsICh2b2lkICopJmZyZXhwZiB9LAorICAgIHsgIl9aNWh5cG90ZmYiLCAodm9pZCAqKSZoeXBvdGYgfSwKKyAgICB7ICJfWjVpbG9nYmYiLCAodm9pZCAqKSZpbG9nYmYgfSwKKyAgICB7ICJfWjVsZGV4cGZpIiwgKHZvaWQgKikmbGRleHBmIH0sCisgICAgeyAiX1o2bGdhbW1hZiIsICh2b2lkICopJmxnYW1tYWYgfSwKKyAgICB7ICJfWjNsb2dmIiwgKHZvaWQgKikmbG9nZiB9LAorICAgIHsgIl9aNGxvZzJmIiwgKHZvaWQgKikmU0NfbG9nMiB9LAorICAgIHsgIl9aNWxvZzEwZiIsICh2b2lkICopJmxvZzEwZiB9LAorICAgIHsgIl9aNWxvZzFwZiIsICh2b2lkICopJmxvZzFwZiB9LAorICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgeyAibW9kZiIsICh2b2lkICopJm1vZGZmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjluZXh0YWZ0ZXJmZiIsICh2b2lkICopJm5leHRhZnRlcmYgfSwKKyAgICB7ICJfWjNwb3dmZiIsICh2b2lkICopJnBvd2YgfSwKKyAgICB7ICJfWjRwb3duZmkiLCAodm9pZCAqKSZTQ19wb3duIH0sCisgICAgeyAiX1o0cG93cmZmIiwgKHZvaWQgKikmU0NfcG93ciB9LAorICAgIHsgIl9aOXJlbWFpbmRlcmZmIiwgKHZvaWQgKikmcmVtYWluZGVyZiB9LAorICAgIHsgInJlbXF1byIsICh2b2lkICopJnJlbXF1b2YgfSwKKyAgICB7ICJfWjRyaW50ZiIsICh2b2lkICopJnJpbnRmIH0sCisgICAgeyAiX1o1cm9vdG5maSIsICh2b2lkICopJlNDX3Jvb3RuIH0sCisgICAgeyAiX1o1cm91bmRmIiwgKHZvaWQgKikmcm91bmRmIH0sCisgICAgeyAiX1o1cnNxcnRmIiwgKHZvaWQgKikmU0NfcnNxcnQgfSwKKyAgICB7ICJfWjNzaW5mIiwgKHZvaWQgKikmc2luZiB9LAorICAgIHsgInNpbmNvcyIsICh2b2lkICopJlNDX3NpbmNvcyB9LAorICAgIHsgIl9aNHNpbmhmIiwgKHZvaWQgKikmc2luaGYgfSwKKyAgICB7ICJfWjVzaW5waWYiLCAodm9pZCAqKSZTQ19zaW5waSB9LAorICAgIHsgIl9aNHNxcnRmIiwgKHZvaWQgKikmc3FydGYgfSwKKyAgICB7ICJfWjN0YW5mIiwgKHZvaWQgKikmdGFuZiB9LAorICAgIHsgIl9aNHRhbmhmIiwgKHZvaWQgKikmdGFuaGYgfSwKKyAgICB7ICJfWjV0YW5waWYiLCAodm9pZCAqKSZTQ190YW5waSB9LAorICAgIC8veyAidGdhbW1hIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o1dHJ1bmNmIiwgKHZvaWQgKikmdHJ1bmNmIH0sCisKKyAgICAvLyBPcGVuQ0wgSW50CisgICAgeyAiX1ozYWJzaSIsICh2b2lkICopJlNDX2Fic19pMzIgfSwKKyAgICB7ICJfWjNhYnNzIiwgKHZvaWQgKikmU0NfYWJzX2kxNiB9LAorICAgIHsgIl9aM2Fic2MiLCAodm9pZCAqKSZTQ19hYnNfaTggfSwKKyAgICB7ICJfWjNjbHpqIiwgKHZvaWQgKikmU0NfY2x6X3UzMiB9LAorICAgIHsgIl9aM2NsenQiLCAodm9pZCAqKSZTQ19jbHpfdTE2IH0sCisgICAgeyAiX1ozY2x6aCIsICh2b2lkICopJlNDX2Nsel91OCB9LAorICAgIHsgIl9aM2NsemkiLCAodm9pZCAqKSZTQ19jbHpfaTMyIH0sCisgICAgeyAiX1ozY2x6cyIsICh2b2lkICopJlNDX2Nsel9pMTYgfSwKKyAgICB7ICJfWjNjbHpjIiwgKHZvaWQgKikmU0NfY2x6X2k4IH0sCisgICAgeyAiX1ozbWF4amoiLCAodm9pZCAqKSZTQ19tYXhfdTMyIH0sCisgICAgeyAiX1ozbWF4dHQiLCAodm9pZCAqKSZTQ19tYXhfdTE2IH0sCisgICAgeyAiX1ozbWF4aGgiLCAodm9pZCAqKSZTQ19tYXhfdTggfSwKKyAgICB7ICJfWjNtYXhpaSIsICh2b2lkICopJlNDX21heF9pMzIgfSwKKyAgICB7ICJfWjNtYXhzcyIsICh2b2lkICopJlNDX21heF9pMTYgfSwKKyAgICB7ICJfWjNtYXhjYyIsICh2b2lkICopJlNDX21heF9pOCB9LAorICAgIHsgIl9aM21pbmpqIiwgKHZvaWQgKikmU0NfbWluX3UzMiB9LAorICAgIHsgIl9aM21pbnR0IiwgKHZvaWQgKikmU0NfbWluX3UxNiB9LAorICAgIHsgIl9aM21pbmhoIiwgKHZvaWQgKikmU0NfbWluX3U4IH0sCisgICAgeyAiX1ozbWluaWkiLCAodm9pZCAqKSZTQ19taW5faTMyIH0sCisgICAgeyAiX1ozbWluc3MiLCAodm9pZCAqKSZTQ19taW5faTE2IH0sCisgICAgeyAiX1ozbWluY2MiLCAodm9pZCAqKSZTQ19taW5faTggfSwKKworICAgIC8vIE9wZW5DTCA2LjExLjQKKyAgICB7ICJfWjVjbGFtcGZmZiIsICh2b2lkICopJlNDX2NsYW1wX2YzMiB9LAorICAgIHsgIl9aN2RlZ3JlZXNmIiwgKHZvaWQgKikmU0NfZGVncmVlcyB9LAorICAgIHsgIl9aM21heGZmIiwgKHZvaWQgKikmU0NfbWF4X2YzMiB9LAorICAgIHsgIl9aM21pbmZmIiwgKHZvaWQgKikmU0NfbWluX2YzMiB9LAorICAgIHsgIl9aM21peGZmZiIsICh2b2lkICopJlNDX21peF9mMzIgfSwKKyAgICB7ICJfWjdyYWRpYW5zZiIsICh2b2lkICopJlNDX3JhZGlhbnMgfSwKKyAgICB7ICJfWjRzdGVwZmYiLCAodm9pZCAqKSZTQ19zdGVwX2YzMiB9LAorICAgIC8veyAic21vb3Roc3RlcCIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNHNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbl9mMzIgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNTk1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKworI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1TdG9yZShSc1Byb2dyYW1TdG9yZSBwZnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFByb2plY3Rpb25NYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOworfQorCisKK3N0YXRpYyB2b2lkIFNDX3BmQ29uc3RhbnRDb2xvcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgLy9HRVRfVExTKCk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHIsIGcsIGIsIGEpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTE9HRSgiUXVhZCIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOworCisgICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OworICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMTIsIGZhbHNlLCAodWludDMyX3QpdnR4LCAicG9zaXRpb24iKTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDIsIDgsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCit7CisgICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKKyAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7CisKKyAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OworCisgICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOworCisgICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCisgICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKKyAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Cit9CisvKgorc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBmbG9hdCB2aW5bM10gPSB7eCwgeSwgen07CisgICAgZmxvYXQgdm91dFs0XTsKKworICAgIC8vTE9HRSgiZHMgIGluICVmICVmICVmIiwgeCwgeSwgeik7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+dHJhbnNmb3JtVG9TY3JlZW4ocnNjLCB2b3V0LCB2aW4pOworICAgIC8vTE9HRSgiZHMgIG91dCAlZiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0sIHZvdXRbM10pOworICAgIHZvdXRbMF0gLz0gdm91dFszXTsKKyAgICB2b3V0WzFdIC89IHZvdXRbM107CisgICAgdm91dFsyXSAvPSB2b3V0WzNdOworCisgICAgdm91dFswXSAqPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKj0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisgICAgdm91dFswXSArPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKz0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisKKyAgICB2b3V0WzBdIC09IHcvMjsKKyAgICB2b3V0WzFdIC09IGgvMjsKKworICAgIC8vTE9HRSgiZHMgIG91dDIgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdKTsKKworICAgIC8vIFUsIFYsIFcsIEgKKyAgICBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2Uodm91dFswXSwgdm91dFsxXSwgeiwgaCwgdyk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKK30KKyovCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKK3sKKyAgICAvL0xPR0UoIlNDX2RyYXdSZWN0ICVmLCVmICAlZiwlZiAgJWYiLCB4MSwgeTEsIHgyLCB5Miwgeik7CisgICAgU0NfZHJhd1F1YWQoeDEsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTEsIHosCisgICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2goUnNNZXNoIHZzbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXIocnNjKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2hQcmltaXRpdmUoUnNNZXNoIHZzbSwgdWludDMyX3QgcHJpbUluZGV4KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclByaW1pdGl2ZShyc2MsIHByaW1JbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UoUnNNZXNoIHZzbSwgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCBzdGFydCwgbGVuKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdm9pZCBTQ19jb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gKFByb2dyYW1GcmFnbWVudCAqKXJzYy0+Z2V0RnJhZ21lbnQoKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyLCBnLCBiLCBhKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlMihSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIGJhc2VNaXBMZXZlbCk7Cit9CitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0KFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChyc2MsIHZhKTsKK30KKworc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbENsZWFyQ29sb3IociwgZywgYiwgYSk7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHZvaWQgU0NfQ2xlYXJEZXB0aChmbG9hdCB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbENsZWFyRGVwdGhmKHYpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19nZXRXaWR0aCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldFdpZHRoKCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19nZXRIZWlnaHQoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByZXR1cm4gcnNjLT5nZXRIZWlnaHQoKTsKK30KKworc3RhdGljIHZvaWQgU0NfRHJhd1RleHRBbGxvYyhSc0FsbG9jYXRpb24gdmEsIGludCB4LCBpbnQgeSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dChhbGxvYywgeCwgeSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0RyYXdUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5tU3RhdGVGb250LnJlbmRlclRleHQodGV4dCwgeCwgeSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0JpbmRGb250KFJzRm9udCBmb250KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRGb250KHJzYywgZm9udCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0ZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKHIsIGcsIGIsIGEpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfWjIycnNnQmluZFByb2dyYW1GcmFnbWVudDE5cnNfcHJvZ3JhbV9mcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQgfSwKKyAgICB7ICJfWjE5cnNnQmluZFByb2dyYW1TdG9yZTE2cnNfcHJvZ3JhbV9zdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtU3RvcmUgfSwKKyAgICB7ICJfWjIwcnNnQmluZFByb2dyYW1WZXJ0ZXgxN3JzX3Byb2dyYW1fdmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXggfSwKKyAgICB7ICJfWjIwcnNnQmluZFByb2dyYW1SYXN0ZXIxN3JzX3Byb2dyYW1fcmFzdGVyIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1SYXN0ZXIgfSwKKyAgICB7ICJfWjE0cnNnQmluZFNhbXBsZXIxOXJzX3Byb2dyYW1fZnJhZ21lbnRqMTByc19zYW1wbGVyIiwgKHZvaWQgKikmU0NfYmluZFNhbXBsZXIgfSwKKyAgICB7ICJfWjE0cnNnQmluZFRleHR1cmUxOXJzX3Byb2dyYW1fZnJhZ21lbnRqMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUgfSwKKworICAgIHsgIl9aMzZyc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkUHJvamVjdGlvbk1hdHJpeCB9LAorICAgIHsgIl9aMzFyc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4IH0sCisgICAgeyAiX1ozM3JzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRUZXh0dXJlTWF0cml4IH0sCisKKyAgICB7ICJfWjMxcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGZmZmYiLCAodm9pZCAqKSZTQ19wZkNvbnN0YW50Q29sb3IgfSwKKworICAgIHsgIl9aMTFyc2dHZXRXaWR0aHYiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCB9LAorICAgIHsgIl9aMTJyc2dHZXRIZWlnaHR2IiwgKHZvaWQgKikmU0NfZ2V0SGVpZ2h0IH0sCisKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uaiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZTIgfSwKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlIH0sCisgICAgeyAiX1oyM3JzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3UmVjdGZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1JlY3QgfSwKKyAgICB7ICJfWjExcnNnRHJhd1F1YWRmZmZmZmZmZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCB9LAorICAgIHsgIl9aMjByc2dEcmF3UXVhZFRleENvb3Jkc2ZmZmZmZmZmZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKKyAgICB7ICJfWjI0cnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoIiwgKHZvaWQgKikmU0NfZHJhd01lc2ggfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGoiLCAodm9pZCAqKSZTQ19kcmF3TWVzaFByaW1pdGl2ZSB9LAorICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoampqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZSB9LAorCisgICAgeyAiX1oxM3JzZ0NsZWFyQ29sb3JmZmZmIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciB9LAorICAgIHsgIl9aMTNyc2dDbGVhckRlcHRoZiIsICh2b2lkICopJlNDX0NsZWFyRGVwdGggfSwKKworICAgIHsgIl9aMTFyc2dEcmF3VGV4dFBLY2lpIiwgKHZvaWQgKikmU0NfRHJhd1RleHQgfSwKKyAgICB7ICJfWjExcnNnRHJhd1RleHQxM3JzX2FsbG9jYXRpb25paSIsICh2b2lkICopJlNDX0RyYXdUZXh0QWxsb2MgfSwKKworICAgIHsgIl9aMTFyc2dCaW5kRm9udDdyc19mb250IiwgKHZvaWQgKikmU0NfQmluZEZvbnQgfSwKKyAgICB7ICJfWjEycnNnRm9udENvbG9yZmZmZiIsICh2b2lkICopJlNDX0ZvbnRDb2xvciB9LAorCisgICAgLy8gbWlzYworICAgIHsgIl9aNWNvbG9yZmZmZiIsICh2b2lkICopJlNDX2NvbG9yIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcCBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKaW5kZXggNDcxMWQxYi4uNWMwNzNiMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAorKysgYi9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCkBAIC0xNCwxMCArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC05NCwxNiArOTgsMTAgQEAKICAgICAgICAgZ2xBdHRhY2hTaGFkZXIocGdtLCBmcmFnLT5nZXRTaGFkZXJJRCgpKTsKIAogICAgICAgICBpZiAoIXZ0eC0+aXNVc2VyUHJvZ3JhbSgpKSB7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDAsICJBVFRSSUJfTGVnYWN5UG9zaXRpb24iKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMSwgIkFUVFJJQl9MZWdhY3lDb2xvciIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAyLCAiQVRUUklCX0xlZ2FjeU5vcm1hbCIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAzLCAiQVRUUklCX0xlZ2FjeVBvaW50U2l6ZSIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCA0LCAiQVRUUklCX0xlZ2FjeVRleHR1cmUiKTsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPU0lUSU9OXSA9IDA7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9DT0xPUl0gPSAxOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfTk9STUFMXSA9IDI7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9QT0lOVF9TSVpFXSA9IDM7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9URVhUVVJFXSA9IDQ7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDAsICJBVFRSSUJfcG9zaXRpb24iKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMSwgIkFUVFJJQl9jb2xvciIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAyLCAiQVRUUklCX25vcm1hbCIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAzLCAiQVRUUklCX3RleHR1cmUwIik7CiAgICAgICAgIH0KIAogICAgICAgICAvL0xPR0UoImUyICV4IiwgZ2xHZXRFcnJvcigpKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaWduYWwuY3BwIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzOWJmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNTaWduYWwuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK1NpZ25hbDo6U2lnbmFsKCkKK3sKKyAgICBtU2V0ID0gdHJ1ZTsKK30KKworU2lnbmFsOjp+U2lnbmFsKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm1Db25kaXRpb24pOworfQorCitib29sIFNpZ25hbDo6aW5pdCgpCit7CisgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBtdXRleCBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZGl0aW9uLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBjb25kaXRpb24gaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpZ25hbDo6c2V0KCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNldCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtQ29uZGl0aW9uKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIG9uIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KK30KKwordm9pZCBTaWduYWw6OndhaXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbVNldCkgeworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbUNvbmRpdGlvbiwgJm1NdXRleCk7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHdhaXRpbmcgb24gY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNldCA9IGZhbHNlOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5oIGIvbGlicy9ycy9yc1NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2lnbmFsLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19TSUdOQUxfSAorI2RlZmluZSBBTkRST0lEX1JTX1NJR05BTF9ICisKKworI2luY2x1ZGUgInJzVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIFNpZ25hbCB7CitwdWJsaWM6CisgICAgU2lnbmFsKCk7CisgICAgflNpZ25hbCgpOworCisgICAgYm9vbCBpbml0KCk7CisKKyAgICB2b2lkIHNldCgpOworICAgIHZvaWQgd2FpdCgpOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtU2V0OworICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgbUNvbmRpdGlvbjsKK307CisKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcCBiL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZTVjZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotU2ltcGxlTWVzaDo6U2ltcGxlTWVzaChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCi17Ci0gICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwotICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLX0KLQotU2ltcGxlTWVzaDo6flNpbXBsZU1lc2goKQotewotICAgIGRlbGV0ZVtdIG1WZXJ0ZXhUeXBlczsKLSAgICBkZWxldGVbXSBtVmVydGV4QnVmZmVyczsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjpyZW5kZXIoQ29udGV4dCAqcnNjKSBjb25zdAotewotICAgIGlmIChtUHJpbWl0aXZlVHlwZS5nZXQoKSkgewotICAgICAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1QcmltaXRpdmVUeXBlLT5nZXREaW1YKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKLSAgICAgICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtSW5kZXhUeXBlLT5nZXREaW1YKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtVmVydGV4VHlwZXNbMF0tPmdldERpbVgoKSk7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdAotewotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDEiKTsKLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcjIoJnZhKTsKLSAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTChyc2MsIDApOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UgMiIpOwotICAgIGlmIChtSW5kZXhUeXBlLmdldCgpKSB7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICBnbERyYXdFbGVtZW50cyhtR0xQcmltaXRpdmUsIGxlbiwgR0xfVU5TSUdORURfU0hPUlQsICh1aW50MTZfdCAqKShzdGFydCAqIDIpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERyYXdBcnJheXMobUdMUHJpbWl0aXZlLCBzdGFydCwgbGVuKTsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIik7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6dXBsb2FkQWxsKENvbnRleHQgKnJzYykKLXsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtSW5kZXhCdWZmZXIuZ2V0KCkpIHsKLSAgICAgICAgbUluZGV4QnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICB9Ci0gICAgaWYgKG1QcmltaXRpdmVCdWZmZXIuZ2V0KCkpIHsKLSAgICAgICAgbVByaW1pdGl2ZUJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgfQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6dXBsb2FkQWxsIik7Ci19Ci0KLQotU2ltcGxlTWVzaENvbnRleHQ6OlNpbXBsZU1lc2hDb250ZXh0KCkKLXsKLX0KLQotU2ltcGxlTWVzaENvbnRleHQ6On5TaW1wbGVNZXNoQ29udGV4dCgpCi17Ci19Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLQotUnNTaW1wbGVNZXNoIHJzaV9TaW1wbGVNZXNoQ3JlYXRlKENvbnRleHQgKnJzYywgUnNUeXBlIHByaW0sIFJzVHlwZSBpZHgsIFJzVHlwZSAqdnR4LCB1aW50MzJfdCB2dHhDb3VudCwgdWludDMyX3QgcHJpbVR5cGUpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBuZXcgU2ltcGxlTWVzaChyc2MpOwotICAgIHNtLT5pbmNVc2VyUmVmKCk7Ci0KLSAgICBzbS0+bUluZGV4VHlwZS5zZXQoKGNvbnN0IFR5cGUgKilpZHgpOwotICAgIHNtLT5tUHJpbWl0aXZlVHlwZS5zZXQoKGNvbnN0IFR5cGUgKilwcmltKTsKLQotICAgIHNtLT5tVmVydGV4VHlwZUNvdW50ID0gdnR4Q291bnQ7Ci0gICAgc20tPm1WZXJ0ZXhUeXBlcyA9IG5ldyBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+W3Z0eENvdW50XTsKLSAgICBzbS0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlt2dHhDb3VudF07Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHZ0eENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHNtLT5tVmVydGV4VHlwZXNbY3RdLnNldCgoY29uc3QgVHlwZSAqKXZ0eFtjdF0pOwotICAgIH0KLQotICAgIHNtLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOwotICAgIHN3aXRjaChzbS0+bVByaW1pdGl2ZSkgewotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1BPSU5UOiAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFOiAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzbTsKLX0KLQotdm9pZCByc2lfU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVZlcnRleFR5cGVDb3VudCk7Ci0KLSAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbc2xvdF0uc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZEluZGV4KENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICBzbS0+bUluZGV4QnVmZmVyLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKLX0KLQotdm9pZCByc2lfU2ltcGxlTWVzaEJpbmRQcmltaXRpdmUoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHNtLT5tUHJpbWl0aXZlQnVmZmVyLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKLX0KLQotCi0KLQotfX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaCBiL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWZiZGEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfU0lNUExFX01FU0hfSAotI2RlZmluZSBBTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLQotCi0jaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLQotLy8gQW4gZWxlbWVudCBpcyBhIGdyb3VwIG9mIENvbXBvbmVudHMgdGhhdCBvY2N1cGllcyBvbmUgY2VsbCBpbiBhIHN0cnVjdHVyZS4KLWNsYXNzIFNpbXBsZU1lc2ggOiBwdWJsaWMgT2JqZWN0QmFzZQotewotcHVibGljOgotICAgIFNpbXBsZU1lc2goQ29udGV4dCAqKTsKLSAgICB+U2ltcGxlTWVzaCgpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtSW5kZXhUeXBlOwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVByaW1pdGl2ZVR5cGU7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiAqbVZlcnRleFR5cGVzOwotICAgIHVpbnQzMl90IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0KLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1QcmltaXRpdmVCdWZmZXI7Ci0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiAqbVZlcnRleEJ1ZmZlcnM7Ci0KLSAgICBSc1ByaW1pdGl2ZSBtUHJpbWl0aXZlOwotICAgIHVpbnQzMl90IG1HTFByaW1pdGl2ZTsKLQotCi0gICAgdm9pZCByZW5kZXIoQ29udGV4dCAqKSBjb25zdDsKLSAgICB2b2lkIHJlbmRlclJhbmdlKENvbnRleHQgKiwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3Q7Ci0gICAgdm9pZCB1cGxvYWRBbGwoQ29udGV4dCAqKTsKLQotCi1wcm90ZWN0ZWQ6Ci19OwotCi1jbGFzcyBTaW1wbGVNZXNoQ29udGV4dAotewotcHVibGljOgotICAgIFNpbXBsZU1lc2hDb250ZXh0KCk7Ci0gICAgflNpbXBsZU1lc2hDb250ZXh0KCk7Ci0KLQotfTsKLQotCi19Ci19Ci0jZW5kaWYgLy9BTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1N0cmVhbS5jcHAgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI0MWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1N0cmVhbS5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK0lTdHJlYW06OklTdHJlYW0oY29uc3QgdWludDhfdCAqYnVmLCBib29sIHVzZTY0KQoreworICAgIG1EYXRhID0gYnVmOworICAgIG1Qb3MgPSAwOworICAgIG1Vc2U2NCA9IHVzZTY0OworfQorCit2b2lkIElTdHJlYW06OmxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKQoreworICAgIG1lbWNweShkZXN0LCBtRGF0YSArIG1Qb3MsIG51bUJ5dGVzKTsKKyAgICBtUG9zICs9IG51bUJ5dGVzOworfQorCit1aW50NjRfdCBJU3RyZWFtOjpsb2FkT2Zmc2V0KCkKK3sKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaWYgKG1Vc2U2NCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7CisgICAgICAgIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDY0X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICByZXR1cm4gbG9hZFUzMigpOworfQorCit2b2lkIElTdHJlYW06OmxvYWRTdHJpbmcoU3RyaW5nOCAqcykKK3sKKyAgICB1aW50MzJfdCBsZW4gPSBsb2FkVTMyKCk7CisgICAgcy0+c2V0VG8oKGNvbnN0IGNoYXIgKikmbURhdGFbbVBvc10sIGxlbik7CisgICAgbVBvcyArPSBsZW47Cit9CisKKworLy8gT3V0cHV0IHN0cmVhbSBpbXBsZW1lbnRhdGlvbgorCitPU3RyZWFtOjpPU3RyZWFtKHVpbnQ2NF90IGxlbiwgYm9vbCB1c2U2NCkKK3sKKyAgICBtRGF0YSA9ICh1aW50OF90KiltYWxsb2MobGVuKTsKKyAgICBtTGVuZ3RoID0gbGVuOworICAgIG1Qb3MgPSAwOworICAgIG1Vc2U2NCA9IHVzZTY0OworfQorCitPU3RyZWFtOjp+T1N0cmVhbSgpCit7CisgICAgZnJlZShtRGF0YSk7Cit9CisKK3ZvaWQgT1N0cmVhbTo6YWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKQoreworICAgIC8vIFdlIG5lZWQgdG8gcG90ZW50aWFsbHkgZ3JvdyBtb3JlIHRoYW4gb25jZSBpZiB0aGUgbnVtYmVyIG9mIGJ5ZXMgd2Ugd3JpdGUgaXMgc3Vic3RhbnRpYWwKKyAgICB3aGlsZShtUG9zICsgbnVtQnl0ZXMgPj0gbUxlbmd0aCkgeworICAgICAgICBncm93U2l6ZSgpOworICAgIH0KKyAgICBtZW1jcHkobURhdGEgKyBtUG9zLCBzcmMsIG51bUJ5dGVzKTsKKyAgICBtUG9zICs9IG51bUJ5dGVzOworfQorCit2b2lkIE9TdHJlYW06OmFkZE9mZnNldCh1aW50NjRfdCB2KQoreworICAgIGlmIChtVXNlNjQpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA0MCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA1NikgJiAweGZmKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZFUzMih2KTsKKyAgICB9Cit9CisKK3ZvaWQgT1N0cmVhbTo6YWRkU3RyaW5nKFN0cmluZzggKnMpCit7CisgICAgdWludDMyX3QgbGVuID0gcy0+c2l6ZSgpOworICAgIGFkZFUzMihsZW4pOworICAgIGlmKG1Qb3MgKyBsZW4qc2l6ZW9mKGNoYXIpID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgY2hhciAqc3RyaW5nRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPigmbURhdGFbbVBvc10pOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSArKykgeworICAgICAgICBzdHJpbmdEYXRhW2ldID0gcy0+c3RyaW5nKClbaV07CisgICAgfQorICAgIG1Qb3MgKz0gbGVuKnNpemVvZihjaGFyKTsKK30KKwordm9pZCBPU3RyZWFtOjpncm93U2l6ZSgpCit7CisgICAgdWludDhfdCAqbmV3RGF0YSA9ICh1aW50OF90KiltYWxsb2MobUxlbmd0aCoyKTsKKyAgICBtZW1jcHkobmV3RGF0YSwgbURhdGEsIG1MZW5ndGgqc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBtTGVuZ3RoID0gbUxlbmd0aCAqIDI7CisgICAgZnJlZShtRGF0YSk7CisgICAgbURhdGEgPSBuZXdEYXRhOworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTdHJlYW0uaCBiL2xpYnMvcnMvcnNTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDAxY2QxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTdHJlYW0uaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1JTX1NUUkVBTV9ICisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgSVN0cmVhbQoreworcHVibGljOgorICAgIElTdHJlYW0oY29uc3QgdWludDhfdCAqLCBib29sIHVzZTY0KTsKKworICAgIGZsb2F0IGxvYWRGKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGZsb2F0IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YoZmxvYXQpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbnQzMl90IGxvYWRJMzIoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHVpbnQzMl90IGxvYWRVMzIoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgdWludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHVpbnQxNl90IGxvYWRVMTYoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDEpICYgKH4xKTsKKyAgICAgICAgdWludDE2X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIGlubGluZSB1aW50OF90IGxvYWRVOCgpIHsKKyAgICAgICAgdWludDhfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHZvaWQgbG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpOworICAgIHVpbnQ2NF90IGxvYWRPZmZzZXQoKTsKKyAgICB2b2lkIGxvYWRTdHJpbmcoU3RyaW5nOCAqcyk7CisgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCh1aW50NjRfdCBwb3MpIHsKKyAgICAgICAgbVBvcyA9IHBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVBvcyA9IDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgY29uc3QgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1Qb3M7CisgICAgYm9vbCBtVXNlNjQ7Cit9OworCitjbGFzcyBPU3RyZWFtCit7CitwdWJsaWM6CisgICAgT1N0cmVhbSh1aW50NjRfdCBsZW5ndGgsIGJvb2wgdXNlNjQpOworICAgIH5PU3RyZWFtKCk7CisgICAgCisgICAgdm9pZCBhbGlnbih1aW50MzJfdCBieXRlcykgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAoYnl0ZXMgLSAxKSkgJiAofihieXRlcyAtIDEpKTsKKyAgICAgICAgaWYobVBvcyA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgYWRkRihmbG9hdCB2KSB7CisgICAgICAgIHVpbnQzMl90IHVpbnRWID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPiAoJnYpOworICAgICAgICBhZGRVMzIodWludFYpOworICAgIH0KKyAgICB2b2lkIGFkZEkzMihpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMzIodWludDMyX3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgIH0KKyAgICB2b2lkIGFkZFUxNih1aW50MTZfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDEpICYgKH4xKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgPj4gOCk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkZFU4KHVpbnQ4X3QgdikgeworICAgICAgICBpZihtUG9zICsgMSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdID0gdjsKKyAgICAgICAgbVBvcyArKzsKKyAgICB9CisgICAgdm9pZCBhZGRCeXRlQXJyYXkoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnVtQnl0ZXMpOworICAgIHZvaWQgYWRkT2Zmc2V0KHVpbnQ2NF90IHYpOworICAgIHZvaWQgYWRkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIHZvaWQgZ3Jvd1NpemUoKTsKKyAgICB1aW50OF90ICogbURhdGE7CisgICAgdWludDY0X3QgbUxlbmd0aDsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKyAgICAKKworfSAvLyByZW5kZXJzY3JpcHQKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vQU5EUk9JRF9SU19TVFJFQU1fSAorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNUeXBlLmNwcCBiL2xpYnMvcnMvcnNUeXBlLmNwcAppbmRleCBjMDllOTc5Li43OWNmZDQxIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVHlwZS5jcHAKKysrIGIvbGlicy9ycy9yc1R5cGUuY3BwCkBAIC0xNCw4ICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTg0LDcgKzg5LDkgQEAKICAgICAgICAgbUxPRENvdW50ID0gMTsKICAgICB9CiAgICAgaWYgKG1MT0RDb3VudCAhPSBvbGRMT0RDb3VudCkgewotICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIGlmKG1MT0RzKXsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBtTE9EczsKKyAgICAgICAgfQogICAgICAgICBtTE9EcyA9IG5ldyBMT0RbbUxPRENvdW50XTsKICAgICB9CiAKQEAgLTEzOCwxMzYgKzE0NSwzMSBAQAogCiB2b2lkIFR5cGU6Om1ha2VHTENvbXBvbmVudHMoKQogeworICAgIGlmKGdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpID49IFJTX01BWF9BVFRSSUJTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICB1aW50MzJfdCB1c2VyTnVtID0gMDsKIAogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKTsgY3QrKykgewogICAgICAgICBjb25zdCBDb21wb25lbnQgJmMgPSBnZXRFbGVtZW50KCktPmdldEZpZWxkKGN0KS0+Z2V0Q29tcG9uZW50KCk7CiAKLSAgICAgICAgc3dpdGNoKGMuZ2V0S2luZCgpKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9VU0VSOgotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm5hbWUuc2V0VG8oZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKLSAgICAgICAgICAgIHVzZXJOdW0gKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVZ0eC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1WdHgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVZ0eC5uYW1lLnNldFRvKCJQb3NpdGlvbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Db2xvci5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOwotICAgICAgICAgICAgbUdMLm1Db2xvci5uYW1lLnNldFRvKCJDb2xvciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tTm9ybS5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5hbWUuc2V0VG8oIk5vcm1hbCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVRleC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1UZXgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVRleC5uYW1lLnNldFRvKCJUZXh0dXJlIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KCFtR0wubVBvaW50U2l6ZS5zaXplKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubmFtZS5zZXRUbygiUG9pbnRTaXplIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOy8vYy5nZXRJc05vcm1hbGl6ZWQoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOworICAgICAgICB1c2VyTnVtICsrOwogICAgIH0KIH0KIAorCiB2b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyKFZlcnRleEFycmF5ICp2YSkgY29uc3QKIHsKLSAgICAvLyBOb3RlOiBXZSBhcmUgb25seSBnb2luZyB0byBlbmFibGUgYnVmZmVycyBhbmQgbmV2ZXIgZGlzYWJsZSB0aGVtCi0gICAgLy8gaGVyZS4gIFRoZSByZWFzb24gaXMgbW9yZSB0aGFuIG9uZSBBbGxvY2F0aW9uIG1heSBiZSB1c2VkIGFzIGEgdmVydGV4Ci0gICAgLy8gc291cmNlLiAgU28gd2UgY2Fubm90IGRpc2FibGUgYXJyYXlzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbiB1c2UgYnkKLSAgICAvLyBhbm90aGVyIGFsbG9jYXRpb24uCi0KLSAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7Ci0gICAgaWYgKG1HTC5tVnR4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVZ0eC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgIG1HTC5tVnR4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Ob3JtLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubU5vcm0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tQ29sb3Iuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tQ29sb3IudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tQ29sb3Iuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubVRleC5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1UZXgudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4Lm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tUG9pbnRTaXplLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVBvaW50U2l6ZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9JTlRfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0KTsKLSAgICB9Ci0KLX0KLQotdm9pZCBUeXBlOjplbmFibGVHTFZlcnRleEJ1ZmZlcjIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAotewotICAgIC8vIERvIGxlZ2FjeSBidWZmZXJzCi0gICAgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIodmEpOwotCiAgICAgdWludDMyX3Qgc3RyaWRlID0gbUVsZW1lbnQtPmdldFNpemVCeXRlcygpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBSU19NQVhfQVRUUklCUzsgY3QrKykgewotICAgICAgICBpZiAobUdMLm1Vc2VyW2N0XS5zaXplKSB7Ci0gICAgICAgICAgICB2YS0+YWRkVXNlcihtR0wubVVzZXJbY3RdLCBzdHJpZGUpOworICAgICAgICBpZiAobUF0dHJpYnNbY3RdLnNpemUpIHsKKyAgICAgICAgICAgIHZhLT5hZGQobUF0dHJpYnNbY3RdLCBzdHJpZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjgzLDYgKzE4NSw1NyBAQAogICAgIG1FbGVtZW50LT5kdW1wTE9HVihidWYpOwogfQogCit2b2lkIFR5cGU6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1FbGVtZW50LT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1YKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWSk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVopOworCisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobURpbUxPRCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobUZhY2VzID8gMSA6IDApKTsKK30KKworVHlwZSAqVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1RZUEUpIHsKKyAgICAgICAgTE9HRSgidHlwZSBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighZWxlbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUeXBlICp0eXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICB0eXBlLT5tRGltWCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1ZID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVogPSBzdHJlYW0tPmxvYWRVMzIoKTsKKworICAgIHVpbnQ4X3QgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bURpbUxPRCA9IHRlbXAgIT0gMDsKKworICAgIHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1GYWNlcyA9IHRlbXAgIT0gMDsKKworICAgIHR5cGUtPnNldEVsZW1lbnQoZWxlbSk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKwogYm9vbCBUeXBlOjpnZXRJc05wMigpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgeCA9IGdldERpbVgoKTsKQEAgLTM5MSw2ICszNDQsMjIgQEAKICAgICByZXR1cm4gc3Q7CiB9CiAKK3ZvaWQgcnNpX1R5cGVHZXROYXRpdmVEYXRhKENvbnRleHQgKnJzYywgUnNUeXBlIHR5cGUsIHVpbnQzMl90ICp0eXBlRGF0YSwgdWludDMyX3QgdHlwZURhdGFTaXplKQoreworICAgIHJzQXNzZXJ0KHR5cGVEYXRhU2l6ZSA9PSA2KTsKKyAgICAvLyBQYWNrIHRoZSBkYXRhIGluIHRoZSBmb2xsb2Zpbmcgd2F5IG1EaW1YOyBtRGltWTsgbURpbVo7CisgICAgLy8gbURpbUxPRDsgbURpbUZhY2VzOyBtRWxlbWVudDsgaW50byB0eXBlRGF0YQorICAgIFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxUeXBlICo+KHR5cGUpOworCisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVgoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWSgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1aKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbUxPRCgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1GYWNlcygpID8gMSA6IDA7CisgICAgKCp0eXBlRGF0YSsrKSA9ICh1aW50MzJfdCl0LT5nZXRFbGVtZW50KCk7CisKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5oIGIvbGlicy9ycy9yc1R5cGUuaAppbmRleCBjMjU1NzdjLi41YjUxZTIwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVHlwZS5oCisrKyBiL2xpYnMvcnMvcnNUeXBlLmgKQEAgLTcxLDkgKzcxLDExIEBACiAgICAgdm9pZCBjb21wdXRlKCk7CiAKICAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVyKGNsYXNzIFZlcnRleEFycmF5ICopIGNvbnN0OwotICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKGNsYXNzIFZlcnRleEFycmF5ICopIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1RZUEU7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICBzdHJ1Y3QgTE9EIHsKQEAgLTExMiwxNSArMTE0LDcgQEAKICAgICBMT0QgKm1MT0RzOwogICAgIHVpbnQzMl90IG1MT0RDb3VudDsKIAotICAgIHN0cnVjdCBHTFN0YXRlX3QgewotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1Vc2VyW1JTX01BWF9BVFRSSUJTXTsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtVnR4OwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1Ob3JtOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1Db2xvcjsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtVGV4OwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1Qb2ludFNpemU7Ci0gICAgfTsKLSAgICBHTFN0YXRlX3QgbUdMOworICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUF0dHJpYnNbUlNfTUFYX0FUVFJJQlNdOwogICAgIHZvaWQgbWFrZUdMQ29tcG9uZW50cygpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1V0aWxzLmggYi9saWJzL3JzL3JzVXRpbHMuaAppbmRleCAwN2Y4OTMzLi4xN2ZlYjIyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVXRpbHMuaAorKysgYi9saWJzL3JzL3JzVXRpbHMuaApAQCAtMTksMTUgKzE5LDIzIEBACiAKICNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlJlbmRlclNjcmlwdCIKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCkBAIC00MSw2ICs0OSwyNiBAQAogI2RlZmluZSByc0Fzc2VydCh2KSB3aGlsZSgwKQogI2VuZGlmCiAKK3R5cGVkZWYgZmxvYXQgcnN2Rl8yIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoOCkpKTsKK3R5cGVkZWYgZmxvYXQgcnN2Rl80IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoMTYpKSk7Cit0eXBlZGVmIHVpbnQ4X3QgcnN2VThfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDQpKSk7CisKK3VuaW9uIGZsb2F0MiB7CisgICAgcnN2Rl8yIHY7CisgICAgZmxvYXQgZlsyXTsKK307CisKK3VuaW9uIGZsb2F0NCB7CisgICAgcnN2Rl80IHY7CisgICAgZmxvYXQgZls0XTsKK307CisKK3VuaW9uIHVjaGFyNCB7CisgICAgcnN2VThfNCB2OworICAgIHVpbnQ4X3QgZls0XTsKKyAgICB1aW50MzJfdCBwYWNrZWQ7Cit9OworCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogVCByc01pbihUIGluMSwgVCBpbjIpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAppbmRleCA2YzIwMDJkLi4wMDE5MjdjIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKQEAgLTE0LDEwICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zOSw2ICs0NCw3IEBACiAgICAgICAgIG1BdHRyaWJzW2N0XS5jbGVhcigpOwogICAgIH0KICAgICBtQWN0aXZlQnVmZmVyID0gMDsKKyAgICBtQWN0aXZlUG9pbnRlciA9IE5VTEw7CiAgICAgbUNvdW50ID0gMDsKIH0KIApAQCAtNTAsMTIgKzU2LDEyIEBACiB2b2lkIFZlcnRleEFycmF5OjpBdHRyaWI6OnNldChjb25zdCBBdHRyaWIgJmEpCiB7CiAgICAgYnVmZmVyID0gYS5idWZmZXI7CisgICAgcHRyID0gYS5wdHI7CiAgICAgb2Zmc2V0ID0gYS5vZmZzZXQ7CiAgICAgdHlwZSA9IGEudHlwZTsKICAgICBzaXplID0gYS5zaXplOwogICAgIHN0cmlkZSA9IGEuc3RyaWRlOwogICAgIG5vcm1hbGl6ZWQgPSBhLm5vcm1hbGl6ZWQ7Ci0gICAga2luZCA9IFJTX0tJTkRfVVNFUjsKICAgICBuYW1lLnNldFRvKGEubmFtZSk7CiB9CiAKQEAgLTY2LDYgKzcyLDcgQEAKICAgICB0eXBlID0gMDsKICAgICBzaXplID0gMDsKICAgICBzdHJpZGUgPSAwOworICAgIHB0ciA9IE5VTEw7CiAgICAgbm9ybWFsaXplZCA9IGZhbHNlOwogICAgIG5hbWUuc2V0VG8oIiIpOwogfQpAQCAtNzUsMTM4ICs4Miw4NCBAQAogICAgIG1BdHRyaWJzW25dLmNsZWFyKCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZFVzZXIoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCit2b2lkIFZlcnRleEFycmF5OjphZGQoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zZXQoYSk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0gUlNfS0lORF9VU0VSOwogICAgIG1Db3VudCArKzsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkTGVnYWN5KHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgUnNEYXRhS2luZCBraW5kLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uY2xlYXIoKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnR5cGUgPSB0eXBlOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2l6ZSA9IHNpemU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5ub3JtYWxpemVkID0gbm9ybWFsaXplZDsKLSAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0ga2luZDsKKyAgICBtQXR0cmlic1ttQ291bnRdLm5hbWUuc2V0VG8obmFtZSk7CisKKyAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQ291bnQgKys7CiB9CiAKIHZvaWQgVmVydGV4QXJyYXk6OmxvZ0F0dHJpYih1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNsb3QpIGNvbnN0IHsKLSAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSAgc2l6ZT0laSAgdHlwZT0weCV4ICBraW5kPSVpICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCisgICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgcHRyPSVwIHNpemU9JWkgIHR5cGU9MHgleCAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5uYW1lLnN0cmluZygpLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5idWZmZXIsCisgICAgICAgICBtQXR0cmlic1tpZHhdLnB0ciwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc2l6ZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0udHlwZSwKLSAgICAgICAgIG1BdHRyaWJzW2lkeF0ua2luZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc3RyaWRlLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5ub3JtYWxpemVkLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5vZmZzZXQpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUpIGNvbnN0Ci17Ci0gICAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChtQXR0cmlic1tjdF0ua2luZCkgewotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT1NJVElPTik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVmVydGV4UG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoTk9STUFMKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1BdHRyaWJzW2N0XS5zaXplID09IDMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbE5vcm1hbFBvaW50ZXIobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoQ09MT1IpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsQ29sb3JQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFRleENvb3JkUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPSU5UX1NJWkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyhtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMIik7Ci19Ci0KIHZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykgY29uc3QKIHsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBzdGFydCIpOwotICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQ7IGN0KyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IDB4Zi8qc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQqLzsgY3QrKykgewogICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShjdCk7CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgZGlzYWJsZWQiKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7CiAgICAgICAgIHVpbnQzMl90IHNsb3QgPSAwOworCisgICAgICAgIGlmIChtQXR0cmlic1tjdF0ubmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHNjLT5pc1VzZXJWZXJ0ZXhQcm9ncmFtKCkpIHsKICAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChjdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLmtpbmQgPT0gUlNfS0lORF9VU0VSKSB7CisgICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gInBvc2l0aW9uIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAiY29sb3IiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJub3JtYWwiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJ0ZXh0dXJlMCIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QobUF0dHJpYnNbY3RdLmtpbmQpOwogICAgICAgICB9CiAKICAgICAgICAgLy9sb2dBdHRyaWIoY3QsIHNsb3QpOwogICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNsb3QpOwogICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLQogICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ubm9ybWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnB0ciArIG1BdHRyaWJzW2N0XS5vZmZzZXQpOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCA9IG1Db3VudDsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkb25lIik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuaCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCmluZGV4IDM5MDRjYjYuLjdjNjA5YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCkBAIC0zNywxMyArMzcsMTMgQEAKICAgICBjbGFzcyBBdHRyaWIgewogICAgIHB1YmxpYzoKICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogcHRyOwogICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIHVpbnQzMl90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKICAgICAgICAgYm9vbCBub3JtYWxpemVkOwogICAgICAgICBTdHJpbmc4IG5hbWU7Ci0gICAgICAgIFJzRGF0YUtpbmQga2luZDsKIAogICAgICAgICBBdHRyaWIoKTsKICAgICAgICAgdm9pZCBzZXQoY29uc3QgQXR0cmliICYpOwpAQCAtNTIsOSArNTIsMTggQEAKIAogCiAgICAgdm9pZCBjbGVhckFsbCgpOwotICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7bUFjdGl2ZUJ1ZmZlciA9IGlkO30KLSAgICB2b2lkIGFkZFVzZXIoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7Ci0gICAgdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gaWQ7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IChjb25zdCB1aW50OF90ICopcHRyOworICAgIH0KKworICAgIHZvaWQgYWRkKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOworICAgIC8vdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCk7CisgICAgdm9pZCBhZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICopIGNvbnN0OwogICAgIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICosIFNoYWRlckNhY2hlICopIGNvbnN0OwpAQCAtNjMsNiArNzIsNyBAQAogcHJvdGVjdGVkOgogICAgIHZvaWQgY2xlYXIodWludDMyX3QgaW5kZXgpOwogICAgIHVpbnQzMl90IG1BY3RpdmVCdWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqIG1BY3RpdmVQb2ludGVyOwogICAgIHVpbnQzMl90IG1Db3VudDsKIAogICAgIEF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAppbmRleCBjZWU5ZjUyLi4wMTY5Yjk4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCisrKyBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKQEAgLTcsOCArNywxMiBAQAogc3RydWN0IEVsZW1lbnQ7CiAKIHN0cnVjdCBFbGVtZW50RmllbGQgeworICAgIC8vIEFuIEVsZW1lbnQgRmllbGQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBFbGVtZW50IHdpdGggYSBuYW1lIGFzc2lnbmVkLgorCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBFbGVtZW50ICplOworCisKICAgICBFbGVtZW50RmllbGQoY29uc3QgY2hhciAqbiwgRWxlbWVudCAqX2UpIHsKICAgICAgICAgbmFtZSA9IG47CiAgICAgICAgIGUgPSBfZTsKQEAgLTIwLDEyICsyNCwyMSBAQAogfTsKIAogc3RydWN0IEVsZW1lbnQgeworICAgIC8vIEFuIEVsZW1lbnQgY2FuIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KKyAgICAvLyAxOiBCYXNpYy4gIEl0IGNvbnRhaW5zIGEgc2luZ2xlIGJhc2ljIHR5cGUgYW5kIHZlY3RvciBzaXplLgorICAgIC8vIDI6IENvbXBsZXguICBJdCBjb250YWlucyBhIGxpc3Qgb2YgZmllbGRzIHdpdGggbmFtZXMuICBFYWNoIGZpZWxkCisgICAgLy8gd2lsbCBpbiB0dXJuIGJlIGFub3RoZXIgZWxlbWVudC4KKwogICAgIEVsZW1lbnRGaWVsZCAqZmllbGRzOwotICAgIHNpemVfdCBmaWVsZENvdW50OworICAgIHNpemVfdCBmaWVsZENvdW50OyAgLy8gSWYgZmllbGQgY291bnQgaXMgMCwgdGhlIGVsZW1lbnQgaXMgYSBCYXNpYyB0eXBlLgogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgYm9vbCBnZW5lcmF0ZWQ7CiAKKyAgICAvLyBUaGUgYmFzaWMgZGF0YSB0eXBlIGZyb20gUmVuZGVyU2NyaXB0LmgKICAgICBSc0RhdGFUeXBlIGNvbXBUeXBlOworCisgICAgLy8gVGhlIHZlY3RvciBzaXplIG9mIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0MiwgZmxvYXQzLCAuLi4uCisgICAgLy8gQWxsb3dlZCBzaXplcyBhcmUgMiwzLDQsOCwxNgogICAgIHVpbnQzMl90IGNvbXBWZWN0b3JTaXplOwogCiAgICAgRWxlbWVudCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODQ0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCkBAIC0wLDAgKzEsNzg1IEBACisjaWZuZGVmIF9fUlNfQ0xfUlNIX18KKyNkZWZpbmUgX19SU19DTF9SU0hfXworCisjZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhmICAgLyogcGkgKi8KKworCisvLyBDb252ZXJzaW9ucworI2RlZmluZSBDVlRfRlVOQ18yKHR5cGVvdXQsIHR5cGVpbikgXAorc3RhdGljIHR5cGVvdXQjIzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzIodHlwZWluIyMyIHYpIHsgXAorICAgIHR5cGVvdXQjIzIgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueX07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMyh0eXBlaW4jIzMgdikgeyBcCisgICAgdHlwZW91dCMjMyByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2Lnp9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzQodHlwZWluIyM0IHYpIHsgXAorICAgIHR5cGVvdXQjIzQgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56LCAodHlwZW91dCl2Lnd9OyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBDVlRfRlVOQyh0eXBlKSAgICAgIENWVF9GVU5DXzIodHlwZSwgdWNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgc2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdWludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgZmxvYXQpCisKK0NWVF9GVU5DKGNoYXIpCitDVlRfRlVOQyh1Y2hhcikKK0NWVF9GVU5DKHNob3J0KQorQ1ZUX0ZVTkModXNob3J0KQorQ1ZUX0ZVTkMoaW50KQorQ1ZUX0ZVTkModWludCkKK0NWVF9GVU5DKGZsb2F0KQorCisKKworLy8gRmxvYXQgb3BzLCA2LjExLjIKKworI2RlZmluZSBERUZfRlVOQ18xKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2KSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2KSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHIudyA9IGZuYyh2LncpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yRihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9CisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOworREVGX0ZVTkNfMShhY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc2goZmxvYXQpOworREVGX0ZVTkNfMShhY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3ModikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXNpbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7CitERUZfRlVOQ18xKGF0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihhdGFuMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXRhbnBpKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yKHksIHgpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzIoYXRhbjJwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNicnQoZmxvYXQpOworREVGX0ZVTkNfMShjYnJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdCk7CitERUZfRlVOQ18xKGNlaWwpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihjb3B5c2lnbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc2goZmxvYXQpOworREVGX0ZVTkNfMShjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3ModiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZmMoZmxvYXQpOworREVGX0ZVTkNfMShlcmZjKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdCk7CitERUZfRlVOQ18xKGV4cDIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKK30KK0RFRl9GVU5DXzEoZXhwMTApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHBtMShmbG9hdCk7CitERUZfRlVOQ18xKGV4cG0xKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7CitERUZfRlVOQ18xKGZhYnMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmZGltKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZkaW0pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7CitERUZfRlVOQ18xKGZsb29yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWF4KTsKK0RFRl9GVU5DXzJGKGZtYXgpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWluKTsKK0RFRl9GVU5DXzJGKGZtaW4pOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbW9kKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQgdiwgZmxvYXQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiAqaXB0cikgeworICAgIGZsb2F0IHRbMl07CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MyB2LCBmbG9hdDMgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzNdOworICAgIGZsb2F0MyByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDQgdiwgZmxvYXQ0ICppcHRyKSB7CisgICAgZmxvYXQgdFs0XTsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICByLncgPSBmcmFjdCh2LncsICZ0WzNdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICBpcHRyWzNdID0gdFszXTsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGh5cG90KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGh5cG90KQorCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGlsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEoaWxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdCwgaW50KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludCk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKGxnYW1tYSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nKQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzEwKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KK0RFRl9GVU5DXzEobG9nMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzFwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMXApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0NCwgZmxvYXQ0ICopOworCisvL2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuYW4odWludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuZXh0YWZ0ZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIobmV4dGFmdGVyKQorCitERUZfRlVOQ18yKHBvdykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdClwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDIgdiwgaW50MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQyKXApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MyB2LCBpbnQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDMpcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQ0IHYsIGludDQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0NClwKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQyIHYsIGZsb2F0MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDMgdiwgZmxvYXQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0NCB2LCBmbG9hdDQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIocmVtYWluZGVyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0LCBmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDIsIGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQzLCBmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKK0RFRl9GVU5DXzEocmludCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQyIHYsIGludDIgcikgeworICAgIGZsb2F0MiB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDMgdiwgaW50MyByKSB7CisgICAgZmxvYXQzIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIuen07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQ0IHYsIGludDQgcikgeworICAgIGZsb2F0NCB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnosIDEuZiAvIHIud307CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKK0RFRl9GVU5DXzEocm91bmQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0KTsKKy8qc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydCh2KTsKK30KK0RFRl9GVU5DXzEocnNxcnQpKi8KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7CitERUZfRlVOQ18xKHNpbikKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQzIHYsIGZsb2F0MyAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQ0IHYsIGZsb2F0NCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luaChmbG9hdCk7CitERUZfRlVOQ18xKHNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHNpbnBpKQorCitERUZfRlVOQ18xKHNxcnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOworREVGX0ZVTkNfMSh0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEodGFucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMSh0Z2FtbWEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7CitERUZfRlVOQ18xKHRydW5jKQorCisvLyBJbnQgb3BzIChwYXJ0aWFsKSwgNi4xMS4zCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoY2hhcik7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1aW50KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1c2hvcnQpOworZXh0ZXJuIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVjaGFyKTsKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihjaGFyKTsKKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/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/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodiA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDQpOworCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCB2KSB7CisgICAgaWYgKHYgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHY7Cit9CitERUZfRlVOQ18xKHNpZ24pCisKKy8vIDYuMTEuNQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHIudyA9IDAuZjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsaHMgKiByaHM7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLno7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56ICsgbGhzLncqcmhzLnc7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQgdikgeworICAgIHJldHVybiB2OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDIgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnopOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDQgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueiArIHYudyp2LncpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQgdikgeworICAgIHJldHVybiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDIgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5YWViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApAQCAtMCwwICsxLDc5NyBAQAorI2lmbmRlZiBfX1JTX0NPUkVfUlNIX18KKyNkZWZpbmUgX19SU19DT1JFX1JTSF9fCisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRGVidWcoY29uc3QgY2hhciAqcywgZmxvYXQyIHYpIHsKKyAgICByc0RlYnVnKHMsIHYueCwgdi55KTsKK30KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRGVidWcoY29uc3QgY2hhciAqcywgZmxvYXQzIHYpIHsKKyAgICByc0RlYnVnKHMsIHYueCwgdi55LCB2LnopOworfQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDQgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnksIHYueiwgdi53KTsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9IDI1NTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9ICh1Y2hhcikoYSAqIDI1NS5mKTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDMgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgMjU1fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDQgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgY29sb3Iud307CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBmbG9hdDQgcnNVbnBhY2tDb2xvcjg4ODgodWNoYXI0IGMpCit7CisgICAgZmxvYXQ0IHJldCA9IChmbG9hdDQpMC4wMDM5MTU2ODYyNzQ1ZjsKKyAgICByZXQgKj0gY29udmVydF9mbG9hdDQoYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy9leHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdDMpOworLy9leHRlcm4gZmxvYXQ0IHJzVW5wYWNrQ29sb3I1NjUodWNoYXI0KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWF0cml4IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDQgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXg0eDQgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogNCArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAzICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4M3gzICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDMgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogMiArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDJ4MiAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiAyICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDR4NCAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDAuZjsKKyAgICBtLT5tWzVdID0gMS5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMC5mOworICAgIG0tPm1bOV0gPSAwLmY7CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXgzeDMgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSAxLmY7CisgICAgbS0+bVs1XSA9IDAuZjsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDJ4MiAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworICAgIG0tPm1bOV0gPSB2WzldOworICAgIG0tPm1bMTBdID0gdlsxMF07CisgICAgbS0+bVsxMV0gPSB2WzExXTsKKyAgICBtLT5tWzEyXSA9IHZbMTJdOworICAgIG0tPm1bMTNdID0gdlsxM107CisgICAgbS0+bVsxNF0gPSB2WzE0XTsKKyAgICBtLT5tWzE1XSA9IHZbMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKKyAgICBtLT5tWzRdID0gdls0XTsKKyAgICBtLT5tWzVdID0gdls1XTsKKyAgICBtLT5tWzZdID0gdls2XTsKKyAgICBtLT5tWzddID0gdls3XTsKKyAgICBtLT5tWzhdID0gdls4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKKyAgICBtLT5tWzldID0gdi0+bVs5XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bMTBdOworICAgIG0tPm1bMTFdID0gdi0+bVsxMV07CisgICAgbS0+bVsxMl0gPSB2LT5tWzEyXTsKKyAgICBtLT5tWzEzXSA9IHYtPm1bMTNdOworICAgIG0tPm1bMTRdID0gdi0+bVsxNF07CisgICAgbS0+bVsxNV0gPSB2LT5tWzE1XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IHYtPm1bNV07CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gdi0+bVs2XTsKKyAgICBtLT5tWzldID0gdi0+bVs3XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bOF07CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gMS5mOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107CisgICAgbS0+bVs0XSA9IHYtPm1bNF07CisgICAgbS0+bVs1XSA9IHYtPm1bNV07CisgICAgbS0+bVs2XSA9IHYtPm1bNl07CisgICAgbS0+bVs3XSA9IHYtPm1bN107CisgICAgbS0+bVs4XSA9IHYtPm1bOF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGZsb2F0IGMsIHM7CisgICAgbS0+bVszXSA9IDA7CisgICAgbS0+bVs3XSA9IDA7CisgICAgbS0+bVsxMV09IDA7CisgICAgbS0+bVsxMl09IDA7CisgICAgbS0+bVsxM109IDA7CisgICAgbS0+bVsxNF09IDA7CisgICAgbS0+bVsxNV09IDE7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZik7CisgICAgYyA9IGNvcyhyb3QpOworICAgIHMgPSBzaW4ocm90KTsKKworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHgqeCArIHkqeSArIHoqejsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgfQorICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisgICAgbS0+bVsgMF0gPSB4KngqbmMgKyAgYzsKKyAgICBtLT5tWyA0XSA9ICB4eSpuYyAtIHpzOworICAgIG0tPm1bIDhdID0gIHp4Km5jICsgeXM7CisgICAgbS0+bVsgMV0gPSAgeHkqbmMgKyB6czsKKyAgICBtLT5tWyA1XSA9IHkqeSpuYyArICBjOworICAgIG0tPm1bIDldID0gIHl6Km5jIC0geHM7CisgICAgbS0+bVsgMl0gPSAgengqbmMgLSB5czsKKyAgICBtLT5tWyA2XSA9ICB5eipuYyArIHhzOworICAgIG0tPm1bMTBdID0geip6Km5jICsgIGM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0geDsKKyAgICBtLT5tWzVdID0geTsKKyAgICBtLT5tWzEwXSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVsxMl0gPSB4OworICAgIG0tPm1bMTNdID0geTsKKyAgICBtLT5tWzE0XSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqbGhzLCBjb25zdCByc19tYXRyaXg0eDQgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICBmbG9hdCByaTMgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgICAgICByaTIgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAyKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSByc01hdHJpeEdldChsaHMsIGosIDMpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDMsIHJpMyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgcnNfbWF0cml4NHg0IG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpsaHMsIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgcnNfbWF0cml4M3gzIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICpsaHMsIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnJocykgeworICAgIHJzX21hdHJpeDJ4MiBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJm0xLCByb3QsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2NhbGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFNjYWxlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbTEsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE9ydGhvKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTBdPSAtMi5mIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTJdPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzEzXT0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxNF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRGcnVzdHVtKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mICogbmVhciAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bNV0gPSAyLmYgKiBuZWFyIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVs4XSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs5XSA9ICh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMV09IC0xLmY7CisgICAgbS0+bVsxNF09IC0yLmYgKiBmYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTVdPSAwLmY7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDQgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopICsgKG0tPm1bMTJdICogaW4udyk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzldICogaW4ueikgKyAobS0+bVsxM10gKiBpbi53KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgKG0tPm1bMTBdICogaW4ueikgKyAobS0+bVsxNF0gKiBpbi53KTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgKG0tPm1bMTFdICogaW4ueikgKyAobS0+bVsxNV0gKiBpbi53KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgbS0+bVsxNV07CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyBtLT5tWzEzXTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDMgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSkgKyAobS0+bVs2XSAqIGluLnopOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs3XSAqIGluLnopOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDIgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzJdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCB3YXMgc3VjY2Vzc2Z1bGx5IGludmVyc2VkCitzdGF0aWMgYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhJbnZlcnNlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIHJzX21hdHJpeDR4NCByZXN1bHQ7CisKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGVDb2ZhY3RvciBmb3IgaW50IGksIGludCBqCisgICAgICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgICAgIGZsb2F0IG1pbm9yID0gKG0tPm1bYzAgKyA0KnIwXSAqIChtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKG0tPm1bYzAgKyA0KnIxXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKG0tPm1bYzAgKyA0KnIyXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMV0gLSBtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMF0pKTsKKworICAgICAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoaStqKSAmIDEgPyAtbWlub3IgOiBtaW5vcjsKKworICAgICAgICAgICAgcmVzdWx0Lm1bNCppICsgal0gPSBjb2ZhY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggcm93IG9mIHJlc3VsdAorICAgIGZsb2F0IGRldCA9IG0tPm1bMF0qcmVzdWx0Lm1bMF0gKyBtLT5tWzRdKnJlc3VsdC5tWzFdICsKKyAgICAgICAgICAgICAgICAgbS0+bVs4XSpyZXN1bHQubVsyXSArIG0tPm1bMTJdKnJlc3VsdC5tWzNdOworCisgICAgaWYgKGZhYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgbS0+bVtpXSA9IHJlc3VsdC5tW2ldICogZGV0OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCB3YXMgc3VjY2Vzc2Z1bGx5IGludmVyc2VkCitzdGF0aWMgYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhJbnZlcnNlVHJhbnNwb3NlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIHJzX21hdHJpeDR4NCByZXN1bHQ7CisKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGVDb2ZhY3RvciBmb3IgaW50IGksIGludCBqCisgICAgICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgICAgIGZsb2F0IG1pbm9yID0gKG0tPm1bYzAgKyA0KnIwXSAqIChtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKG0tPm1bYzAgKyA0KnIxXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKG0tPm1bYzAgKyA0KnIyXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMV0gLSBtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMF0pKTsKKworICAgICAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoaStqKSAmIDEgPyAtbWlub3IgOiBtaW5vcjsKKworICAgICAgICAgICAgcmVzdWx0Lm1bNCpqICsgaV0gPSBjb2ZhY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggY29sdW1uIG9mIHJlc3VsdAorICAgIGZsb2F0IGRldCA9IG0tPm1bMF0qcmVzdWx0Lm1bMF0gKyBtLT5tWzRdKnJlc3VsdC5tWzRdICsKKyAgICAgICAgICAgICAgICAgbS0+bVs4XSpyZXN1bHQubVs4XSArIG0tPm1bMTJdKnJlc3VsdC5tWzEyXTsKKworICAgIGlmIChmYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgIG0tPm1baV0gPSByZXN1bHQubVtpXSAqIGRldDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIGludCBpLCBqOworICAgIGZsb2F0IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgdGVtcCA9IG0tPm1baSo0ICsgal07CisgICAgICAgICAgICBtLT5tW2kqNCArIGpdID0gbS0+bVtqKjQgKyBpXTsKKyAgICAgICAgICAgIG0tPm1baio0ICsgaV0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4M3gzICptKSB7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0gbS0+bVtpKjMgKyBqXTsKKyAgICAgICAgICAgIG0tPm1baSozICsgal0gPSBtLT5tW2oqNCArIGldOworICAgICAgICAgICAgbS0+bVtqKjMgKyBpXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXgyeDIgKm0pIHsKKyAgICBmbG9hdCB0ZW1wID0gbS0+bVsxXTsKKyAgICBtLT5tWzFdID0gbS0+bVsyXTsKKyAgICBtLT5tWzJdID0gdGVtcDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHF1YXRlcm5pb24gb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uU2V0KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHcsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBxLT53ID0gdzsKKyAgICBxLT54ID0geDsKKyAgICBxLT55ID0geTsKKyAgICBxLT56ID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ID0gcmhzLT53OworICAgIHEtPnggPSByaHMtPng7CisgICAgcS0+eSA9IHJocy0+eTsKKyAgICBxLT56ID0gcmhzLT56OworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uTXVsdGlwbHkocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcykgeworICAgIHEtPncgKj0gczsKKyAgICBxLT54ICo9IHM7CisgICAgcS0+eSAqPSBzOworICAgIHEtPnogKj0gczsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgPSAtcS0+eCpyaHMtPnggLSBxLT55KnJocy0+eSAtIHEtPnoqcmhzLT56ICsgcS0+dypyaHMtPnc7CisgICAgcS0+eCA9ICBxLT54KnJocy0+dyArIHEtPnkqcmhzLT56IC0gcS0+eipyaHMtPnkgKyBxLT53KnJocy0+eDsKKyAgICBxLT55ID0gLXEtPngqcmhzLT56ICsgcS0+eSpyaHMtPncgKyBxLT56KnJocy0+eiArIHEtPncqcmhzLT55OworICAgIHEtPnogPSAgcS0+eCpyaHMtPnkgLSBxLT55KnJocy0+eCArIHEtPnoqcmhzLT53ICsgcS0+dypyaHMtPno7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25BZGQocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyAqPSByaHMtPnc7CisgICAgcS0+eCAqPSByaHMtPng7CisgICAgcS0+eSAqPSByaHMtPnk7CisgICAgcS0+eiAqPSByaHMtPno7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25Mb2FkUm90YXRlVW5pdChyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByb3QgKj0gKGZsb2F0KShNX1BJIC8gMTgwLjBmKSAqIDAuNWY7CisgICAgZmxvYXQgYyA9IGNvcyhyb3QpOworICAgIGZsb2F0IHMgPSBzaW4ocm90KTsKKworICAgIHEtPncgPSBjOworICAgIHEtPnggPSB4ICogczsKKyAgICBxLT55ID0geSAqIHM7CisgICAgcS0+eiA9IHogKiBzOworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZShyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBjb25zdCBmbG9hdCBsZW4gPSB4KnggKyB5KnkgKyB6Kno7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICB4ICo9IHJlY2lwTGVuOworICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgIH0KKyAgICByc1F1YXRlcm5pb25Mb2FkUm90YXRlVW5pdChxLCByb3QsIHgsIHksIHopOworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uQ29uanVnYXRlKHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBxLT54ID0gLXEtPng7CisgICAgcS0+eSA9IC1xLT55OworICAgIHEtPnogPSAtcS0+ejsKK30KKworc3RhdGljIGZsb2F0Cityc1F1YXRlcm5pb25Eb3QoY29uc3QgcnNfcXVhdGVybmlvbiAqcTAsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnExKSB7CisgICAgcmV0dXJuIHEwLT53KnExLT53ICsgcTAtPngqcTEtPnggKyBxMC0+eSpxMS0+eSArIHEwLT56KnExLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTm9ybWFsaXplKHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBjb25zdCBmbG9hdCBsZW4gPSByc1F1YXRlcm5pb25Eb3QocSwgcSk7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICByc1F1YXRlcm5pb25NdWx0aXBseShxLCByZWNpcExlbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uU2xlcnAocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcTAsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnExLCBmbG9hdCB0KSB7CisgICAgaWYodCA8PSAwLjBmKSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldChxLCBxMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYodCA+PSAxLjBmKSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldChxLCBxMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByc19xdWF0ZXJuaW9uIHRlbXBxMCwgdGVtcHExOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHEwLCBxMCk7CisgICAgcnNRdWF0ZXJuaW9uU2V0KCZ0ZW1wcTEsIHExKTsKKworICAgIGZsb2F0IGFuZ2xlID0gcnNRdWF0ZXJuaW9uRG90KHEwLCBxMSk7CisgICAgaWYoYW5nbGUgPCAwKSB7CisgICAgICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KCZ0ZW1wcTAsIC0xLjBmKTsKKyAgICAgICAgYW5nbGUgKj0gLTEuMGY7CisgICAgfQorCisgICAgZmxvYXQgc2NhbGUsIGludlNjYWxlOworICAgIGlmIChhbmdsZSArIDEuMGYgPiAwLjA1ZikgeworICAgICAgICBpZiAoMS4wZiAtIGFuZ2xlID49IDAuMDVmKSB7CisgICAgICAgICAgICBmbG9hdCB0aGV0YSA9IGFjb3MoYW5nbGUpOworICAgICAgICAgICAgZmxvYXQgaW52U2luVGhldGEgPSAxLjBmIC8gc2luKHRoZXRhKTsKKyAgICAgICAgICAgIHNjYWxlID0gc2luKHRoZXRhICogKDEuMGYgLSB0KSkgKiBpbnZTaW5UaGV0YTsKKyAgICAgICAgICAgIGludlNjYWxlID0gc2luKHRoZXRhICogdCkgKiBpbnZTaW5UaGV0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNjYWxlID0gMS4wZiAtIHQ7CisgICAgICAgICAgICBpbnZTY2FsZSA9IHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCB0ZW1wcTAueiwgLXRlbXBxMC55LCB0ZW1wcTAueCwgLXRlbXBxMC53KTsKKyAgICAgICAgc2NhbGUgPSBzaW4oTV9QSSAqICgwLjVmIC0gdCkpOworICAgICAgICBpbnZTY2FsZSA9IHNpbihNX1BJICogdCk7CisgICAgfQorCisgICAgcnNRdWF0ZXJuaW9uU2V0KHEsIHRlbXBxMC53KnNjYWxlICsgdGVtcHExLncqaW52U2NhbGUsIHRlbXBxMC54KnNjYWxlICsgdGVtcHExLngqaW52U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcTAueSpzY2FsZSArIHRlbXBxMS55KmludlNjYWxlLCB0ZW1wcTAueipzY2FsZSArIHRlbXBxMS56KmludlNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgcnNRdWF0ZXJuaW9uR2V0TWF0cml4VW5pdChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBmbG9hdCB4MiA9IDIuMGYgKiBxLT54ICogcS0+eDsKKyAgICBmbG9hdCB5MiA9IDIuMGYgKiBxLT55ICogcS0+eTsKKyAgICBmbG9hdCB6MiA9IDIuMGYgKiBxLT56ICogcS0+ejsKKyAgICBmbG9hdCB4eSA9IDIuMGYgKiBxLT54ICogcS0+eTsKKyAgICBmbG9hdCB3eiA9IDIuMGYgKiBxLT53ICogcS0+ejsKKyAgICBmbG9hdCB4eiA9IDIuMGYgKiBxLT54ICogcS0+ejsKKyAgICBmbG9hdCB3eSA9IDIuMGYgKiBxLT53ICogcS0+eTsKKyAgICBmbG9hdCB3eCA9IDIuMGYgKiBxLT53ICogcS0+eDsKKyAgICBmbG9hdCB5eiA9IDIuMGYgKiBxLT55ICogcS0+ejsKKworICAgIG0tPm1bMF0gPSAxLjBmIC0geTIgLSB6MjsKKyAgICBtLT5tWzFdID0geHkgLSB3ejsKKyAgICBtLT5tWzJdID0geHogKyB3eTsKKyAgICBtLT5tWzNdID0gMC4wZjsKKworICAgIG0tPm1bNF0gPSB4eSArIHd6OworICAgIG0tPm1bNV0gPSAxLjBmIC0geDIgLSB6MjsKKyAgICBtLT5tWzZdID0geXogLSB3eDsKKyAgICBtLT5tWzddID0gMC4wZjsKKworICAgIG0tPm1bOF0gPSB4eiAtIHd5OworICAgIG0tPm1bOV0gPSB5eiAtIHd4OworICAgIG0tPm1bMTBdID0gMS4wZiAtIHgyIC0geTI7CisgICAgbS0+bVsxMV0gPSAwLjBmOworCisgICAgbS0+bVsxMl0gPSAwLjBmOworICAgIG0tPm1bMTNdID0gMC4wZjsKKyAgICBtLT5tWzE0XSA9IDAuMGY7CisgICAgbS0+bVsxNV0gPSAxLjBmOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBpbnQgb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitfX2lubGluZV9fIHN0YXRpYyB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWludCBhbW91bnQsIHVpbnQgbG93LCB1aW50IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKGludCBhbW91bnQsIGludCBsb3csIGludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcCh1c2hvcnQgYW1vdW50LCB1c2hvcnQgbG93LCB1c2hvcnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChzaG9ydCBhbW91bnQsIHNob3J0IGxvdywgc2hvcnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcCh1Y2hhciBhbW91bnQsIHVjaGFyIGxvdywgdWNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKGNoYXIgYW1vdW50LCBjaGFyIGxvdywgY2hhciBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKaW5kZXggNzBjZDU2Mi4uZmQwNDkxYyAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCkBAIC0xLDY1ICsxLDg4IEBACisjaWZuZGVmIF9fUlNfR1JBUEhJQ1NfUlNIX18KKyNkZWZpbmUgX19SU19HUkFQSElDU19SU0hfXworCisjaW5jbHVkZSAicnNfbWF0aC5yc2giCiAKIAotZXh0ZXJuIGZsb2F0MiB2ZWMyUmFuZChmbG9hdCBsZW4pOworLy8gQmluZCBhIFByb2dyYW1GcmFnbWVudCB0byB0aGUgUlMgY29udGV4dC4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShyc19wcm9ncmFtX3N0b3JlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3Rlcihyc19wcm9ncmFtX3Jhc3Rlcik7CiAKLWV4dGVybiBmbG9hdDMgZmxvYXQzTm9ybShmbG9hdDMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0M0xlbmd0aChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNBZGQoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M1N1YihmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzQ3Jvc3MoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQgZmxvYXQzRG90KGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNTY2FsZShmbG9hdDMgdiwgZmxvYXQgc2NhbGUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCB1aW50IHNsb3QsIHJzX3NhbXBsZXIpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kVGV4dHVyZShyc19wcm9ncmFtX2ZyYWdtZW50LCB1aW50IHNsb3QsIHJzX2FsbG9jYXRpb24pOwogCi1leHRlcm4gZmxvYXQ0IGZsb2F0NEFkZChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0U3ViKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRDcm9zcyhmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDREb3QoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NFNjYWxlKGZsb2F0NCB2LCBmbG9hdCBzY2FsZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOwogCi0gICAgLy8gY29udGV4dAotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtU3RvcmUocnNfcHJvZ3JhbV9zdG9yZSk7Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IocnNfcHJvZ3JhbV9mcmFnbWVudCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0dldFdpZHRoKHZvaWQpOworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dHZXRIZWlnaHQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IGZsb2F0ICopOwotZXh0ZXJuIHZvaWQgdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCBmbG9hdCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9UZXh0dXJlKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgdWludCBtaXBMZXZlbCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKIAotLy8gZHJhd2luZwotZXh0ZXJuIHZvaWQgZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOwotZXh0ZXJuIHZvaWQgZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpOwotZXh0ZXJuIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpOwotZXh0ZXJuIHZvaWQgZHJhd1NpbXBsZU1lc2goaW50IGlzbSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaFJhbmdlKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSwgdWludCBwcmltaXRpdmVJbmRleCwgdWludCBzdGFydCwgdWludCBsZW4pOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0NsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dDbGVhckRlcHRoKGZsb2F0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdUZXh0KHJzX2FsbG9jYXRpb24sIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRGb250KHJzX2ZvbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dGb250Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBtaXNjCi1leHRlcm4gdm9pZCBwZkNsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgY29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiB2b2lkIGhzYlRvUmdiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0Kik7Ci1leHRlcm4gaW50IGhzYlRvQWJncihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiB2b2lkIHVwbG9hZFRvVGV4dHVyZShpbnQsIGludCk7Ci1leHRlcm4gdm9pZCB1cGxvYWRUb0J1ZmZlck9iamVjdChpbnQpOworLy8gRGVwcmljYXRlZAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0J0bzU2NShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLQotZXh0ZXJuIGludCBnZXRXaWR0aCgpOwotZXh0ZXJuIGludCBnZXRIZWlnaHQoKTsKLQotZXh0ZXJuIGludCBzZW5kVG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKTsKLQotZXh0ZXJuIHZvaWQgZGVidWdGKGNvbnN0IGNoYXIgKiwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgZGVidWdJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZGVidWdIZXhJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKaW5kZXggNjEzYzdjYS4uNDVmNmJmNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaApAQCAtMSwyODcgKzEsMTM3IEBACi0vLyBGbG9hdCBvcHMKKyNpZm5kZWYgX19SU19NQVRIX1JTSF9fCisjZGVmaW5lIF9fUlNfTUFUSF9SU0hfXwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworLy8gRGVidWdnaW5nLCBwcmludCB0byB0aGUgTE9HIGEgZGVzY3JpcHRpb24gc3RyaW5nIGFuZCBhIHZhbHVlLgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgY29uc3QgcnNfbWF0cml4NHg0ICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgY29uc3QgcnNfbWF0cml4M3gzICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgY29uc3QgcnNfbWF0cml4MngyICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIHVpbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqKTsKKyNkZWZpbmUgUlNfREVCVUcoYSkgcnNEZWJ1ZygjYSwgYSkKKyNkZWZpbmUgUlNfREVCVUdfTUFSS0VSIHJzRGVidWcoX19GSUxFX18sIF9fTElORV9fKQogCiAKKyNpbmNsdWRlICJyc19jbC5yc2giCisjaW5jbHVkZSAicnNfY29yZS5yc2giCiAKKy8vIEFsbG9jYXRpb25zCiAKKy8vIFJldHVybiB0aGUgcnNfYWxsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib3VuZCBkYXRhCisvLyBwb2ludGVyLgorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKIAorLy8gUmV0dXJuIHRoZSBkaW1lbnNpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1aKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltTE9EKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CiAKLS8vIEludCBvcHMKKy8vIEV4dHJhY3QgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGFuIGFsbG9jYXRpb24uCitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKKy8vIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIDAgKG9yIG1pbl92YWx1ZSkgYW5kIG1heF9tYWx1ZS4KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1heF92YWx1ZSk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1heF92YWx1ZSk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoZmxvYXQgbWluX3ZhbHVlLCBmbG9hdCBtYXhfdmFsdWUpOwogCisvLyByZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhIGZsb2F0CisvLyBtaW4odiAtICgoaW50KWZsb29yKHYpKSwgMHgxLmZmZmZmZXAtMWYpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGcmFjKGZsb2F0KTsKIAorLy8gdGltZQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlY29uZCh2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNaW51dGUodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSG91cih2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEYXkodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTW9udGgodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzWWVhcih2b2lkKTsKIAotLyoKLWV4dGVybiBmbG9hdCBtb2RmKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGZyYWNmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBsZXJwZihmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBtYXBmKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0qLworLy8gUmV0dXJuIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayBpbiBtaWxsaXNlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVNaWxsaXModm9pZCk7CiAKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbmFub3NlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVOYW5vcyh2b2lkKTsKKworLy8gUmV0dXJuIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgZnVuY3Rpb24gd2FzIGxhc3QgY2FsbGVkIGluIHRoaXMgc2NyaXB0LgorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREdCh2b2lkKTsKKworLy8gU2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50LiAgV2lsbCBub3QgYmxvY2sgYW5kIHJldHVybnMgdHJ1ZQorLy8gaWYgdGhlIG1lc3NhZ2Ugd2FzIHNlbmRhYmxlIGFuZCBmYWxzZSBpZiB0aGUgZmlmbyB3YXMgZnVsbC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElEKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYmxvY2tpbmcgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorLy8gQSBtZXNzYWdlIElEIGlzIHJlcXVpcmVkLiAgRGF0YSBwYXlsb2FkIGlzIG9wdGlvbmFsLgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CisKKy8vIFNjcmlwdCB0byBTY3JpcHQKK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdF9jYWxsIHsKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCit9IHJzX3NjcmlwdF9jYWxsX3Q7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAppbmRleCA0MTk4YTc0Li5kZGFlN2ViIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKQEAgLTIsNzAgKzIsNzUgQEAKIHR5cGVkZWYgY2hhciBpbnQ4X3Q7CiB0eXBlZGVmIHNob3J0IGludDE2X3Q7CiB0eXBlZGVmIGludCBpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKIAogdHlwZWRlZiB1aW50OF90IHVjaGFyOwogdHlwZWRlZiB1aW50MTZfdCB1c2hvcnQ7CiB0eXBlZGVmIHVpbnQzMl90IHVpbnQ7Ci0vL3R5cGVkZWYgdWludDY0X3QgdWxvbmc7Cit0eXBlZGVmIHVpbnQ2NF90IHVsb25nOwogCi10eXBlZGVmIGludCByc19lbGVtZW50OwotdHlwZWRlZiBpbnQgcnNfdHlwZTsKLXR5cGVkZWYgaW50IHJzX2FsbG9jYXRpb247Ci10eXBlZGVmIGludCByc19zYW1wbGVyOwotdHlwZWRlZiBpbnQgcnNfc2NyaXB0OwotdHlwZWRlZiBpbnQgcnNfbWVzaDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fZnJhZ21lbnQ7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3ZlcnRleDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fcmFzdGVyOwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2VsZW1lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc190eXBlOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfYWxsb2NhdGlvbjsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3NhbXBsZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zY3JpcHQ7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19tZXNoOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9mcmFnbWVudDsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fdmVydGV4OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9yYXN0ZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3N0b3JlOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfZm9udDsKIAogdHlwZWRlZiBmbG9hdCBmbG9hdDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVjaGFyIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWludCB1aW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWludCB1aW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWludCB1aW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWludCB1aW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWludCB1aW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGNoYXIgY2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBzaG9ydCBzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGludCBpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBpbnQgaW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgaW50IGludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGludCBpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBpbnQgaW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzE2XTsKK30gcnNfbWF0cml4NHg0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs5XTsKK30gcnNfbWF0cml4M3gzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs0XTsKK30gcnNfbWF0cml4MngyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgdywgeCwgeSwgejsKK30gcnNfcXVhdGVybmlvbjsKKworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQogCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCBhMTQwMWFkLi40MzYyZDE0IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworcGFyY2VsYWJsZSBDb3VudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMDU0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgY291bnRyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX05FVFdPUksgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIGxvY2F0aW9uIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBVElPTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIHdhcyByZWFkIGZyb20gdGhlIFNJTSBjYXJkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfU0lNID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBzeXN0ZW0gbG9jYWxlIHNldHRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBTEUgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5SXNvOworCisgICAgLyoqCisgICAgICogV2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNvdXJjZTsKKworICAgIHByaXZhdGUgaW50IG1IYXNoQ29kZTsKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5SXNvIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gc291cmNlIHdoZXJlIHRoZSBjb3VudHJ5SXNvIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93CisgICAgICogICAgICAgIHZhbHVlcworICAgICAqICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FUSU9OfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeShmaW5hbCBTdHJpbmcgY291bnRyeUlzbywgZmluYWwgaW50IHNvdXJjZSkgeworICAgICAgICBpZiAoY291bnRyeUlzbyA9PSBudWxsIHx8IHNvdXJjZSA8IENPVU5UUllfU09VUkNFX05FVFdPUksKKyAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPiBDT1VOVFJZX1NPVVJDRV9MT0NBTEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBtQ291bnRyeUlzbyA9IGNvdW50cnlJc28udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ291bnRyeShDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5Lm1Db3VudHJ5SXNvOworICAgICAgICBtU291cmNlID0gY291bnRyeS5tU291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb3VudHJ5SXNvKCkgeworICAgICAgICByZXR1cm4gbUNvdW50cnlJc287CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGVyZSB0aGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93IHZhbHVlcworICAgICAqICAgICAgICAgPHA+CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfU0lNfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+KCkgeworICAgICAgICBwdWJsaWMgQ291bnRyeSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZEludCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5W10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIHBhcmNlbCwgaW50IGZsYWdzKSB7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtQ291bnRyeUlzbyk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtU291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb3VudHJ5KSB7CisgICAgICAgICAgICBDb3VudHJ5IGMgPSAoQ291bnRyeSkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvLmVxdWFscyhjLmdldENvdW50cnlJc28oKSkgJiYgbVNvdXJjZSA9PSBjLmdldFNvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IG1IYXNoQ29kZTsKKyAgICAgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgICAgICAgaGFzaCA9IDE3OworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Db3VudHJ5SXNvLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDEzICsgbVNvdXJjZTsKKyAgICAgICAgICAgIG1IYXNoQ29kZSA9IGhhc2g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1IYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBzcGVjaWZpZWQgY291bnRyeSB0byB0aGlzIGNvdW50cnkgb2JqZWN0IGlnbm9yaW5nIHRoZSBtU291cmNlCisgICAgICogZmllbGQsIHJldHVybiB0cnVlIGlmIHRoZSBjb3VudHJ5SXNvIGZpZWxkcyBhcmUgZXF1YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjb3VudHJ5IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb3VudHJ5J3MgY291bnRyeUlzbyBmaWVsZCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICBjb3VudHJ5J3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVTb3VyY2UoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5ICE9IG51bGwgJiYgbUNvdW50cnlJc28uZXF1YWxzKGNvdW50cnkuZ2V0Q291bnRyeUlzbygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3ODBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gY291bnRyeSBkZXRlY3RvciBzZXJ2aWNlLiBUaGlzCisgKiBzZXJ2aWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IHdpbGwgYmUgZGV0ZWN0ZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2UgdGhlCisgKiB7QGxpbmsgI2FkZENvdW50cnlMaXN0ZW5lcn0KKyAqIDxwPgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKX0uCisgKiA8cD4KKyAqIEJvdGggQUNDRVNTX0ZJTkVfTE9DQVRJT04gYW5kIEFDQ0VTU19DT0FSU0VfTE9DQVRJT04gcGVybWlzc2lvbnMgYXJlIG5lZWRlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0byB3cmFwIHRoZSBJQ291bnRyeUxpc3RlbmVyLlN0dWIgYW5kIENvdW50cnlMaXN0ZW5lciBvYmplY3RzCisgICAgICogdG9nZXRoZXIuIFRoZSBDb3VudHJ5TGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZSBzcGVjaWZpYworICAgICAqIGxvb3BlciBvbmNlIHRoZSBjb3VudHJ5IGNoYW5nZWQgYW5kIGRldGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIExpc3RlbmVyVHJhbnNwb3J0IGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgICAgIHB1YmxpYyBMaXN0ZW5lclRyYW5zcG9ydChDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChmaW5hbCBDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3IiOworICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlEZXRlY3RvciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4gbUxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIEBoaWRlIC0gaGlkZSB0aGlzIGNvbnN0cnVjdG9yIGJlY2F1c2UgaXQgaGFzIGEgcGFyYW1ldGVyIG9mIHR5cGUKKyAgICAgKiAgICAgICBJQ291bnRyeURldGVjdG9yLCB3aGljaCBpcyBhIHN5c3RlbSBwcml2YXRlIGNsYXNzLiBUaGUgcmlnaHQgd2F5IHRvCisgICAgICogICAgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNpbmcgdGhlIGZhY3RvcnkKKyAgICAgKiAgICAgICBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvcihJQ291bnRyeURldGVjdG9yIHNlcnZpY2UpIHsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsCisgICAgICogICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImRldGVjdENvdW50cnk6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZAorICAgICAqIG9yIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBsb29wZXIgYSBMb29wZXIgb2JqZWN0IHdob3NlIG1lc3NhZ2UgcXVldWUgd2lsbCBiZSB1c2VkIHRvCisgICAgICogICAgICAgIGltcGxlbWVudCB0aGUgY2FsbGJhY2sgbWVjaGFuaXNtLiBJZiBsb29wZXIgaXMgbnVsbCB0aGVuIHRoZQorICAgICAqICAgICAgICBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAoIW1MaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IExpc3RlbmVyVHJhbnNwb3J0KGxpc3RlbmVyLCBsb29wZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENvdW50cnlMaXN0ZW5lcih0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhZGRDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbUxpc3RlbmVycy5nZXQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5yZW1vdmVDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyZW1vdmVDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworLyoqCisgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IKKyAqIGNoYW5nZWQKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvdW50cnlMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvdW50cnkgdGhlIGNoYW5nZWQgb3IgZGV0ZWN0ZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgQVBJIGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgd2hlcmUgdGhlIHVzZXIgaXMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNvdW50cnlEZXRlY3RvcgoreworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUNvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworLyoqCisgKiB7QGhpZGV9CisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNvdW50cnlMaXN0ZW5lcgoreworICAgIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoaW4gQ291bnRyeSBjb3VudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeVRlc3RlciBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50cnlFcXVhbHMoKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeUEgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBDb3VudHJ5IGNvdW50cnlCID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlDID0gbmV3IENvdW50cnkoIkNOIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlEID0gbmV3IENvdW50cnkoInVzIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHNJZ25vcmVTb3VyY2UoY291bnRyeUIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlDKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5RCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmhhc2hDb2RlKCkgPT0gY291bnRyeUQuaGFzaENvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQppbmRleCBmMWZhMWU4Li4zMWU0NjMxIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQpAQCAtMzEsOSArMzEsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0lOVkFMSUQgPSAwOwogICAgIC8qKiBEZWZhdWx0IGF1ZGlvIGRhdGEgZm9ybWF0ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfREVGQVVMVCA9IDE7Ci0gICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSAxNiBiaXQgcGVyIHNhbXBsZS4gR3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fMTZCSVQgPSAyOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDggYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlLiBOb3QgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fOEJJVCA9IDM7ICAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQogCiAgICAgLyoqIEludmFsaWQgYXVkaW8gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKaW5kZXggYmJiYmE3NC4uYjIzZGNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQpAQCAtMTUyNSw0ICsxNTI1LDIyIEBACiAgICAgICAqIHtAaGlkZX0KICAgICAgICovCiAgICAgIHByaXZhdGUgSUJpbmRlciBtSUNhbGxCYWNrID0gbmV3IEJpbmRlcigpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBob25lIGlzIGluIHNpbGVudCBtb2RlLCB3aXRoIG9yIHdpdGhvdXQgdmlicmF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSaW5nZXJNb2RlKCkKKyAgICAgKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIENvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbGVudE1vZGUoKSB7CisgICAgICAgIGludCByaW5nZXJNb2RlID0gZ2V0UmluZ2VyTW9kZSgpOworICAgICAgICBib29sZWFuIHNpbGVudE1vZGUgPQorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfU0lMRU5UKSB8fAorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfVklCUkFURSk7CisgICAgICAgIHJldHVybiBzaWxlbnRNb2RlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQppbmRleCBjNDhlYWFkLi5jNTY3YTZlIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQpAQCAtMTk0LDExICsxOTQsMTMgQEAKICAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIHJlY29yZGluZyBzb3VyY2UuIFNlZSB7QGxpbmsgTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZX0gZm9yCiAgICAgICogICAgcmVjb3JkaW5nIHNvdXJjZSBkZWZpbml0aW9ucy4KLSAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gRXhhbXBsZXMgb2YgcmF0ZXMgYXJlIChidXQKLSAgICAgKiAgIG5vdCBsaW1pdGVkIHRvKSA0NDEwMCwgMjIwNTAgYW5kIDExMDI1LgorICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiB0aGUgc2FtcGxlIHJhdGUgZXhwcmVzc2VkIGluIEhlcnR6LiA0NDEwMEh6IGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqICAgcmF0ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiBhbGwgZGV2aWNlcywgYnV0IG90aGVyIHJhdGVzIHN1Y2ggYXMgMjIwNTAsCisgICAgICogICAxNjAwMCwgYW5kIDExMDI1IG1heSB3b3JrIG9uIHNvbWUgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZXNjcmliZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIGNoYW5uZWxzLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBhbmQKLSAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30KKyAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30uICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBpcyBndWFyYW50ZWVkCisgICAgICogICB0byB3b3JrIG9uIGFsbCBkZXZpY2VzLgogICAgICAqIEBwYXJhbSBhdWRpb0Zvcm1hdCB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBhdWRpbyBkYXRhIGlzIHJlcHJlc2VudGVkLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzE2QklUfSBhbmQgCiAgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzhCSVR9CkBAIC00NDQsNiArNDQ2LDggQEAKICAgICAgKiAgb3Ige0BsaW5rICNFUlJPUn0gaWYgdGhlIGltcGxlbWVudGF0aW9uIHdhcyB1bmFibGUgdG8gcXVlcnkgdGhlIGhhcmR3YXJlIGZvciBpdHMgCiAgICAgICogIG91dHB1dCBwcm9wZXJ0aWVzLCAKICAgICAgKiAgIG9yIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAgICAgKiBAc2VlICNBdWRpb1JlY29yZChpbnQsIGludCwgaW50LCBpbnQsIGludCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdmFsaWQKKyAgICAgKiAgIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgaW50IGdldE1pbkJ1ZmZlclNpemUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgY2hhbm5lbENvbmZpZywgaW50IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIGludCBjaGFubmVsQ291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IDZlNTI3ZDkuLmEzNDZhZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuVmlkZW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZWNvZGVyQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuRGVjb2RlckNhcGFiaWxpdGllcy5WaWRlb0RlY29kZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZWNvZGVyQ2FwYWJpbGl0aWVzLkF1ZGlvRGVjb2RlcjsKQEAgLTk2LDE1ICs5NywzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgZmlsZSBleHRlbnNpb24gdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNGaWxlVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIG1pbWUgdHlwZSB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgTVRQIGZvcm1hdCBjb2RlIHRvIG1pbWUgdHlwZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBzRm9ybWF0VG9NaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKICAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBzRmlsZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbmV3IE1lZGlhRmlsZVR5cGUoZmlsZVR5cGUsIG1pbWVUeXBlKSk7CiAgICAgICAgIHNNaW1lVHlwZU1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihmaWxlVHlwZSkpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlLCBpbnQgbXRwRm9ybWF0Q29kZSkgeworICAgICAgICBhZGRGaWxlVHlwZShleHRlbnNpb24sIGZpbGVUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIHNGaWxlVHlwZVRvRm9ybWF0TWFwLnB1dChleHRlbnNpb24sIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNNaW1lVHlwZVRvRm9ybWF0TWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc0Zvcm1hdFRvTWltZVR5cGVNYXAucHV0KG10cEZvcm1hdENvZGUsIG1pbWVUeXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01BRW5hYmxlZCgpIHsKICAgICAgICAgTGlzdDxBdWRpb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgICAgIGZvciAoQXVkaW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7CkBAIC0xMjYsMTcgKzE0NCwxNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2Iik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIsIE10cC5PYmplY3QuRk9STUFUX01QMyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNNEEiLCBGSUxFX1RZUEVfTTRBLCAiYXVkaW8vbXA0IiwgTXRwLk9iamVjdC5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXQVYiLCBGSUxFX1RZUEVfV0FWLCAiYXVkaW8veC13YXYiLCBNdHAuT2JqZWN0LkZPUk1BVF9XQVYpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQU1SIiwgRklMRV9UWVBFX0FNUiwgImF1ZGlvL2FtciIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQVdCIiwgRklMRV9UWVBFX0FXQiwgImF1ZGlvL2Ftci13YiIpOwogICAgICAgICBpZiAoaXNXTUFFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiLCBNdHAuT2JqZWN0LkZPUk1BVF9XTUEpOwogICAgICAgICB9Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJBQUMiLCBGSUxFX1RZUEVfQUFDLCAiYXVkaW8vYWFjIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwLk9iamVjdC5GT1JNQVRfT0dHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHAuT2JqZWN0LkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIsIE10cC5PYmplY3QuRk9STUFUX0FBQyk7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJNS0EiLCBGSUxFX1RZUEVfTUtBLCAiYXVkaW8veC1tYXRyb3NrYSIpOwogIAogICAgICAgICBhZGRGaWxlVHlwZSgiTUlEIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKQEAgLTE0OCwzMiArMTY2LDMyIEBACiAgICAgICAgIGFkZEZpbGVUeXBlKCJSVFgiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiT1RBIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKICAgICAgICAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNUEVHIiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIsIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHAuT2JqZWN0LkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHAuT2JqZWN0LkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LViIsIEZJTEVfVFlQRV9NS1YsICJ2aWRlby94LW1hdHJvc2thIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJXRUJNIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIlRTIiwgRklMRV9UWVBFX01QMlRTLCAidmlkZW8vbXAydHMiKTsKIAogICAgICAgICBpZiAoaXNXTVZFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiLCBNdHAuT2JqZWN0LkZPUk1BVF9XTVYpOwogICAgICAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwogICAgICAgICB9CiAKLSAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHAuT2JqZWN0LkZPUk1BVF9FWElGX0pQRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cC5PYmplY3QuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIiwgTXRwLk9iamVjdC5GT1JNQVRfR0lGKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBORyIsIEZJTEVfVFlQRV9QTkcsICJpbWFnZS9wbmciLCBNdHAuT2JqZWN0LkZPUk1BVF9QTkcpOworICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIiwgTXRwLk9iamVjdC5GT1JNQVRfQk1QKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldCTVAiLCBGSUxFX1RZUEVfV0JNUCwgImltYWdlL3ZuZC53YXAud2JtcCIpOwogIAotICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIiwgTXRwLk9iamVjdC5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIiwgTXRwLk9iamVjdC5GT1JNQVRfUExTX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIiwgTXRwLk9iamVjdC5GT1JNQVRfV1BMX1BMQVlMSVNUKTsKIAogICAgICAgICAvLyBjb21wdXRlIGZpbGUgZXh0ZW5zaW9ucyBsaXN0IGZvciBuYXRpdmUgTWVkaWEgU2Nhbm5lcgogICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjIyLDQgKzI0MCwyNSBAQAogICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaW50VmFsdWUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9ybWF0Q29kZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNNaW1lVHlwZVRvRm9ybWF0TWFwLmdldChtaW1lVHlwZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBsYXN0RG90ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKKyAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzRmlsZVR5cGVUb0Zvcm1hdE1hcC5nZXQoZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE10cC5PYmplY3QuRk9STUFUX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZUZvckZvcm1hdENvZGUoaW50IGZvcm1hdENvZGUpIHsKKyAgICAgICAgcmV0dXJuIHNGb3JtYXRUb01pbWVUeXBlTWFwLmdldChmb3JtYXRDb2RlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCAzNGE4NmVjLi45NGY1YzdhIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTI4Miw2ICsyODIsMjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHRpbWUgbGFwc2UgY2FwdHVyZSBhbmQgc2V0cyBpdHMgcGFyYW1ldGVycy4gVGhpcyBtZXRob2Qgc2hvdWxkCisgICAgICogYmUgY2FsbGVkIGFmdGVyIHNldFByb2ZpbGUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVUaW1lTGFwc2UgUGFzcyB0cnVlIHRvIGVuYWJsZSB0aW1lIGxhcHNlIGNhcHR1cmUsIGZhbHNlIHRvIGRpc2FibGUgaXQuCisgICAgICogQHBhcmFtIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlIFBhc3MgdHJ1ZSB0byB1c2Ugc3RpbGwgY2FtZXJhIGZvciBjYXB0dXJpbmcgdGltZSBsYXBzZQorICAgICAqIGZyYW1lcywgZmFsc2UgdG8gdXNlIHRoZSB2aWRlbyBjYW1lcmEuCisgICAgICogQHBhcmFtIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMgdGltZSBiZXR3ZWVuIHR3byBjYXB0dXJlcyBvZiB0aW1lIGxhcHNlIGZyYW1lcy4KKyAgICAgKiBAcGFyYW0gZW5jb2RlckxldmVsIHRoZSB2aWRlbyBlbmNvZGVyIGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVMYXBzZVBhcmFtZXRlcnMoYm9vbGVhbiBlbmFibGVUaW1lTGFwc2UsCisgICAgICAgICAgICBib29sZWFuIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICAgICAgaW50IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMsIGludCBlbmNvZGVyTGV2ZWwpIHsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInRpbWUtbGFwc2UtZW5hYmxlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGVuYWJsZVRpbWVMYXBzZSkgPyAxIDogMCkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidXNlLXN0aWxsLWNhbWVyYS1mb3ItdGltZS1sYXBzZT0lZCIsCisgICAgICAgICAgICAgICAgICAgICh1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgPyAxIDogMCkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKTsKKyAgICAgICAgc2V0VmlkZW9FbmNvZGVyTGV2ZWwoZW5jb2RlckxldmVsKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlIHByb2R1Y2VkIGR1cmluZyByZWNvcmRpbmcuIENhbGwgdGhpcwogICAgICAqIGFmdGVyIHNldEF1ZGlvU291cmNlKCkvc2V0VmlkZW9Tb3VyY2UoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KICAgICAgKgpAQCAtNDQ4LDYgKzQ3MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxldmVsIG9mIHRoZSBlbmNvZGVyLiBDYWxsIHRoaXMgYmVmb3JlIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGVyTGV2ZWwgdGhlIHZpZGVvIGVuY29kZXIgbGV2ZWwuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb0VuY29kZXJMZXZlbChpbnQgZW5jb2RlckxldmVsKSB7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1wYXJhbS1lbmNvZGVyLWxldmVsPSVkIiwgZW5jb2RlckxldmVsKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFzcyBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4uIENhbGwgdGhpcyBhZnRlcgogICAgICAqIHNldE91dHB1dEZvcm1hdCgpIGJ1dCBiZWZvcmUgcHJlcGFyZSgpLgogICAgICAqCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKaW5kZXggMzMzMzI2OC4uN2Y5MWMyMiAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQpAQCAtMzA1LDYgKzMwNSw3IEBACiAgICAgcHJpdmF0ZSBVcmkgbUdlbnJlc1VyaTsKICAgICBwcml2YXRlIFVyaSBtUGxheWxpc3RzVXJpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvY2Vzc1BsYXlsaXN0cywgbVByb2Nlc3NHZW5yZXM7CisgICAgcHJpdmF0ZSBpbnQgbU10cE9iamVjdEhhbmRsZTsKIAogICAgIC8vIHVzZWQgd2hlbiBzY2FubmluZyB0aGUgaW1hZ2UgZGF0YWJhc2Ugc28gd2Uga25vdyB3aGV0aGVyIHdlIGhhdmUgdG8gcHJ1bmUKICAgICAvLyBvbGQgdGh1bWJuYWlsIGZpbGVzCkBAIC02MjUsNiArNjI2LDkgQEAKICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFURV9NT0RJRklFRCwgbUxhc3RNb2RpZmllZCk7CiAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLlNJWkUsIG1GaWxlU2l6ZSk7CiAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLk1JTUVfVFlQRSwgbU1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmIChtTXRwT2JqZWN0SGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLk1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCwgbU10cE9iamVjdEhhbmRsZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKICAgICAgICAgICAgICAgICBtYXAucHV0KFZpZGVvLk1lZGlhLkFSVElTVCwgKG1BcnRpc3QgIT0gbnVsbCAmJiBtQXJ0aXN0Lmxlbmd0aCgpID4gMCA/IG1BcnRpc3QgOiBNZWRpYVN0b3JlLlVOS05PV05fU1RSSU5HKSk7CkBAIC0xMjI3LDYgKzEyMzEsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBVcmkgc2Nhbk10cEZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyB2b2x1bWVOYW1lLCBpbnQgb2JqZWN0SGFuZGxlLCBpbnQgZm9ybWF0KSB7CisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IE1lZGlhRmlsZS5nZXRNaW1lVHlwZUZvckZvcm1hdENvZGUoZm9ybWF0KTsKKyAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IG9iamVjdEhhbmRsZTsKKyAgICAgICAgVXJpIHJlc3VsdCA9IHNjYW5TaW5nbGVGaWxlKHBhdGgsIHZvbHVtZU5hbWUsIG1pbWVUeXBlKTsKKyAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IDA7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIGZpbGUvZGlyZWN0b3J5IG5hbWVzLCBzdGFydGluZyBmcm9tIHRoZSByaWdodAogICAgIHByaXZhdGUgaW50IG1hdGNoUGF0aHMoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlYmNiOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBDbGllbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDbGllbnQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBDbGllbnQoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk10cENsaWVudDogbGlzdGVuZXIgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlT2JqZWN0KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfZGVsZXRlX29iamVjdChkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFyZW50KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X3BhcmVudChkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RvcmFnZUlEKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBvdmVyIE1UUAorICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX29wZW5fZmlsZShkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgeworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhIG5ldyBNVFAgZGV2aWNlIGhhcyBiZWVuIGRpc2NvdmVyZWQKKyAgICAgICAgdm9pZCBkZXZpY2VBZGRlZChpbnQgaWQpOworCisgICAgICAgIC8vIGNhbGxlZCB3aGVuIGFuIE1UUCBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICB2b2lkIGRldmljZVJlbW92ZWQoaW50IGlkKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQorICAgIHByaXZhdGUgdm9pZCBkZXZpY2VBZGRlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlQWRkZWQgIiArIGlkKTsKKyAgICAgICAgbUxpc3RlbmVyLmRldmljZUFkZGVkKGlkKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQorICAgIHByaXZhdGUgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCkgeworICAgICAgICBMb2cuZChUQUcsICJkZXZpY2VSZW1vdmVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VSZW1vdmVkKGlkKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0X3BhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRfc3RvcmFnZV9pZChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlX29wZW5fZmlsZShpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjZmQwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RXaW5kb3dlZEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICAqIEN1cnNvciBjbGFzcyBmb3IgTVRQIGNvbnRlbnQgcHJvdmlkZXIKKyAgKiBAaGlkZQorICAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cEN1cnNvciBleHRlbmRzIEFic3RyYWN0V2luZG93ZWRDdXJzb3IgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cEN1cnNvciI7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19DT1VOVCA9IC0xOworCisgICAgLyogY29uc3RhbnRzIGZvciBtUXVlcnlUeXBlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFICAgICAgICAgICAgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX0lEICAgICAgICAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRSAgICAgICAgICAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9JRCAgICAgICAgICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUICAgICAgICAgICAgICA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEICAgICAgICAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9DSElMRFJFTiAgICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0NISUxEUkVOICAgICA9IDg7CisKKyAgICBwcml2YXRlIGludCBtUXVlcnlUeXBlOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1RYmplY3RJRDsKKworICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHByb2plY3Rpb24gKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworCisgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCisgICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisKKyAgICBwcml2YXRlIGZpbmFsIE10cENsaWVudCBtQ2xpZW50OworCisgICAgcHVibGljIE10cEN1cnNvcihNdHBDbGllbnQgY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKworICAgICAgICBtQ2xpZW50ID0gY2xpZW50OworICAgICAgICBtUXVlcnlUeXBlID0gcXVlcnlUeXBlOworICAgICAgICBtRGV2aWNlSUQgPSBkZXZpY2VJRDsKKyAgICAgICAgbVN0b3JhZ2VJRCA9IHN0b3JhZ2VJRDsKKyAgICAgICAgbVFiamVjdElEID0gb2JqZWN0SUQ7CisgICAgICAgIG1Db2x1bW5zID0gcHJvamVjdGlvbjsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5VHlwZSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICBjYXNlIERFVklDRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzRGV2aWNlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICAgICAgbWFwID0gc09iamVjdFByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gcXVlcnkgdHlwZSAiICArIHF1ZXJ5VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBjb2x1bW5zID0gbmV3IGludFtwcm9qZWN0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSW50ZWdlciBpZCA9IG1hcC5nZXQocHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY29sdW1uICIgICsgcHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2x1bW5zW2ldID0gaWQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfc2V0dXAoY2xpZW50LCBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCkgeworICAgICAgICAgICAgZmlsbFdpbmRvdygwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CisgICAgICAgIExvZy5kKFRBRywgInJlcXVlcnkiKTsKKyAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsV2luZG93KGludCBzdGFydFBvcykgeworICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHdpbmRvdyBzZXQgYWxyZWFkeSBpdCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQgbG9jYWxseQorICAgICAgICAgICAgbVdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3codHJ1ZSAvKiB0aGUgd2luZG93IGlzIGxvY2FsIG9ubHkgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOworICAgICAgICBtQ291bnQgPSBuYXRpdmVfZmlsbF93aW5kb3cobVdpbmRvdywgc3RhcnRQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q29sdW1uTmFtZXMgcmV0dXJuaW5nICIgKyBtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiBtQ29sdW1uczsKKyAgICB9CisKKyAgICAvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9ST1dfSUQgICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01PREVMICAgICAgICAgICA9IDM7CisKKyAgICAvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX1JPV19JRCAgICAgICAgID0gMTAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lERU5USUZJRVIgICAgID0gMTAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0RFU0NSSVBUSU9OICAgID0gMTAzOworCisgICAgLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICA9IDIwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgPSAyMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgID0gMjAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICA9IDIwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgPSAyMDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgID0gMjA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICA9IDIwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgPSAyMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgID0gMjA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICA9IDIxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgPSAyMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgID0gMjEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICA9IDIxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgPSAyMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgID0gMjE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICA9IDIxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgPSAyMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgID0gMjE4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICA9IDIxOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgID0gMjIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNPYmplY3RQcm9qZWN0aW9uTWFwOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLl9JRCwgbmV3IEludGVnZXIoREVWSUNFX1JPV19JRCkpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIG5ldyBJbnRlZ2VyKERFVklDRV9NQU5VRkFDVFVSRVIpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTU9ERUwsIG5ldyBJbnRlZ2VyKERFVklDRV9NT0RFTCkpOworCisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5fSUQsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfUk9XX0lEKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuSURFTlRJRklFUiwgbmV3IEludGVnZXIoU1RPUkFHRV9JREVOVElGSUVSKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04sIG5ldyBJbnRlZ2VyKFNUT1JBR0VfREVTQ1JJUFRJT04pKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfUk9XX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNUT1JBR0VfSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TVE9SQUdFX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QUk9URUNUSU9OX1NUQVRVUywgbmV3IEludGVnZXIoT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0ZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0RFUFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBBUkVOVCwgbmV3IEludGVnZXIoT0JKRUNUX1BBUkVOVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9UWVBFLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9ERVNDLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fREVTQykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9DUkVBVEVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9DUkVBVEVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX01PRElGSUVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LktFWVdPUkRTLCBuZXcgSW50ZWdlcihPQkpFQ1RfS0VZV09SRFMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsCisgICAgICAgICAgICBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50W10gY29sdW1ucyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV93YWl0X2Zvcl9ldmVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjY2U0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5BdWRpbzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5NdHBPYmplY3RzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwRGF0YWJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBEYXRhYmFzZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbU1lZGlhUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZvbHVtZU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbU9iamVjdHNVcmk7CisKKyAgICAvLyBGSVhNRSAtIHRoaXMgc2hvdWxkIGJlIHBhc3NlZCBpbiB2aWEgdGhlIGNvbnN0cnVjdG9yCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0b3JhZ2VJRCA9IDB4MDAwMTAwMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJRF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIC8vIDAKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBVEhfU0laRV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgLy8gMgorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0lORk9fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkZPUk1BVCwgLy8gMgorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlBBUkVOVCwgLy8gMworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlNJWkUsIC8vIDQKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRFX01PRElGSUVELCAvLyA1CisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfV0hFUkUgPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lEICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSEVSRSA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1dIRVJFID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlBBUkVOVCArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9GT1JNQVRfV0hFUkUgPSBQQVJFTlRfV0hFUkUgKyAiIEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkZPUk1BVCArICI9PyI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Nhbm5lciBtTWVkaWFTY2FubmVyOworCisgICAgLy8gTVRQIHByb3BlcnR5IGNvZGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEID0gMHhEQzAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCA9IDB4REMwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFID0gMHhEQzA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSA9IDB4REMwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQgPSAweERDMDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUID0gMHhEQzBCOworCisgICAgLy8gTVRQIHJlc3BvbnNlIGNvZGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9SRVNQT05TRV9PSyA9IDB4MjAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1IgPSAweDIwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEUgPSAweDIwMDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHhBODBBOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwRGF0YWJhc2UoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdm9sdW1lTmFtZSkgeworICAgICAgICBuYXRpdmVfc2V0dXAoKTsKKworICAgICAgICBtTWVkaWFQcm92aWRlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuYWNxdWlyZVByb3ZpZGVyKCJtZWRpYSIpOworICAgICAgICBtVm9sdW1lTmFtZSA9IHZvbHVtZU5hbWU7CisgICAgICAgIG1PYmplY3RzVXJpID0gTXRwT2JqZWN0cy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtTWVkaWFTY2FubmVyID0gbmV3IE1lZGlhU2Nhbm5lcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYmVnaW5TZW5kT2JqZWN0KFN0cmluZyBwYXRoLCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlLCBsb25nIHNpemUsIGxvbmcgbW9kaWZpZWQpIHsKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBLCBwYXRoKTsKKyAgICAgICAgdmFsdWVzLnB1dChNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFULCBmb3JtYXQpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5QQVJFTlQsIHBhcmVudCk7CisgICAgICAgIC8vIHN0b3JhZ2UgaXMgaWdub3JlZCBmb3Igbm93CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlNJWkUsIHNpemUpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRFX01PRElGSUVELCBtb2RpZmllZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBtTWVkaWFQcm92aWRlci5pbnNlcnQobU9iamVjdHNVcmksIHZhbHVlcyk7CisgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGJlZ2luU2VuZE9iamVjdCIsIGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZFNlbmRPYmplY3QoU3RyaW5nIHBhdGgsIGludCBoYW5kbGUsIGludCBmb3JtYXQsIGJvb2xlYW4gc3VjY2VlZGVkKSB7CisgICAgICAgIGlmIChzdWNjZWVkZWQpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBhYnN0cmFjdCBwbGF5bGlzdHMgc2VwYXJhdGVseQorICAgICAgICAgICAgLy8gdGhleSBkbyBub3QgZXhpc3QgaW4gdGhlIGZpbGUgc3lzdGVtIHNvIGRvbid0IHVzZSB0aGUgbWVkaWEgc2Nhbm5lciBoZXJlCisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IE10cC5PYmplY3QuRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUKSB7CisgICAgICAgICAgICAgICAgLy8gU3RyaXAgV2luZG93cyBNZWRpYSBQbGF5ZXIgZmlsZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLnBsYSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGF0aDsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gbmFtZS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5EQVRBLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5OQU1FLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhQ29sdW1ucy5NRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChBdWRpby5QbGF5bGlzdHMuRVhURVJOQUxfQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGVuZFNlbmRPYmplY3QiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBtTWVkaWFTY2FubmVyLnNjYW5NdHBGaWxlKHBhdGgsIG1Wb2x1bWVOYW1lLCBoYW5kbGUsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWxldGVGaWxlKGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldE9iamVjdExpc3QoaW50IHN0b3JhZ2VJRCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCkgeworICAgICAgICAvLyB3ZSBjYW4gaWdub3JlIHN0b3JhZ2VJRCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHN0b3JhZ2VzCisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdExpc3QgcGFyZW50OiAiICsgcGFyZW50KTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9GT1JNQVRfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpLCBJbnRlZ2VyLnRvU3RyaW5nKGZvcm1hdCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSB9LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJudWxsIGN1cnNvciIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNvdW50ID0gYy5nZXRDb3VudCgpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJldHVybmluZyAiICsgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdExpc3QiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TnVtT2JqZWN0cyhpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjLmdldENvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0TnVtT2JqZWN0cyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfQVNTT0NJQVRJT04sCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9NUDMsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9NUEVHLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfRVhJRl9KUEVHLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfVElGRl9FUCwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX0dJRiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX0pGSUYsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9QTkcsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9USUZGLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfV01BLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfT0dHLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfQUFDLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfTVA0X0NPTlRBSU5FUiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX01QMiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX1dQTF9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX00zVV9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX1BMU19QTEFZTElTVCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgICAgICAvLyBubyBjYXB0dXJlIGZvcm1hdHMgeWV0CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgTXRwLk9iamVjdC5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwLk9iamVjdC5QUk9QRVJUWV9PQkpFQ1RfRk9STUFULAorICAgICAgICAgICAgTXRwLk9iamVjdC5QUk9QRVJUWV9PQkpFQ1RfU0laRSwKKyAgICAgICAgICAgIE10cC5PYmplY3QuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cC5PYmplY3QuUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSB7CisgICAgICAgIC8vIG5vIGRldmljZSBwcm9wZXJ0aWVzIHlldAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIG91dEludFZhbHVlLCBjaGFyW10gb3V0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIFN0cmluZyBjb2x1bW4gPSBudWxsOworICAgICAgICBib29sZWFuIGlzU3RyaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkZPUk1BVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5TSVpFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRToKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuREFUQTsKKyAgICAgICAgICAgICAgICBpc1N0cmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRFX01PRElGSUVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuUEFSRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBmb3Igbm93IHdlIGFyZSBvbmx5IHJlYWRpbmcgcHJvcGVydGllcyBmcm9tIHRoZSAib2JqZWN0cyIgdGFibGUKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgY29sdW1uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBmdWxsIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSB2YWx1ZS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsYXN0U2xhc2ggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDaGFycyhzdGFydCwgZW5kLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlW2VuZCAtIHN0YXJ0XSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW50VmFsdWVbMF0gPSBjLmdldExvbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHF1ZXJ5IGZhaWxlZCBpZiB3ZSBnZXQgaGVyZQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0T2JqZWN0SW5mbyhpbnQgaGFuZGxlLCBpbnRbXSBvdXRTdG9yYWdlRm9ybWF0UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIG91dE5hbWUsIGxvbmdbXSBvdXRTaXplTW9kaWZpZWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0SW5mbzogIiArIGhhbmRsZSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgT0JKRUNUX0lORk9fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzFdID0gYy5nZXRJbnQoMik7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsyXSA9IGMuZ2V0SW50KDMpOworCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAobGFzdFNsYXNoID49IDAgPyBsYXN0U2xhc2ggKyAxIDogMCk7CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRoLmdldENoYXJzKHN0YXJ0LCBlbmQsIG91dE5hbWUsIDApOworICAgICAgICAgICAgICAgIG91dE5hbWVbZW5kIC0gc3RhcnRdID0gMDsKKworICAgICAgICAgICAgICAgIG91dFNpemVNb2RpZmllZFswXSA9IGMuZ2V0TG9uZyg0KTsKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMV0gPSBjLmdldExvbmcoNSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0UHJvcGVydHkiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdEZpbGVQYXRoKGludCBoYW5kbGUsIGNoYXJbXSBvdXRGaWxlUGF0aCwgbG9uZ1tdIG91dEZpbGVMZW5ndGgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0RmlsZVBhdGg6ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIFBBVEhfU0laRV9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycygwLCBwYXRoLmxlbmd0aCgpLCBvdXRGaWxlUGF0aCwgMCk7CisgICAgICAgICAgICAgICAgb3V0RmlsZVBhdGhbcGF0aC5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgIG91dEZpbGVMZW5ndGhbMF0gPSBjLmdldExvbmcoMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0RmlsZVBhdGgiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVGaWxlKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRlRmlsZTogIiArIGhhbmRsZSk7CisgICAgICAgIFVyaSB1cmkgPSBNdHBPYmplY3RzLmdldENvbnRlbnRVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobU1lZGlhUHJvdmlkZXIuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGRlbGV0ZUZpbGUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0UmVmZXJlbmNlcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdFJlZmVyZW5jZXMgZm9yOiAiICsgaGFuZGxlKTsKKyAgICAgICAgVXJpIHVyaSA9IE10cE9iamVjdHMuZ2V0UmVmZXJlbmNlc1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KHVyaSwgSURfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFJlZmVyZW5jZXMoaW50IGhhbmRsZSwgaW50W10gcmVmZXJlbmNlcykgeworICAgICAgICBVcmkgdXJpID0gTXRwT2JqZWN0cy5nZXRSZWZlcmVuY2VzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLmxlbmd0aDsKKyAgICAgICAgQ29udGVudFZhbHVlc1tdIHZhbHVlc0xpc3QgPSBuZXcgQ29udGVudFZhbHVlc1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgdmFsdWVzLnB1dChNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lELCByZWZlcmVuY2VzW2ldKTsKKyAgICAgICAgICAgIHZhbHVlc0xpc3RbaV0gPSB2YWx1ZXM7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSBtTWVkaWFQcm92aWRlci5idWxrSW5zZXJ0KHVyaSwgdmFsdWVzTGlzdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIHNldE9iamVjdFJlZmVyZW5jZXMiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk0NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEphdmEgd3JhcHBlciBmb3IgTVRQL1BUUCBzdXBwb3J0IGFzIFVTQiByZXNwb25kZXIuCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBTZXJ2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBTZXJ2ZXIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwU2VydmVyKE10cERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgc3RvcmFnZVBhdGgpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKGRhdGFiYXNlLCBzdG9yYWdlUGF0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRPYmplY3RBZGRlZChpbnQgaGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChoYW5kbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRPYmplY3RSZW1vdmVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGludCBoYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9qbmkvQW5kcm9pZC5tawppbmRleCA2ZWVjMjE1YS4uNjUzNTMyYyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKQEAgLTEyLDcgKzEyLDExIEBACiAgICAgYW5kcm9pZF9tZWRpYV9NZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBcCiAgICAgYW5kcm9pZF9tZWRpYV9SZXNhbXBsZUlucHV0U3RyZWFtLmNwcCBcCiAgICAgYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcCBcCi0gICAgYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbS5jcHAKKyAgICBhbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXApAQCAtMjUsNyArMjksOCBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgbGliY2FtZXJhX2NsaWVudAorICAgIGxpYmNhbWVyYV9jbGllbnQgXAorCWxpYnNxbGl0ZQogCiBpZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQogCkBAIC0zNSw3ICs0MCw5IEBACiAgICAgTE9DQUxfQ0ZMQUdTICs9IC1ETk9fT1BFTkNPUkUKIGVuZGlmCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0CitlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBleHRlcm5hbC90cmVtb3IvVHJlbW9yIFwKQEAgLTQ0LDYgKzUxLDcgQEAKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMgXAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKICAgICAkKFBWX0lOQ0xVREVTKSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcAppbmRleCA0NzRhMTc0Li42NzEwZGIwIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCkBAIC03ODgsNiArNzg4LDEwIEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9SZXNhbXBsZUlucHV0U3RyZWFtKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihKTklFbnYgKmVudik7CiAKICNpZm5kZWYgTk9fT1BFTkNPUkUKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CkBAIC04NDEsNiArODQ1LDI2IEBACiAgICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoZW52KSA8IDApIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IE10cENsaWVudCBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDdXJzb3IgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBEYXRhYmFzZSBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBTZXJ2ZXIgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKwogICAgIC8qIHN1Y2Nlc3MgLS0gcmV0dXJuIHZhbGlkIHZlcnNpb24gbnVtYmVyICovCiAgICAgcmVzdWx0ID0gSk5JX1ZFUlNJT05fMV80OwogCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc0MGJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50Sk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RldmljZVJlbW92ZWQ7CitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworc3RhdGljIHN0cnVjdCBmaWxlX2Rlc2NyaXB0b3Jfb2Zmc2V0c190Cit7CisgICAgamNsYXNzIG1DbGFzczsKKyAgICBqbWV0aG9kSUQgbUNvbnN0cnVjdG9yOworICAgIGpmaWVsZElEIG1EZXNjcmlwdG9yOworfSBnRmlsZURlc2NyaXB0b3JPZmZzZXRzOworCitzdGF0aWMgc3RydWN0IHBhcmNlbF9maWxlX2Rlc2NyaXB0b3Jfb2Zmc2V0c190Cit7CisgICAgamNsYXNzIG1DbGFzczsKKyAgICBqbWV0aG9kSUQgbUNvbnN0cnVjdG9yOworfSBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzOworCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworY2xhc3MgTXlDbGllbnQgOiBwdWJsaWMgTXRwQ2xpZW50IHsKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkICAgIGRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSk7CisKKyAgICBqb2JqZWN0ICAgICAgICAgbUNsaWVudDsKKyAgICBNdHBEZXZpY2UqICAgICAgbUV2ZW50RGV2aWNlOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIE15Q2xpZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCk7CisgICAgdm9pZCAgICAgICAgICAgIGNsZWFudXAoSk5JRW52ICplbnYpOworfTsKKworTXRwQ2xpZW50KiBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGphdmFDbGllbnQpCit7CisgICAgcmV0dXJuIChNdHBDbGllbnQqKWVudi0+R2V0SW50RmllbGQoamF2YUNsaWVudCwgZmllbGRfY29udGV4dCk7Cit9CisKKworTXlDbGllbnQ6Ok15Q2xpZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCkKKyAgICA6ICAgbUNsaWVudChlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKQoreworfQorCit2b2lkIE15Q2xpZW50OjpjbGVhbnVwKEpOSUVudiAqZW52KSB7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNsaWVudCk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgY29uc3QgY2hhciogbmFtZSA9IGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpOworICAgIExPR0QoIk15Q2xpZW50OjpkZXZpY2VBZGRlZCAlc1xuIiwgbmFtZSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DbGllbnQsIG1ldGhvZF9kZXZpY2VBZGRlZCwgZGV2aWNlLT5nZXRJRCgpKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIE15Q2xpZW50OjpkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgY29uc3QgY2hhciogbmFtZSA9IGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpOworICAgIExPR0QoIk15Q2xpZW50OjpkZXZpY2VSZW1vdmVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZVJlbW92ZWQsIGRldmljZS0+Z2V0SUQoKSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeUNsaWVudCogY2xpZW50ID0gbmV3IE15Q2xpZW50KGVudiwgdGhpeik7CisgICAgY2xpZW50LT5zdGFydCgpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCljbGllbnQpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBjbGllbnQtPmNsZWFudXAoZW52KTsKKyAgICBkZWxldGUgY2xpZW50OworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgMCk7CisjZW5kaWYKK30KKworc3RhdGljIGpib29sZWFuCithbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0YXJ0XG4iKTsKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICByZXR1cm4gY2xpZW50LT5zdGFydCgpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0b3AoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdG9wXG4iKTsKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBjbGllbnQtPnN0b3AoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgamJvb2xlYW4KK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3QoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5kZWxldGVPYmplY3Qob2JqZWN0X2lkKTsKKyAgICBlbHNlCisgI2VuZGlmCisgICAgICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmdldFBhcmVudChvYmplY3RfaWQpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisgI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5nZXRTdG9yYWdlSUQob2JqZWN0X2lkKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgam9iamVjdAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfb3Blbl9maWxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGRldmljZS0+Z2V0T2JqZWN0SW5mbyhvYmplY3RfaWQpOworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW50IG9iamVjdF9zaXplID0gaW5mby0+bUNvbXByZXNzZWRTaXplOworICAgIGRlbGV0ZSBpbmZvOworICAgIGludCBmZCA9IGRldmljZS0+cmVhZE9iamVjdChvYmplY3RfaWQsIG9iamVjdF9zaXplKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IgPSBlbnYtPk5ld09iamVjdChnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcywKKyAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciAhPSBOVUxMKSB7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQoZmlsZURlc2NyaXB0b3IsIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubURlc2NyaXB0b3IsIGZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciwgZmlsZURlc2NyaXB0b3IpOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAiKClaIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RhcnR9LAorICAgIHsibmF0aXZlX3N0b3AiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RvcH0sCisgICAgeyJuYXRpdmVfZGVsZXRlX29iamVjdCIsICAgIihJSSlaIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9kZWxldGVfb2JqZWN0fSwKKyAgICB7Im5hdGl2ZV9nZXRfcGFyZW50IiwgICAgICAiKElJKUkiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9wYXJlbnR9LAorICAgIHsibmF0aXZlX2dldF9zdG9yYWdlX2lkIiwgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3N0b3JhZ2VfaWR9LAorICAgIHsibmF0aXZlX29wZW5fZmlsZSIsICAgICAgICIoSUkpTGFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3I7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X29wZW5fZmlsZX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZUFkZGVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX2RldmljZUFkZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VBZGRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZXZpY2VSZW1vdmVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZVJlbW92ZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlUmVtb3ZlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGV2aWNlUmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cENsaWVudC5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisgICAgTE9HX0ZBVEFMX0lGKGNsYXp6ID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBjbGFzcyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihjbGF6eik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiPGluaXQ+IiwgIigpViIpOworICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubURlc2NyaXB0b3IgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJkZXNjcmlwdG9yIiwgIkkiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciA9PSBOVUxMLAorICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgZGVzY3JpcHRvciBmaWVsZCBpbiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIik7CisKKyAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIik7CisgICAgTE9HX0ZBVEFMX0lGKGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBmb3IgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cENsaWVudCIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyOGI1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cEN1cnNvckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBDdXJzb3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKKy8vIEZyb20gYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCitNdHBDbGllbnQgKiBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KEpOSUVudiAqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YUNsaWVudCwKKyAgICAgICAgamludCBxdWVyeVR5cGUsIGppbnQgZGV2aWNlSUQsIGppbnQgc3RvcmFnZUlELCBqaW50IG9iamVjdElELCBqaW50QXJyYXkgamF2YUNvbHVtbnMpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAgcXVlcnlUeXBlOiAlZCBkZXZpY2VJRDogJWQgc3RvcmFnZUlEOiAlZCBvYmplY3RJRDogJWRcbiIsCisgICAgICAgICAgICAgICAgcXVlcnlUeXBlLCBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCk7CisKKyAgICBpbnQqIGNvbHVtbnMgPSBOVUxMOworICAgIGludCBjb2x1bW5Db3VudCA9IDA7CisgICAgaWYgKGphdmFDb2x1bW5zKSB7CisgICAgICAgIGNvbHVtbnMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoamF2YUNvbHVtbnMsIDApOworICAgICAgICBjb2x1bW5Db3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamF2YUNvbHVtbnMpOworICAgIH0KKworICAgIE10cENsaWVudCogY2xpZW50ID0gZ2V0X2NsaWVudF9mcm9tX29iamVjdChlbnYsIGphdmFDbGllbnQpOworICAgIE10cEN1cnNvciogY3Vyc29yID0gbmV3IE10cEN1cnNvcihjbGllbnQsIHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5Db3VudCwgY29sdW1ucyk7CisKKyAgICBpZiAoY29sdW1ucykKKyAgICAgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgY29sdW1ucywgMCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWN1cnNvcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE10cEN1cnNvciAqY3Vyc29yID0gKE10cEN1cnNvciAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGVsZXRlIGN1cnNvcjsKKyNlbmRpZgorfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmlsbF93aW5kb3coSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhV2luZG93LCBqaW50IHN0YXJ0UG9zKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIEN1cnNvcldpbmRvdyogd2luZG93ID0gZ2V0X3dpbmRvd19mcm9tX29iamVjdChlbnYsIGphdmFXaW5kb3cpOworICAgIGlmICghd2luZG93KSB7CisgICAgICAgIExPR0UoIkludmFsaWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEN1cnNvcldpbmRvdyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXRwQ3Vyc29yICpjdXJzb3IgPSAoTXRwQ3Vyc29yICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKworICAgIHJldHVybiBjdXJzb3ItPmZpbGxXaW5kb3cod2luZG93LCBzdGFydFBvcyk7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cENsaWVudDtJSUlJW0kpViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cEN1cnNvcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cEN1cnNvcl9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfZmlsbF93aW5kb3ciLCAgICAgICIoTGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93O0kpSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvd30sCisKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cEN1cnNvciI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvclxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBDdXJzb3IubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJlYTMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEYXRhYmFzZUpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisjaW5jbHVkZSAibXRwLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2JlZ2luU2VuZE9iamVjdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2VuZFNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RMaXN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0TnVtT2JqZWN0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEluZm87CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RlbGV0ZUZpbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlczsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpIHsKKyAgICByZXR1cm4gKE10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZChkYXRhYmFzZSwgZmllbGRfY29udGV4dCk7Cit9CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTXlNdHBEYXRhYmFzZSA6IHB1YmxpYyBNdHBEYXRhYmFzZSB7Citwcml2YXRlOgorICAgIGpvYmplY3QgICAgICAgICBtRGF0YWJhc2U7CisgICAgamludEFycmF5ICAgICAgIG1JbnRCdWZmZXI7CisgICAgamxvbmdBcnJheSAgICAgIG1Mb25nQnVmZmVyOworICAgIGpjaGFyQXJyYXkgICAgICBtU3RyaW5nQnVmZmVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgICAgICB+TXlNdHBEYXRhYmFzZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCk7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdFByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpOworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpOworfTsKKworTXlNdHBEYXRhYmFzZTo6TXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1EYXRhYmFzZShlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKSwKKyAgICAgICAgbUludEJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUxvbmdCdWZmZXIoTlVMTCksCisgICAgICAgIG1TdHJpbmdCdWZmZXIoTlVMTCkKK3sKKyAgICBqaW50QXJyYXkgaW50QXJyYXk7CisgICAgamxvbmdBcnJheSBsb25nQXJyYXk7CisgICAgamNoYXJBcnJheSBjaGFyQXJyYXk7CisKKyAgICAvLyBjcmVhdGUgYnVmZmVycyBmb3Igb3V0IGFyZ3VtZW50cworICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUgc28gdGhpcyBpcyBPSworICAgIGludEFycmF5ID0gZW52LT5OZXdJbnRBcnJheSgzKTsKKyAgICBpZiAoIWludEFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUludEJ1ZmZlciA9IChqaW50QXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoaW50QXJyYXkpOworICAgIGxvbmdBcnJheSA9IGVudi0+TmV3TG9uZ0FycmF5KDIpOworICAgIGlmICghbG9uZ0FycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUxvbmdCdWZmZXIgPSAoamxvbmdBcnJheSllbnYtPk5ld0dsb2JhbFJlZihsb25nQXJyYXkpOworICAgIGNoYXJBcnJheSA9IGVudi0+TmV3Q2hhckFycmF5KDI1Nik7CisgICAgaWYgKCFjaGFyQXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtU3RyaW5nQnVmZmVyID0gKGpjaGFyQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoY2hhckFycmF5KTsKKyAgICByZXR1cm47CisKK291dF9vZl9tZW1vcnk6CisgICAgZW52LT5UaHJvd05ldyhlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKSwgTlVMTCk7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1EYXRhYmFzZSk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUludEJ1ZmZlcik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUxvbmdCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TdHJpbmdCdWZmZXIpOworfQorCitNeU10cERhdGFiYXNlOjp+TXlNdHBEYXRhYmFzZSgpIHsKK30KKworTXRwT2JqZWN0SGFuZGxlIE15TXRwRGF0YWJhc2U6OmJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9iZWdpblNlbmRPYmplY3QsIGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpLAorICAgICAgICAgICAgICAgIChqaW50KWZvcm1hdCwgKGppbnQpcGFyZW50LCAoamludClzdG9yYWdlLCAoamxvbmcpc2l6ZSwgKGpsb25nKW1vZGlmaWVkKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjplbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGJvb2wgc3VjY2VlZGVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9lbmRTZW5kT2JqZWN0LCBlbnYtPk5ld1N0cmluZ1VURihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RMaXN0LAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOworICAgIGppbnQqIGhhbmRsZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goaGFuZGxlc1tpXSk7CisgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgIHJldHVybiBsaXN0OworfQorCitpbnQgTXlNdHBEYXRhYmFzZTo6Z2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXROdW1PYmplY3RzLAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworfQorCitNdHBPYmplY3RGb3JtYXRMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RGb3JtYXRMaXN0KCk7CisgICAgamludCogZm9ybWF0cyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChmb3JtYXRzW2ldKTsKKyAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdEZvcm1hdExpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RGb3JtYXRMaXN0KCk7CisgICAgamludCogZm9ybWF0cyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChmb3JtYXRzW2ldKTsKKyAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdFByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMsIChqaW50KWZvcm1hdCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdFByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKyAgIHJldHVybiBsaXN0OworfQorCitNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogbGlzdCA9IG5ldyBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QoKTsKKyAgICBqaW50KiBwcm9wZXJ0aWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKHByb3BlcnRpZXNbaV0pOworICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisgICByZXR1cm4gbGlzdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBpbnQgICAgICAgICB0eXBlOworCisgICAgaWYgKCFnZXRQcm9wZXJ0eUluZm8ocHJvcGVydHksIHR5cGUpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfQ09ERTsKKworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpcHJvcGVydHksIG1Mb25nQnVmZmVyLCBtU3RyaW5nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOworICAgICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGNoYXIgICAgZGF0ZVsyMF07CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdEluZm8sCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtSW50QnVmZmVyLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgamludCogaW50VmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIDApOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBpbnRWYWx1ZXNbMF07CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IGludFZhbHVlc1sxXTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW50VmFsdWVzWzJdOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobUludEJ1ZmZlciwgaW50VmFsdWVzLCAwKTsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgdWludDY0X3Qgc2l6ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgdWludDY0X3QgbW9kaWZpZWQgPSBsb25nVmFsdWVzWzFdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworCisgICAgcGFja2V0LnB1dFVJbnQzMihzdG9yYWdlSUQpOworICAgIHBhY2tldC5wdXRVSW50MTYoZm9ybWF0KTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgcGFja2V0LnB1dFVJbnQzMigoc2l6ZSA+IDB4RkZGRkZGRkZMTCA/IDB4RkZGRkZGRkYgOiBzaXplKSk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyB0aHVtYiBmb3JtYXQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIHBhY2tldC5wdXRVSW50MzIocGFyZW50KTsKKyAgICBwYWNrZXQucHV0VUludDE2KGFzc29jaWF0aW9uVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBzZXF1ZW5jZSBudW1iZXIKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsgICAvLyBmaWxlIG5hbWUKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICBmaWxlUGF0aC5zZXRUbyhzdHIsIHN0cmxlbjE2KHN0cikpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGZpbGVMZW5ndGggPSBsb25nVmFsdWVzWzBdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6ZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9kZWxldGVGaWxlLCAoamludCloYW5kbGUpOworfQorCitzdHJ1Y3QgUHJvcGVydHlUYWJsZUVudHJ5IHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSAgIHByb3BlcnR5OworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgICAgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgICAgIE1UUF9UWVBFX1VJTlQxNiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUsICAgICAgIE1UUF9UWVBFX1VJTlQ2NCB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCwgICAgIE1UUF9UWVBFX1NUUiAgICB9LAorfTsKKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXRQcm9wZXJ0eUluZm8oTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa1Byb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGhhbmRsZXMsIDApOworICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLT5zaXplKCk7CisgICAgamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShjb3VudCk7CisgICAgaWYgKCFhcnJheSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGluIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBoYW5kbGVzW2ldID0gKCpyZWZlcmVuY2VzKVtpXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBhcnJheSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSBuZXcgTXlNdHBEYXRhYmFzZShlbnYsIHRoaXopOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludClkYXRhYmFzZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSAoTXlNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGF0YWJhc2UtPmNsZWFudXAoZW52KTsKKyAgICBkZWxldGUgZGF0YWJhc2U7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9maW5hbGl6ZX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiYmVnaW5TZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSUlKSilJIik7CisgICAgaWYgKG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGJlZ2luU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9lbmRTZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImVuZFNlbmRPYmplY3QiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJWilWIik7CisgICAgaWYgKG1ldGhvZF9lbmRTZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBlbmRTZW5kT2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdExpc3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0TGlzdCIsICIoSUlJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RMaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE51bU9iamVjdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0TnVtT2JqZWN0cyIsICIoSUlJKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE51bU9iamVjdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE51bU9iamVjdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIiwgIihJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdFByb3BlcnR5IiwgIihJSVtKW0MpSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdFByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdEluZm8gPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0SW5mbyIsICIoSVtJW0NbSilaIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RJbmZvID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RJbmZvIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEZpbGVQYXRoIiwgIihJW0NbSilJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0RmlsZVBhdGgiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGVsZXRlRmlsZSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZWxldGVGaWxlIiwgIihJKUkiKTsKKyAgICBpZiAobWV0aG9kX2RlbGV0ZUZpbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRlbGV0ZUZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RSZWZlcmVuY2VzIiwgIihJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0T2JqZWN0UmVmZXJlbmNlcyIsICIoSVtJKUkiKTsKKyAgICBpZiAobWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBEYXRhYmFzZS5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWYyYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcApAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU2VydmVySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKKworI2luY2x1ZGUgIk10cFNlcnZlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKK3N0YXRpYyBNdXRleCAgICBzTXV0ZXg7CisKKy8vIGluIGFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCitleHRlcm4gTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitjbGFzcyBNdHBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwRGF0YWJhc2UqICAgIG1EYXRhYmFzZTsKKyAgICBNdHBTZXJ2ZXIqICAgICAgbVNlcnZlcjsKKyAgICBTdHJpbmc4ICAgICAgICAgbVN0b3JhZ2VQYXRoOworICAgIGJvb2wgICAgICAgICAgICBtRG9uZTsKKyAgICBqb2JqZWN0ICAgICAgICAgbUphdmFTZXJ2ZXI7CisKK3B1YmxpYzoKKyAgICBNdHBUaHJlYWQoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBjaGFyKiBzdG9yYWdlUGF0aCwgam9iamVjdCBqYXZhU2VydmVyKQorICAgICAgICA6IG1EYXRhYmFzZShkYXRhYmFzZSksCisgICAgICAgICAgICBtU2VydmVyKE5VTEwpLAorICAgICAgICAgICAgbVN0b3JhZ2VQYXRoKHN0b3JhZ2VQYXRoKSwKKyAgICAgICAgICAgIG1Eb25lKGZhbHNlKSwKKyAgICAgICAgICAgIG1KYXZhU2VydmVyKGphdmFTZXJ2ZXIpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaW50IGZkID0gb3BlbigiL2Rldi9tdHBfdXNiIiwgT19SRFdSKTsKKyAgICAgICAgICAgIHByaW50Zigib3BlbiByZXR1cm5lZCAlZFxuIiwgZmQpOworICAgICAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICAgICAgbVNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIoZmQsIG1EYXRhYmFzZSwgQUlEX1NEQ0FSRF9SVywgMDY2NCwgMDc3NSk7CisgICAgICAgICAgICBtU2VydmVyLT5hZGRTdG9yYWdlKG1TdG9yYWdlUGF0aCk7CisgICAgICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgICAgIExPR0QoIk10cFRocmVhZCBtU2VydmVyLT5ydW4iKTsKKyAgICAgICAgICAgIG1TZXJ2ZXItPnJ1bigpOworICAgICAgICAgICAgY2xvc2UoZmQpOworCisgICAgICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICAgICAgZGVsZXRlIG1TZXJ2ZXI7CisgICAgICAgICAgICBtU2VydmVyID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtRG9uZSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgICAgICAgICAvLyB3YWl0IGEgYml0IGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIH0KKworICAgICAgICBzTXV0ZXgubG9jaygpOworZG9uZToKKyAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQobUphdmFTZXJ2ZXIsIGZpZWxkX2NvbnRleHQsIDApOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSmF2YVNlcnZlcik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKworICAgICAgICBMT0dEKCJ0aHJlYWRMb29wIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZXREb25lKCkgeworICAgICAgICBMT0dEKCJzZXREb25lIik7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsgCisgICAgfQorCisgICAgdm9pZCBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RBZGRlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0QWRkZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1TZXJ2ZXIpCisgICAgICAgICAgICBtU2VydmVyLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0UmVtb3ZlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KK307CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YURhdGFiYXNlLCBqc3RyaW5nIHN0b3JhZ2VQYXRoKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKworICAgIE10cERhdGFiYXNlKiBkYXRhYmFzZSA9IGdldE10cERhdGFiYXNlKGVudiwgamF2YURhdGFiYXNlKTsKKyAgICBjb25zdCBjaGFyICpzdG9yYWdlUGF0aFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIE5VTEwpOworCisgICAgTXRwVGhyZWFkKiB0aHJlYWQgPSBuZXcgTXRwVGhyZWFkKGRhdGFiYXNlLCBzdG9yYWdlUGF0aFN0ciwgZW52LT5OZXdHbG9iYWxSZWYodGhpeikpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCl0aHJlYWQpOworCisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIHN0b3JhZ2VQYXRoU3RyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7Cit9CisKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgdGhyZWFkLT5ydW4oIk10cFRocmVhZCIpOworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworICAgIHNNdXRleC5sb2NrKCk7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNldERvbmUoKTsKKyAgICBzTXV0ZXgudW5sb2NrKCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaGFuZGxlKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNlbmRfb2JqZWN0X2FkZGVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9yZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cERhdGFiYXNlO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZCIsICAgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZCIsICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwU2VydmVyLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IDQ4YjQ1ZmYuLmU2ZmY2NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC0yNyw0ICsyNyw0IEBACiAKIExPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggN2UzYjc0My4uOWMyYThiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtNzYzLDcgKzc2Myw4IEBACiAgICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgogICAgICAgICAoZGV2aWNlICYgKEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfAogICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpKSkgeworICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUIHwKKyAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCmluZGV4IDZmNTgxZDMuLmJhOThmMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtODEsMTMgKzgxLDEzIEBACiB9CiAKIHN0YXRpYyBib29sIGZpbGVNYXRjaGVzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKLSAgICBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7CisgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOwogICAgIGlmICghZXh0ZW5zaW9uKSByZXR1cm4gZmFsc2U7CiAgICAgKytleHRlbnNpb247ICAgIC8vIHNraXAgdGhlIGRvdAogICAgIGlmIChleHRlbnNpb25bMF0gPT0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgd2hpbGUgKGV4dGVuc2lvbnNbMF0pIHsKLSAgICAgICAgY2hhciogY29tbWEgPSBzdHJjaHIoZXh0ZW5zaW9ucywgJywnKTsKKyAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoZXh0ZW5zaW9ucywgJywnKTsKICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IChjb21tYSA/IGNvbW1hIC0gZXh0ZW5zaW9ucyA6IHN0cmxlbihleHRlbnNpb25zKSk7CiAgICAgICAgIGlmIChsZW5ndGggPT0gc3RybGVuKGV4dGVuc2lvbikgJiYgc3RybmNhc2VjbXAoZXh0ZW5zaW9uLCBleHRlbnNpb25zLCBsZW5ndGgpID09IDApIHJldHVybiB0cnVlOwogICAgICAgICBleHRlbnNpb25zICs9IGxlbmd0aDsKQEAgLTEzMyw2ICsxMzMsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7CisgICAgICAgIGlmIChuYW1lTGVuZ3RoICsgMSA+IHBhdGhSZW1haW5pbmcpIHsKKyAgICAgICAgICAgIC8vIHBhdGggdG9vIGxvbmchCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOworCiAgICAgICAgIGludCB0eXBlID0gZW50cnktPmRfdHlwZTsKICAgICAgICAgaWYgKHR5cGUgPT0gRFRfVU5LTk9XTikgewogICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgaXMgdW5rbm93biwgc3RhdCgpIHRoZSBmaWxlIGluc3RlYWQuCkBAIC0xNTAsMTYgKzE1Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRFRfUkVHIHx8IHR5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgICAgIGJvb2wgaXNEaXJlY3RvcnkgPSAodHlwZSA9PSBEVF9ESVIpOwotCi0gICAgICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcgfHwgKGlzRGlyZWN0b3J5ICYmIG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBEVF9ESVIpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZGlyZWN0b3JpZXMgd2l0aCBhIG5hbWUgdGhhdCBzdGFydHMgd2l0aCAnLicKICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIE1hYyAiLlRyYXNoZXMiIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggZjZmODljNy4uNTc1NmU1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zNyw4ICszOCw4IEBACiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAiQVJUUFdyaXRlci5oIgogCkBAIC00NzQsNiArNDc1LDQ1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZShpbnQzMl90IHRpbWVMYXBzZUVuYWJsZSkgeworICAgIExPR1YoInNldFBhcmFtVGltZUxhcHNlRW5hYmxlOiAlZCIsIHRpbWVMYXBzZUVuYWJsZSk7CisKKyAgICBpZih0aW1lTGFwc2VFbmFibGUgPT0gMCkgeworICAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAodGltZUxhcHNlRW5hYmxlID09IDEpIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZShpbnQzMl90IHVzZVN0aWxsQ2FtZXJhKSB7CisgICAgTE9HVigic2V0UGFyYW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZTogJWQiLCB1c2VTdGlsbENhbWVyYSk7CisKKyAgICBpZih1c2VTdGlsbENhbWVyYSA9PSAwKSB7CisgICAgICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZT0gZmFsc2U7CisgICAgfSBlbHNlIGlmICh1c2VTdGlsbENhbWVyYSA9PSAxKSB7CisgICAgICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZT0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlOiAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgIC8vIE5vdCBhbGxvd2luZyB0aW1lIG1vcmUgdGhhbiBhIGRheQorICAgIGlmICh0aW1lVXMgPD0gMCB8fCB0aW1lVXMgPiA4NjQwMCoxRTYpIHsKKyAgICAgICAgTE9HRSgiVGltZSBiZXR3ZWVuIHRpbWUgbGFwc2UgZnJhbWUgY2FwdHVyZSAoJWxsZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAxIERheV0iLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gdGltZVVzOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1ldGVyKAogICAgICAgICBjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKSB7CiAgICAgTE9HVigic2V0UGFyYW1ldGVyOiBrZXkgKCVzKSA9PiB2YWx1ZSAoJXMpIiwga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSk7CkBAIC01NTcsNiArNTk3LDIyIEBACiAgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdGltZVNjYWxlKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9UaW1lU2NhbGUodGltZVNjYWxlKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWxhcHNlLWVuYWJsZSIpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lTGFwc2VFbmFibGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdGltZUxhcHNlRW5hYmxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKHRpbWVMYXBzZUVuYWJsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidXNlLXN0aWxsLWNhbWVyYS1mb3ItdGltZS1sYXBzZSIpIHsKKyAgICAgICAgaW50MzJfdCB1c2VTdGlsbENhbWVyYTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ1c2VTdGlsbENhbWVyYSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKHVzZVN0aWxsQ2FtZXJhKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWJldHdlZW4tdGltZS1sYXBzZS1mcmFtZS1jYXB0dXJlIikgeworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKAorICAgICAgICAgICAgICAgICAgICAxMDAwTEwgKiB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0UoInNldFBhcmFtZXRlcjogZmFpbGVkIHRvIGZpbmQga2V5ICVzIiwga2V5LnN0cmluZygpKTsKICAgICB9CkBAIC04NTAsMTAgKzkwNiwxNCBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZSgpIHsKLSAgICBjbGlwVmlkZW9CaXRSYXRlKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVSYXRlKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOwotICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7CisgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAvLyBEb250IGNsaXAgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSBhcyBlbmNvZGVyIHdpbGwgaGF2ZSBlbm91Z2gKKyAgICAgICAgLy8gdGltZSB0byBlbmNvZGUgYmVjYXVzZSBvZiBzbG93IGNhcHR1cmUgcmF0ZSBvZiB0aW1lIGxhcHNlLgorICAgICAgICBjbGlwVmlkZW9CaXRSYXRlKCk7CisgICAgICAgIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CisgICAgICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7CisgICAgfQogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgaWYgKG1DYW1lcmEgPT0gMCkgewpAQCAtODY4LDcgKzkyOCwxNCBAQAogCiAgICAgLy8gU2V0IHRoZSBhY3R1YWwgdmlkZW8gcmVjb3JkaW5nIGZyYW1lIHNpemUKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgIHBhcmFtcy5zZXRQcmV2aWV3U2l6ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKworICAgIC8vIGRvbnQgY2hhbmdlIHRoZSBwcmV2aWV3IHNpemUgd2hlbiB1c2luZyBzdGlsbCBjYW1lcmEgZm9yIHRpbWUgbGFwc2UKKyAgICAvLyBhcyBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0IG1heSBjb3JyZXNwb25kIHRvIEhEIHJlc29sdXRpb24gbm90CisgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSB2aWRlbyBjYW1lcmEuCisgICAgaWYgKCEobUNhcHR1cmVUaW1lTGFwc2UgJiYgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSkgeworICAgICAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgfQorCiAgICAgcGFyYW1zLnNldFByZXZpZXdGcmFtZVJhdGUobUZyYW1lUmF0ZSk7CiAgICAgU3RyaW5nOCBzID0gcGFyYW1zLmZsYXR0ZW4oKTsKICAgICBpZiAoT0sgIT0gbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhzKSkgewpAQCAtODgxLDggKzk0OCw5IEBACiAgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgc2l6ZQogICAgIGludCBmcmFtZVdpZHRoID0gMCwgZnJhbWVIZWlnaHQgPSAwOwogICAgIG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKLSAgICBpZiAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8Ci0gICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKKyAgICBpZiAoIShtQ2FwdHVyZVRpbWVMYXBzZSAmJiBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpICYmCisgICAgICAgIChmcmFtZVdpZHRoICA8IDAgfHwgZnJhbWVXaWR0aCAgIT0gbVZpZGVvV2lkdGggfHwKKyAgICAgICAgZnJhbWVIZWlnaHQgPCAwIHx8IGZyYW1lSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgdmlkZW8gZnJhbWUgc2l6ZSB0byAlZHglZCIsCiAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwpAQCAtOTI2LDcgKzk5NCwxMCBAQAogICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIAotICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOworICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/CisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhLCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsIG1GcmFtZVJhdGUpOgorICAgICAgICBDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEobUNhbWVyYSk7CiAgICAgQ0hFQ0soY2FtZXJhU291cmNlICE9IE5VTEwpOwogCiAgICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwpAQCAtOTc3LDkgKzEwNDgsMTIgQEAKICAgICBPTVhDbGllbnQgY2xpZW50OwogICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKIAorICAgIC8vIFVzZSBzb2Z0d2FyZSBjb2RlYyBmb3IgdGltZSBsYXBzZQorICAgIHVpbnQzMl90IGVuY29kZXJfZmxhZ3MgPSAobUNhcHR1cmVUaW1lTGFwc2UpID8gT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyA6IDA7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAogICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLCBlbmNfbWV0YSwKLSAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlKTsKKyAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlLAorICAgICAgICAgICAgTlVMTCwgZW5jb2Rlcl9mbGFncyk7CiAgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC0xMDE2LDcgKzEwOTAsNyBAQAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOwogCiAgICAgLy8gQWRkIGF1ZGlvIHNvdXJjZSBmaXJzdCBpZiBpdCBleGlzdHMKLSAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpKSB7CiAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwpAQCAtMTEyNiw2ICsxMjAwLDkgQEAKICAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOwogICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKKyAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOworICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IHRydWU7CisgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSAtMTsKICAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKIAogICAgIG1PdXRwdXRGZCA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMjE2ZjZiYy4uYThiZTI3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC05Miw2ICs5MiwxMCBAQAogICAgIGludDY0X3QgbU1heEZpbGVEdXJhdGlvblVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAorICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CisgICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7CisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKwogICAgIFN0cmluZzggbVBhcmFtczsKICAgICBpbnQgbU91dHB1dEZkOwogICAgIGludDMyX3QgbUZsYWdzOwpAQCAtMTEzLDYgKzExNyw5IEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKGludDMyX3QgdXNlU3RpbGxDYW1lcmEpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCBiOGIyZjNmLi40MDQ3NjJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEwLDYgKzEwLDcgQEAKICAgICAgICAgQXVkaW9Tb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU3LDYgKzU4LDcgQEAKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3l1diBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCA5YzQ4ZGFmLi41ZTdkZDVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTY1LDYgKzY1LDExIEBACiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyKSB7CiAgICAgTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolZCkiLAogICAgICAgICAgbXNnVHlwZSwgZGF0YVB0ci0+cG9pbnRlcigpLCBkYXRhUHRyLT5zaXplKCkpOworCisgICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICBpZiAoc291cmNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgc291cmNlLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgZGF0YVB0cik7CisgICAgfQogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YVRpbWVzdGFtcCgKQEAgLTExOCwxNSArMTIzLDE1IEBACiAKIENhbWVyYVNvdXJjZTo6Q2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkKICAgICA6IG1DYW1lcmEoY2FtZXJhKSwKLSAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLAotICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKDApLAogICAgICAgbU51bUZyYW1lc1JlY2VpdmVkKDApLAorICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKDApLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUZpcnN0RnJhbWVUaW1lVXMoMCksCiAgICAgICBtTnVtRnJhbWVzRW5jb2RlZCgwKSwKICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDApLAogICAgICAgbU51bUdsaXRjaGVzKDApLAogICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMoMjAwMDAwKSwKLSAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpIHsKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKQEAgLTE2MSw3ICsxNjYsNiBAQAogICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBzdHJpZGUpOwogICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIHNsaWNlSGVpZ2h0KTsKLQogfQogCiBDYW1lcmFTb3VyY2U6On5DYW1lcmFTb3VyY2UoKSB7CkBAIC0xNzAsNiArMTc0LDEwIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOworfQorCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIApAQCAtMTg3LDEzICsxOTUsMTcgQEAKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKG5ldyBDYW1lcmFTb3VyY2VMaXN0ZW5lcih0aGlzKSk7Ci0gICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOworICAgIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKKyAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7Cit9CisKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RvcCgpIHsKICAgICBMT0dWKCJzdG9wIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTIwMiw3ICsyMTQsNyBAQAogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7Ci0gICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKICAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7CiAgICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKICAgICAgICAgTE9HSSgiV2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICVkIiwKQEAgLTIyMiwxMSArMjM0LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgeworICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7Cit9CisKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUXVldWVkRnJhbWVzKCkgewogICAgIExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQ7CiAgICAgd2hpbGUgKCFtRnJhbWVzUmVjZWl2ZWQuZW1wdHkoKSkgewogICAgICAgICBpdCA9IG1GcmFtZXNSZWNlaXZlZC5iZWdpbigpOwotICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKKyAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZC5lcmFzZShpdCk7CiAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgfQpAQCAtMjM4LDcgKzI1NCw3IEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogfQogCkBAIC0yNDcsNyArMjYzLDYgQEAKICAgICBmb3IgKExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQgPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICgoKml0KS0+cG9pbnRlcigpID09ICBidWZmZXItPmRhdGEoKSkgewotCiAgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoKCppdCkpOwogICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5lcmFzZShpdCk7CiAgICAgICAgICAgICArK21OdW1GcmFtZXNFbmNvZGVkOwpAQCAtMzM4LDYgKzM1MywxMyBAQAogICAgICAgICArK21OdW1HbGl0Y2hlczsKICAgICB9CiAKKyAgICAvLyBNYXkgbmVlZCB0byBza2lwIGZyYW1lIG9yIG1vZGlmeSB0aW1lc3RhbXAuIEN1cnJlbnRseSBpbXBsZW1lbnRlZAorICAgIC8vIGJ5IHRoZSBzdWJjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UuCisgICAgaWYoc2tpcEN1cnJlbnRGcmFtZSh0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CiAgICAgICAgIG1GaXJzdEZyYW1lVGltZVVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQyNTZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlVGltZUxhcHNlIgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlKGJvb2wgdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpIHsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdCgwKTsKKworICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZVRpbWVMYXBzZShjYW1lcmEsIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywgd2lkdGgsIGhlaWdodCwgdmlkZW9GcmFtZVJhdGUpOworfQorCisvLyBzdGF0aWMKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkgeworICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZVRpbWVMYXBzZShjYW1lcmEsIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywgd2lkdGgsIGhlaWdodCwgdmlkZW9GcmFtZVJhdGUpOworfQorCitDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGJvb2wgdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpCisgICAgOiBDYW1lcmFTb3VyY2UoY2FtZXJhKSwKKyAgICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSh1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSksCisgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyh0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXMoMUU2L3ZpZGVvRnJhbWVSYXRlKSwKKyAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMoMCksCisgICAgICBtU2tpcEN1cnJlbnRGcmFtZShmYWxzZSkgeworCisgICAgTE9HVigic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlIik7CisgICAgbVZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICBtVmlkZW9IZWlnaHQgPSBoZWlnaHQ7CisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBDSEVDSyhzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIG1OZWVkQ3JvcHBpbmcgPSBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIH0KK30KKworQ2FtZXJhU291cmNlVGltZUxhcHNlOjp+Q2FtZXJhU291cmNlVGltZUxhcHNlKCkgeworfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkU2l6ZXM7CisgICAgcGFyYW1zLmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhzdXBwb3J0ZWRTaXplcyk7CisKKyAgICBpbnQzMl90IG1pblBpY3R1cmVTaXplID0gSU5UX01BWDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OworCisgICAgICAgIGlmICgocGljdHVyZVdpZHRoID49IHdpZHRoKSAmJiAocGljdHVyZUhlaWdodCA+PSBoZWlnaHQpKSB7CisgICAgICAgICAgICBpbnQzMl90IHBpY3R1cmVTaXplID0gcGljdHVyZVdpZHRoKnBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICBpZiAocGljdHVyZVNpemUgPCBtaW5QaWN0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgIG1pblBpY3R1cmVTaXplID0gcGljdHVyZVNpemU7CisgICAgICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCA9IHBpY3R1cmVXaWR0aDsKKyAgICAgICAgICAgICAgICBtUGljdHVyZUhlaWdodCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HVigiUGljdHVyZSBzaXplID0gKCVkLCAlZCkiLCBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCk7CisgICAgcmV0dXJuIChtaW5QaWN0dXJlU2l6ZSAhPSBJTlRfTUFYKTsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCkgeworICAgIGlmICgobVBpY3R1cmVXaWR0aCA9PSBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID09IG1WaWRlb0hlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLKChtUGljdHVyZVdpZHRoID4gbVZpZGVvV2lkdGgpICYmIChtUGljdHVyZUhlaWdodCA+IG1WaWRlb0hlaWdodCkpOworCisgICAgaW50MzJfdCB3aWR0aERpZmZlcmVuY2UgPSBtUGljdHVyZVdpZHRoIC0gbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHREaWZmZXJlbmNlID0gbVBpY3R1cmVIZWlnaHQgLSBtVmlkZW9IZWlnaHQ7CisKKyAgICBtQ3JvcFJlY3RTdGFydFggPSB3aWR0aERpZmZlcmVuY2UvMjsKKyAgICBtQ3JvcFJlY3RTdGFydFkgPSBoZWlnaHREaWZmZXJlbmNlLzI7CisKKyAgICBMT0dWKCJzZXR0aW5nIGNyb3AgcmVjdGFuZ2xlIG9mZnNldCB0byAoJWQsICVkKSIsIG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK3ZvaWQgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6VGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSkgeworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8Q2FtZXJhU291cmNlVGltZUxhcHNlICo+KG1lKTsKKyAgICBzb3VyY2UtPnRocmVhZFRpbWVMYXBzZUVudHJ5KCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0aHJlYWRUaW1lTGFwc2VFbnRyeSgpIHsKKyAgICB3aGlsZShtU3RhcnRlZCkgeworICAgICAgICBpZiAobUNhbWVyYUlkbGUpIHsKKyAgICAgICAgICAgIExPR1YoInRocmVhZFRpbWVMYXBzZUVudHJ5OiB0YWtpbmcgcGljdHVyZSIpOworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnRha2VQaWN0dXJlKCkpOworICAgICAgICAgICAgbUNhbWVyYUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHVzbGVlcChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogY2FtZXJhIGJ1c3kgd2l0aCBvbGQgdGFrZVBpY3R1cmUuIFNsZWVwaW5nIGEgbGl0dGxlLiIpOworICAgICAgICAgICAgdXNsZWVwKDFFNCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHN0aWxsIGNhbWVyYSIpOworCisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUobVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICBtQ2FtZXJhSWRsZSA9IHRydWU7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgdGhyZWFkIHdoaWNoIHRha2VzIHBpY3R1cmVzIGluIGEgbG9vcAorICAgICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkVGltZUxhcHNlLCAmYXR0ciwgVGhyZWFkVGltZUxhcHNlV3JhcHBlciwgdGhpcyk7CisgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJzdGFydCB0aW1lIGxhcHNlIHJlY29yZGluZyB1c2luZyB2aWRlbyBjYW1lcmEiKTsKKyAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICB2b2lkICpkdW1teTsKKyAgICAgICAgcHRocmVhZF9qb2luKG1UaHJlYWRUaW1lTGFwc2UsICZkdW1teSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIH0KK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKKyAgICBzaXplX3Qgc291cmNlX3NpemUgPSBzb3VyY2VfZGF0YS0+c2l6ZSgpOworICAgIHZvaWQqIHNvdXJjZV9wb2ludGVyID0gc291cmNlX2RhdGEtPnBvaW50ZXIoKTsKKworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNvdXJjZV9zaXplKTsKKyAgICBzcDxNZW1vcnlCYXNlPiBuZXdNZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShuZXdNZW1vcnlIZWFwLCAwLCBzb3VyY2Vfc2l6ZSk7CisgICAgbWVtY3B5KG5ld01lbW9yeS0+cG9pbnRlcigpLCBzb3VyY2VfcG9pbnRlciwgc291cmNlX3NpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIEFsbG9jYXRlcyBJTWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZSB3aXRoIHRoZSBnaXZlbiBzaXplLgorc3A8SU1lbW9yeT4gYWxsb2NhdGVJTWVtb3J5KHNpemVfdCBzaXplKSB7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ld01lbW9yeTsKK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRTdGFydFByZXZpZXcoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFN0YXJ0UHJldmlldygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOworICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlc3RhcnRQcmV2aWV3KCkgeworICAgIC8vIFN0YXJ0IHRoaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLCBzbyB0aGF0IHRoZSBkYXRhQ2FsbGJhY2sgY2FuIHJldHVybgorICAgIExPR1YoInJlc3RhcnRQcmV2aWV3Iik7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisKKyAgICBwdGhyZWFkX3QgdGhyZWFkUHJldmlldzsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkUHJldmlldywgJmF0dHIsIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAorICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CisgICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9IGVsc2UgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIHl1dkZvcm1hdCA9IFlVVkltYWdlOjpZVVY0MjBQbGFuYXI7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGUgbWVtb3J5IGZvciBjcm9wcGVkIGltYWdlIGFuZCBzZXR1cCBhIGNhbnZhcyB1c2luZyBpdC4KKyAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VNZW1vcnkgPSBhbGxvY2F0ZUlNZW1vcnkoCisgICAgICAgICAgICBZVVZJbWFnZTo6YnVmZmVyU2l6ZSh5dXZGb3JtYXQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpKTsKKyAgICBZVVZJbWFnZSB5dXZJbWFnZUNyb3BwZWQoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopY3JvcHBlZEltYWdlTWVtb3J5LT5wb2ludGVyKCkpOworICAgIFlVVkNhbnZhcyB5dXZDYW52YXNDcm9wKHl1dkltYWdlQ3JvcHBlZCk7CisKKyAgICBZVVZJbWFnZSB5dXZJbWFnZVNvdXJjZSh5dXZGb3JtYXQsCisgICAgICAgICAgICBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopc291cmNlX2RhdGEtPnBvaW50ZXIoKSk7CisgICAgeXV2Q2FudmFzQ3JvcC5Db3B5SW1hZ2VSZWN0KAorICAgICAgICAgICAgUmVjdChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSwKKyAgICAgICAgICAgICAgICBtQ3JvcFJlY3RTdGFydFggKyBtVmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICBtQ3JvcFJlY3RTdGFydFkgKyBtVmlkZW9IZWlnaHQpLAorICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgIHl1dkltYWdlU291cmNlKTsKKworICAgIHJldHVybiBjcm9wcGVkSW1hZ2VNZW1vcnk7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIGlmIChtc2dUeXBlID09IENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSkgeworICAgICAgICAvLyB0YWtlUGljdHVyZSB3aWxsIGNvbXBsZXRlIGFmdGVyIHRoaXMgY2FsbGJhY2ssIHNvIHJlc3RhcnQgcHJldmlldy4KKyAgICAgICAgcmVzdGFydFByZXZpZXcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobXNnVHlwZSAhPSBDQU1FUkFfTVNHX1JBV19JTUFHRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HVigiZGF0YUNhbGxiYWNrIGZvciB0aW1lbGFwc2Ugc3RpbGwgZnJhbWUiKTsKKyAgICBDSEVDS19FUSh0cnVlLCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpOworCisgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgPSBtU3RhcnRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgIH0KKworICAgIGlmIChtTmVlZENyb3BwaW5nKSB7CisgICAgICAgIHNwPElNZW1vcnk+IGNyb3BwZWRJbWFnZURhdGEgPSBjcm9wWVVWSW1hZ2UoZGF0YSk7CisgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgY3JvcHBlZEltYWdlRGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gZGF0YUNvcHkgPSBjcmVhdGVJTWVtb3J5Q29weShkYXRhKTsKKyAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBkYXRhQ29weSk7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1Ta2lwQ3VycmVudEZyYW1lKSB7CisgICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBpZiAobUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGxhcHNlIGZyYW1lLiBJbml0aWFsaXplIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMKKyAgICAgICAgICAgIC8vIHRvIGN1cnJlbnQgdGltZSAodGltZXN0YW1wVXMpIGFuZCBzYXZlIGZyYW1lIGRhdGEuCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBpbml0aWFsIGZyYW1lIik7CisKKyAgICAgICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7CisgICAgICAgIH0gZWxzZSBpZiAoKnRpbWVzdGFtcFVzIDwKKyAgICAgICAgICAgICAgICAobUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgeworICAgICAgICAgICAgLy8gU2tpcCBhbGwgZnJhbWVzIGZyb20gbGFzdCBlbmNvZGVkIGZyYW1lIHVudGlsCisgICAgICAgICAgICAvLyBzdWZmaWNpZW50IHRpbWUgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSBoYXMgcGFzc2VkLgorICAgICAgICAgICAgLy8gVGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgaXRzIHJlY29yZGluZyBmcmFtZSBhbmQgcmV0dXJuLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogc2tpcHBpbmcgaW50ZXJtZWRpYXRlIGZyYW1lIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERlc2lyZWQgZnJhbWUgaGFzIGFycml2ZWQgYWZ0ZXIgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdGltZToKKyAgICAgICAgICAgIC8vIC0gUmVzZXQgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyB0byBjdXJyZW50IHRpbWUuCisgICAgICAgICAgICAvLyAtIEFydGlmaWNpYWxseSBtb2RpZnkgdGltZXN0YW1wVXMgdG8gYmUgb25lIGZyYW1lIHRpbWUgKDEvZnJhbWVyYXRlKSBhaGVhZAorICAgICAgICAgICAgLy8gb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBnb3QgdGltZWxhcHNlIGZyYW1lIik7CisKKyAgICAgICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7CisgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKCZ0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBkYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggYWI5Mjg1ZC4uMzMyYmFiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOwogICAgIH0KIAotICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOworICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOwogCiAgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggZWRkODY0OC4uMTc3NzFjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggZTkxNjJjMC4uOTgyNjk5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgIHBhdGgtPnNldFRvKHNsYXNoUG9zKTsKICAgICB9CiAKLSAgICBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOworICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPmNfc3RyKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCBhZDgxM2NkLi44MTg3ZTBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIEFTdHJpbmcgZm9ybWF0OwogICAgIGdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CiAKLSAgICBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOworICAgIGNvbnN0IGNoYXIgKmxhc3RTcGFjZVBvcyA9IHN0cnJjaHIoZm9ybWF0LmNfc3RyKCksICcgJyk7CiAgICAgQ0hFQ0sobGFzdFNwYWNlUG9zICE9IE5VTEwpOwogCiAgICAgY2hhciAqZW5kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggZjIxYzhkYy4uOGJlODkxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC00NDEsNyArNDQxLDcgQEAKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICAgICAgWVVWSW1hZ2UuY3BwICAgICAgICAgICAgXAorICAgICAgICBZVVZDYW52YXMuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAorICAgICAgICBsaWJjdXRpbHMKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfeXV2CisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkNhbnZhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmNjUyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJZVVZDYW52YXMiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitZVVZDYW52YXM6OllVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpCisgICAgOiBtWVVWSW1hZ2UoeXV2SW1hZ2UpIHsKK30KKworWVVWQ2FudmFzOjp+WVVWQ2FudmFzKCkgeworfQorCit2b2lkIFlVVkNhbnZhczo6RmlsbFlVVih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKSB7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbVlVVkltYWdlLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVlVVkltYWdlLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpGaWxsWVVWUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHJlY3QsCisgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBmb3IgKGludDMyX3QgeSA9IHJlY3QudG9wOyB5IDwgcmVjdC5ib3R0b207ICsreSkgeworICAgICAgICBmb3IgKGludDMyX3QgeCA9IHJlY3QubGVmdDsgeCA8IHJlY3QucmlnaHQ7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpDb3B5SW1hZ2VSZWN0KAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKSB7CisKKyAgICAvLyBUcnkgZmFzdCBjb3B5IGZpcnN0CisgICAgaWYgKFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgc3JjSW1hZ2UsIG1ZVVZJbWFnZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgc3JjU3RhcnRYID0gc3JjUmVjdC5sZWZ0OworICAgIGludDMyX3Qgc3JjU3RhcnRZID0gc3JjUmVjdC50b3A7CisgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgc3JjUmVjdC5oZWlnaHQoKTsgKytvZmZzZXRZKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRYID0gMDsgb2Zmc2V0WCA8IHNyY1JlY3Qud2lkdGgoKTsgKytvZmZzZXRYKSB7CisgICAgICAgICAgICBpbnQzMl90IHNyY1ggPSBzcmNTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBzcmNZID0gc3JjU3RhcnRZICsgb2Zmc2V0WTsKKworICAgICAgICAgICAgaW50MzJfdCBkZXN0WCA9IGRlc3RTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBkZXN0WSA9IGRlc3RTdGFydFkgKyBvZmZzZXRZOworCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB2VmFsdWU7CisKKyAgICAgICAgICAgIHNyY0ltYWdlLmdldFBpeGVsVmFsdWUoc3JjWCwgc3JjWSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoZGVzdFgsIGRlc3RZLCB5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTMyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWVVWSW1hZ2UiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworWVVWSW1hZ2U6OllVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgbVlVVkZvcm1hdCA9IHl1dkZvcm1hdDsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgc2l6ZV90IG51bWJlck9mQnl0ZXMgPSBidWZmZXJTaXplKHl1dkZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3RbbnVtYmVyT2ZCeXRlc107CisgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtT3duQnVmZmVyID0gdHJ1ZTsKKworICAgIGluaXRpYWxpemVZVVZQb2ludGVycygpOworfQorCitZVVZJbWFnZTo6WVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgKmJ1ZmZlcikgeworICAgIG1ZVVZGb3JtYXQgPSB5dXZGb3JtYXQ7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtQnVmZmVyID0gYnVmZmVyOworICAgIG1Pd25CdWZmZXIgPSBmYWxzZTsKKworICAgIGluaXRpYWxpemVZVVZQb2ludGVycygpOworfQorCisvL3N0YXRpYworc2l6ZV90IFlVVkltYWdlOjpidWZmZXJTaXplKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgaW50MzJfdCBudW1iZXJPZlBpeGVscyA9IHdpZHRoKmhlaWdodDsKKyAgICBzaXplX3QgbnVtYmVyT2ZCeXRlcyA9IDA7CisgICAgaWYgKHl1dkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIgfHwgeXV2Rm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gWSB0YWtlcyBudW1iZXJPZlBpeGVscyBieXRlcyBhbmQgVS9WIHRha2UgbnVtYmVyT2ZQaXhlbHMvNCBieXRlcyBlYWNoLgorICAgICAgICBudW1iZXJPZkJ5dGVzID0gKHNpemVfdCkobnVtYmVyT2ZQaXhlbHMgKyAobnVtYmVyT2ZQaXhlbHMgPj4gMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIHJldHVybiBudW1iZXJPZkJ5dGVzOworfQorCitib29sIFlVVkltYWdlOjppbml0aWFsaXplWVVWUG9pbnRlcnMoKSB7CisgICAgaW50MzJfdCBudW1iZXJPZlBpeGVscyA9IG1XaWR0aCAqIG1IZWlnaHQ7CisKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgbVlkYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyOworICAgICAgICBtVWRhdGEgPSBtWWRhdGEgKyBudW1iZXJPZlBpeGVsczsKKyAgICAgICAgbVZkYXRhID0gbVVkYXRhICsgKG51bWJlck9mUGl4ZWxzID4+IDIpOworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkIGFzIFZVVlVWVS4KKyAgICAgICAgLy8gU28gViBkYXRhIHN0YXJ0cyBhdCB0aGUgZW5kIG9mIFkgY2hhbm5lbCBhbmQKKyAgICAgICAgLy8gVSBkYXRhIHN0YXJ0cyByaWdodCBhZnRlciBWJ3Mgc3RhcnQuCisgICAgICAgIG1ZZGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlcjsKKyAgICAgICAgbVZkYXRhID0gbVlkYXRhICsgbnVtYmVyT2ZQaXhlbHM7CisgICAgICAgIG1VZGF0YSA9IG1WZGF0YSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworWVVWSW1hZ2U6On5ZVVZJbWFnZSgpIHsKKyAgICBpZiAobU93bkJ1ZmZlcikgZGVsZXRlW10gbUJ1ZmZlcjsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0T2Zmc2V0cyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgaW50MzJfdCAqeU9mZnNldCwgaW50MzJfdCAqdU9mZnNldCwgaW50MzJfdCAqdk9mZnNldCkgY29uc3QgeworICAgICp5T2Zmc2V0ID0geSptV2lkdGggKyB4OworCisgICAgaW50MzJfdCB1dk9mZnNldCA9ICh5ID4+IDEpICogKG1XaWR0aCA+PiAxKSArICh4ID4+IDEpOworICAgIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAqdU9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAqdk9mZnNldCA9IHV2T2Zmc2V0OworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFNpbmNlIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkLCBvZmZzZXRzIG5lZWQKKyAgICAgICAgLy8gdG8gYmUgZG91YmxlZC4KKyAgICAgICAgKnVPZmZzZXQgPSAyKnV2T2Zmc2V0OworICAgICAgICAqdk9mZnNldCA9IDIqdXZPZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFlVVkltYWdlOjpnZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgaW50MzJfdCAqeURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnVEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp2RGF0YU9mZnNldEluY3JlbWVudCkgY29uc3QgeworICAgICp5RGF0YU9mZnNldEluY3JlbWVudCA9IG1XaWR0aDsKKworICAgIGludDMyX3QgdXZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gbVdpZHRoID4+IDE7CisKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgKnVEYXRhT2Zmc2V0SW5jcmVtZW50ID0gdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAqdkRhdGFPZmZzZXRJbmNyZW1lbnQgPSB1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgfSBlbHNlIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gU2luY2UgVSBhbmQgViBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQsIG9mZnNldHMgbmVlZAorICAgICAgICAvLyB0byBiZSBkb3VibGVkLgorICAgICAgICAqdURhdGFPZmZzZXRJbmNyZW1lbnQgPSAyKnV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICAgICAgKnZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gMip1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVlkYXRhICsgb2Zmc2V0OworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0VUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVkYXRhICsgb2Zmc2V0OworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0VkFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZkYXRhICsgb2Zmc2V0OworfQorCitib29sIFlVVkltYWdlOjpnZXRZVVZBZGRyZXNzZXMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgKip5QWRkciwgdWludDhfdCAqKnVBZGRyLCB1aW50OF90ICoqdkFkZHIpIGNvbnN0IHsKKyAgICBpbnQzMl90IHlPZmZzZXQ7CisgICAgaW50MzJfdCB1T2Zmc2V0OworICAgIGludDMyX3Qgdk9mZnNldDsKKyAgICBpZiAoIWdldE9mZnNldHMoeCwgeSwgJnlPZmZzZXQsICZ1T2Zmc2V0LCAmdk9mZnNldCkpIHJldHVybiBmYWxzZTsKKworICAgICp5QWRkciA9IGdldFlBZGRyZXNzKHlPZmZzZXQpOworICAgICp1QWRkciA9IGdldFVBZGRyZXNzKHVPZmZzZXQpOworICAgICp2QWRkciA9IGdldFZBZGRyZXNzKHZPZmZzZXQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgKnlQdHIsIHVpbnQ4X3QgKnVQdHIsIHVpbnQ4X3QgKnZQdHIpIGNvbnN0IHsKKyAgICB1aW50OF90ICp5QWRkcjsKKyAgICB1aW50OF90ICp1QWRkcjsKKyAgICB1aW50OF90ICp2QWRkcjsKKyAgICBpZiAoIWdldFlVVkFkZHJlc3Nlcyh4LCB5LCAmeUFkZHIsICZ1QWRkciwgJnZBZGRyKSkgcmV0dXJuIGZhbHNlOworCisgICAgKnlQdHIgPSAqeUFkZHI7CisgICAgKnVQdHIgPSAqdUFkZHI7CisgICAgKnZQdHIgPSAqdkFkZHI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBZVVZJbWFnZTo6c2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSkgeworICAgIHVpbnQ4X3QgKnlBZGRyOworICAgIHVpbnQ4X3QgKnVBZGRyOworICAgIHVpbnQ4X3QgKnZBZGRyOworICAgIGlmICghZ2V0WVVWQWRkcmVzc2VzKHgsIHksICZ5QWRkciwgJnVBZGRyLCAmdkFkZHIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeUFkZHIgPSB5VmFsdWU7CisgICAgKnVBZGRyID0gdVZhbHVlOworICAgICp2QWRkciA9IHZWYWx1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKTsKKyAgICBDSEVDSyhkZXN0SW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpOworCisgICAgaW50MzJfdCBzcmNTdGFydFggPSBzcmNSZWN0LmxlZnQ7CisgICAgaW50MzJfdCBzcmNTdGFydFkgPSBzcmNSZWN0LnRvcDsKKyAgICBpbnQzMl90IHdpZHRoID0gc3JjUmVjdC53aWR0aCgpOworICAgIGludDMyX3QgaGVpZ2h0ID0gc3JjUmVjdC5oZWlnaHQoKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3NlcworICAgIHVpbnQ4X3QgKnlTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdlNyY0FkZHJCYXNlOworICAgIHNyY0ltYWdlLmdldFlVVkFkZHJlc3NlcyhzcmNTdGFydFgsIHNyY1N0YXJ0WSwKKyAgICAgICAgICAgICZ5U3JjQWRkckJhc2UsICZ1U3JjQWRkckJhc2UsICZ2U3JjQWRkckJhc2UpOworCisgICAgdWludDhfdCAqeURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZEZXN0QWRkckJhc2U7CisgICAgZGVzdEltYWdlLmdldFlVVkFkZHJlc3NlcyhkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgJnlEZXN0QWRkckJhc2UsICZ1RGVzdEFkZHJCYXNlLCAmdkRlc3RBZGRyQmFzZSk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZworICAgIC8vIGZyb20gb25lIGRhdGEgcm93IHRvIG5leHQuCisgICAgaW50MzJfdCB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgc3JjSW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKKworICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOworCisgICAgLy8gQ29weSBZCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSB3aWR0aDsKKyAgICAgICAgdWludDhfdCAqeVNyY0FkZHIgPSB5U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnlEZXN0QWRkciA9IHlEZXN0QWRkckJhc2U7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IGhlaWdodDsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkoeURlc3RBZGRyLCB5U3JjQWRkciwgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB5U3JjQWRkciArPSB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyICs9IHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSBVCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZVQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSAod2lkdGggPj4gMSk7CisgICAgICAgIHVpbnQ4X3QgKnVTcmNBZGRyID0gdVNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp1RGVzdEFkZHIgPSB1RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciByb3cgaGFzIGFuIGVudHJ5IGZvciBVL1YgY2hhbm5lbCB2YWx1ZXMuIEhlbmNlIG9ubHkKKyAgICAgICAgLy8gZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh1RGVzdEFkZHIsIHVTcmNBZGRyLCBudW1iZXJPZlVCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHVTcmNBZGRyICs9IHVTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB1RGVzdEFkZHIgKz0gdURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFYKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZlZCeXRlc1BlclJvdyA9IChzaXplX3QpICh3aWR0aCA+PiAxKTsKKyAgICAgICAgdWludDhfdCAqdlNyY0FkZHIgPSB2U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnZEZXN0QWRkciA9IHZEZXN0QWRkckJhc2U7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIHBpeGVsIHJvdyBoYXMgYSBVL1YgZGF0YSByb3cuIEhlbmNlIG9ubHkgZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh2RGVzdEFkZHIsIHZTcmNBZGRyLCBudW1iZXJPZlZCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHZTcmNBZGRyICs9IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB2RGVzdEFkZHIgKz0gdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisgICAgQ0hFQ0soZGVzdEltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisKKyAgICBpbnQzMl90IHNyY1N0YXJ0WCA9IHNyY1JlY3QubGVmdDsKKyAgICBpbnQzMl90IHNyY1N0YXJ0WSA9IHNyY1JlY3QudG9wOworICAgIGludDMyX3Qgd2lkdGggPSBzcmNSZWN0LndpZHRoKCk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBzcmNSZWN0LmhlaWdodCgpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RhcnQgYWRkcmVzc2VzCisgICAgdWludDhfdCAqeVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2U3JjQWRkckJhc2U7CisgICAgc3JjSW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKHNyY1N0YXJ0WCwgc3JjU3RhcnRZLAorICAgICAgICAgICAgJnlTcmNBZGRyQmFzZSwgJnVTcmNBZGRyQmFzZSwgJnZTcmNBZGRyQmFzZSk7CisKKyAgICB1aW50OF90ICp5RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdkRlc3RBZGRyQmFzZTsKKyAgICBkZXN0SW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAmeURlc3RBZGRyQmFzZSwgJnVEZXN0QWRkckJhc2UsICZ2RGVzdEFkZHJCYXNlKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mZnNldCBpbmNyZW1lbnRzIGluY3VycmVkIGluIGdvaW5nCisgICAgLy8gZnJvbSBvbmUgZGF0YSByb3cgdG8gbmV4dC4KKyAgICBpbnQzMl90IHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdlNyY09mZnNldEluY3JlbWVudDsKKyAgICBzcmNJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5U3JjT2Zmc2V0SW5jcmVtZW50LCAmdVNyY09mZnNldEluY3JlbWVudCwgJnZTcmNPZmZzZXRJbmNyZW1lbnQpOworCisgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CisKKyAgICAvLyBDb3B5IFkKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZllCeXRlc1BlclJvdyA9IChzaXplX3QpIHdpZHRoOworICAgICAgICB1aW50OF90ICp5U3JjQWRkciA9IHlTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqeURlc3RBZGRyID0geURlc3RBZGRyQmFzZTsKKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgaGVpZ2h0OyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh5RGVzdEFkZHIsIHlTcmNBZGRyLCBudW1iZXJPZllCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHlTcmNBZGRyID0geVNyY0FkZHIgKyB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyID0geURlc3RBZGRyICsgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFVWCisgICAgeworICAgICAgICAvLyBVViBhcmUgaW50ZXJsZWF2ZWQuIFNvIG51bWJlciBvZiBVViBieXRlcyBwZXIgcm93IGlzIDIqKHdpZHRoLzIpLgorICAgICAgICBzaXplX3QgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93ID0gKHNpemVfdCkgd2lkdGg7CisgICAgICAgIHVpbnQ4X3QgKnZTcmNBZGRyID0gdlNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp2RGVzdEFkZHIgPSB2RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciBwaXhlbCByb3cgaGFzIGEgVS9WIGRhdGEgcm93LiBIZW5jZSBvbmx5IGdvIGhhbGYgdGhlIGhlaWdodC4KKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgKGhlaWdodCA+PiAxKTsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkodkRlc3RBZGRyLCB2U3JjQWRkciwgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgdlNyY0FkZHIgKz0gdlNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHZEZXN0QWRkciArPSB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCitib29sIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IGRlc3RJbWFnZS5tWVVWRm9ybWF0KSB7CisgICAgICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLCBkZXN0SW1hZ2UpOworICAgICAgICB9IGVsc2UgaWYgKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwgZGVzdEltYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit1aW50OF90IGNsYW1wKHVpbnQ4X3QgdiwgdWludDhfdCBtaW5WYWx1ZSwgdWludDhfdCBtYXhWYWx1ZSkgeworICAgIENIRUNLKG1heFZhbHVlID49IG1pblZhbHVlKTsKKworICAgIGlmICh2IDwgbWluVmFsdWUpIHJldHVybiBtaW5WYWx1ZTsKKyAgICBlbHNlIGlmICh2ID4gbWF4VmFsdWUpIHJldHVybiBtYXhWYWx1ZTsKKyAgICBlbHNlIHJldHVybiB2OworfQorCit2b2lkIFlVVkltYWdlOjp5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0IHsKKyAgICAqciA9IHlWYWx1ZSArICgxLjM3MDcwNSAqICh2VmFsdWUtMTI4KSk7CisgICAgKmcgPSB5VmFsdWUgLSAoMC42OTgwMDEgKiAodlZhbHVlLTEyOCkpIC0gKDAuMzM3NjMzICogKHVWYWx1ZS0xMjgpKTsKKyAgICAqYiA9IHlWYWx1ZSArICgxLjczMjQ0NiAqICh1VmFsdWUtMTI4KSk7CisKKyAgICAqciA9IGNsYW1wKCpyLCAwLCAyNTUpOworICAgICpnID0gY2xhbXAoKmcsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcCgqYiwgMCwgMjU1KTsKK30KKworYm9vbCBZVVZJbWFnZTo6d3JpdGVUb1BQTShjb25zdCBjaGFyICpmaWxlbmFtZSkgY29uc3QgeworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiUDNcbiIpOworICAgIGZwcmludGYoZnAsICIlZCAlZFxuIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOworCisgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ1ZhbHVlOworICAgICAgICAgICAgdWludDhfdCBiVmFsdWU7CisgICAgICAgICAgICB5dXYycmdiKHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUsICZyVmFsdWUsICZnVmFsdWUsICZiVmFsdWUpOworCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJWQgJWQgJWRcbiIsIChpbnQzMl90KXJWYWx1ZSwgKGludDMyX3QpZ1ZhbHVlLCAoaW50MzJfdCliVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDJmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU2VydmVyLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbGlibXRwCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UgLURNVFBfSE9TVAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cENsaWVudC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ3Vyc29yLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERlYnVnLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9NT0RVTEU6PSBsaWJtdHAKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcCBiL21lZGlhL210cC9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBpc010cERldmljZSh1aW50MTZfdCB2ZW5kb3IsIHVpbnQxNl90IHByb2R1Y3QpIHsKKyAgICAvLyBTYW5kaXNrIFNhbnNhIEZ1emUKKyAgICBpZiAodmVuZG9yID09IDB4MDc4MSAmJiBwcm9kdWN0ID09IDB4NzRjMikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gU2Ftc3VuZyBZUC1aNQorICAgIGlmICh2ZW5kb3IgPT0gMHgwNGU4ICYmIHByb2R1Y3QgPT0gMHg1MDNjKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIE10cENsaWVudFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBDbGllbnQqICAgbUNsaWVudDsKKworcHVibGljOgorICAgIE10cENsaWVudFRocmVhZChNdHBDbGllbnQqIGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT50aHJlYWRMb29wKCk7CisgICAgfQorfTsKKworCitNdHBDbGllbnQ6Ok10cENsaWVudCgpCisgICAgOiAgIG1UaHJlYWQoTlVMTCksCisgICAgICAgIG1Vc2JIb3N0Q29udGV4dChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCit7Cit9CisKK010cENsaWVudDo6fk10cENsaWVudCgpIHsKKyAgICB1c2JfaG9zdF9jbGVhbnVwKG1Vc2JIb3N0Q29udGV4dCk7Cit9CisKK2Jvb2wgTXRwQ2xpZW50OjpzdGFydCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtVGhyZWFkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG1Vc2JIb3N0Q29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIW1Vc2JIb3N0Q29udGV4dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbVRocmVhZCA9IG5ldyBNdHBDbGllbnRUaHJlYWQodGhpcyk7CisgICAgbVRocmVhZC0+cnVuKCJNdHBDbGllbnRUaHJlYWQiKTsKKyAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRvIGluaXRpYWwgZGV2aWNlIGRpc2NvdmVyeSBiZWZvcmUgcmV0dXJuaW5nCisgICAgbVRocmVhZFN0YXJ0Q29uZGl0aW9uLndhaXQobU11dGV4KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE10cENsaWVudDo6c3RvcCgpIHsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKK010cERldmljZSogTXRwQ2xpZW50OjpnZXREZXZpY2UoaW50IGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRJRCgpID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEZXZpY2VBZGRlZChjb25zdCBjaGFyICpkZXZuYW1lKSB7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIG1Eb25lOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IDB4RkYgJiYKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMHhGRiAmJgorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciogaW50ZXJmYWNlTmFtZSA9IHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGludGVyZmFjZS0+aUludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VOYW1lIHx8IHN0cmNtcChpbnRlcmZhY2VOYW1lLCAiTVRQIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgYW4gYW5kcm9pZCBzdHlsZSBNVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgTVRQIGRldmljZTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbG9vayBmb3Igc3BlY2lhbCBjYXNlZCBkZXZpY2VzIGJhc2VkIG9uIHZlbmRvci9wcm9kdWN0IElECisgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvaW5nIHRoaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAgICAgICAgdWludDE2X3QgdmVuZG9yID0gdXNiX2RldmljZV9nZXRfdmVuZG9yX2lkKGRldmljZSk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTXRwRGV2aWNlKHZlbmRvciwgcHJvZHVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFuIE1UUCBvciBQVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IE1UUCBPUyBzdHJpbmcgYW5kIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAvLyBzb21lIG11c2ljIHBsYXllcnMgbmVlZCB0byBzZWUgdGhpcyBiZWZvcmUgZW50ZXJpbmcgTVRQIG1vZGUuCisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHVzYl9kZXZpY2Vfc2VuZF9jb250cm9sKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRXxVU0JfVFlQRV9TVEFOREFSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsIChVU0JfRFRfU1RSSU5HIDw8IDgpIHwgMHhFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNpemVvZihidWZmZXIpLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHByaW50ZigidXNiX2RldmljZV9zZW5kX2NvbnRyb2wgcmV0dXJuZWQgJWQgZXJybm86ICVkXG4iLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoImdvdCBNVFAgc3RyaW5nICVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB1c2JfZGV2aWNlX3NlbmRfY29udHJvbChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFfFVTQl9UWVBFX1ZFTkRPUiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCBzaXplb2YoYnVmZmVyKSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJPUyBkZXNjcmlwdG9yIGdvdCAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIE1UUCBzdHJpbmdcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgaGF2ZSBhIGxpa2VseSBNVFAgb3IgUFRQIGRldmljZQorCisgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX291dF9kZXNjKTsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX2ludHJfZGVzYyk7CisKKyAgICAgICAgICAgIGlmICh1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZSBmYWlsZWQgZXJybm86ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfb3V0KTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfaW50cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdHBEZXZpY2UqIG10cERldmljZSA9IG5ldyBNdHBEZXZpY2UoZGV2aWNlLCBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbiwgZXBfb3V0LCBlcF9pbnRyKTsKKyAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChtdHBEZXZpY2UpOworICAgICAgICAgICAgbXRwRGV2aWNlLT5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICB9CisgICAgfQorCisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiBtRG9uZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2bmFtZSwgZGV2aWNlLT5nZXREZXZpY2VOYW1lKCkpKSB7CisgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgICAgICBMT0dEKCJDYW1lcmEgcmVtb3ZlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dXNiRGlzY292ZXJ5RG9uZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBtVGhyZWFkU3RhcnRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dGhyZWFkTG9vcCgpIHsKKyAgICB1c2JfaG9zdF9ydW4obVVzYkhvc3RDb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIHVzYl9kaXNjb3ZlcnlfZG9uZSwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEZXZpY2VBZGRlZChkZXZuYW1lKTsKK30KKworaW50IE10cENsaWVudDo6dXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9yZW1vdmVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICByZXR1cm4gKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZVJlbW92ZWQoZGV2bmFtZSk7Cit9CisKK2ludCBNdHBDbGllbnQ6OnVzYl9kaXNjb3ZlcnlfZG9uZSh2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIExPR0QoInVzYl9kaXNjb3ZlcnlfZG9uZVxuIik7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEaXNjb3ZlcnlEb25lKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmggYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YzUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDbGllbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NMSUVOVF9ICisjZGVmaW5lIF9NVFBfQ0xJRU5UX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCB1c2JfaG9zdF9jb250ZXh0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cENsaWVudFRocmVhZDsKKworY2xhc3MgTXRwQ2xpZW50IHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlTGlzdCAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0OworICAgIE10cENsaWVudFRocmVhZCogICAgICAgICAgICBtVGhyZWFkOworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtVGhyZWFkU3RhcnRDb25kaXRpb247CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogICAgbVVzYkhvc3RDb250ZXh0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cENsaWVudCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBDbGllbnQoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc3RvcCgpOworCisgICAgaW5saW5lIE10cERldmljZUxpc3QmICAgZ2V0RGV2aWNlTGlzdCgpIHsgcmV0dXJuIG1EZXZpY2VMaXN0OyB9CisgICAgTXRwRGV2aWNlKiAgICAgICAgICAgICAgZ2V0RGV2aWNlKGludCBpZCk7CisKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgPSAwOworCitwcml2YXRlOgorICAgIC8vIHRoZXNlIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCBzdG9wIG1vbml0b3JpbmcgVVNCIGFuZCBjbGVhbiB1cAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdXNiRGlzY292ZXJ5RG9uZSgpOworCisgICAgZnJpZW5kIGNsYXNzIE10cENsaWVudFRocmVhZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICB1c2JfZGlzY292ZXJ5X2RvbmUodm9pZCogY2xpZW50X2RhdGEpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3IiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKworCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIERldmljZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgREVWSUNFX1JPV19JRCAgICAgICAgICAgMQorI2RlZmluZSBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgICAyCisjZGVmaW5lIERFVklDRV9NT0RFTCAgICAgICAgICAgIDMKKworLyogU3RvcmFnZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgU1RPUkFHRV9ST1dfSUQgICAgICAgICAgMTAxCisjZGVmaW5lIFNUT1JBR0VfSURFTlRJRklFUiAgICAgIDEwMgorI2RlZmluZSBTVE9SQUdFX0RFU0NSSVBUSU9OICAgICAxMDMKKworLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICAgMjAxCisjZGVmaW5lIE9CSkVDVF9TVE9SQUdFX0lEICAgICAgICAgICAyMDIKKyNkZWZpbmUgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgIDIwMworI2RlZmluZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICAgMjA0CisjZGVmaW5lIE9CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAyMDUKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgIDIwNgorI2RlZmluZSBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICAgMjA3CisjZGVmaW5lIE9CSkVDVF9USFVNQl9XSURUSCAgICAgICAgICAyMDgKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgIDIwOQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICAgMjEwCisjZGVmaW5lIE9CSkVDVF9JTUFHRV9IRUlHSFQgICAgICAgICAyMTEKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgIDIxMgorI2RlZmluZSBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICAgMjEzCisjZGVmaW5lIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFICAgICAyMTQKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgIDIxNQorI2RlZmluZSBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICAgMjE2CisjZGVmaW5lIE9CSkVDVF9OQU1FICAgICAgICAgICAgICAgICAyMTcKKyNkZWZpbmUgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgIDIxOAorI2RlZmluZSBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICAgMjE5CisjZGVmaW5lIE9CSkVDVF9LRVlXT1JEUyAgICAgICAgICAgICAyMjAKKyNkZWZpbmUgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgIDIyMQorCitNdHBDdXJzb3I6Ok10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpCisgICAgICAgIDogICBtQ2xpZW50KGNsaWVudCksCisgICAgICAgICAgICBtUXVlcnlUeXBlKHF1ZXJ5VHlwZSksCisgICAgICAgICAgICBtRGV2aWNlSUQoZGV2aWNlSUQpLAorICAgICAgICAgICAgbVN0b3JhZ2VJRChzdG9yYWdlSUQpLAorICAgICAgICAgICAgbVFiamVjdElEKG9iamVjdElEKSwKKyAgICAgICAgICAgIG1Db2x1bW5Db3VudChjb2x1bW5Db3VudCksCisgICAgICAgICAgICBtQ29sdW1ucyhOVUxMKQoreworICAgIGlmIChjb2x1bW5zKSB7CisgICAgICAgIG1Db2x1bW5zID0gbmV3IGludFtjb2x1bW5Db3VudF07CisgICAgICAgIG1lbWNweShtQ29sdW1ucywgY29sdW1ucywgY29sdW1uQ291bnQgKiBzaXplb2YoaW50KSk7CisgICAgfQorfQorCitNdHBDdXJzb3I6On5NdHBDdXJzb3IoKSB7CisgICAgZGVsZXRlW10gbUNvbHVtbnM7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIExPR0QoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdyBtUXVlcnlUeXBlOiAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisKKyAgICBzd2l0Y2ggKG1RdWVyeVR5cGUpIHsKKyAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxEZXZpY2Uod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCAwLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3Qod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9DSElMRFJFTjoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIC0xLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgbVFiamVjdElELCBzdGFydFBvcyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJNdHBDdXJzb3I6OmZpbGxXaW5kb3c6IHVua25vd24gcXVlcnkgdHlwZSAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZUxpc3QmIGRldmljZUxpc3QgPSBtQ2xpZW50LT5nZXREZXZpY2VMaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gZGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKGRldmljZSAmJiBmaWxsRGV2aWNlKHdpbmRvdywgZGV2aWNlLCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlSURzID0gZGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgaWYgKCFzdG9yYWdlSURzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUlEcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUlEcylbaV07CisgICAgICAgIGlmIChmaWxsU3RvcmFnZSh3aW5kb3csIGRldmljZSwgc3RvcmFnZUlELCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIHN0b3JhZ2VJRHM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBtU3RvcmFnZUlELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxPYmplY3RzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgcGFyZW50LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBkZXZpY2UtPmdldE9iamVjdEhhbmRsZXMobVN0b3JhZ2VJRCwgMCwgcGFyZW50KTsKKyAgICBpZiAoIWhhbmRsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIGhhbmRsZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIG1RYmplY3RJRCwgc3RhcnRQb3MpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCByb3cpIHsKKyAgICBNdHBEZXZpY2VJbmZvKiBkZXZpY2VJbmZvID0gZGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKCFkZXZpY2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0VfUk9XX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIGRldmljZS0+Z2V0SUQoKSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01BTlVGQUNUVVJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1NYW51ZmFjdHVyZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERFVklDRV9NT0RFTDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1Nb2RlbCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbERldmljZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdykgeworCitMT0dEKCJmaWxsU3RvcmFnZSAlZFxuIiwgc3RvcmFnZUlEKTsKKworICAgIE10cFN0b3JhZ2VJbmZvKiBzdG9yYWdlSW5mbyA9IGRldmljZS0+Z2V0U3RvcmFnZUluZm8oc3RvcmFnZUlEKTsKKyAgICBpZiAoIXN0b3JhZ2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdGV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgc3RvcmFnZUlELCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICAgdGV4dCA9IHN0b3JhZ2VJbmZvLT5tVm9sdW1lSWRlbnRpZmllcjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiQ2FtZXJhIFN0b3JhZ2UiOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0WzBdKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIlN0b3JhZ2UgRGVzY3JpcHRpb24iOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbFN0b3JhZ2U6IHVua25vd24gY29sdW1uICVkXG4iLCBtQ29sdW1uc1tpXSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBzdG9yYWdlSW5mbzsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KSB7CisKKyAgICBNdHBPYmplY3RJbmZvKiBvYmplY3RJbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdElEKTsKKyAgICBpZiAoIW9iamVjdEluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBvYmplY3RJbmZvLT5wcmludCgpOworICAgIGlmICghcHJlcGFyZVJvdyh3aW5kb3cpKSB7CisgICAgICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1TdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Qcm90ZWN0aW9uU3RhdHVzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tQ29tcHJlc3NlZFNpemUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJDb21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX0RFUFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeERlcHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUEFSRU5UOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1QYXJlbnQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvblR5cGUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvbkRlc2MsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVNlcXVlbmNlTnVtYmVyLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfTkFNRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIG9iamVjdEluZm8tPm1OYW1lLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1EYXRlQ3JlYXRlZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVNb2RpZmllZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0tFWVdPUkRTOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bUtleXdvcmRzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRUaHVtYm5haWwod2luZG93LCBvYmplY3RJRCwgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgb2JqZWN0SW5mbzsKKyAgICByZXR1cm4gdHJ1ZTsKKworZmFpbDoKKyAgICBkZWxldGUgb2JqZWN0SW5mbzsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwcmVwYXJlUm93KEN1cnNvcldpbmRvdyogd2luZG93KSB7CisgICAgaWYgKCF3aW5kb3ctPnNldE51bUNvbHVtbnMobUNvbHVtbkNvdW50KSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY2hhbmdlIGNvbHVtbiBjb3VudCBmcm9tICVkIHRvICVkIiwgd2luZG93LT5nZXROdW1Db2x1bW5zKCksIG1Db2x1bW5Db3VudCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSB3aW5kb3ctPmFsbG9jUm93KCk7CisgICAgaWYgKCFmaWVsZERpcikgeworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBmaWVsZERpciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRMb25nKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgdmFsdWUsIGludCByb3csIGludCBjb2x1bW4pIHsKKworICAgIGlmICghd2luZG93LT5wdXRMb25nKHJvdywgY29sdW1uLCB2YWx1ZSkpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGNvbHVtbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBpbnQgc2l6ZSA9IHN0cmxlbih0ZXh0KSArIDE7CisgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CisgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iICVzIiwgc2l6ZSwgdGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2luZG93LT5jb3B5SW4ob2Zmc2V0LCAoY29uc3QgdWludDhfdCopdGV4dCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfU1RSSU5HOworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBvYmplY3RJRCwgaW50IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgdm9pZCogdGh1bWJuYWlsOworICAgIGludCBzaXplLCBvZmZzZXQ7CisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIHRodW1ibmFpbCA9IE5VTEw7CisgICAgICAgIHNpemUgPSBvZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1ibmFpbCA9IGRldmljZS0+Z2V0VGh1bWJuYWlsKG9iamVjdElELCBzaXplKTsKKworICAgICAgICBMT0dWKCJwdXRUaHVtYm5haWw6ICVwLCBzaXplOiAlZFxuIiwgdGh1bWJuYWlsLCBzaXplKTsKKyAgICAgICAgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0aHVtYm5haWwiLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGh1bWJuYWlsKQorICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0aHVtYm5haWwsIHNpemUpOworCisgICAgLy8gVGhpcyBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gYWxsb2MoKSwgc2luY2UgdGhhdAorICAgIC8vIG1heSBtb3ZlIHRoZSBmaWVsZCBhcm91bmQgaW4gdGhlIHdpbmRvdworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IHdpbmRvdy0+Z2V0RmllbGRTbG90KHJvdywgY29sdW1uKTsKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0JMT0I7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEN1cnNvci5oIGIvbWVkaWEvbXRwL010cEN1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODQ3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9DVVJTT1JfSAorI2RlZmluZSBfTVRQX0NVUlNPUl9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKworY2xhc3MgTXRwQ3Vyc29yIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIERFVklDRSAgICAgICAgICAgICAgPSAxLAorICAgICAgICBERVZJQ0VfSUQgICAgICAgICAgID0gMiwKKyAgICAgICAgU1RPUkFHRSAgICAgICAgICAgICA9IDMsCisgICAgICAgIFNUT1JBR0VfSUQgICAgICAgICAgPSA0LAorICAgICAgICBPQkpFQ1QgICAgICAgICAgICAgID0gNSwKKyAgICAgICAgT0JKRUNUX0lEICAgICAgICAgICA9IDYsCisgICAgICAgIFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3LAorICAgICAgICBPQkpFQ1RfQ0hJTERSRU4gICAgID0gOCwKKyAgICB9OworCisgICAgTXRwQ2xpZW50KiAgbUNsaWVudDsKKyAgICBpbnQgICAgICAgICBtUXVlcnlUeXBlOworICAgIGludCAgICAgICAgIG1EZXZpY2VJRDsKKyAgICBpbnQgICAgICAgICBtU3RvcmFnZUlEOworICAgIGludCAgICAgICAgIG1RYmplY3RJRDsKKyAgICBpbnQgICAgICAgICBtQ29sdW1uQ291bnQ7CisgICAgaW50KiAgICAgICAgbUNvbHVtbnM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBNdHBDdXJzb3IoTXRwQ2xpZW50KiBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpOworICAgIHZpcnR1YWwgICAgIH5NdHBDdXJzb3IoKTsKKworICAgIGludCAgICAgICAgIGZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisKK3ByaXZhdGU6CisgICAgaW50ICAgICAgICAgZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworICAgIGJvb2wgICAgICAgIGZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLCBpbnQgc3RhcnRQb3MpOworICAgIGJvb2wgICAgICAgIGZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIGludCByb3cpOworICAgIGJvb2wgICAgICAgIGZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KTsKKworICAgIGJvb2wgICAgICAgIHByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpOworICAgIGJvb2wgICAgICAgIHB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgYm9vbCAgICAgICAgcHV0U3RyaW5nKEN1cnNvcldpbmRvdyogd2luZG93LCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBvYmplY3RJRCwgaW50IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbik7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9DVVJTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmQwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERhdGFQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEYXRhUGFja2V0OjpNdHBEYXRhUGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMiksCisgICAgICAgIG1PZmZzZXQoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKK3sKK30KKworTXRwRGF0YVBhY2tldDo6fk10cERhdGFQYWNrZXQoKSB7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cmVzZXQoKSB7CisgICAgTXRwUGFja2V0OjpyZXNldCgpOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDE2X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDE2KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQxNl90IHJlc3VsdCA9ICh1aW50MTZfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCk7CisgICAgbU9mZnNldCArPSAyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQzMigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSAgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpOworICAgIG1PZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50NjQoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDY0X3QgcmVzdWx0ID0gKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDRdIDw8IDMyKSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA1XSA8PCA0MCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNl0gPDwgNDgpICB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA3XSA8PCA1Nik7CisgICAgbU9mZnNldCArPSA4OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgdmFsdWVbMF0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsxXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzJdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbM10gPSBnZXRVSW50MzIoKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpnZXRTdHJpbmcoTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpCit7CisgICAgc3RyaW5nLnJlYWRGcm9tUGFja2V0KHRoaXMpOworfQorCitJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDgoKSB7CisgICAgSW50OExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ4KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ4KCkgeworICAgIFVJbnQ4TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQxNigpIHsKKyAgICBJbnQxNkxpc3QqIHJlc3VsdCA9IG5ldyBJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDE2TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQxNigpIHsKKyAgICBVSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgVUludDE2TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MzIoKSB7CisgICAgSW50MzJMaXN0KiByZXN1bHQgPSBuZXcgSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQzMkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MzIoKSB7CisgICAgVUludDMyTGlzdCogcmVzdWx0ID0gbmV3IFVJbnQzMkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDY0KCkgeworICAgIEludDY0TGlzdCogcmVzdWx0ID0gbmV3IEludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50NjRMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDY0KCkgeworICAgIFVJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBVSW50NjRMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDgoaW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50OCh1aW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxNihpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDE2KHVpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MzIoaW50MzJfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA0KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MzIodWludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50NjQoaW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICBwdXRJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0SW50MzIodmFsdWVbMV0pOworICAgIHB1dEludDMyKHZhbHVlWzJdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0VUludDMyKHZhbHVlWzBdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMV0pOworICAgIHB1dFVJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzNdKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDgoY29uc3QgdWludDhfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IFVJbnQxNkxpc3QqIHZhbHVlcykgeworICAgIHNpemVfdCBjb3VudCA9ICh2YWx1ZXMgPyB2YWx1ZXMtPnNpemUoKSA6IDApOworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKCp2YWx1ZXMpW2ldKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IHVpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IFVJbnQzMkxpc3QqIGxpc3QpIHsKKyAgICBpZiAoIWxpc3QpIHsKKyAgICAgICAgcHV0RW1wdHlBcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbGlzdC0+c2l6ZSgpOworICAgICAgICBwdXRVSW50MzIoc2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgcHV0VUludDMyKCgqbGlzdClbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpIHsKKyAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgY2hhciogcykgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmcocyk7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmluZ1tpXSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwdXRVSW50OChjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoc3RyaW5nW2ldKTsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UgCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZChpbnQgZmQpIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ICE9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB0aGVuIHRoZSBmb2xsb3dpbmcgZGF0YQorICAgIGludCB0b3RhbCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgaW50IHJlbWFpbmluZyA9IHRvdGFsIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICByZXQgPSA6OnJlYWQoZmQsICZtQnVmZmVyWzBdICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgcmVtYWluaW5nKTsKKyAgICBpZiAocmV0ICE9IHJlbWFpbmluZykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbVBhY2tldFNpemUgPSB0b3RhbDsKKyAgICBtT2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YUhlYWRlcihpbnQgZmQpIHsKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKworICAgIC8vIHNlbmQgaGVhZGVyIHNlcGFyYXRlbHkgZnJvbSBkYXRhCisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYgLy8gTVRQX0RFVklDRQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IGxlbmd0aCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKGxlbmd0aCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIC8vIGxvb2sgYXQgdGhlIGxlbmd0aCBmaWVsZCB0byBzZWUgaWYgdGhlIGRhdGEgc3BhbnMgbXVsdGlwbGUgcGFja2V0cworICAgICAgICB1aW50MzJfdCB0b3RhbExlbmd0aCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgICAgIHdoaWxlICh0b3RhbExlbmd0aCA+IGxlbmd0aCkgeworICAgICAgICAgICAgYWxsb2NhdGUobGVuZ3RoICsgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyICsgbGVuZ3RoLCBtQWxsb2NhdGlvbkluY3JlbWVudCk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHJldDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IHBhY2tldFNpemUgPSB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCk7CisgICAgaW50IHJlYWQgPSAwOworICAgIHdoaWxlIChyZWFkIDwgbGVuZ3RoKSB7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgKGNoYXIgKilidWZmZXIgKyByZWFkLCBwYWNrZXRTaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZERhdGEgcmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZWFkICs9IHJldDsKKyAgICB9CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWREYXRhIHJldHVybmluZyAlZFxuIiwgcmVhZCk7CisgICAgcmV0dXJuIHJlYWQ7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCBsZW5ndGggPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApKTsKKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNpemUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIGludCByZXQgPSAwOworICAgIGludCBwYWNrZXRTaXplID0gdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIGludCB3cml0ZSA9IChsZW5ndGggPiBwYWNrZXRTaXplID8gcGFja2V0U2l6ZSA6IGxlbmd0aCk7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgYnVmZmVyLCB3cml0ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbmd0aCAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCisjZW5kaWYgLy8gTVRQX0hPU1QKKwordm9pZCogTXRwRGF0YVBhY2tldDo6Z2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3QgeworICAgIGludCBsZW5ndGggPSBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKGxlbmd0aCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ODI4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0RBVEFfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFN0cmluZ0J1ZmZlcjsKKworY2xhc3MgTXRwRGF0YVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworcHJpdmF0ZToKKyAgICAvLyBjdXJyZW50IG9mZnNldCBmb3IgZ2V0L3B1dCBtZXRob2RzCisgICAgaW50ICAgICAgICAgICAgICAgICBtT2Zmc2V0OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRGF0YVBhY2tldCgpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICByZXNldCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgaW5saW5lIHVpbnQ4X3QgICAgICBnZXRVSW50OCgpIHsgcmV0dXJuICh1aW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIGlubGluZSBpbnQ4X3QgICAgICAgZ2V0SW50OCgpIHsgcmV0dXJuIChpbnQ4X3QpbUJ1ZmZlclttT2Zmc2V0KytdOyB9CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoKTsKKyAgICBpbmxpbmUgaW50MTZfdCAgICAgIGdldEludDE2KCkgeyByZXR1cm4gKGludDE2X3QpZ2V0VUludDE2KCk7IH0KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFVJbnQzMigpOworICAgIGlubGluZSBpbnQzMl90ICAgICAgZ2V0SW50MzIoKSB7IHJldHVybiAoaW50MzJfdClnZXRVSW50MzIoKTsgfQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgZ2V0VUludDY0KCk7CisgICAgaW5saW5lIGludDY0X3QgICAgICBnZXRJbnQ2NCgpIHsgcmV0dXJuIChpbnQ2NF90KWdldFVJbnQ2NCgpOyB9CisgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRVSW50MTI4KHVpbnQxMjhfdCYgdmFsdWUpOworICAgIGlubGluZSB2b2lkICAgICAgICAgZ2V0SW50MTI4KGludDEyOF90JiB2YWx1ZSkgeyBnZXRVSW50MTI4KCh1aW50MTI4X3QmKXZhbHVlKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKworICAgIEludDhMaXN0KiAgICAgICAgICAgZ2V0QUludDgoKTsKKyAgICBVSW50OExpc3QqICAgICAgICAgIGdldEFVSW50OCgpOworICAgIEludDE2TGlzdCogICAgICAgICAgZ2V0QUludDE2KCk7CisgICAgVUludDE2TGlzdCogICAgICAgICBnZXRBVUludDE2KCk7CisgICAgSW50MzJMaXN0KiAgICAgICAgICBnZXRBSW50MzIoKTsKKyAgICBVSW50MzJMaXN0KiAgICAgICAgIGdldEFVSW50MzIoKTsKKyAgICBJbnQ2NExpc3QqICAgICAgICAgIGdldEFJbnQ2NCgpOworICAgIFVJbnQ2NExpc3QqICAgICAgICAgZ2V0QVVJbnQ2NCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ4KGludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50OCh1aW50OF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDE2KGludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDE2KHVpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDMyKGludDMyX3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKHVpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDY0KGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDY0KHVpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDgoY29uc3QgaW50OF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDgoY29uc3QgdWludDhfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDE2KGNvbnN0IGludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MTYoY29uc3QgdWludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MTYoY29uc3QgVUludDE2TGlzdCogdmFsdWVzKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQzMihjb25zdCBpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDMyKGNvbnN0IHVpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDMyKGNvbnN0IFVJbnQzMkxpc3QqIGxpc3QpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDY0KGNvbnN0IGludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50NjQoY29uc3QgdWludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCB1aW50MTZfdCogc3RyaW5nKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5U3RyaW5nKCkgeyBwdXRVSW50MTYoMCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5QXJyYXkoKSB7IHB1dFVJbnQzMigwKTsgfQorCisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gZmlsbCBvdXIgYnVmZmVyIHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhSGVhZGVyKGludCBmZCk7CisKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGEoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdWludDMyX3QgbGVuZ3RoKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworICAgIGlubGluZSBib29sICAgICAgICAgaGFzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1QYWNrZXRTaXplID4gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsgfQorICAgIHZvaWQqICAgICAgICAgICAgICAgZ2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9EQVRBX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODIzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKKyNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cERhdGFiYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NdHBEYXRhYmFzZSgpIHt9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgPSAwOworCisgICAgLy8gY2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2ZlcgorICAgIC8vIHN1Y2Nlc3Mgc2hvdWxkIHNpZ25hbCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgbmV3IG9iamVjdCdzIGNyZWF0aW9uLAorICAgIC8vIGZhaWx1cmUgc2hvdWxkIHJlbW92ZSB0aGUgZGF0YWJhc2UgZW50cnkgY3JlYXRlZCBpbiBiZWdpblNlbmRPYmplY3QKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nJiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcykgPSAwOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9EQVRBQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVidWcuY3BwIGIvbWVkaWEvbXRwL010cERlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmIxMDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmNwcApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDb2RlRW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgdWludDE2X3QgY29kZTsKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc09wZXJhdGlvbkNvZGVzW10gPSB7CisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8iLCAgICAgICAgICAgICAgMHgxMDAxIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04iLCAgICAgICAgICAgICAgICAgMHgxMDAyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OIiwgICAgICAgICAgICAgICAgMHgxMDAzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMiLCAgICAgICAgICAgICAgMHgxMDA0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPIiwgICAgICAgICAgICAgMHgxMDA1IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMiLCAgICAgICAgICAgICAgMHgxMDA2IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMiLCAgICAgICAgICAgMHgxMDA3IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAgMHgxMDA4IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgMHgxMDA5IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfVEhVTUIiLCAgICAgICAgICAgICAgICAgICAgMHgxMDBBIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUIiwgICAgICAgICAgICAgICAgMHgxMDBCIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPIiwgICAgICAgICAgICAgMHgxMDBDIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDBEIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFIiwgICAgICAgICAgICAgMHgxMDBFIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUiLCAgICAgICAgICAgICAgICAgMHgxMDBGIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UiLCAgICAgICAgICAgICAgICAgMHgxMDEwIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRUxGX1RFU1QiLCAgICAgICAgICAgICAgICAgICAgMHgxMDExIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04iLCAgICAgICAgMHgxMDEyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOIiwgICAgICAgICAgICAgICAgICAgMHgxMDEzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQyIsICAgICAgICAgMHgxMDE0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgICAgMHgxMDE1IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgICAgMHgxMDE2IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgMHgxMDE3IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFIiwgICAgICAgMHgxMDE4IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDE5IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDFBIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QiLCAgICAgICAgICAgMHgxMDFCIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAgMHgxMDFDIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCIsICAgMHg5ODAxIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQyIsICAgICAgICAgMHg5ODAyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUiLCAgICAgICAgMHg5ODAzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUiLCAgICAgICAgMHg5ODA0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMiLCAgICAgICAgMHg5ODEwIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMiLCAgICAgICAgMHg5ODExIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TS0lQIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ODIwIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNGb3JtYXRDb2Rlc1tdID0geworICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNTT0NJQVRJT04iLCAgICAgICAgICAgICAgICAgICAgIDB4MzAwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfU0NSSVBUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfRVhFQ1VUQUJMRSIsICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfVEVYVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfSFRNTCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfRFBPRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUlGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfV0FWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVAzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVZJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVBFRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQyB9LAorICAgIHsgIk1UUF9GT1JNQVRfREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfRVhJRl9KUEVHIiwgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRl9FUCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfRkxBU0hQSVgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQk1QIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQ0lGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfR0lGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfSkZJRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQ0QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfUElDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfUE5HIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRl9JVCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRSB9LAorICAgIHsgIk1UUF9GT1JNQVRfSlAyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiB9LAorICAgIHsgIk1UUF9GT1JNQVRfSlBYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFIiwgICAgICAgICAgICAgIDB4QjgwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQiLCAgICAgICAgICAgIDB4Qjg4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPIiwgICAgICAgICAgICAgICAgIDB4QjkwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfV01BIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfT0dHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUFDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVVESUJMRSIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfRkxBQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPIiwgICAgICAgICAgICAgICAgIDB4Qjk4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfV01WIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVA0X0NPTlRBSU5FUiIsICAgICAgICAgICAgICAgICAgIDB4Qjk4MiB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVAyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MyB9LAorICAgIHsgIk1UUF9GT1JNQVRfM0dQX0NPTlRBSU5FUiIsICAgICAgICAgICAgICAgICAgIDB4Qjk4NCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04iLCAgICAgICAgICAgIDB4QkEwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSIsICAgICAgIDB4QkEwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0iLCAgICAgICAgICAgIDB4QkEwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0iLCAgICAgICAgICAgIDB4QkEwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU0iLCAgICAgICAgICAgIDB4QkEwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QiLCAgICAgICAgICAgIDB4QkEwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCIsICAgICAgICAgIDB4QkEwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIiLCAgICAgICAgIDB4QkEwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ0hBUFRFUkVEX1BST0RVQ1RJT04iLCAgIDB4QkEwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QiLCAgICAgICAgIDB4QkEwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QiLCAgICAgICAgIDB4QkEwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVESUFDQVNUIiwgICAgICAgICAgICAgIDB4QkEwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfV1BMX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNYX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfUExTX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0RPQ1VNRU5UIiwgICAgICAgICAgICAgIDB4QkE4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfRE9DVU1FTlQiLCAgICAgICAgICAgICAgIDB4QkE4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfWE1MX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAgICAgIDB4QkE4MiB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgIDB4QkE4MyB9LAorICAgIHsgIk1UUF9GT1JNQVRfTUhUX0NPTVBJTEVEX0hUTUxfRE9DVU1FTlQiLCAgICAgIDB4QkE4NCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQiLCAgICAgICAgICAgIDB4QkE4NSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04iLCAgICAgIDB4QkE4NiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX01FU1NBR0UiLCAgICAgICAgICAgICAgIDB4QkIwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UiLCAgICAgICAgICAgICAgIDB4QkIwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QiLCAgICAgICAgICAgICAgIDB4QkI4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVCIsICAgICAgICAgICAgICAgIDB4QkI4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVkNBUkRfMiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkI4MiB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzT2JqZWN0UHJvcENvZGVzW10gPSB7CisgICAgeyAiTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgMHhEQzAzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX0RFU0MiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQ1JFQVRFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0tFWVdPUkRTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMTE9XRURfRk9MREVSX0NPTlRFTlRTIiwgICAgICAgICAgICAgICAgMHhEQzBDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0hJRERFTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NZU1RFTV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NZTkNfSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST1BFUlRZX0JBRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NSRUFURURfQlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQVVUSE9SRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RFU0NSSVBUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9SRUZFUkVOQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBTkdVQUdFX0xPQ0FMRSIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiIsICAgICAgICAgICAgICAgICAgMHhEQzRCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NPVVJDRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SSUdJTl9MT0NBVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzREIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQURERUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05PTl9DT05TVU1BQkxFIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPUlJVUFRfVU5QTEFZQUJMRSIsICAgICAgICAgICAgICAgICAgICAgMHhEQzUwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIiLCAgICAgICAgICAgICAgICAgMHhEQzUxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9GT1JNQVQiLCAgICAgICAgICAgMHhEQzgxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFIiwgICAgICAgICAgICAgMHhEQzgyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQiLCAgICAgICAgICAgMHhEQzgzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCIsICAgICAgICAgICAgMHhEQzg0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiIsICAgICAgICAgMHhEQzg1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EQVRBIiwgICAgICAgICAgICAgMHhEQzg2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1dJRFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0hFSUdIVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RVUkFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RSQUNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0dFTlJFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NSRURJVFMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xZUklDUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEIiwgICAgICAgICAgICAgICAgMHhEQzhGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST0RVQ0VEX0JZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VTRV9DT1VOVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NLSVBfQ09VTlQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBU1RfQUNDRVNTRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBUkVOVEFMX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FVEFfR0VOUkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPTVBPU0VSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VGRkVDVElWRV9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQlRJVExFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURSIsICAgICAgICAgICAgICAgICAgMHhEQzk5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMQlVNX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMQlVNX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01PT0QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RSTV9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQl9ERVNDUklQVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lTX0NST1BQRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQiLCAgICAgICAgICAgICAgICAgICAgMHhEQ0QyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RPVEFMX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JJVFJBVEVfVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NBTVBMRV9SQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyIsICAgICAgICAgICAgICAgICAgICAgMHhERTk0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX0JJVF9ERVBUSCIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NDQU5fVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERTk5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyIsICAgICAgICAgICAgICAgICAgICAgMHhERTlCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1ZJREVPX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyIsICAgICAgICAgICAgMHhERTlEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0tFWUZSQU1FX0RJU1RBTkNFIiwgICAgICAgICAgICAgICAgICAgICAgMHhERTlFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JVRkZFUl9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VOQ09ESU5HX1FVQUxJVFkiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERUEwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERUExIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JPRFlfVEVYVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSSU9SSVRZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0dJVkVOX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01JRERMRV9OQU1FUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBTUlMWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSRUZJWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVRkZJWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUiLCAgICAgICAgICAgICAgICAgICAgMHhERDA1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX0ZBTUlMWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgMHhERDA2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDA4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDA5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzEiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDBBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDBCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX09USEVSUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDBDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgMHhERDBEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCIsICAgICAgICAgICAgICAgICAgMHhERDBFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTF8yIiwgICAgICAgICAgICAgICAgMHhERDBGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTUyIsICAgICAgICAgICAgICAgICAgMHhERDEwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yIiwgICAgICAgICAgICAgICAgMHhERDExIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEUiLCAgICAgICAgICAgICAgICAgICAgMHhERDEyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiIsICAgICAgICAgICAgICAgICAgMHhERDEzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgICAgMHhERDE0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUwiLCAgICAgICAgICAgICAgICAgICAgMHhERDE1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1MiLCAgICAgICAgICAgICAgICAgICAgMHhERDE2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBR0VSX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDE3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlMiLCAgICAgICAgICAgICAgICAgICAgMHhERDE4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAgMHhERDE5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BFUlNPTkFMX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgMHhERDFBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JVU0lORVNTX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgMHhERDFCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1MiLCAgICAgICAgICAgICAgMHhERDFDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiIsICAgICAgICAgICAgMHhERDFEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMyIsICAgICAgICAgICAgMHhERDFFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwiLCAgICAgICAgICAgMHhERDFGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMSIsICAgICAgICAgMHhERDIwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiIsICAgICAgICAgMHhERDIxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkiLCAgICAgICAgICAgMHhERDIyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiIsICAgICAgICAgMHhERDIzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFIiwgICAgMHhERDI0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkiLCAgICAgICAgMHhERDI1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwiLCAgICAgICAgICAgMHhERDI2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMSIsICAgICAgICAgMHhERDI3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiIsICAgICAgICAgMHhERDI4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkiLCAgICAgICAgICAgMHhERDI5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiIsICAgICAgICAgMHhERDJBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFIiwgICAgMHhERDJCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkiLCAgICAgICAgMHhERDJDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwiLCAgICAgICAgICAgICAgMHhERDJEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMSIsICAgICAgICAgICAgMHhERDJFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiIsICAgICAgICAgICAgMHhERDJGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkiLCAgICAgICAgICAgICAgMHhERDMwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiIsICAgICAgICAgICAgMHhERDMxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFIiwgICAgICAgMHhERDMyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkiLCAgICAgICAgICAgMHhERDMzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDM0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FIiwgICAgICAgICAgICAgMHhERDM1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JPTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JJUlRIREFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfVE8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfQ0MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfQkNDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfUkVBRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfUkVDRUlWRURfVElNRSIsICAgICAgICAgICAgICAgICAgMHhERDQ0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfU0VOREVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQ1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgMHhERDUwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0VORF9USU1FIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDUxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0xPQ0FUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDUyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFUVVJUkVEX0FUVEVOREVFUyIsICAgICAgICAgICAgMHhERDU0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyIsICAgICAgICAgICAgMHhERDU1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyIsICAgICAgICAgICAgICAgICAgICAgMHhERDU2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0FDQ0VQVEVEIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDU3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1RFTlRBVElWRSIsICAgICAgICAgICAgICAgICAgICAgMHhERDU4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDU5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FIiwgICAgICAgICAgICAgICAgMHhERDVBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX09XTkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09XTkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VESVRPUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1dFQk1BU1RFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9TT1VSQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9ERVNUSU5BVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RJTUVfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JZVEVfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDY0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBU1RfQlVJTERfREFURSIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RJTUVfVE9fTElWRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FRElBX0dVSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcyIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNEZXZpY2VQcm9wQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAweDUwMDAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JBVFRFUllfTEVWRUwiLCAgICAgICAgICAgICAgICAgICAweDUwMDEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZVTkNUSU9OQUxfTU9ERSIsICAgICAgICAgICAgICAgICAweDUwMDIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMDMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkciLCAgICAgICAgICAgICAweDUwMDQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UiLCAgICAgICAgICAgICAgICAgICAweDUwMDUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDcgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCIsICAgICAgICAgICAgICAgICAgICAweDUwMDggfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX0RJU1RBTkNFIiwgICAgICAgICAgICAgICAgICAweDUwMDkgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMEEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUiLCAgICAgICAgICAweDUwMEIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMEMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUiLCAgICAgICAgICAgICAgICAgICAweDUwMEQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSIsICAgICAgICAgICAweDUwMEUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYIiwgICAgICAgICAgICAgICAgICAweDUwMEYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OIiwgICAgICAweDUwMTAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NBUFRVUkVfREVMQVkiLCAgICAgICAgICAgICAgICAgICAweDUwMTIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NUSUxMX0NBUFRVUkVfTU9ERSIsICAgICAgICAgICAgICAweDUwMTMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NIQVJQTkVTUyIsICAgICAgICAgICAgICAgICAgICAgICAweDUwMTUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSIsICAgICAgICAgICAgICAgICAgICAweDUwMTYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICAweDUwMTcgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAweDUwMTggfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX0lOVEVSVkFMIiwgICAgICAgICAgICAgICAgICAweDUwMTkgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIiLCAgICAgICAgICAgICAgICAweDUwMUEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCIsICAgICAgICAgICAgICAweDUwMUIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01FVEVSSU5HX01PREUiLCAgICAgICAgICAgICAweDUwMUMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1VQTE9BRF9VUkwiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMUQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMUUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPIiwgICAgICAgICAgICAgICAgICAweDUwMUYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSIiwgICAgICAgICAweEQ0MDEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FIiwgICAgICAgICAgICAweEQ0MDIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1ZPTFVNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ0MDMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQiLCAgICAgICAweEQ0MDQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OIiwgICAgICAgICAgICAgICAgICAgICAweEQ0MDUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUiLCAgICAgICAgICAgICAgICAgICAweEQ0MTAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCIsICAgICAgICAgICAgICAgICAweEQ0MTEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCIsICAgICAgICAweEQ0MTIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NFU1NJT05fSU5JVElBVE9SX1ZFUlNJT05fSU5GTyIsICAweEQ0MDYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSIsICAgICAgICAgICAweEQ0MDcgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRDb2RlTmFtZSh1aW50MTZfdCBjb2RlLCBjb25zdCBDb2RlRW50cnkqIHRhYmxlKSB7CisgICAgY29uc3QgQ29kZUVudHJ5KiBlbnRyeSA9IHRhYmxlOworICAgIHdoaWxlIChlbnRyeS0+bmFtZSkgeworICAgICAgICBpZiAoZW50cnktPmNvZGUgPT0gY29kZSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+bmFtZTsKKyAgICAgICAgZW50cnkrKzsKKyAgICB9CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzT3BlcmF0aW9uQ29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNGb3JtYXRDb2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc09iamVjdFByb3BDb2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc0RldmljZVByb3BDb2Rlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVidWcuaCBiL21lZGlhL210cC9NdHBEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTNlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFQlVHX0gKKyNkZWZpbmUgX01UUF9ERUJVR19ICisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERlYnVnIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0T3BlcmF0aW9uQ29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0Rm9ybWF0Q29kZU5hbWUoTXRwT2JqZWN0Rm9ybWF0IGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPYmplY3RQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXREZXZpY2VQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVCVUdfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY4Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEZXZpY2U6Ok10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpCisgICAgOiAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpLAorICAgICAgICBtRW5kcG9pbnRJbihlcF9pbiksCisgICAgICAgIG1FbmRwb2ludE91dChlcF9vdXQpLAorICAgICAgICBtRW5kcG9pbnRJbnRyKGVwX2ludHIpLAorICAgICAgICBtRGV2aWNlSW5mbyhOVUxMKSwKKyAgICAgICAgbUlEKHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZChkZXZpY2UpKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVRyYW5zYWN0aW9uSUQoMCkKK3sKK30KKworTXRwRGV2aWNlOjp+TXRwRGV2aWNlKCkgeworICAgIGNsb3NlKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlUHJvcGVydGllcy5zaXplKCk7IGkrKykKKyAgICAgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzW2ldOworfQorCit2b2lkIE10cERldmljZTo6aW5pdGlhbGl6ZSgpIHsKKyAgICBvcGVuU2Vzc2lvbigpOworICAgIG1EZXZpY2VJbmZvID0gZ2V0RGV2aWNlSW5mbygpOworICAgIGlmIChtRGV2aWNlSW5mbykgeworICAgICAgICBtRGV2aWNlSW5mby0+cHJpbnQoKTsKKworICAgICAgICBpZiAobURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIE10cERldmljZVByb3BlcnR5IHByb3BDb2RlID0gKCptRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMpW2ldOworICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IGdldERldmljZVByb3BEZXNjKHByb3BDb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHktPnByaW50KCk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdHBEZXZpY2U6OmNsb3NlKCkgeworICAgIGlmIChtRGV2aWNlKSB7CisgICAgICAgIHVzYl9kZXZpY2VfcmVsZWFzZV9pbnRlcmZhY2UobURldmljZSwgbUludGVyZmFjZSk7CisgICAgICAgIHVzYl9kZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgIG1EZXZpY2UgPSBOVUxMOworICAgIH0KK30KKworY29uc3QgY2hhciogTXRwRGV2aWNlOjpnZXREZXZpY2VOYW1lKCkgeworICAgIGlmIChtRGV2aWNlKQorICAgICAgICByZXR1cm4gdXNiX2RldmljZV9nZXRfbmFtZShtRGV2aWNlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiPz8/IjsKK30KKworYm9vbCBNdHBEZXZpY2U6Om9wZW5TZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVNlc3Npb25JRCA9IDA7CisgICAgbVRyYW5zYWN0aW9uSUQgPSAwOworICAgIE10cFNlc3Npb25JRCBuZXdTZXNzaW9uID0gMTsKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBuZXdTZXNzaW9uKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTikKKyAgICAgICAgbmV3U2Vzc2lvbiA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMSk7CisgICAgZWxzZSBpZiAocmV0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbVNlc3Npb25JRCA9IG5ld1Nlc3Npb247CisgICAgbVRyYW5zYWN0aW9uSUQgPSAxOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cERldmljZTo6Y2xvc2VTZXNzaW9uKCkgeworICAgIC8vIEZJWE1FCisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cERldmljZUluZm8qIE10cERldmljZTo6Z2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBuZXcgTXRwRGV2aWNlSW5mbzsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cFN0b3JhZ2VJbmZvKiBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBTdG9yYWdlSW5mbyogaW5mbyA9IG5ldyBNdHBTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNdHBEZXZpY2U6OmdldE9iamVjdEhhbmRsZXMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGZvcm1hdCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDMsIHBhcmVudCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgLy8gRklYTUUgLSB3ZSBtaWdodCB3YW50IHRvIGFkZCBzb21lIGNhY2hpbmcgaGVyZQorCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IG5ldyBNdHBPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQqIE10cERldmljZTo6Z2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9USFVNQikgJiYgcmVhZERhdGEoKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbURhdGEuZ2V0RGF0YShvdXRMZW5ndGgpOworICAgICAgICB9CisgICAgfQorICAgIG91dExlbmd0aCA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OnNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGluZm8tPm1QYXJlbnQ7CisgICAgaWYgKHBhcmVudCA9PSAwKQorICAgICAgICBwYXJlbnQgPSBNVFBfUEFSRU5UX1JPT1Q7CisKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaW5mby0+bVN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGluZm8tPm1QYXJlbnQpOworCisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1TdG9yYWdlSUQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tRm9ybWF0KTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bVByb3RlY3Rpb25TdGF0dXMpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tQ29tcHJlc3NlZFNpemUpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tVGh1bWJGb3JtYXQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJDb21wcmVzc2VkU2l6ZSk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYlBpeFdpZHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iUGl4SGVpZ2h0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4V2lkdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhIZWlnaHQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhEZXB0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1QYXJlbnQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tQXNzb2NpYXRpb25UeXBlKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUFzc29jaWF0aW9uRGVzYyk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1TZXF1ZW5jZU51bWJlcik7CisgICAgbURhdGEucHV0U3RyaW5nKGluZm8tPm1OYW1lKTsKKworICAgIGNoYXIgY3JlYXRlZFsxMDBdLCBtb2RpZmllZFsxMDBdOworICAgIGZvcm1hdERhdGVUaW1lKGluZm8tPm1EYXRlQ3JlYXRlZCwgY3JlYXRlZCwgc2l6ZW9mKGNyZWF0ZWQpKTsKKyAgICBmb3JtYXREYXRlVGltZShpbmZvLT5tRGF0ZU1vZGlmaWVkLCBtb2RpZmllZCwgc2l6ZW9mKG1vZGlmaWVkKSk7CisKKyAgICBtRGF0YS5wdXRTdHJpbmcoY3JlYXRlZCk7CisgICAgbURhdGEucHV0U3RyaW5nKG1vZGlmaWVkKTsKKyAgICBpZiAoaW5mby0+bUtleXdvcmRzKQorICAgICAgICBtRGF0YS5wdXRTdHJpbmcoaW5mby0+bUtleXdvcmRzKTsKKyAgICBlbHNlCisgICAgICAgIG1EYXRhLnB1dEVtcHR5U3RyaW5nKCk7CisKKyAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8pICYmIHNlbmREYXRhKCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICAgICAgaW5mby0+bVN0b3JhZ2VJRCA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMSk7CisgICAgICAgICAgICBpbmZvLT5tUGFyZW50ID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigyKTsKKyAgICAgICAgICAgIGluZm8tPm1IYW5kbGUgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDMpOworICAgICAgICAgICAgcmV0dXJuIGluZm8tPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChNdHBPYmplY3RIYW5kbGUpLTE7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8sIGludCBzcmNGRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaW50IHJlbWFpbmluZyA9IGluZm8tPm1Db21wcmVzc2VkU2l6ZTsKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBpbmZvLT5tSGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCkpIHsKKyAgICAgICAgLy8gc2VuZCBkYXRhIGhlYWRlcgorICAgICAgICB3cml0ZURhdGFIZWFkZXIoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwgcmVtYWluaW5nKTsKKworICAgICAgICBjaGFyIGJ1ZmZlcls2NTUzNl07CisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkKHNyY0ZELCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IG1EYXRhLndyaXRlKG1FbmRwb2ludE91dCwgYnVmZmVyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgZXJyb3IKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICByZXR1cm4gKHJlbWFpbmluZyA9PSAwICYmIHJldCA9PSBNVFBfUkVTUE9OU0VfT0spOworfQorCitib29sIE10cERldmljZTo6ZGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OmdldFBhcmVudChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICBpZiAoaW5mbykKKyAgICAgICAgcmV0dXJuIGluZm8tPm1QYXJlbnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICBpZiAoaW5mbykKKyAgICAgICAgcmV0dXJuIGluZm8tPm1TdG9yYWdlSUQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK010cFByb3BlcnR5KiBNdHBEZXZpY2U6OmdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGNvZGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG5ldyBNdHBQcm9wZXJ0eTsKKyAgICAgICAgcHJvcGVydHktPnJlYWQobURhdGEsIHRydWUpOworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjbGFzcyBSZWFkT2JqZWN0VGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cERldmljZSogICAgICAgICAgbURldmljZTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBtT2JqZWN0U2l6ZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgIG1Jbml0aWFsRGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1Jbml0aWFsRGF0YUxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GRDsKKworcHVibGljOgorICAgIFJlYWRPYmplY3RUaHJlYWQoTXRwRGV2aWNlKiBkZXZpY2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgICAgbU9iamVjdFNpemUob2JqZWN0U2l6ZSksCisgICAgICAgICAgbUluaXRpYWxEYXRhKE5VTEwpLAorICAgICAgICAgIG1Jbml0aWFsRGF0YUxlbmd0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5SZWFkT2JqZWN0VGhyZWFkKCkgeworICAgICAgICBpZiAobUZEID49IDApCisgICAgICAgICAgICBjbG9zZShtRkQpOworICAgICAgICBmcmVlKG1Jbml0aWFsRGF0YSk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgaW5pdCgpIHsKKyAgICAgICAgbURldmljZS0+bVJlcXVlc3QucmVzZXQoKTsKKyAgICAgICAgbURldmljZS0+bVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG1IYW5kbGUpOworICAgICAgICBpZiAobURldmljZS0+c2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUKQorICAgICAgICAgICAgICAgICYmIG1EZXZpY2UtPm1EYXRhLnJlYWREYXRhSGVhZGVyKG1EZXZpY2UtPm1FbmRwb2ludEluKSkgeworCisgICAgICAgICAgICAvLyBtRGF0YSB3aWxsIGNvbnRhaW4gaGVhZGVyIGFuZCBwb3NzaWJseSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QgZGF0YQorICAgICAgICAgICAgbUluaXRpYWxEYXRhID0gbURldmljZS0+bURhdGEuZ2V0RGF0YShtSW5pdGlhbERhdGFMZW5ndGgpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwaXBlIGZvciB0aGUgY2xpZW50IHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgaW50IHBpcGVmZFsyXTsKKyAgICAgICAgICAgIGlmIChwaXBlKHBpcGVmZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicGlwZSBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRkQgPSBwaXBlZmRbMV07CisgICAgICAgICAgICByZXR1cm4gcGlwZWZkWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgaW50IHJlbWFpbmluZyA9IG1PYmplY3RTaXplOworICAgICAgICBpZiAobUluaXRpYWxEYXRhKSB7CisgICAgICAgICAgICB3cml0ZShtRkQsIG1Jbml0aWFsRGF0YSwgbUluaXRpYWxEYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBtSW5pdGlhbERhdGFMZW5ndGg7CisgICAgICAgICAgICBmcmVlKG1Jbml0aWFsRGF0YSk7CisgICAgICAgICAgICBtSW5pdGlhbERhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBidWZmZXJbMTYzODRdOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgaW50IHJlYWRTaXplID0gKHJlbWFpbmluZyA+IHNpemVvZihidWZmZXIpID8gc2l6ZW9mKGJ1ZmZlcikgOiByZW1haW5pbmcpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZS0+bURhdGEucmVhZERhdGEobURldmljZS0+bUVuZHBvaW50SW4sIGJ1ZmZlciwgcmVhZFNpemUpOworICAgICAgICAgICAgaW50IHdyaXR0ZW47CisgICAgICAgICAgICBpZiAoY291bnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gd3JpdGUobUZELCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayBlcnJvcgorICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gbURldmljZS0+cmVhZFJlc3BvbnNlKCk7CisgICAgICAgIG1EZXZpY2UtPm1NdXRleC51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKKyAgICAvLyByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlwZSB0byByZWFkIHRoZSBvYmplY3QncyBkYXRhCitpbnQgTXRwRGV2aWNlOjpyZWFkT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKSB7CisgICAgbU11dGV4LmxvY2soKTsKKworICAgIFJlYWRPYmplY3RUaHJlYWQqIHRocmVhZCA9IG5ldyBSZWFkT2JqZWN0VGhyZWFkKHRoaXMsIGhhbmRsZSwgb2JqZWN0U2l6ZSk7CisgICAgaW50IGZkID0gdGhyZWFkLT5pbml0KCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBkZWxldGUgdGhyZWFkOworICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZWFkLT5ydW4oIlJlYWRPYmplY3RUaHJlYWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGZkOworfQorCitib29sIE10cERldmljZTo6c2VuZFJlcXVlc3QoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pIHsKKyAgICBMT0dWKCJzZW5kUmVxdWVzdDogJXNcbiIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICBtUmVxdWVzdC5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgaWYgKG1UcmFuc2FjdGlvbklEID4gMCkKKyAgICAgICAgbVJlcXVlc3Quc2V0VHJhbnNhY3Rpb25JRChtVHJhbnNhY3Rpb25JRCsrKTsKKyAgICBpbnQgcmV0ID0gbVJlcXVlc3Qud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtUmVxdWVzdC5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmREYXRhKCkgeworICAgIExPR1YoInNlbmREYXRhXG4iKTsKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKSk7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIGludCByZXQgPSBtRGF0YS53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1EYXRhLmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6cmVhZERhdGEoKSB7CisgICAgbURhdGEucmVzZXQoKTsKKyAgICBpbnQgcmV0ID0gbURhdGEucmVhZChtRW5kcG9pbnRJbik7CisgICAgTE9HVigicmVhZERhdGEgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1EYXRhLmR1bXAoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dWKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBNdHBEZXZpY2U6OndyaXRlRGF0YUhlYWRlcihNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiwgaW50IGRhdGFMZW5ndGgpIHsKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIHJldHVybiAoIW1EYXRhLndyaXRlRGF0YUhlYWRlcihtRW5kcG9pbnRPdXQsIGRhdGFMZW5ndGgpKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cERldmljZTo6cmVhZFJlc3BvbnNlKCkgeworICAgIExPR1YoInJlYWRSZXNwb25zZVxuIik7CisgICAgaW50IHJldCA9IG1SZXNwb25zZS5yZWFkKG1FbmRwb2ludEluKTsKKyAgICBpZiAocmV0ID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgbVJlc3BvbnNlLmR1bXAoKTsKKyAgICAgICAgcmV0dXJuIG1SZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPR0QoInJlYWRSZXNwb25zZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5oIGIvbWVkaWEvbXRwL010cERldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjQ5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCB1c2JfZGV2aWNlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERldmljZUluZm87CitjbGFzcyBNdHBPYmplY3RJbmZvOworY2xhc3MgTXRwU3RvcmFnZUluZm87CisKK2NsYXNzIE10cERldmljZSB7Citwcml2YXRlOgorICAgIHN0cnVjdCB1c2JfZGV2aWNlKiAgICAgIG1EZXZpY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZTsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbjsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRPdXQ7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50SW50cjsKKyAgICBNdHBEZXZpY2VJbmZvKiAgICAgICAgICBtRGV2aWNlSW5mbzsKKyAgICBNdHBQcm9wZXJ0eUxpc3QgICAgICAgICBtRGV2aWNlUHJvcGVydGllczsKKworICAgIC8vIGEgdW5pcXVlIElEIGZvciB0aGUgZGV2aWNlCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUlEOworCisgICAgLy8gY3VycmVudCBzZXNzaW9uIElECisgICAgTXRwU2Vzc2lvbklEICAgICAgICAgICAgbVNlc3Npb25JRDsKKyAgICAvLyBjdXJyZW50IHRyYW5zYWN0aW9uIElECisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICAgICAgbVRyYW5zYWN0aW9uSUQ7CisKKyAgICBNdHBSZXF1ZXN0UGFja2V0ICAgICAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgICAgICBtRGF0YTsKKyAgICBNdHBSZXNwb25zZVBhY2tldCAgICAgICBtUmVzcG9uc2U7CisKKyAgICAvLyB0byBlbnN1cmUgb25seSBvbmUgTVRQIHRyYW5zYWN0aW9uIGF0IGEgdGltZQorICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1NdXRleDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2UoKTsKKworICAgIGlubGluZSBpbnQgICAgICAgICAgICAgIGdldElEKCkgY29uc3QgeyByZXR1cm4gbUlEOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBvcGVuU2Vzc2lvbigpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGNsb3NlU2Vzc2lvbigpOworCisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgZ2V0RGV2aWNlSW5mbygpOworICAgIE10cFN0b3JhZ2VJRExpc3QqICAgICAgIGdldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBTdG9yYWdlSW5mbyogICAgICAgICBnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIE10cE9iamVjdEluZm8qICAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBzZW5kT2JqZWN0SW5mbyhNdHBPYmplY3RJbmZvKiBpbmZvKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8sIGludCBzcmNGRCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFBhcmVudChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBnZXRTdG9yYWdlSUQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKTsKKworICAgIC8vIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaXBlIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZWFkT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUmVhZE9iamVjdFRocmVhZDsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kRGF0YSgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHJlYWREYXRhKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgd3JpdGVEYXRhSGVhZGVyKE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uLCBpbnQgZGF0YUxlbmd0aCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVhZFJlc3BvbnNlKCk7CisKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5MzIyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEZXZpY2VJbmZvIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZUluZm86Ok10cERldmljZUluZm8oKQorICAgIDogICBtU3RhbmRhcmRWZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQoMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyhOVUxMKSwKKyAgICAgICAgbUZ1bmN0aW9uYWxDb2RlKDApLAorICAgICAgICBtT3BlcmF0aW9ucyhOVUxMKSwKKyAgICAgICAgbUV2ZW50cyhOVUxMKSwKKyAgICAgICAgbURldmljZVByb3BlcnRpZXMoTlVMTCksCisgICAgICAgIG1DYXB0dXJlRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbVBsYXliYWNrRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbU1hbnVmYWN0dXJlcihOVUxMKSwKKyAgICAgICAgbU1vZGVsKE5VTEwpLAorICAgICAgICBtVmVyc2lvbihOVUxMKSwKKyAgICAgICAgbVNlcmlhbChOVUxMKQoreworfQorCitNdHBEZXZpY2VJbmZvOjp+TXRwRGV2aWNlSW5mbygpIHsKKyAgICBpZiAobVZlbmRvckV4dGVuc2lvbkRlc2MpCisgICAgICAgIGZyZWUobVZlbmRvckV4dGVuc2lvbkRlc2MpOworICAgIGRlbGV0ZSBtT3BlcmF0aW9uczsKKyAgICBkZWxldGUgbUV2ZW50czsKKyAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXM7CisgICAgZGVsZXRlIG1DYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgbVBsYXliYWNrRm9ybWF0czsKKyAgICBpZiAobU1hbnVmYWN0dXJlcikKKyAgICAgICAgZnJlZShtTWFudWZhY3R1cmVyKTsKKyAgICBpZiAobU1vZGVsKQorICAgICAgICBmcmVlKG1Nb2RlbCk7CisgICAgaWYgKG1WZXJzaW9uKQorICAgICAgICBmcmVlKG1WZXJzaW9uKTsKKyAgICBpZiAobVNlcmlhbCkKKyAgICAgICAgZnJlZShtU2VyaWFsKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisKKyAgICAvLyByZWFkIHRoZSBkZXZpY2UgaW5mbworICAgIG1TdGFuZGFyZFZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVZlbmRvckV4dGVuc2lvbklEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIG1GdW5jdGlvbmFsQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtT3BlcmF0aW9ucyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUV2ZW50cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbURldmljZVByb3BlcnRpZXMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1DYXB0dXJlRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbVBsYXliYWNrRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1hbnVmYWN0dXJlciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Nb2RlbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZXJzaW9uID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVNlcmlhbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HVigiRGV2aWNlIEluZm86XG5cdG1TdGFuZGFyZFZlcnNpb246ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25JRDogJWRcblx0bVZlbmRvckV4dGVuc2lvblZlcnNpb255OiAlZFxuIiwKKyAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb24sIG1WZW5kb3JFeHRlbnNpb25JRCwgbVZlbmRvckV4dGVuc2lvblZlcnNpb24pOworICAgIExPR1YoIlx0bVZlbmRvckV4dGVuc2lvbkRlc2M6ICVzXG5cdG1GdW5jdGlvbmFsQ29kZTogJWRcblx0bU1hbnVmYWN0dXJlcjogJXNcblx0bU1vZGVsOiAlc1xuXHRtVmVyc2lvbjogJXNcblx0bVNlcmlhbDogJXNcbiIsCisgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYywgbUZ1bmN0aW9uYWxDb2RlLCBtTWFudWZhY3R1cmVyLCBtTW9kZWwsIG1WZXJzaW9uLCBtU2VyaWFsKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0lORk9fSAorI2RlZmluZSBfTVRQX0RFVklDRV9JTkZPX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwRGV2aWNlSW5mbyB7CitwdWJsaWM6CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2M7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZ1bmN0aW9uYWxDb2RlOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1PcGVyYXRpb25zOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1FdmVudHM7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgbURldmljZVByb3BlcnRpZXM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbUNhcHR1cmVGb3JtYXRzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1hbnVmYWN0dXJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTW9kZWw7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVNlcmlhbDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8oKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzQ1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cEV2ZW50UGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWZkZWYgTVRQX0RFVklDRQorI2luY2x1ZGUgPGxpbnV4L3VzYi9mX210cC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJNdHBFdmVudFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cEV2ZW50UGFja2V0OjpNdHBFdmVudFBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cEV2ZW50UGFja2V0Ojp+TXRwRXZlbnRQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwRXZlbnRQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHN0cnVjdCBtdHBfZXZlbnQgICAgZXZlbnQ7CisKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9FVkVOVCk7CisKKyAgICBldmVudC5kYXRhID0gbUJ1ZmZlcjsKKyAgICBldmVudC5sZW5ndGggPSBtUGFja2V0U2l6ZTsKKyAgICBpbnQgcmV0ID0gOjppb2N0bChmZCwgTVRQX1NFTkRfRVZFTlQsICh1bnNpZ25lZCBsb25nKSZldmVudCk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CitpbnQgTXRwRXZlbnRQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZTg2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfRVZFTlRfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9FVkVOVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRXZlbnRQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwRXZlbnRQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBFdmVudFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cEV2ZW50Q29kZSAgICAgZ2V0RXZlbnRDb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgc2V0RXZlbnRDb2RlKE10cEV2ZW50Q29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9FVkVOVF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDMwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cE9iamVjdEluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBPYmplY3RJbmZvOjpNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpCisgICAgOiAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgbVN0b3JhZ2VJRCgwKSwKKyAgICAgICAgbUZvcm1hdCgwKSwKKyAgICAgICAgbVByb3RlY3Rpb25TdGF0dXMoMCksCisgICAgICAgIG1Db21wcmVzc2VkU2l6ZSgwKSwKKyAgICAgICAgbVRodW1iRm9ybWF0KDApLAorICAgICAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSgwKSwKKyAgICAgICAgbVRodW1iUGl4V2lkdGgoMCksCisgICAgICAgIG1UaHVtYlBpeEhlaWdodCgwKSwKKyAgICAgICAgbUltYWdlUGl4V2lkdGgoMCksCisgICAgICAgIG1JbWFnZVBpeEhlaWdodCgwKSwKKyAgICAgICAgbUltYWdlUGl4RGVwdGgoMCksCisgICAgICAgIG1QYXJlbnQoMCksCisgICAgICAgIG1Bc3NvY2lhdGlvblR5cGUoMCksCisgICAgICAgIG1Bc3NvY2lhdGlvbkRlc2MoMCksCisgICAgICAgIG1TZXF1ZW5jZU51bWJlcigwKSwKKyAgICAgICAgbU5hbWUoTlVMTCksCisgICAgICAgIG1EYXRlQ3JlYXRlZCgwKSwKKyAgICAgICAgbURhdGVNb2RpZmllZCgwKSwKKyAgICAgICAgbUtleXdvcmRzKE5VTEwpCit7Cit9CisKK010cE9iamVjdEluZm86On5NdHBPYmplY3RJbmZvKCkgeworICAgIGlmIChtTmFtZSkKKyAgICAgICAgZnJlZShtTmFtZSk7CisgICAgaWYgKG1LZXl3b3JkcykKKyAgICAgICAgZnJlZShtS2V5d29yZHMpOworfQorCit2b2lkIE10cE9iamVjdEluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKyAgICB0aW1lX3QgdGltZTsKKworICAgIG1TdG9yYWdlSUQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtUHJvdGVjdGlvblN0YXR1cyA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQ29tcHJlc3NlZFNpemUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iRm9ybWF0ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1UaHVtYkNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYlBpeFdpZHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYlBpeEhlaWdodCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4RGVwdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVBhcmVudCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtQXNzb2NpYXRpb25UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Bc3NvY2lhdGlvbkRlc2MgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVNlcXVlbmNlTnVtYmVyID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1OYW1lID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBpZiAocGFyc2VEYXRlVGltZSgoY29uc3QgY2hhciopc3RyaW5nLCB0aW1lKSkKKyAgICAgICAgbURhdGVDcmVhdGVkID0gdGltZTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBpZiAocGFyc2VEYXRlVGltZSgoY29uc3QgY2hhciopc3RyaW5nLCB0aW1lKSkKKyAgICAgICAgbURhdGVNb2RpZmllZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbUtleXdvcmRzID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpwcmludCgpIHsKKyAgICBMT0dEKCJNdHBPYmplY3QgSW5mbyAlMDhYOiAlc1xuIiwgbUhhbmRsZSwgbU5hbWUpOworICAgIExPR0QoIiAgbVN0b3JhZ2VJRDogJTA4WCBtRm9ybWF0OiAlMDRYIG1Qcm90ZWN0aW9uU3RhdHVzOiAlZFxuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1Gb3JtYXQsIG1Qcm90ZWN0aW9uU3RhdHVzKTsKKyAgICBMT0dEKCIgIG1Db21wcmVzc2VkU2l6ZTogJWQgbVRodW1iRm9ybWF0OiAlMDRYIG1UaHVtYkNvbXByZXNzZWRTaXplOiAlZFxuIiwKKyAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZSwgbUZvcm1hdCwgbVRodW1iQ29tcHJlc3NlZFNpemUpOworICAgIExPR0QoIiAgbVRodW1iUGl4V2lkdGg6ICVkIG1UaHVtYlBpeEhlaWdodDogJWRcbiIsIG1UaHVtYlBpeFdpZHRoLCBtVGh1bWJQaXhIZWlnaHQpOworICAgIExPR0QoIiAgbUltYWdlUGl4V2lkdGg6ICVkIG1JbWFnZVBpeEhlaWdodDogJWQgbUltYWdlUGl4RGVwdGg6ICVkXG4iLAorICAgICAgICAgICAgbUltYWdlUGl4V2lkdGgsIG1JbWFnZVBpeEhlaWdodCwgbUltYWdlUGl4RGVwdGgpOworICAgIExPR0QoIiAgbVBhcmVudDogJTA4WCBtQXNzb2NpYXRpb25UeXBlOiAlMDRYIG1Bc3NvY2lhdGlvbkRlc2M6ICUwNFhcbiIsCisgICAgICAgICAgICBtUGFyZW50LCBtQXNzb2NpYXRpb25UeXBlLCBtQXNzb2NpYXRpb25EZXNjKTsKKyAgICBMT0dEKCIgIG1TZXF1ZW5jZU51bWJlcjogJWQgbURhdGVDcmVhdGVkOiAlZCBtRGF0ZU1vZGlmaWVkOiAlZCBtS2V5d29yZHM6ICVzXG4iLAorICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyLCBtRGF0ZUNyZWF0ZWQsIG1EYXRlTW9kaWZpZWQsIG1LZXl3b3Jkcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0NDljYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9PQkpFQ1RfSU5GT19ICisjZGVmaW5lIF9NVFBfT0JKRUNUX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBPYmplY3RJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbUZvcm1hdDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbVRodW1iRm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYlBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4SGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4RGVwdGg7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtUGFyZW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFzc29jaWF0aW9uVHlwZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvbkRlc2M7CisgICAgdWludDMyX3QgICAgICAgICAgICBtU2VxdWVuY2VOdW1iZXI7CisgICAgY2hhciogICAgICAgICAgICAgICBtTmFtZTsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlQ3JlYXRlZDsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlTW9kaWZpZWQ7CisgICAgY2hhciogICAgICAgICAgICAgICBtS2V5d29yZHM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwT2JqZWN0SW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9PQkpFQ1RfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmY4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUGFja2V0IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFBhY2tldDo6TXRwUGFja2V0KGludCBidWZmZXJTaXplKQorICAgIDogICBtQnVmZmVyKE5VTEwpLAorICAgICAgICBtQnVmZmVyU2l6ZShidWZmZXJTaXplKSwKKyAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQoYnVmZmVyU2l6ZSksCisgICAgICAgIG1QYWNrZXRTaXplKDApCit7CisgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGJ1ZmZlclNpemUpOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5ISIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworTXRwUGFja2V0Ojp+TXRwUGFja2V0KCkgeworICAgIGlmIChtQnVmZmVyKQorICAgICAgICBmcmVlKG1CdWZmZXIpOworfQorCit2b2lkIE10cFBhY2tldDo6cmVzZXQoKSB7CisgICAgYWxsb2NhdGUoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgbVBhY2tldFNpemUgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIG1lbXNldChtQnVmZmVyLCAwLCBtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjphbGxvY2F0ZShpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA+IG1CdWZmZXJTaXplKSB7CisgICAgICAgIGludCBuZXdMZW5ndGggPSBsZW5ndGggKyBtQWxsb2NhdGlvbkluY3JlbWVudDsKKyAgICAgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopcmVhbGxvYyhtQnVmZmVyLCBuZXdMZW5ndGgpOworICAgICAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkhIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gbmV3TGVuZ3RoOworICAgIH0KK30KKwordm9pZCBNdHBQYWNrZXQ6OmR1bXAoKSB7CisjZGVmaW5lIERVTVBfQllURVNfUEVSX1JPVyAgMTYKKyAgICBjaGFyIGJ1ZmZlcls1MDBdOworICAgIGNoYXIqIGJ1ZnB0ciA9IGJ1ZmZlcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBhY2tldFNpemU7IGkrKykgeworICAgICAgICBzcHJpbnRmKGJ1ZnB0ciwgIiUwMlggIiwgbUJ1ZmZlcltpXSk7CisgICAgICAgIGJ1ZnB0ciArPSBzdHJsZW4oYnVmcHRyKTsKKyAgICAgICAgaWYgKGkgJSBEVU1QX0JZVEVTX1BFUl9ST1cgPT0gKERVTVBfQllURVNfUEVSX1JPVyAtIDEpKSB7CisgICAgICAgICAgICBMT0dWKCIlcyIsIGJ1ZmZlcik7CisgICAgICAgICAgICBidWZwdHIgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZnB0ciAhPSBidWZmZXIpIHsKKyAgICAgICAgLy8gcHJpbnQgbGFzdCBsaW5lCisgICAgICAgIExPR1YoIiVzIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HVigiXG4iKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfCAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit1aW50MzJfdCBNdHBQYWNrZXQ6OmdldFVJbnQzMihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCkgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpICB8ICh1aW50MzJfdCltQnVmZmVyW29mZnNldF07Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpIHsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworfQorCit1aW50MTZfdCBNdHBQYWNrZXQ6OmdldENvbnRhaW5lckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldENvbnRhaW5lckNvZGUodWludDE2X3QgY29kZSkgeworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VULCBjb2RlKTsKK30KKworTXRwVHJhbnNhY3Rpb25JRCBNdHBQYWNrZXQ6OmdldFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlcXVlc3RQYWNrZXQ6OmdldFBhcmFtZXRlciIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICsgKGluZGV4IC0gMSkgKiBzaXplb2YodWludDMyX3QpKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlc3BvbnNlUGFja2V0OjpzZXRQYXJhbWV0ZXIiLCBpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9mZnNldCA9IE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpKQorICAgICAgICBtUGFja2V0U2l6ZSA9IG9mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgICAgcHV0VUludDMyKG9mZnNldCwgdmFsdWUpOworfQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBQYWNrZXQ6OnRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpZiAodXNiX2VuZHBvaW50X3F1ZXVlKGVwLCBidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgTE9HRSgidXNiX2VuZHBvaW50X3F1ZXVlIGZhaWxlZCwgZXJybm86ICVkIiwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBlcF9udW07CisgICAgcmV0dXJuIHVzYl9lbmRwb2ludF93YWl0KHVzYl9lbmRwb2ludF9nZXRfZGV2aWNlKGVwKSwgJmVwX251bSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuaCBiL21lZGlhL210cC9NdHBQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworc3RydWN0IHVzYl9lbmRwb2ludDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBQYWNrZXQgeworCitwcm90ZWN0ZWQ6CisgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOworICAgIC8vIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHdoZW4gcmVzaXppbmcgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgLy8gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUGFja2V0KGludCBidWZmZXJTaXplKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQYWNrZXQoKTsKKworICAgIC8vIHNldHMgcGFja2V0IHNpemUgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHNpemUgYW5kIHNldHMgYnVmZmVyIHRvIHplcm8KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFsbG9jYXRlKGludCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcCgpOworCisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRDb250YWluZXJDb2RlKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpOworCisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICBnZXRUcmFuc2FjdGlvbklEKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICB0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJhZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSgpCisgICAgOiAgIG1Db2RlKDApLAorICAgICAgICBtVHlwZSgwKSwKKyAgICAgICAgbVdyaXRlYWJsZShmYWxzZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NaW5pbXVtVmFsdWUuc3RyID0gTlVMTDsKKyAgICBtTWF4aW11bVZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKQorICAgIDogICBtQ29kZShwcm9wQ29kZSksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtV3JpdGVhYmxlKHdyaXRlYWJsZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtZW1zZXQoJm1EZWZhdWx0VmFsdWUsIDAsIHNpemVvZihtRGVmYXVsdFZhbHVlKSk7CisgICAgbWVtc2V0KCZtQ3VycmVudFZhbHVlLCAwLCBzaXplb2YobUN1cnJlbnRWYWx1ZSkpOworICAgIG1lbXNldCgmbU1pbmltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NaW5pbXVtVmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NYXhpbXVtVmFsdWUsIDAsIHNpemVvZihtTWF4aW11bVZhbHVlKSk7CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTggPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudTggPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTE2ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51MTYgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTMyID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51MzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTY0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51NjQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSIsIHR5cGUpOworICAgICAgICB9CisgICAgfQorfQorCitNdHBQcm9wZXJ0eTo6fk10cFByb3BlcnR5KCkgeworICAgIGlmIChtVHlwZSA9PSBNVFBfVFlQRV9TVFIpIHsKKyAgICAgICAgLy8gZnJlZSBhbGwgc3RyaW5ncworICAgICAgICBmcmVlKG1EZWZhdWx0VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtQ3VycmVudFZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1pbmltdW1WYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1NYXhpbXVtVmFsdWUuc3RyKTsKKyAgICAgICAgaWYgKG1EZWZhdWx0QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURlZmF1bHRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobURlZmF1bHRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudEFycmF5VmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DdXJyZW50QXJyYXlMZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1DdXJyZW50QXJyYXlWYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUVudW1WYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVudW1MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1FbnVtVmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlW10gbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBkZWxldGVbXSBtQ3VycmVudEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1FbnVtVmFsdWVzOworfQorCit2b2lkIE10cFByb3BlcnR5OjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCwgYm9vbCBkZXZpY2VQcm9wKSB7CisKKyAgICBtQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtV3JpdGVhYmxlID0gKHBhY2tldC5nZXRVSW50OCgpID09IDEpOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtQ3VycmVudEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICBpZiAoZGV2aWNlUHJvcCkKKyAgICAgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKKyAgICB9CisgICAgbUdyb3VwQ29kZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybUZsYWcgPSBwYWNrZXQuZ2V0VUludDgoKTsKKworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIG1FbnVtTGVuZ3RoID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICBtRW51bVZhbHVlcyA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW21FbnVtTGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKworLy8gRklYTUUgLSBvbmx5IHdvcmtzIGZvciBvYmplY3QgcHJvcGVydGllcwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGUoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgcGFja2V0LnB1dFVJbnQxNihtQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQxNihtVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Xcml0ZWFibGUgPyAxIDogMCk7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheVZhbHVlcywgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICB9CisgICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKKyAgICBwYWNrZXQucHV0VUludDgobUZvcm1GbGFnKTsKKyAgICBpZiAobUZvcm1GbGFnID09IGtGb3JtUmFuZ2UpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtU3RlcFNpemUpOworICAgIH0gZWxzZSBpZiAobUZvcm1GbGFnID09IGtGb3JtRW51bSkgeworICAgICAgICBwYWNrZXQucHV0VUludDE2KG1FbnVtTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1FbnVtVmFsdWVzW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnByaW50KCkgeworICAgIExPR1YoIk10cFByb3BlcnR5ICUwNFhcbiIsIG1Db2RlKTsKKyAgICBMT0dWKCIgICAgdHlwZSAlMDRYXG4iLCBtVHlwZSk7CisgICAgTE9HVigiICAgIHdyaXRlYWJsZSAlc1xuIiwgKG1Xcml0ZWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgdmFsdWUuaTggPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICAgICAgdmFsdWUudTggPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgICAgIHZhbHVlLmkxNiA9IHBhY2tldC5nZXRJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51MTYgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS5pMzIgPSBwYWNrZXQuZ2V0SW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICAgICAgdmFsdWUudTMyID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgdmFsdWUuaTY0ID0gcGFja2V0LmdldEludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnU2NCA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldEludDEyOCh2YWx1ZS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0VUludDEyOCh2YWx1ZS51MTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nQnVmZmVyKTsKKyAgICAgICAgICAgIHZhbHVlLnN0ciA9IHN0cmR1cChzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgodmFsdWUuaTgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KHZhbHVlLnU4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNih2YWx1ZS5pMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KHZhbHVlLnUxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIodmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMih2YWx1ZS51MzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KHZhbHVlLmk2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQodmFsdWUudTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOCh2YWx1ZS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDEyOCh2YWx1ZS51MTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgICAgIGlmICh2YWx1ZS5zdHIpCisgICAgICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyh2YWx1ZS5zdHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBhY2tldC5wdXRFbXB0eVN0cmluZygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6d3JpdGVWYWx1ZSIsIG1UeXBlKTsKKyAgICB9Cit9CisKK010cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgeworICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZUFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSogdmFsdWVzLCBpbnQgbGVuZ3RoKSB7CisgICAgcGFja2V0LnB1dFVJbnQzMihsZW5ndGgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCB2YWx1ZXNbaV0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmggYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI0ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QUk9QRVJUWV9ICisjZGVmaW5lIF9NVFBfUFJPUEVSVFlfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBQcm9wZXJ0eSB7CitwdWJsaWM6CisgICAgTXRwUHJvcGVydHlDb2RlICAgICBtQ29kZTsKKyAgICBNdHBEYXRhVHlwZSAgICAgICAgIG1UeXBlOworICAgIGJvb2wgICAgICAgICAgICAgICAgbVdyaXRlYWJsZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1EZWZhdWx0VmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtQ3VycmVudFZhbHVlOworCisgICAgLy8gZm9yIGFycmF5IHR5cGVzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtQ3VycmVudEFycmF5VmFsdWVzOworCisgICAgZW51bSB7CisgICAgICAgIGtGb3JtTm9uZSA9IDAsCisgICAgICAgIGtGb3JtUmFuZ2UgPSAxLAorICAgICAgICBrRm9ybUVudW0gPSAyLAorICAgIH07CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Hcm91cENvZGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybUZsYWc7CisKKyAgICAvLyBmb3IgcmFuZ2UgZm9ybQorICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1pbmltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NYXhpbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtU3RlcFNpemU7CisKKyAgICAvLyBmb3IgZW51bSBmb3JtCisgICAgaW50ICAgICAgICAgICAgICAgICBtRW51bUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1FbnVtVmFsdWVzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkoTXRwUHJvcGVydHlDb2RlIHByb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZWFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gMCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUHJvcGVydHkoKTsKKworICAgIGlubGluZSBNdHBQcm9wZXJ0eUNvZGUgZ2V0UHJvcGVydHlDb2RlKCkgY29uc3QgeyByZXR1cm4gbUNvZGU7IH0KKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGJvb2wgZGV2aWNlUHJvcCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworCitwcml2YXRlOgorICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUFJPUEVSVFlfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2U1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVxdWVzdFBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXF1ZXN0UGFja2V0OjpNdHBSZXF1ZXN0UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwUmVxdWVzdFBhY2tldDo6fk10cFJlcXVlc3RQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6cmVhZChpbnQgZmQpIHsKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50IChob3N0IG1vZGUpCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApCit7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCk7CisgICAgcmV0dXJuIHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtUGFja2V0U2l6ZSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlcXVlc3RQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlcXVlc3RQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyBmaWxsIG91ciBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBPcGVyYXRpb25Db2RlICAgIGdldE9wZXJhdGlvbkNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVFVRVNUX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWY3MTRlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVzcG9uc2VQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlc3BvbnNlUGFja2V0OjpNdHBSZXNwb25zZVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlc3BvbnNlUGFja2V0Ojp+TXRwUmVzcG9uc2VQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cFJlc3BvbnNlUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Y4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlc3BvbnNlUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVzcG9uc2VQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBSZXNwb25zZUNvZGUgICAgICBnZXRSZXNwb25zZUNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VDb2RlKE10cFJlc3BvbnNlQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVNQT05TRV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFiZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgTXRwT3BlcmF0aW9uQ29kZSBrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CLAorICAgIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFLAorLy8gICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OLAorLy8gICAgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOLAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQywKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFLAorLy8gICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NLSVAsCit9OworCitzdGF0aWMgY29uc3QgTXRwRXZlbnRDb2RlIGtTdXBwb3J0ZWRFdmVudENvZGVzW10gPSB7CisgICAgTVRQX0VWRU5UX09CSkVDVF9BRERFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCit9OworCitNdHBTZXJ2ZXI6Ok10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSkKKyAgICA6ICAgbUZEKGZkKSwKKyAgICAgICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgbUZpbGVHcm91cChmaWxlR3JvdXApLAorICAgICAgICBtRmlsZVBlcm1pc3Npb24oZmlsZVBlcm0pLAorICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbihkaXJlY3RvcnlQZXJtKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCgwKSwKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSgwKQoreworICAgIGluaXRPYmplY3RQcm9wZXJ0aWVzKCk7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKKyAgICBpbnQgZmQgPSBtRkQ7CisKKyAgICBMT0dWKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInJlcXVlc3QgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgICAgICBNdHBUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uID0gbVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpOworCisgICAgICAgIExPR1YoIm9wZXJhdGlvbjogJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgIG1SZXF1ZXN0LmR1bXAoKTsKKworICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGdlbmVyYWxpemUgdGhpcworICAgICAgICBib29sIGRhdGFJbiA9IChvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyk7CisgICAgICAgIGlmIChkYXRhSW4pIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtRGF0YS5yZWFkKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoInJlY2VpdmVkIGRhdGE6Iik7CisgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhbmRsZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaWYgKCFkYXRhSW4gJiYgbURhdGEuaGFzRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICAgIExPR1YoInNlbmRpbmcgZGF0YToiKTsKKyAgICAgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUoZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIHJlc3BvbnNlICUwNFgiLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK010cFByb3BlcnR5KiBNdHBTZXJ2ZXI6OmdldE9iamVjdFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU9iamVjdFByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbU9iamVjdFByb3BlcnRpZXNbaV07CisgICAgICAgIGlmIChwcm9wZXJ0eS0+Z2V0UHJvcGVydHlDb2RlKCkgPT0gcHJvcENvZGUpCisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBQcm9wZXJ0eSogTXRwU2VydmVyOjpnZXREZXZpY2VQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EZXZpY2VQcm9wZXJ0aWVzW2ldOworICAgICAgICBpZiAocHJvcGVydHktPmdldFByb3BlcnR5Q29kZSgpID09IHByb3BDb2RlKQorICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0QWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9BRERFRCk7CisgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgICAgICBMT0dEKCJtRXZlbnQud3JpdGUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgfQorfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgTE9HRCgic2VuZE9iamVjdFJlbW92ZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjppbml0T2JqZWN0UHJvcGVydGllcygpIHsKKyAgICBtT2JqZWN0UHJvcGVydGllcy5wdXNoKG5ldyBNdHBQcm9wZXJ0eShNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgTVRQX1RZUEVfVUlOVDMyKSk7CisgICAgbU9iamVjdFByb3BlcnRpZXMucHVzaChuZXcgTXRwUHJvcGVydHkoTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsIE1UUF9UWVBFX1VJTlQxNikpOworICAgIG1PYmplY3RQcm9wZXJ0aWVzLnB1c2gobmV3IE10cFByb3BlcnR5KE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgTVRQX1RZUEVfVUlOVDY0KSk7CisgICAgbU9iamVjdFByb3BlcnRpZXMucHVzaChuZXcgTXRwUHJvcGVydHkoTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsIE1UUF9UWVBFX1NUUikpOworICAgIG1PYmplY3RQcm9wZXJ0aWVzLnB1c2gobmV3IE10cFByb3BlcnR5KE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULCBNVFBfVFlQRV9VSU5UMzIpKTsKK30KKworYm9vbCBNdHBTZXJ2ZXI6OmhhbmRsZVJlcXVlc3QoKSB7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3BvbnNlOworCisgICAgbVJlc3BvbnNlLnJlc2V0KCk7CisKKyAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBMT0dFKCJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgfQorCisgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9PcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0Nsb3NlU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0TnVtT2JqZWN0cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisgICAgY2hhciBwcm9wX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBwbGF5YmFja0Zvcm1hdHMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGNhcHR1cmVGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZGV2aWNlUHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkRXZlbnRDb2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkRXZlbnRDb2RlcykgLyBzaXplb2YodWludDE2X3QpKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoZGV2aWNlUHJvcGVydGllcyk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoY2FwdHVyZUZvcm1hdHMpOyAvLyBDYXB0dXJlIEZvcm1hdHMKKyAgICBtRGF0YS5wdXRBVUludDE2KHBsYXliYWNrRm9ybWF0cyk7ICAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICBkZWxldGUgcGxheWJhY2tGb3JtYXRzOworICAgIGRlbGV0ZSBjYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgZGV2aWNlUHJvcGVydGllczsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvT3BlblNlc3Npb24oKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIG1TZXNzaW9uSUQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOOworICAgIH0KKyAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9DbG9zZVNlc3Npb24oKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtU2Vzc2lvbk9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJRHMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKworICAgIGludCBjb3VudCA9IG1TdG9yYWdlcy5zaXplKCk7CisgICAgbURhdGEucHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIG1EYXRhLnB1dFVJbnQzMihtU3RvcmFnZXNbaV0tPmdldFN0b3JhZ2VJRCgpKTsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0U3RvcmFnZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworCisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgaWQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2UoaWQpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0VHlwZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0RmlsZVN5c3RlbVR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEFjY2Vzc0NhcGFiaWxpdHkoKSk7CisgICAgbURhdGEucHV0VUludDY0KHN0b3JhZ2UtPmdldE1heENhcGFjaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRGcmVlU3BhY2UoKSk7CisgICAgbURhdGEucHV0VUludDMyKDEwMjQqMTAyNCoxMDI0KTsgLy8gRnJlZSBTcGFjZSBpbiBPYmplY3RzCisgICAgc3RyaW5nLnNldChzdG9yYWdlLT5nZXREZXNjcmlwdGlvbigpKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtRGF0YS5wdXRFbXB0eVN0cmluZygpOyAgIC8vIFZvbHVtZSBJZGVudGlmaWVyCisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIHByb3BlcnRpZXMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoZm9ybWF0KTsKKyAgICBtRGF0YS5wdXRBVUludDE2KHByb3BlcnRpZXMpOworICAgIGRlbGV0ZSBwcm9wZXJ0aWVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0SGFuZGxlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3IgYWxsIHN0b3JhZ2UKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOyAgICAgIC8vIDAgZm9yIGFsbCBmb3JtYXRzCisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBvYmplY3RzIHdpdGggbm8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cz8KKyAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgIHBhcmVudCA9IDA7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXROdW1PYmplY3RzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgcGFyZW50ID0gMDsKKworICAgIGludCBjb3VudCA9IG1EYXRhYmFzZS0+Z2V0TnVtT2JqZWN0cyhzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBpZiAoY291bnQgPj0gMCkgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIDApOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UmVmZXJlbmNlcyhoYW5kbGUpOworICAgIGlmICghaGFuZGxlcykgeworICAgICAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKyAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcyA9IG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gbURhdGFiYXNlLT5zZXRPYmplY3RSZWZlcmVuY2VzKGhhbmRsZSwgcmVmZXJlbmNlcyk7CisgICAgZGVsZXRlIHJlZmVyZW5jZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5KGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRGF0YS53cml0ZURhdGFIZWFkZXIobUZELCBmaWxlTGVuZ3RoKTsKKworICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBjbG9zZShtZnIuZmQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3RJbmZvKCkgeworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IE1UUF9QQVJFTlRfUk9PVCkgeworICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgICAgICBwYXJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gcmVhZCBvbmx5IHRoZSBmaWVsZHMgd2UgbmVlZAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc3RvcmFnZSBJRAorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSA9IG1EYXRhLmdldFVJbnQzMigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gdGh1bWIgZm9ybWF0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHBhcmVudAorICAgIHVpbnQxNl90IGFzc29jaWF0aW9uVHlwZSA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIHVpbnQzMl90IGFzc29jaWF0aW9uRGVzYyA9IG1EYXRhLmdldFVJbnQzMigpOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHNlcXVlbmNlIG51bWJlcgorICAgIE10cFN0cmluZ0J1ZmZlciBuYW1lLCBjcmVhdGVkLCBtb2RpZmllZDsKKyAgICBtRGF0YS5nZXRTdHJpbmcobmFtZSk7ICAgIC8vIGZpbGUgbmFtZQorICAgIG1EYXRhLmdldFN0cmluZyhjcmVhdGVkKTsgICAgICAvLyBkYXRlIGNyZWF0ZWQKKyAgICBtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpOyAgICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIC8vIGtleXdvcmRzIGZvbGxvdworCisgICAgdGltZV90IG1vZGlmaWVkVGltZTsKKyAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCisgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCisgICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgKHBhcmVudCA9PSAwID8gMHhGRkZGRkZGRjogcGFyZW50KSk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgbW9kZV90IG1hc2s7CisgICAgaW50IHJldDsKKworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBMT0dFKCJFeHBlY3RlZCBTZW5kT2JqZWN0SW5mbyBiZWZvcmUgU2VuZE9iamVjdCIpOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk87CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICByZXQgPSBtRGF0YS5yZWFkRGF0YUhlYWRlcihtRkQpOworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgorCisgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjaworICAgIG1EYXRhLnJlc2V0KCk7CisKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGZjaG93bihtZnIuZmQsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKKyAgICAvLyBzZXQgcGVybWlzc2lvbnMKKyAgICBtYXNrID0gdW1hc2soMCk7CisgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKKyAgICB1bWFzayhtYXNrKTsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisKKyAgICBMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHVubGluayhtU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworZG9uZToKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIC8vIEZJWE1FIC0gc3VwcG9ydCBkZWxldGluZyBhbGwgb2JqZWN0cyBpZiBoYW5kbGUgaXMgMHhGRkZGRkZGRgorICAgIC8vIEZJWE1FIC0gaW1wbGVtZW50IGRlbGV0aW5nIG9iamVjdHMgYnkgZm9ybWF0CisgICAgLy8gRklYTUUgLSBoYW5kbGUgbm9uLWVtcHR5IGRpcmVjdG9yaWVzCisKKyAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgZmlsZVBhdGgsIGZpbGVMZW5ndGgpOworICAgIGlmIChyZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIExPR1YoImRlbGV0aW5nICVzIiwgKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisgICAgICAgIC8vIG9uZSBvZiB0aGVzZSBzaG91bGQgd29yaworICAgICAgICBybWRpcigoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgdW5saW5rKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICByZXR1cm4gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXRPYmplY3RQcm9wZXJ0eShwcm9wQ29kZSk7CisgICAgaWYgKCFwcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgcHJvcGVydHktPndyaXRlKG1EYXRhKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2NmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU0VSVkVSX0gKKyNkZWZpbmUgX01UUF9TRVJWRVJfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgTXRwUHJvcGVydHk7CitjbGFzcyBNdHBTdG9yYWdlOworCitjbGFzcyBNdHBTZXJ2ZXIgeworCitwcml2YXRlOgorICAgIC8vIGZpbGUgZGVzY3JpcHRvciBmb3IgTVRQIGtlcm5lbCBkcml2ZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GRDsKKworICAgIE10cERhdGFiYXNlKiAgICAgICAgbURhdGFiYXNlOworCisgICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKKyAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOworICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlc3Npb25PcGVuOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgbVJlc3BvbnNlOworICAgIE10cEV2ZW50UGFja2V0ICAgICAgbUV2ZW50OworCisgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CisKKyAgICBNdHBQcm9wZXJ0eUxpc3QgICAgIG1PYmplY3RQcm9wZXJ0aWVzOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgbURldmljZVByb3BlcnRpZXM7CisKKyAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1TZW5kT2JqZWN0Rm9ybWF0OworICAgIE10cFN0cmluZyAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQorICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcnVuKCk7CisKKyAgICBNdHBQcm9wZXJ0eSogICAgICAgIGdldE9iamVjdFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSk7CisgICAgTXRwUHJvcGVydHkqICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGluaXRPYmplY3RQcm9wZXJ0aWVzKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb09wZW5TZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0Nsb3NlU2Vzc2lvbigpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRTdG9yYWdlSURzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0TnVtT2JqZWN0cygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvRGVsZXRlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BEZXNjKCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2YxODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpCisgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAorICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAorICAgICAgICBtRGF0YWJhc2UoZGIpLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCkKK3sKKyAgICBMT0dEKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2I5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9ICisjZGVmaW5lIF9NVFBfU1RPUkFHRV9ICisKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU3RvcmFnZSB7CisKK3ByaXZhdGU6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBtRmlsZVBhdGg7CisgICAgTXRwRGF0YWJhc2UqICAgICAgICAgICAgbURhdGFiYXNlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOworCisgICAgaW5saW5lIE10cFN0b3JhZ2VJRCAgICAgZ2V0U3RvcmFnZUlEKCkgY29uc3QgeyByZXR1cm4gbVN0b3JhZ2VJRDsgfQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEFjY2Vzc0NhcGFiaWxpdHkoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBnZXRNYXhDYXBhY2l0eSgpOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldEZyZWVTcGFjZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IGNoYXIqICAgICAgZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlUGF0aDsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY0YWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZUluZm86Ok10cFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBpZCkKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1TdG9yYWdlVHlwZSgwKSwKKyAgICAgICAgbUZpbGVTeXN0ZW1UeXBlKDApLAorICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eSgwKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApLAorICAgICAgICBtRnJlZVNwYWNlQnl0ZXMoMCksCisgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzKDApLAorICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgICBtVm9sdW1lSWRlbnRpZmllcihOVUxMKQoreworfQorCitNdHBTdG9yYWdlSW5mbzo6fk10cFN0b3JhZ2VJbmZvKCkgeworICAgIGlmIChtU3RvcmFnZURlc2NyaXB0aW9uKQorICAgICAgICBmcmVlKG1TdG9yYWdlRGVzY3JpcHRpb24pOworICAgIGlmIChtVm9sdW1lSWRlbnRpZmllcikKKyAgICAgICAgZnJlZShtVm9sdW1lSWRlbnRpZmllcik7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0b3JhZ2VUeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1GaWxlU3lzdGVtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQWNjZXNzQ2FwYWJpbGl0eSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtTWF4Q2FwYWNpdHkgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZUJ5dGVzID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgIG1GcmVlU3BhY2VPYmplY3RzID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TdG9yYWdlRGVzY3JpcHRpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVm9sdW1lSWRlbnRpZmllciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgeworICAgIExPR0QoIlN0b3JhZ2UgSW5mbyAlMDhYOlxuXHRtU3RvcmFnZVR5cGU6ICVkXG5cdG1GaWxlU3lzdGVtVHlwZTogJWRcblx0bUFjY2Vzc0NhcGFiaWxpdHk6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbVN0b3JhZ2VUeXBlLCBtRmlsZVN5c3RlbVR5cGUsIG1BY2Nlc3NDYXBhYmlsaXR5KTsKKyAgICBMT0dEKCJcdG1NYXhDYXBhY2l0eTogJWxsZFxuXHRtRnJlZVNwYWNlQnl0ZXM6ICVsbGRcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAorICAgICAgICAgICAgbU1heENhcGFjaXR5LCBtRnJlZVNwYWNlQnl0ZXMsIG1GcmVlU3BhY2VPYmplY3RzKTsKKyAgICBMT0dEKCJcdG1TdG9yYWdlRGVzY3JpcHRpb246ICVzXG5cdG1Wb2x1bWVJZGVudGlmaWVyOiAlc1xuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24sIG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBTdG9yYWdlSW5mbyB7CitwdWJsaWM6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVN0b3JhZ2VUeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUZpbGVTeXN0ZW1UeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFjY2Vzc0NhcGFiaWxpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtRnJlZVNwYWNlQnl0ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRnJlZVNwYWNlT2JqZWN0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgY2hhciogICAgICAgICAgICAgICBtVm9sdW1lSWRlbnRpZmllcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTdG9yYWdlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVE9SQUdFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDNjZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0cmluZ0J1ZmZlciIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKCkKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIG1CdWZmZXJbMF0gPSAwOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBzZXQoc3JjKTsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoc3JjLm1DaGFyQ291bnQpLAorICAgICAgICBtQnl0ZUNvdW50KHNyYy5tQnl0ZUNvdW50KQoreworICAgIG1lbWNweShtQnVmZmVyLCBzcmMubUJ1ZmZlciwgbUJ5dGVDb3VudCk7Cit9CisKKworTXRwU3RyaW5nQnVmZmVyOjp+TXRwU3RyaW5nQnVmZmVyKCkgeworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6c2V0KGNvbnN0IGNoYXIqIHNyYykgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4oc3JjKTsKKyAgICBpZiAobGVuZ3RoID49IHNpemVvZihtQnVmZmVyKSkKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKG1CdWZmZXIpIC0gMTsKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLCBsZW5ndGgpOworCisgICAgLy8gY291bnQgdGhlIGNoYXJhY3RlcnMKKyAgICBpbnQgY291bnQgPSAwOworICAgIGNoYXIgY2g7CisgICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gMCkgeworICAgICAgICBpZiAoKGNoICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhGMCkgPT0gMHhFMCkgeworICAgICAgICAgICAgLy8gMyBieXRlIGNoYXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IHR3byBieXRlcworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50Kys7CisgICAgfQorCisgICAgbUJ5dGVDb3VudCA9IGxlbmd0aCArIDE7CisgICAgbUJ1ZmZlcltsZW5ndGhdID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpyZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIHsKKyAgICBpbnQgY291bnQgPSBwYWNrZXQtPmdldFVJbnQ4KCk7CisgICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNoID0gcGFja2V0LT5nZXRVSW50MTYoKTsKKyAgICAgICAgaWYgKGNoID49IDB4MDgwMCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4ODApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhDMCB8IChjaCA+PiA2KSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgIH0KKyAgICB9CisgICAgKmRlc3QrKyA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OndyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdCB7CisgICAgaW50IGNvdW50ID0gbUNoYXJDb3VudDsKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSBtQnVmZmVyOworICAgIHBhY2tldC0+cHV0VUludDgoY291bnQpOworCisgICAgLy8gZXhwYW5kIHV0ZjggdG8gMTYgYml0IGNoYXJzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNoOworICAgICAgICB1aW50MTZfdCBjaDEgPSAqc3JjKys7CisgICAgICAgIGlmICgoY2gxICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICBjaCA9IGNoMTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2gxICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICB1aW50MTZfdCBjaDIgPSAqc3JjKys7CisgICAgICAgICAgICBjaCA9ICgoY2gxICYgMHgxRikgPDwgNikgfCAoY2gyICYgMHgzRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aHJlZSBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOworICAgICAgICAgICAgdWludDE2X3QgY2gzID0gKnNyYysrOworICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MEYpIDw8IDEyKSB8ICgoY2gyICYgMHgzRikgPDwgNikgfCAoY2gzICYgMHgzRik7CisgICAgICAgIH0KKyAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoY2gpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQxYzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisjZGVmaW5lIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCisvLyBSZXByZXNlbnRzIGEgdXRmOCBzdHJpbmcsIHdpdGggYSBtYXhpbXVtIG9mIDI1NSBjaGFyYWN0ZXJzCitjbGFzcyBNdHBTdHJpbmdCdWZmZXIgeworCitwcml2YXRlOgorICAgIC8vIG1heGltdW0gMyBieXRlcy9jaGFyYWN0ZXIsIHdpdGggMSBleHRyYSBmb3IgemVybyB0ZXJtaW5hdGlvbgorICAgIHVpbnQ4X3QgICAgICAgICBtQnVmZmVyWzI1NSAqIDMgKyAxXTsKKyAgICBpbnQgICAgICAgICAgICAgbUNoYXJDb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgbUJ5dGVDb3VudDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYyk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBNdHBTdHJpbmdCdWZmZXImIHNyYyk7CisgICAgdmlydHVhbCAgICAgICAgIH5NdHBTdHJpbmdCdWZmZXIoKTsKKworICAgIHZvaWQgICAgICAgICAgICBzZXQoY29uc3QgY2hhciogc3JjKTsKKworICAgIHZvaWQgICAgICAgICAgICByZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpOworICAgIHZvaWQgICAgICAgICAgICB3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3Q7CisKKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Q2hhckNvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYXJDb3VudDsgfQorICAgIGlubGluZSBpbnQgICAgICBnZXRCeXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQnl0ZUNvdW50OyB9CisKKwlpbmxpbmUgb3BlcmF0b3IgY29uc3QgY2hhciooKSBjb25zdCB7IHJldHVybiAoY29uc3QgY2hhciAqKW1CdWZmZXI7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUUklOR19CVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFR5cGVzLmggYi9tZWRpYS9tdHAvTXRwVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9UWVBFU19ICisjZGVmaW5lIF9NVFBfVFlQRVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidXRpbHMvU3RyaW5nOC5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgaW50MzJfdCBpbnQxMjhfdFs0XTsKK3R5cGVkZWYgdWludDMyX3QgdWludDEyOF90WzRdOworCit0eXBlZGVmIHVpbnQxNl90IE10cE9wZXJhdGlvbkNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cFJlc3BvbnNlQ29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRXZlbnRDb2RlOwordHlwZWRlZiB1aW50MzJfdCBNdHBTZXNzaW9uSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFN0b3JhZ2VJRDsKK3R5cGVkZWYgdWludDMyX3QgTXRwVHJhbnNhY3Rpb25JRDsKK3R5cGVkZWYgdWludDE2X3QgTXRwUHJvcGVydHlDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBEYXRhVHlwZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwT2JqZWN0Rm9ybWF0OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwRGV2aWNlUHJvcGVydHk7Cit0eXBlZGVmIE10cFByb3BlcnR5Q29kZSBNdHBPYmplY3RQcm9wZXJ0eTsKKworLy8gb2JqZWN0IGhhbmRsZXMgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN0b3JhZ2UgYnV0IG9ubHkgd2l0aGluIGEgc2luZ2xlIHNlc3Npb24uCisvLyBvYmplY3QgaGFuZGxlcyBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkLgorLy8gdmFsdWVzIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2VzLgordHlwZWRlZiB1aW50MzJfdCBNdHBPYmplY3RIYW5kbGU7CisKK3VuaW9uIE10cFByb3BlcnR5VmFsdWUgeworICAgIGludDhfdCAgICAgICAgICBpODsKKyAgICB1aW50OF90ICAgICAgICAgdTg7CisgICAgaW50MTZfdCAgICAgICAgIGkxNjsKKyAgICB1aW50MTZfdCAgICAgICAgdTE2OworICAgIGludDMyX3QgICAgICAgICBpMzI7CisgICAgdWludDMyX3QgICAgICAgIHUzMjsKKyAgICBpbnQ2NF90ICAgICAgICAgaTY0OworICAgIHVpbnQ2NF90ICAgICAgICB1NjQ7CisgICAgaW50MTI4X3QgICAgICAgIGkxMjg7CisgICAgdWludDEyOF90ICAgICAgIHUxMjg7CisgICAgY2hhciogICAgICAgICAgIHN0cjsKK307CisKKy8vIFNwZWNpYWwgdmFsdWVzCisjZGVmaW5lIE1UUF9QQVJFTlRfUk9PVCAgICAgICAgIDB4RkZGRkZGRkYgICAgICAgLy8gcGFyZW50IGlzIHJvb3Qgb2YgdGhlIHN0b3JhZ2UKKyNkZWZpbmUga0ludmFsaWRPYmplY3RIYW5kbGUgICAgMHhGRkZGRkZGRgorCitjbGFzcyBNdHBTdG9yYWdlOworY2xhc3MgTXRwRGV2aWNlOworY2xhc3MgTXRwUHJvcGVydHk7CisKK3R5cGVkZWYgVmVjdG9yPE10cFN0b3JhZ2UgKj4gTXRwU3RvcmFnZUxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxNdHBEZXZpY2UqPiBNdHBEZXZpY2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwUHJvcGVydHkqPiBNdHBQcm9wZXJ0eUxpc3Q7CisKK3R5cGVkZWYgVmVjdG9yPHVpbnQ4X3Q+IFVJbnQ4TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQxNl90PiBVSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDMyX3Q+IFVJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50NjRfdD4gVUludDY0TGlzdDsKK3R5cGVkZWYgVmVjdG9yPGludDhfdD4gSW50OExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQxNl90PiBJbnQxNkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQzMl90PiBJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ2NF90PiBJbnQ2NExpc3Q7CisKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdEZvcm1hdExpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwT2JqZWN0SGFuZGxlTGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwU3RvcmFnZUlETGlzdDsKKwordHlwZWRlZiBTdHJpbmc4ICAgIE10cFN0cmluZzsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMWVmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwVXRpbHMiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCitEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKK3Rha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKK3JlcHJlc2VudGF0aW9uLCBZWVlZIHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB5ZWFyLCBNTSByZXBsYWNlZCBieSB0aGUgbW9udGggKDAxLTEyKSwKK0REIHJlcGxhY2VkIGJ5IHRoZSBkYXkgKDAxLTMxKSwgVCBpcyBhIGNvbnN0YW50IGNoYXJhY3RlciAnVCcgZGVsaW1pdGluZyB0aW1lIGZyb20gZGF0ZSwKK2hoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob3VyICgwMC0yMyksIG1tIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgKDAwLTU5KSwgYW5kIHNzIGJ5IHRoZQorc2Vjb25kICgwMC01OSkuIFRoZSAiLnMiIGlzIG9wdGlvbmFsLCBhbmQgcmVwcmVzZW50cyB0ZW50aHMgb2YgYSBzZWNvbmQuCisqLworCitib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcykgeworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKyAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICBpZiAoc3NjYW5mKGRhdGVUaW1lLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCkgIT0gNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGNoYXIqIHRhaWwgPSBkYXRlVGltZSArIDE1OworICAgIC8vIHNraXAgb3B0aW9uYWwgdGVudGggb2Ygc2Vjb25kCisgICAgaWYgKHRhaWxbMF0gPT0gJy4nICYmIHRhaWxbMV0pCisgICAgICAgIHRhaWwgKz0gMjsKKyAgICAvL0ZJWE1FIC0gc3VwcG9ydCArLy1oaG1tCisgICAgYm9vbCB1c2VVVEMgPSAodGFpbFswXSA9PSAnWicpOworCisgICAgLy8gaGFjayB0byBjb21wdXRlIHRpbWV6b25lCisgICAgdGltZV90IGR1bW15OworICAgIGxvY2FsdGltZV9yKCZkdW1teSwgJnRtKTsKKworICAgIHRtLnRtX3NlYyA9IHNlY29uZDsKKyAgICB0bS50bV9taW4gPSBtaW51dGU7CisgICAgdG0udG1faG91ciA9IGhvdXI7CisgICAgdG0udG1fbWRheSA9IGRheTsKKyAgICB0bS50bV9tb24gPSBtb250aDsKKyAgICB0bS50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgdG0udG1fd2RheSA9IDA7CisgICAgdG0udG1faXNkc3QgPSAtMTsKKyAgICBpZiAodXNlVVRDKQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lKCZ0bSk7CisgICAgZWxzZQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lX3R6KCZ0bSwgdG0udG1fem9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKSB7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgbG9jYWx0aW1lX3IoJnNlY29uZHMsICZ0bSk7CisgICAgc25wcmludGYoYnVmZmVyLCBidWZmZXJMZW5ndGgsICIlMDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmggYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY5MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9VVElMU19ICisjZGVmaW5lIF9NVFBfVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL210cC5oIGIvbWVkaWEvbXRwL210cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvbXRwLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfSAorI2RlZmluZSBfTVRQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIE1UUF9TVEFOREFSRF9WRVJTSU9OICAgICAgICAgICAgMTAwCisKKy8vIENvbnRhaW5lciBUeXBlcworI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfVU5ERUZJTkVEICAgIDAKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQgICAgICAxCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBICAgICAgICAgMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfUkVTUE9OU0UgICAgIDMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UICAgICAgICA0CisKKy8vIENvbnRhaW5lciBPZmZzZXRzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCAgICAgICAgICAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VUICAgICA4CisjZGVmaW5lIE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCAgICAgICAgICAxMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTIKKworLy8gTVRQIFR5cGVzCisjZGVmaW5lIE1UUF9UWVBFX1VOREVGSU5FRCAgICAgIDB4MDAwMCAgICAgICAgICAvLyBVbmRlZmluZWQKKyNkZWZpbmUgTVRQX1RZUEVfSU5UOCAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8vIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ4ICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvLyBVbnNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDE2ICAgICAgICAgIDB4MDAwMyAgICAgICAgICAvLyBTaWduZWQgMTYtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDE2ICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8vIFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDMyICAgICAgICAgIDB4MDAwNSAgICAgICAgICAvLyBTaWduZWQgMzItYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDMyICAgICAgICAgMHgwMDA2ICAgICAgICAgIC8vIFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDY0ICAgICAgICAgIDB4MDAwNyAgICAgICAgICAvLyBTaWduZWQgNjQtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDY0ICAgICAgICAgMHgwMDA4ICAgICAgICAgIC8vIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDEyOCAgICAgICAgIDB4MDAwOSAgICAgICAgICAvLyBTaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxMjggICAgICAgIDB4MDAwQSAgICAgICAgICAvLyBVbnNpZ25lZCAxMjgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDggICAgICAgICAgMHg0MDAxICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDggICAgICAgICAweDQwMDIgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDE2ICAgICAgICAgMHg0MDAzICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQxNiAgICAgICAgMHg0MDA0ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMzIgICAgICAgICAweDQwMDUgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDMyICAgICAgICAweDQwMDYgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ2NCAgICAgICAgIDB4NDAwNyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UNjQgICAgICAgIDB4NDAwOCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDEyOCAgICAgICAgMHg0MDA5ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTI4ICAgICAgIDB4NDAwQSAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX1NUUiAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAvLyBWYXJpYWJsZS1sZW5ndGggVW5pY29kZSBzdHJpbmcKKworLy8gTVRQIEZvcm1hdCBDb2RlcworI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAgICAvLyBVbmRlZmluZWQgb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMSAgIC8vIEFzc29jaWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmb2xkZXIpCisjZGVmaW5lIE1UUF9GT1JNQVRfU0NSSVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMiAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBzY3JpcHQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9FWEVDVVRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzICAgLy8gRGV2aWNlIG1vZGVsLXNwZWNpZmljIGJpbmFyeSBleGVjdXRhYmxlCisjZGVmaW5lIE1UUF9GT1JNQVRfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNCAgIC8vIFRleHQgZmlsZQorI2RlZmluZSBNVFBfRk9STUFUX0hUTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUgICAvLyBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfRFBPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNiAgIC8vIERpZ2l0YWwgUHJpbnQgT3JkZXIgRm9ybWF0IGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfQUlGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNyAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XQVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA4ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX01QMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDkgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfQVZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQSAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBCICAgLy8gVmlkZW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FTRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEMgICAvLyBNaWNyb3NvZnQgQWR2YW5jZWQgU3RyZWFtaW5nIEZvcm1hdCAodmlkZW8pCisjZGVmaW5lIE1UUF9GT1JNQVRfREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMCAgIC8vIFVua25vd24gaW1hZ2Ugb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhJRl9KUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMSAgIC8vIEV4Y2hhbmdlYWJsZSBGaWxlIEZvcm1hdCwgSkVJREEgc3RhbmRhcmQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAyICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBFbGVjdHJvbmljIFBob3RvZ3JhcGh5CisjZGVmaW5lIE1UUF9GT1JNQVRfRkxBU0hQSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMyAgIC8vIFN0cnVjdHVyZWQgU3RvcmFnZSBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9CTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA0ICAgLy8gTWljcm9zb2Z0IFdpbmRvd3MgQml0bWFwIGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9DSUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA1ICAgLy8gQ2Fub24gQ2FtZXJhIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfR0lGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNyAgIC8vIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pGSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDggICAvLyBKUEVHIEZpbGUgSW50ZXJjaGFuZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOSAgIC8vIFBob3RvQ0QgSW1hZ2UgUGFjCisjZGVmaW5lIE1UUF9GT1JNQVRfUElDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQSAgIC8vIFF1aWNrZHJhdyBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBCICAgLy8gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcworI2RlZmluZSBNVFBfRk9STUFUX1RJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEQgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBFICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IChncmFwaGljIGFydHMpCisjZGVmaW5lIE1UUF9GT1JNQVRfSlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiAgIC8vIEpQRUcyMDAwIEJhc2VsaW5lIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfSlBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCAgIC8vIEpQRUcyMDAwIEV4dGVuZGVkIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFICAgICAgICAgICAgICAgICAgIDB4QjgwMgorI2RlZmluZSBNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUICAgICAgICAgICAgICAgICAweEI4ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTAwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMQorI2RlZmluZSBNVFBfRk9STUFUX09HRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAzCisjZGVmaW5lIE1UUF9GT1JNQVRfQVVESUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNAorI2RlZmluZSBNVFBfRk9STUFUX0ZMQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTgwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MQorI2RlZmluZSBNVFBfRk9STUFUX01QNF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODIgIC8vIElTTyAxNDQ5Ni0xCisjZGVmaW5lIE1UUF9GT1JNQVRfTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MworI2RlZmluZSBNVFBfRk9STUFUXzNHUF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODQgIC8vIDNHUFAgZmlsZSBmb3JtYXQuIERldGFpbHM6IGh0dHA6Ly93d3cuM2dwcC5vcmcvZnRwL1NwZWNzL2h0bWwtaW5mby8yNjI0NC5odG0gKHBhZ2UgdGl0bGUgLSBcdTIwMWNUcmFuc3BhcmVudCBlbmQtdG8tZW5kIHBhY2tldCBzd2l0Y2hlZCBzdHJlYW1pbmcgc2VydmljZSwgM0dQUCBmaWxlIGZvcm1hdFx1MjAxZCkuCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gICAgICAgICAgICAgICAgIDB4QkEwMAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0gICAgICAgICAgICAweEJBMDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMworI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCAgICAgICAgICAgICAgICAgMHhCQTA1CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCAgICAgICAgICAgICAgIDB4QkEwNgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSICAgICAgICAgICAgICAweEJBMDcKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiAgICAgICAgMHhCQTA4CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgICAgICAgICAgICAgIDB4QkEwOQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMEEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgICAgICAgICAgICAgICAgICAgMHhCQTBCIC8vIEZvciB1c2Ugd2l0aCBtZWRpYWNhc3RzOyByZWZlcmVuY2VzIG11bHRpbWVkaWEgZW5jbG9zdXJlcyBvZiBSU1MgZmVlZHMgb3IgZXBpc29kaWMgY29udGVudAorI2RlZmluZSBNVFBfRk9STUFUX1dQTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NM1VfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTExCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMgorI2RlZmluZSBNVFBfRk9STUFUX0FTWF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTE0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgIDB4QkE4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAweEJBODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9YTUxfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTgyCisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgIDB4QkE4MworI2RlZmluZSBNVFBfRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UICAgICAgICAgICAweEJBODQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCAgICAgICAgICAgICAgICAgMHhCQTg1CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gICAgICAgICAgIDB4QkE4NgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAweEJCMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgIDB4QkI4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgICAweEJCODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9WQ0FSRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQjgyCisKKy8vIE1UUCBPYmplY3QgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweERDMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDICAgICAgICAgICAgICAgICAgICAgICAweERDMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyAgICAgICAgICAgICAgICAweERDMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0hJRERFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1lTVEVNX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZTkNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPUEVSVFlfQkFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRUFURURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FVVEhPUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAweERDNEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgIDB4REM0QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDNEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQURERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgICAgICAgICAgICAgICAgICAgICAweERDNTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgIDB4REM1MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCAgICAgICAgICAgMHhEQzgxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSAgICAgICAgICAgICAweERDODIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgICAgICAgICAgIDB4REM4MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIICAgICAgICAgICAgMHhEQzg0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04gICAgICAgICAweERDODUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EQVRBICAgICAgICAgICAgIDB4REM4NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9UUkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QworI2RlZmluZSBNVFBfUFJPUEVSVFlfQ1JFRElUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MWVJJQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEICAgICAgICAgICAgICAgIDB4REM4RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPRFVDRURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VU0VfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NLSVBfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFTVF9BQ0NFU1NFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQVJFTlRBTF9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAweERDOTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FVEFfR0VOUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09NUE9TRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRkZFQ1RJVkVfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAweERDOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlRJVExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFICAgICAgICAgICAgICAgICAgMHhEQzk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMQlVNX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTU9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQl9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ1JPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAweERDRDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVE9UQUxfQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVRSQVRFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NBTVBMRV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgMHhERTk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERFOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NDQU5fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyAgICAgICAgICAgICAgICAgICAgICAgMHhERTk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyAgICAgICAgICAgICAgICAgICAgIDB4REU5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVklERU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMgICAgICAgICAgICAweERFOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWUZSQU1FX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgIDB4REU5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgICAweERFQTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRElTUExBWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CT0RZX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HSVZFTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01JRERMRV9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUkVGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVRkZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgMHhERDA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAgICAweEREMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMSAgICAgICAgICAgICAgICAgICAgICAgMHhERDA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8yICAgICAgICAgICAgICAgICAgICAgICAweEREMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9PVEhFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgIDB4REQwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgMHhERDBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAweEREMEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTUyAgICAgICAgICAgICAgICAgIDB4REQxMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgMHhERDExCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFICAgICAgICAgICAgICAgICAgICAweEREMTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiAgICAgICAgICAgICAgICAgIDB4REQxMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgMHhERDE0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgICAweEREMTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAgIDB4REQxNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFHRVJfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDE3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfT1RIRVJTICAgICAgICAgICAgICAgICAgICAweEREMTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4REQxOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweEREMUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1MgICAgICAgICAgICAgIDB4REQxQworI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18yICAgICAgICAgICAgMHhERDFECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgICAgICAgICAgICAweEREMUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwgICAgICAgICAgIDB4REQxRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xICAgICAgICAgMHhERDIwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzIgICAgICAgICAweEREMjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgICAgICAgICAgIDB4REQyMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OICAgICAgICAgMHhERDIzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSAgICAweEREMjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgICAgICAgIDB4REQyNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCAgICAgICAgICAgMHhERDI2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgICAgICAgICAweEREMjcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiAgICAgICAgIDB4REQyOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ0lUWSAgICAgICAgICAgMHhERDI5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19SRUdJT04gICAgICAgICAweEREMkEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFICAgIDB4REQyQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ09VTlRSWSAgICAgICAgMHhERDJDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9GVUxMICAgICAgICAgICAgICAweEREMkQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMSAgICAgICAgICAgIDB4REQyRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yICAgICAgICAgICAgMHhERDJGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZICAgICAgICAgICAgICAweEREMzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiAgICAgICAgICAgIDB4REQzMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUE9TVEFMX0NPREUgICAgICAgMHhERDMyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZICAgICAgICAgICAweEREMzMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgICAgICAgICAgIDB4REQzNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgICAgICAgICAgICAgMHhERDM1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ST0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JJUlRIREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfQkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgICAgICAgICAgICAgICAgICAweERENDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSAgICAgICAgICAgICAgICAgICAgMHhERDUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSAgICAgICAgICAgICAgICAgICAgICAweERENTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PUFRJT05BTF9BVFRFTkRFRVMgICAgICAgICAgICAweERENTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAgIDB4REQ1NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQgICAgICAgICAgICAgICAgICAgICAgMHhERDU3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgICAgICAgICAgICAgICAgICAgICAweERENTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgICAgICAgICAgICAgICAgMHhERDVBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PV05FUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dFQk1BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERENjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CWVRFX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQlVJTERfREFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVElNRV9UT19MSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRURJQV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzIKKworLy8gTVRQIERldmljZSBQcm9wZXJ0eSBDb2RlcworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCAgICAgICAgICAgICAgICAgICAweDUwMDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgICAgICAgICAgICAgICAgIDB4NTAwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09NUFJFU1NJT05fU0VUVElORyAgICAgICAgICAgICAweDUwMDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFICAgICAgICAgICAgICAgICAgIDB4NTAwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4NTAwOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgMHg1MDA5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDUwMEEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9NRVRFUklOR19NT0RFICAgICAgICAgIDB4NTAwQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAweDUwMEQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9QUk9HUkFNX01PREUgICAgICAgICAgIDB4NTAwRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgMHg1MDBGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gICAgICAweDUwMTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9EQVRFVElNRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NBUFRVUkVfREVMQVkgICAgICAgICAgICAgICAgICAgMHg1MDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFICAgICAgICAgICAgICAweDUwMTMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT05UUkFTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NIQVJQTkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRElHSVRBTF9aT09NICAgICAgICAgICAgICAgICAgICAweDUwMTYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FRkZFQ1RfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4NTAxNworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUiAgICAgICAgICAgICAgICAgICAgMHg1MDE4CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwgICAgICAgICAgICAgICAgICAweDUwMTkKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfTlVNQkVSICAgICAgICAgICAgICAgIDB4NTAxQQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCAgICAgICAgICAgICAgMHg1MDFCCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSAgICAgICAgICAgICAweDUwMUMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDFFCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk8gICAgICAgICAgICAgICAgICAweDUwMUYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiAgICAgICAgIDB4RDQwMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FICAgICAgICAgICAgMHhENDAyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ0MDMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TVVBQT1JURURfRk9STUFUU19PUkRFUkVEICAgICAgIDB4RDQwNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OICAgICAgICAgICAgICAgICAgICAgMHhENDA1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfUkFURSAgICAgICAgICAgICAgICAgICAweEQ0MTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QgICAgICAgICAgICAgICAgIDB4RDQxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCAgICAgICAgMHhENDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPICAweEQ0MDYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUgICAgICAgICAgIDB4RDQwNworCisvLyBNVFAgT3BlcmF0aW9uIENvZGVzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTICAgICAgICAgICAgICAgICAgICAgICAweDEwMDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTICAgICAgICAgICAgICAgICAgICAweDEwMDcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgMHgxMDBDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBGCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTAKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRUxGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgMHgxMDEyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4MTAxNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE1CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDEwMTYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgIDB4MTAxNworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUgICAgICAgICAgICAgICAgMHgxMDE4CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTkKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxQQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCAgICAgICAgICAgICAgICAgICAgMHgxMDFCCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgICAweDEwMUMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCAgICAgICAgICAgIDB4OTgwMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDICAgICAgICAgICAgICAgICAgMHg5ODAyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4OTgwNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTICAgICAgICAgICAgICAgICAweDk4MTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TS0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgyMAorCisvLyBNVFAgUmVzcG9uc2UgQ29kZXMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfVFJBTlNBQ1RJT05fSUQgICAgICAgICAgICAgICAgICAgICAweDIwMDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFICAgICAgICAgICAgICAgICAweDIwMEIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JBR0VfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9XUklURV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAweDIwMEQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAweDIwMTAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUlRJQUxfREVMRVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEICAgICAgICAweDIwMTQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDIwMTUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOS05PV05fVkVORE9SX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0NBUFRVUkVfQUxSRUFEWV9URVJNSU5BVEVEICAgICAgICAgICAgICAgICAweDIwMTgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAweDIwMUEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweDIwMUIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweDIwMUMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMUQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAweDIwMUUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCAgICAgICAgICAgICAgICAgICAgICAweDIwMUYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fT0ZfREVTVElOQVRJT05fVU5TVVBQT1JURUQgICAweDIwMjAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfQ09ERSAgICAgICAgICAgICAgICAgICAweEE4MDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweEE4MDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweEE4MDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAweEE4MDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dST1VQX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREFUQVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfR1JPVVBfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfREVQVEhfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweEE4MEEKKworLy8gTVRQIEV2ZW50IENvZGVzCisjZGVmaW5lIE1UUF9FVkVOVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1UUF9FVkVOVF9DQU5DRUxfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfQURERUQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9BRERFRCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVEICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA3CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA4CisjZGVmaW5lIE1UUF9FVkVOVF9SRVFVRVNUX09CSkVDVF9UUkFOU0ZFUiAgICAgICAgICAgMHg0MDA5CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDBBCisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHg0MDBCCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SQUdFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgMHg0MDBDCisjZGVmaW5lIE1UUF9FVkVOVF9DQVBUVVJFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgMHg0MDBECisjZGVmaW5lIE1UUF9FVkVOVF9VTlJFUE9SVEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg0MDBFCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHhDODAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9ERVNDX0NIQU5HRUQgICAgICAgICAgMHhDODAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVGRVJFTkNFU19DSEFOR0VEICAgICAgICAgMHhDODAzCisKKy8vIFN0b3JhZ2UgVHlwZQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9ST00gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUk9NICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9SQU0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwNAorCisvLyBTdG9yYWdlIEZpbGUgU3lzdGVtCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRkxBVCAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fSElFUkFSQ0hJQ0FMICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRENGICAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8vIFN0b3JhZ2UgQWNjZXNzIENhcGFiaWxpdHkKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhPVVRfREVMRVRFICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhfREVMRVRFICAgICAgICAgICAweDAwMDIKKworLy8gQXNzb2NpYXRpb24gVHlwZQorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiAgICAgICAgIDB4MDAwMQorCisjZW5kaWYgLy8gX01UUF9ICmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMjk3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ2FtZXJhQnJvd3NlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUwYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlciI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbGFiZWwiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDYW1lcmFCcm93c2VyIiBhbmRyb2lkOmxhYmVsPSJDYW1lcmEgQnJvd3NlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU3RvcmFnZUJyb3dzZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik9iamVjdEJyb3dzZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik9iamVjdFZpZXdlciIgLz4KKworICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJVc2JSZWNlaXZlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iY29udGVudCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKworCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9pbmZvLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmZDgzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwKQEAgLTAsMCArMSwxNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9vYmplY3RfaW5mbyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmFtZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaXplIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9zaXplIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2UiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY3JlYXRlZF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY3JlYXRlZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHMiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiIC8+CisgICAgPC9UYWJsZVJvdz4KKzwvVGFibGVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfbGlzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1ibmFpbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbWVudS9vYmplY3RfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NjVmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NhdmUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2F2ZV9pdGVtIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZGVsZXRlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2RlbGV0ZV9pdGVtIiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzUxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCI+Q2FtZXJhIEJyb3dzZXI8L3N0cmluZz4KKworICAgIDwhLS0gZm9yIG9iamVjdCBpbmZvIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibmFtZV9sYWJlbCI+TmFtZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaXplX2xhYmVsIj5TaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX3dpZHRoX2xhYmVsIj5UaHVtYiBXaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9oZWlnaHRfbGFiZWwiPlRodW1iIEhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9zaXplX2xhYmVsIj5UaHVtYiBTaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndpZHRoX2xhYmVsIj5XaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJoZWlnaHRfbGFiZWwiPkhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXB0aF9sYWJlbCI+RGVwdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VxdWVuY2VfbGFiZWwiPlNlcXVlbmNlOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZWRfbGFiZWwiPkNyZWF0ZWQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9kaWZpZWRfbGFiZWwiPk1vZGlmaWVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleXdvcmRzX2xhYmVsIj5LZXl3b3JkczogPC9zdHJpbmc+CisKKyAgICA8IS0tIG1lbnUgaXRlbXMgLS0+CisgICAgPHN0cmluZyBuYW1lPSJzYXZlX2l0ZW0iPlNhdmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9pdGVtIj5EZWxldGU8L3N0cmluZz4KKworICAgIDwhLS0gdG9hc3RzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X3NhdmVkX21lc3NhZ2UiPk9iamVjdCBzYXZlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IHNhdmUgb2JqZWN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvYmplY3RfZGVsZXRlZF9tZXNzYWdlIj5PYmplY3QgZGVsZXRlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2ZhaWxlZF9tZXNzYWdlIj5Db3VsZCBub3QgZGVsZXRlIG9iamVjdDwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2OTk4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9ImluZm9fbGFiZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij40ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iaW5mb192YWx1ZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvQ2FtZXJhQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDg3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIGNvbm5lY3RlZCBjYW1lcmFzLgorICovCitwdWJsaWMgY2xhc3MgQ2FtZXJhQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbWVyYUJyb3dzZXIiOworCisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgcHJpdmF0ZSBEZXZpY2VPYnNlcnZlciBtRGV2aWNlT2JzZXJ2ZXI7CisgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKKworICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBEZXZpY2VPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlT2JzZXJ2ZXIub25DaGFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFVklDRV9DT0xVTU5TID0KKyAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5EZXZpY2UuX0lELCBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUmVzb2x2ZXIgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgbURldmljZU9ic2VydmVyID0gbmV3IERldmljZU9ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoTXRwLkRldmljZS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBERVZJQ0VfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKyAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8yLnhtbAorICAgICAgICBtQWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICAvLyByZWdpc3RlciBmb3IgY2hhbmdlcyB0byB0aGUgZGV2aWNlIGxpc3QKKyAgICAgICAgbVJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE10cC5EZXZpY2UuQ09OVEVOVF9VUkksIHRydWUsIG1EZXZpY2VPYnNlcnZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtUmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBTdG9yYWdlQnJvd3Nlci5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwMjAyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIG9iamVjdHMgd2l0aGluIGEgY29udGFpbmVyIChmb2xkZXIgb3Igc3RvcmFnZSB1bml0KS4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdEJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJPYmplY3RCcm93c2VyIjsKKworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisgICAgcHJpdmF0ZSBPYmplY3RDdXJzb3JBZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1PYmplY3RJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLk9iamVjdC5fSUQsIE10cC5PYmplY3QuTkFNRSwgTXRwLk9iamVjdC5GT1JNQVQsIE10cC5PYmplY3QuVEhVTUIgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MVU1OID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DT0xVTU4gPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEhVTUJfQ09MVU1OID0gMzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgib2JqZWN0IiwgMCk7CisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCAmJiBtU3RvcmFnZUlEICE9IDApIHsKKyAgICAgICAgICAgIEN1cnNvciBjOworICAgICAgICAgICAgVXJpIHVyaTsKKyAgICAgICAgICAgIGlmIChtT2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihtRGV2aWNlSUQsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JPYmplY3RDaGlsZHJlbihtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuZChUQUcsICJxdWVyeSAiICsgdXJpKTsKKyAgICAgICAgICAgIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIE9CSkVDVF9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgICAgICBtQ3Vyc29yID0gYzsKKworICAgICAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8xLnhtbAorICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgT2JqZWN0Q3Vyc29yQWRhcHRlcih0aGlzLCBjKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBpbnQgcm93SUQgPSAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCByb3dJRCksCisgICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjICsgIiBjb3VudDogIiArIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGxvbmcgZm9ybWF0ID0gMDsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLmdldENvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9DT0xVTU4pOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldFN0cmluZyhOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBmb3JtYXQgPSBjLmdldExvbmcoRk9STUFUX0NPTFVNTik7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyb3dJZDogIiArIHJvd0lkICsgIiBuYW1lOiAiICsgbmFtZSArICIgZm9ybWF0OiAiICsgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0ID09IE10cC5PYmplY3QuRk9STUFUX0pGSUYpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdFZpZXdlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iixyb3dJRCk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJvYmplY3QiLCByb3dJRCk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9iamVjdEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIFIubGF5b3V0Lm9iamVjdF9saXN0LCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgVGV4dFZpZXcgbmFtZVZpZXcgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aHVtYm5haWwKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjdXJzb3IuZ2V0QmxvYihUSFVNQl9DT0xVTU4pOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVWaWV3LnNldFRleHQobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ5Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogQSB2aWV3IHRvIGRpc3BsYXkgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LgorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0Vmlld2VyIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJPYmplY3RWaWV3ZXIiOworCisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworICAgIHByaXZhdGUgaW50IG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbU9iamVjdElEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyAgTXRwLk9iamVjdC5fSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0Lk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LkRBVEVfQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9NT0RJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CLAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5vYmplY3RfaW5mbyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworCisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCAmJiBtT2JqZWN0SUQgIT0gMCkgeworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgbU9iamVjdElEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9CSkVDVF9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubmFtZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zaXplKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygyKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl93aWR0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoMykpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfaGVpZ2h0KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg0KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9zaXplKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg1KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC53aWR0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNikpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuaGVpZ2h0KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg3KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5kZXB0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOCkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2VxdWVuY2UpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDkpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmNyZWF0ZWQpOworICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoYy5nZXRMb25nKDEwKSAqIDEwMDApOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGRhdGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1vZGlmaWVkKTsKKyAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTEpICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQua2V5d29yZHMpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGMuZ2V0U3RyaW5nKDEyKSk7CisgICAgICAgICAgICBieXRlW10gdGh1bWJuYWlsID0gYy5nZXRCbG9iKDEzKTsKKyAgICAgICAgICAgIGlmICh0aHVtYm5haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyB0aHVtYlZpZXcgPSAoSW1hZ2VWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1ibmFpbCk7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5vYmplY3RfbWVudSwgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbWVudS5maW5kSXRlbShSLmlkLnNhdmUpOworICAgICAgICBpdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuZGVsZXRlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zYXZlOgorICAgICAgICAgICAgICAgIHNhdmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5kZWxldGU6CisgICAgICAgICAgICAgICAgZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIldFktJXRtLSV0ZC0ldEgtJXRNLSV0UyIsIGMsIGMsIGMsIGMsIGMsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlKCkgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgVXJpIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBudWxsOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwZmQgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuRmlsZURlc2NyaXB0b3IodXJpLCAiciIpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgcGZkICIgKyBwZmQpOworICAgICAgICAgICAgaWYgKHBmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgZmlzICIgKyBmaXMpOworICAgICAgICAgICAgICAgIEZpbGUgZGVzdERpciA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVB1YmxpY0RpcmVjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkRJUkVDVE9SWV9EQ0lNKTsKKyAgICAgICAgICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgIkNhbWVyYUJyb3dzZXItIiArIGdldFRpbWVzdGFtcCgpICsgIi5qcGVnIik7CisKKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IGRlc3RGaWxlICIgKyBkZXN0RmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcikpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB1bnRpbCB3ZSBzdHJhaWdodGVuIG91dCBwZXJtaXNzaW9ucyBpbiAvZGF0YS9tZWRpYQorICAgICAgICAgICAgICAgIC8vIDEwMTUgaXMgQUlEX1NEQ0FSRF9SVworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhkZXN0RGlyLmdldFBhdGgoKSwgMDc3NSwgUHJvY2Vzcy5teVVpZCgpLCAxMDE1KTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoZGVzdEZpbGUuZ2V0UGF0aCgpLCAwNjY0LCBQcm9jZXNzLm15VWlkKCksIDEwMTUpOworCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gT2JqZWN0Vmlldy5zYXZlIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkuZnJvbUZpbGUoZGVzdEZpbGUpKTsKKyAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLm9iamVjdF9zYXZlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLnNhdmVfZmFpbGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRpbmcgIiArIHVyaSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLmRlbGV0ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkZjRlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKKworLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBzdG9yYWdlIHVuaXRzIG9uIGEgZGV2aWNlLgorICovCitwdWJsaWMgY2xhc3MgU3RvcmFnZUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdG9yYWdlQnJvd3NlciI7CisKKyAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNUT1JBR0VfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5TdG9yYWdlLl9JRCwgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCkgeworICAgICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShNdHAuU3RvcmFnZS5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCksCisgICAgICAgICAgICAgICAgICAgIFNUT1JBR0VfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworCisgICAgICAgICAgICAvLyBNYXAgQ3Vyc29yIGNvbHVtbnMgdG8gdmlld3MgZGVmaW5lZCBpbiBzaW1wbGVfbGlzdF9pdGVtXzEueG1sCisgICAgICAgICAgICBtQWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5TdG9yYWdlLkRFU0NSSVBUSU9OIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0QnJvd3Nlci5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDViMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlVzYjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFVzYlJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlVzYlJlY2VpdmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAib25SZWNlaXZlICIgKyBpbnRlbnQpOworICAgICAgICBpZiAoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBVcmkgdXJpID0gaW50ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGFkZCBhIHdyYXBwZXIgdG8gTXRwLkRldmljZSBmb3IgdGhpcworICAgICAgICAgICAgICAgIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQodXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBpZCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBkZXZpY2UgVXJpICIgKyB1cmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA3NGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9IT1NUCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJ1dGlscyBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1JlZkJhc2UuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVmVjdG9ySW1wbC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QgLWcgLU8wCisKK2hhdmVfcmVhZGxpbmUgOj0gJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvcmVhZGxpbmUvcmVhZGxpbmUuaCkKK2hhdmVfaGlzdG9yeSA6PSAkKHdpbGRjYXJkIC91c3IvbGliL2xpYmhpc3RvcnkqKQoraWZuZXEgKCQoc3RyaXAgJChoYXZlX3JlYWRsaW5lKSksKQorTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9SRUFETElORT0xCitlbmRpZgorCitMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfcmVhZGxpbmUpKSwpCitMT0NBTF9MRExJQlMgKz0gLWxyZWFkbGluZSAtbG5jdXJzZXMKK2VuZGlmCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfaGlzdG9yeSkpLCkKK0xPQ0FMX0xETElCUyArPSAtbGhpc3RvcnkKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcCBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQzMjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKKyNpbmNsdWRlICJNdHBGaWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwQ2xpZW50KiBNdHBGaWxlOjpzQ2xpZW50ID0gTlVMTDsKKworTXRwRmlsZTo6TXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZSgwKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZShoYW5kbGUpCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRmlsZSogZmlsZSkKKyAgICA6ICAgbURldmljZShmaWxlLT5tRGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2UoZmlsZS0+bVN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKGZpbGUtPm1IYW5kbGUpCit7Cit9CisKK010cEZpbGU6On5NdHBGaWxlKCkgeworfQorCit2b2lkIE10cEZpbGU6OnByaW50KCkgeworICAgIGlmIChtSGFuZGxlKSB7CisKKyAgICB9IGVsc2UgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIHByaW50ZigiJXhcbiIsIG1TdG9yYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaWQgPSBtRGV2aWNlLT5nZXRJRCgpOworICAgICAgICBNdHBEZXZpY2VJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0RGV2aWNlSW5mbygpOworICAgICAgICBpZiAoaW5mbykKKyAgICAgICAgICAgIHByaW50ZigiJWRcdCVzICVzICVzXG4iLCBpZCwgaW5mby0+bU1hbnVmYWN0dXJlciwgaW5mby0+bU1vZGVsLCBpbmZvLT5tU2VyaWFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIlZFx0KG5vIGRldmljZSBpbmZvIGF2YWlsYWJsZSlcbiIsIGlkKTsKKyAgICAgICAgZGVsZXRlIGluZm87CisgICAgfQorfQorCitNdHBPYmplY3RJbmZvKiBNdHBGaWxlOjpnZXRPYmplY3RJbmZvKCkgeworICAgIHJldHVybiBtRGV2aWNlLT5nZXRPYmplY3RJbmZvKG1IYW5kbGUpOworfQorCit2b2lkIE10cEZpbGU6Omxpc3QoKSB7CisgICAgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKG1TdG9yYWdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1IYW5kbGUgPyBtSGFuZGxlIDogLTEpKTsKKyAgICAgICAgaWYgKGhhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbW9kaWZpZWRbMTAwXTsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRtIHRtOworCisgICAgICAgICAgICAgICAgICAgIGdtdGltZV9yKCZpbmZvLT5tRGF0ZU1vZGlmaWVkLCAmdG0pOworICAgICAgICAgICAgICAgICAgICBzdHJmdGltZShtb2RpZmllZCwgc2l6ZW9mKG1vZGlmaWVkKSwgIiVhICViICVlICVIOiVNOiVTIEdNVCAlWSIsICZ0bSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgSGFuZGxlOiAlZCBGb3JtYXQ6ICUwNFggU2l6ZTogJWQgTW9kaWZpZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLCBoYW5kbGUsIGluZm8tPm1Gb3JtYXQsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSwgbW9kaWZpZWQpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxpc3Qgc3RvcmFnZSB1bml0cyBmb3IgZGV2aWNlCisgICAgICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VMaXN0ID0gbURldmljZS0+Z2V0U3RvcmFnZUlEcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JhZ2VMaXN0LT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUxpc3QpW2ldOworICAgICAgICAgICAgcHJpbnRmKCIleFxuIiwgc3RvcmFnZUlEKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdHBGaWxlOjppbml0KE10cENsaWVudCogY2xpZW50KSB7CisgICAgc0NsaWVudCA9IGNsaWVudDsKK30KKworTXRwRmlsZSogTXRwRmlsZTo6cGFyc2VQYXRoKE10cEZpbGUqIGJhc2UsIGNoYXIqIHBhdGgpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IE5VTEw7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UgPSAwOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAwOworCisgICAgaWYgKHBhdGhbMF0gIT0gJy8nICYmIGJhc2UpIHsKKyAgICAgICAgZGV2aWNlID0gYmFzZS0+bURldmljZTsKKyAgICAgICAgc3RvcmFnZSA9IGJhc2UtPm1TdG9yYWdlOworICAgICAgICBoYW5kbGUgPSBiYXNlLT5tSGFuZGxlOworICAgIH0KKworICAgIC8vIHBhcnNlIGFuIGFic29sdXRlIHBhdGgKKyAgICBpZiAocGF0aFswXSA9PSAnLycpCisgICAgICAgIHBhdGgrKzsKKyAgICBjaGFyKiB0b2sgPSBzdHJ0b2socGF0aCwgIi8iKTsKKyAgICB3aGlsZSAodG9rKSB7CisgICAgICAgIGlmIChzdG9yYWdlKSB7CisgICAgICAgICAgICAvLyBmaW5kIGNoaWxkIG9mIGN1cnJlbnQgaGFuZGxlCisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gZGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKHN0b3JhZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZSA/IGhhbmRsZSA6IC0xKSk7CisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgY2hpbGRIYW5kbGUgPSAwOworCisgICAgICAgICAgICBpZiAoaGFuZGxlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpICYmICFjaGlsZEhhbmRsZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmICFzdHJjbXAodG9rLCBpbmZvLT5tTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoaWxkSGFuZGxlKQorICAgICAgICAgICAgICAgIGhhbmRsZSA9IGNoaWxkSGFuZGxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkOworICAgICAgICAgICAgLy8gZmluZCBzdG9yYWdlIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICBpZiAoc3NjYW5mKHRvaywgIiV4IiwgJmlkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlETGlzdCogc3RvcmFnZUxpc3QgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlTGlzdC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqc3RvcmFnZUxpc3QpW2ldID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgPSBpZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmluZCBkZXZpY2UKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYodG9rLCAiJWQiLCAmaWQpID09IDEpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gc0NsaWVudC0+Z2V0RGV2aWNlKGlkKTsKKyAgICAgICAgICAgIGlmICghZGV2aWNlKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgdG9rID0gc3RydG9rKE5VTEwsICIvIik7CisgICAgfQorCisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIG5ldyBNdHBGaWxlKGRldmljZSwgc3RvcmFnZSwgaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg3NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0ZJTEVfSAorI2RlZmluZSBfTVRQX0ZJTEVfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnQ7CitjbGFzcyBNdHBEZXZpY2U7CitjbGFzcyBNdHBPYmplY3RJbmZvOworCisvLyBGaWxlLWxpa2UgYWJzdHJhY3Rpb24gZm9yIHRoZSBpbnRlcmFjdGl2ZSBzaGVsbC4KKy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIE1UUCBkZXZpY2UsIHN0b3JhZ2UgdW5pdCBvciBvYmplY3QKKy8vIChlaXRoZXIgZmlsZSBvciBhc3NvY2lhdGlvbikuCitjbGFzcyBNdHBGaWxlIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2U7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIHN0YXRpYyBNdHBDbGllbnQqICAgc0NsaWVudDsKKworcHVibGljOgorICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UpOworICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKTsKKyAgICBNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwRmlsZShNdHBGaWxlKiBmaWxlKTsKKyAgICB2aXJ0dWFsIH5NdHBGaWxlKCk7CisKKyAgICBNdHBPYmplY3RJbmZvKiBnZXRPYmplY3RJbmZvKCk7CisgICAgdm9pZCBwcmludCgpOworICAgIHZvaWQgbGlzdCgpOworCisgICAgaW5saW5lIE10cERldmljZSogZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURldmljZTsgfQorCisgICAgc3RhdGljIHZvaWQgaW5pdChNdHBDbGllbnQqIGNsaWVudCk7CisgICAgc3RhdGljIE10cEZpbGUqIHBhcnNlUGF0aChNdHBGaWxlKiBiYXNlLCBjaGFyKiBwYXRoKTsKK307CisKK30KKworI2VuZGlmIC8vIF9NVFBfRElSRUNUT1JZX0gKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwIGIvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1ZTIzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZiBIQVZFX1JFQURMSU5FCisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKworI2luY2x1ZGUgIk10cEZpbGUuaCIKKworI2RlZmluZSBQUk9NUFQgICJtdHA+ICIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBNdHBDbGllbnQqIHNDbGllbnQgPSBOVUxMOworCisvLyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGZvciBpbnRlcmFjdGl2ZSBzaGVsbAorc3RhdGljIE10cEZpbGUqIHNDdXJyZW50RGlyZWN0b3J5ID0gTlVMTDsKKworc3RhdGljIE10cEZpbGUqIHBhcnNlX3BhdGgoY2hhciogcGF0aCkgeworICAgIHJldHVybiBNdHBGaWxlOjpwYXJzZVBhdGgoc0N1cnJlbnREaXJlY3RvcnksIHBhdGgpOworfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIH0KKworcHVibGljOgorfTsKKworc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICBzQ2xpZW50ID0gbmV3IE15Q2xpZW50OworICAgIHNDbGllbnQtPnN0YXJ0KCk7CisgICAgTXRwRmlsZTo6aW5pdChzQ2xpZW50KTsKK30KKworc3RhdGljIGludCBzZXRfY3dkKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Qgc2hvdWxkIGhhdmUgb25lIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChhcmd2WzBdLCAiLyIpKSB7CisgICAgICAgIGRlbGV0ZSBzQ3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgc0N1cnJlbnREaXJlY3RvcnkgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTXRwRmlsZSogZmlsZSA9IHBhcnNlX3BhdGgoYXJndlswXSk7CisgICAgICAgIGlmIChmaWxlKSB7CisgICAgICAgICAgICBkZWxldGUgc0N1cnJlbnREaXJlY3Rvcnk7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeSA9IGZpbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGlzdF9kZXZpY2VzKCkgeworICAgIC8vIFRPRE8gLSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbGlzdCB3aWxsIG5vdCBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nCisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlcyA9IHNDbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICBNdHBGaWxlKiBmaWxlID0gbmV3IE10cEZpbGUoZGV2aWNlKTsKKyAgICAgICAgZmlsZS0+cHJpbnQoKTsKKyAgICAgICAgZGVsZXRlIGZpbGU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGxpc3QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgLy8gbGlzdCBjd2QKKyAgICAgICAgaWYgKHNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeS0+bGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBwYXRoID0gYXJndltpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAocGF0aCwgIi8iKSkgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNdHBGaWxlKiBmaWxlID0gcGFyc2VfcGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmICghZmlsZSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIHBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGUtPmxpc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9maWxlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IHNyY0ZEID0gLTE7CisgICAgaW50IGRlc3RGRCA9IC0xOworICAgIE10cEZpbGUqIHNyY0ZpbGUgPSBOVUxMOworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBOVUxMOworICAgIGNoYXIqIGRlc3Q7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGZpbmQgc291cmNlIG9iamVjdAorICAgIGNoYXIqIHNyYyA9IGFyZ3ZbMF07CisgICAgc3JjRmlsZSA9IHBhcnNlX3BhdGgoc3JjKTsKKyAgICBpZiAoIXNyY0ZpbGUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgc3JjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbmZvID0gc3JjRmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghaW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9iamVjdCBpbmZvIGZvciAlc1xuIiwgc3JjKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoaW5mby0+bUZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29weWluZyBkaXJlY3RvcmllcyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRlc3QgPSAoYXJnYyA+IDEgPyBhcmd2WzFdIDogaW5mby0+bU5hbWUpOworICAgIGRlc3RGRCA9IG9wZW4oZGVzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGRlc3RGRCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlICVzXG4iLCBkZXN0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzcmNGRCA9IHNyY0ZpbGUtPmdldERldmljZSgpLT5yZWFkT2JqZWN0KGluZm8tPm1IYW5kbGUsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgaWYgKHNyY0ZEIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgY2hhciBidWZmZXJbNjU1MzZdOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB3cml0ZShkZXN0RkQsIGJ1ZmZlciwgY291bnQpOworICAgIH0KKyAgICAvLyBGSVhNRSAtIGVycm9yIGNoZWNraW5nIGFuZCByZXBvcnRpbmcKKyAgICByZXQgPSAwOworCitmYWlsOgorICAgIGRlbGV0ZSBzcmNGaWxlOworICAgIGRlbGV0ZSBpbmZvOworICAgIGlmIChzcmNGRCA+PSAwKQorICAgICAgICBjbG9zZShzcmNGRCk7CisgICAgaWYgKGRlc3RGRCA+PSAwKQorICAgICAgICBjbG9zZShkZXN0RkQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ZpbGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc3JjRkQgPSAtMTsKKyAgICBNdHBGaWxlKiBkZXN0RmlsZSA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogc3JjSW5mbyA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogZGVzdEluZm8gPSBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGU7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBjb25zdCBjaGFyKiBsYXN0U2xhc2g7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBzcmMgPSBhcmd2WzBdOworICAgIHNyY0ZEID0gb3BlbihzcmMsIE9fUkRPTkxZKTsKKyAgICBpZiAoc3JjRkQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJXNcbiIsIHNyYyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGFyZ2MgPT0gMikgeworICAgICAgICAgY2hhciogZGVzdCA9IGFyZ3ZbMV07CisgICAgICAgIGRlc3RGaWxlID0gcGFyc2VfcGF0aChkZXN0KTsKKyAgICAgICAgaWYgKCFkZXN0RmlsZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgZGVzdCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgbm90IHNldFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZGVzdEZpbGUgPSBuZXcgTXRwRmlsZShzQ3VycmVudERpcmVjdG9yeSk7CisgICAgfQorCisgICAgZGVzdEluZm8gPSBkZXN0RmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghZGVzdEluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCBvYmplY3QgaW5mbyBkZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChkZXN0SW5mby0+bUZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVzdGluYXRpb24gbm90IGEgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChmc3RhdChzcmNGRCwgJnN0YXRidWYpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzcmNJbmZvID0gbmV3IE10cE9iamVjdEluZm8oMCk7CisgICAgc3JjSW5mby0+bVN0b3JhZ2VJRCA9IGRlc3RJbmZvLT5tU3RvcmFnZUlEOworICAgIHNyY0luZm8tPm1Gb3JtYXQgPSBNVFBfRk9STUFUX0VYSUZfSlBFRzsgIC8vIEZJWE1FCisgICAgc3JjSW5mby0+bUNvbXByZXNzZWRTaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICAgIHNyY0luZm8tPm1QYXJlbnQgPSBkZXN0SW5mby0+bUhhbmRsZTsKKyAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHNyYywgJy8nKTsKKyAgICBzcmNJbmZvLT5tTmFtZSA9IHN0cmR1cChsYXN0U2xhc2ggPyBsYXN0U2xhc2ggKyAxIDogc3JjKTsKKyAgICBzcmNJbmZvLT5tRGF0ZU1vZGlmaWVkID0gc3RhdGJ1Zi5zdF9tdGltZTsKKyAgICBoYW5kbGUgPSBkZXN0RmlsZS0+Z2V0RGV2aWNlKCktPnNlbmRPYmplY3RJbmZvKHNyY0luZm8pOworICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICBwcmludGYoInNlbmRPYmplY3RJbmZvIHJldHVybmVkICUwNFhcbiIsIGhhbmRsZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGRlc3RGaWxlLT5nZXREZXZpY2UoKS0+c2VuZE9iamVjdChzcmNJbmZvLCBzcmNGRCkpCisgICAgICAgIHJldCA9IDA7CisKK2ZhaWw6CisgICAgZGVsZXRlIGRlc3RGaWxlOworICAgIGRlbGV0ZSBzcmNJbmZvOworICAgIGRlbGV0ZSBkZXN0SW5mbzsKKyAgICBpZiAoc3JjRkQgPj0gMCkKKyAgICAgICAgY2xvc2Uoc3JjRkQpOworICAgIHByaW50ZigicmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgaW50ICgqIGNvbW1hbmRfZnVuYykoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisKK3N0cnVjdCBjb21tYW5kX3RhYmxlX2VudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbW1hbmRfZnVuYyBmdW5jOworfTsKKworY29uc3QgY29tbWFuZF90YWJsZV9lbnRyeSBjb21tYW5kX2xpc3RbXSA9IHsKKyAgICB7ICAgImNkIiwgICAgICAgc2V0X2N3ZCAgICAgICAgIH0sCisgICAgeyAgICJscyIsICAgICAgIGxpc3QgICAgICAgICAgICB9LAorICAgIHsgICAiZ2V0IiwgICAgICBnZXRfZmlsZSAgICAgICAgfSwKKyAgICB7ICAgInB1dCIsICAgICAgcHV0X2ZpbGUgICAgICAgIH0sCisgICAgeyAgIE5VTEwsICAgICAgIE5VTEwgICAgICAgICAgICB9LAorfTsKKworCitzdGF0aWMgaW50IGRvX2NvbW1hbmQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNvbnN0IGNvbW1hbmRfdGFibGVfZW50cnkqIGNvbW1hbmQgPSBjb21tYW5kX2xpc3Q7CisgICAgY29uc3QgY2hhciogbmFtZSA9ICphcmd2Kys7CisgICAgYXJnYy0tOworCisgICAgd2hpbGUgKGNvbW1hbmQtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoY29tbWFuZC0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gY29tbWFuZC0+ZnVuYyhhcmdjLCBhcmd2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29tbWFuZCsrOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY29tbWFuZCAlc1xuIiwgbmFtZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNoZWxsKCkgeworICAgIGludCBhcmdjOworICAgIGludCByZXN1bHQgPSAwOworI2RlZmluZSBNQVhfQVJHUyAgICAxMDAKKyAgICBjaGFyKiBhcmd2W01BWF9BUkdTXTsKKworI2lmIEhBVkVfUkVBRExJTkUKKyAgICB1c2luZ19oaXN0b3J5KCk7CisjZW5kaWYKKworICAgIHdoaWxlICgxKSB7CisjaWYgSEFWRV9SRUFETElORQorICAgICAgICBjaGFyKiBsaW5lID0gcmVhZGxpbmUoUFJPTVBUKTsKKyAgICAgICAgaWYgKCFsaW5lKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisjZWxzZQorICAgICAgICBjaGFyICAgIGJ1ZmZlclsxMDAwXTsKKyAgICAgICAgcHJpbnRmKCIlcyIsIFBST01QVCk7CisgICAgICAgIGNoYXIqIGxpbmUgPSBOVUxMOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKKworICAgICAgICBidWZmZXJbMF0gPSAwOworICAgICAgICBmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbik7CisgICAgICAgIGludCBjb3VudCA9IHN0cmxlbihidWZmZXIpOworICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ1ZmZlclswXSA9PSBFT0YpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBsaW5lW2NvdW50IC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIGxpbmVbY291bnQgLSAxXSA9PSAwOworI2VuZGlmCisgICAgICAgIGNoYXIqIHRvayA9IHN0cnRvayhsaW5lLCAiIFx0XG5cciIpOworICAgICAgICBpZiAoIXRvaykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXN0cmNtcCh0b2ssICJxdWl0IikgfHwgIXN0cmNtcCh0b2ssICJleGl0IikpIHsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyNpZiBIQVZFX1JFQURMSU5FCisgICAgICAgIGFkZF9oaXN0b3J5KGxpbmUpOworI2VuZGlmCisgICAgICAgIGFyZ2MgPSAwOworICAgICAgICB3aGlsZSAodG9rKSB7CisgICAgICAgICAgICBpZiAoYXJnYyArIDEgPT0gTUFYX0FSR1MpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBib3R0b21fb2ZfbG9vcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJndlthcmdjKytdID0gc3RyZHVwKHRvayk7CisgICAgICAgICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IGRvX2NvbW1hbmQoYXJnYywgYXJndik7CisKK2JvdHRvbV9vZl9sb29wOgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgICAgIGZyZWUoYXJndltpXSk7CisgICAgICAgIGZyZWUobGluZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGluaXQoKTsKKworICAgIGlmIChhcmdjID09IDEpCisgICAgICAgIHJldHVybiBzaGVsbCgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2NvbW1hbmQoYXJnYyAtIDEsIGFyZ3YgKyAxKTsKK30KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTUxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfVFRTX0gKKyNkZWZpbmUgQU5EUk9JRF9UVFNfSCAKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKy8vIHRvIGFjY2VzcyBUZXh0LVRvLVNwZWVjaCBmdW5jdGlvbmFsaXR5IGluIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQKKy8vIHNwZWVjaCBzeW50aGVzaXMgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisvLyBzeW50aGVzaXMuCisKKy8vIFRoZSBzaGFyZWQgbGlicmFyeSBtdXN0IGNvbnRhaW4gYSBmdW5jdGlvbiBuYW1lZCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiCisvLyB0aGF0IHJldHVybnMgYW4gJ2FuZHJvaWRfdHRzX2VuZ2luZV90JyBpbnN0YW5jZS4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcgImVuZ2luZUNvbmZpZyIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1BJVENIICAicGl0Y2giCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9SQVRFICAgInJhdGUiCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9WT0xVTUUgInZvbHVtZSIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TVUNDRVNTICAgICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19GRUFUVVJFX1VOU1VQUE9SVEVEICAgICA9IC0yLAorICAgIEFORFJPSURfVFRTX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgID0gLTMsCisgICAgQU5EUk9JRF9UVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQgICAgPSAtNCwKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTCA9IC01LAorICAgIEFORFJPSURfVFRTX01JU1NJTkdfUkVTT1VSQ0VTICAgICAgID0gLTYKK30gYW5kcm9pZF90dHNfcmVzdWx0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgPSAyLAorICAgIEFORFJPSURfVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgICAgPSAxLAorICAgIEFORFJPSURfVFRTX0xBTkdfQVZBSUxBQkxFICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0xBTkdfTUlTU0lOR19EQVRBICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQgICAgICAgID0gLTIKK30gYW5kcm9pZF90dHNfc3VwcG9ydF9yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TWU5USF9ET05FICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfU1lOVEhfUEVORElORyAgICAgICAgICAgPSAxCit9IGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRSAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3Q7CisKKy8vIFN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9JTlZBTElEICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUID0gMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUICA9IDIsCit9IGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90OworCisKKy8qIEFuIGFuZHJvaWRfdHRzX2VuZ2luZV90IG9iamVjdCBjYW4gYmUgYW55dGhpbmcsIGJ1dCBtdXN0IGhhdmUsCisgKiBhcyBpdHMgZmlyc3QgZmllbGQsIGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIGZ1bmN0aW9ucy4KKyAqCisgKiBTZWUgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX3RfZnVuY3NfdAorICogYmVsb3cgZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICpmdW5jczsKK30gYW5kcm9pZF90dHNfZW5naW5lX3Q7CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBUVFMgRW5naW5lIHNoYXJlZCBsaWJyYXJ5CisgKiBhbmQgbXVzdCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYW4gYW5kcm9pZF90dHNfZW5naW5lX3QgbGlicmFyeS4KKyAqLworZXh0ZXJuIGFuZHJvaWRfdHRzX2VuZ2luZV90ICphbmRyb2lkX2dldFR0c0VuZ2luZSgpOworCisvKiBJbmNsdWRpbmcgdGhlIG9sZCB2ZXJzaW9uIGZvciBsZWdhY3kgc3VwcG9ydCAoRnJveW8gY29tcGF0aWJpbGl0eSkuCisgKiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgYW5kcm9pZF9nZXRUdHNFbmdpbmUuCisgKi8KK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfZW5naW5lX3QgKmdldFR0c0VuZ2luZSgpOworCisvLyBBIGNhbGxiYWNrIHR5cGUgdXNlZCB0byBub3RpZnkgdGhlIGZyYW1ld29yayBvZiBuZXcgc3ludGhldGl6ZWQKKy8vIGF1ZGlvIHNhbXBsZXMsIHN0YXR1cyB3aWxsIGJlIFNZTlRIX0RPTkUgZm9yIHRoZSBsYXN0IHNhbXBsZSBvZgorLy8gdGhlIGxhc3QgcmVxdWVzdCwgb2YgU1lOVEhfUEVORElORyBvdGhlcndpc2UuCisvLworLy8gVGhpcyBpcyBwYXNzZWQgYnkgdGhlIGZyYW1ld29yayB0byB0aGUgZW5naW5lIHRocm91Z2ggdGhlCisvLyAnZW5naW5lX2luaXQnIGZ1bmN0aW9uIChzZWUgYmVsb3cpLgorLy8KKy8vIFRoZSBjYWxsYmFjayBmb3Igc3ludGhlc2lzIGNvbXBsZXRlZCB0YWtlczoKKy8vIEBwYXJhbSBbaW5vdXRdIHZvaWQgKiYgICAgICAgLSBUaGUgdXNlcmRhdGEgcG9pbnRlciBzZXQgaW4gdGhlIG9yaWdpbmFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoIGNhbGwKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6CisvLyBAcGFyYW0gW2luXSAgICB1aW50MzJfdCAgICAgIC0gVGhlIGF1ZGlvIGZvcm1hdAorLy8gQHBhcmFtIFtpbl0gICAgaW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKy8vIEBwYXJhbSBbaW5vdXRdIGludDhfdCAqJiAgICAgLSBBIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIG9ubHkgdmFsaWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2sKKy8vIEBwYXJhbSBbaW5vdXRdIHNpemVfdCAgJiAgICAgLSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisvLyBAcGFyYW0gW2luXSB0dHNfc3ludGhfc3RhdHVzIC0gaW5kaWNhdGUgd2hldGhlciB0aGUgc3ludGhlc2lzIGlzIGRvbmUsIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vcmUgZGF0YSBpcyB0byBiZSBzeW50aGVzaXplZC4KKy8vIEByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQgdG8gaW5kaWNhdGUgdGhlIHN5bnRoZXNpcyBtdXN0IHN0b3AsCisvLyAgICAgICAgIFRUU19DQUxMQkFDS19DT05USU5VRSB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3QgY29udGludWUgaWYKKy8vICAgICAgICAgICAgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHByb2R1Y2UuCit0eXBlZGVmIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190ICgqYW5kcm9pZF90dHNfc3ludGhfY2JfdCkKKyAgICAgICAgICAgICh2b2lkICoqcFVzZXJEYXRhLAorICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrU2FtcGxpbmdIeiwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgIGludDhfdCAqKnBBdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cyk7CisKKworLy8gVGhlIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgdGhlIGFuZHJvaWRfdHRzX2VuZ2luZV90IG11c3QgcG9pbnQgdG8uCisvLyBOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCB0YWtlIGEgaGFuZGxlIHRvIHRoZSBlbmdpbmUgaXRzZWxmCisvLyBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXIuCisvLworCitzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgeworICAgIC8vIHJlc2VydmVkIGZpZWxkcywgaWdub3JlZCBieSB0aGUgZnJhbWV3b3JrCisgICAgLy8gdGhleSBtdXN0IGJlIHBsYWNlZCBoZXJlIHRvIGVuc3VyZSBiaW5hcnkgY29tcGF0aWJpbGl0eQorICAgIC8vIG9mIGxlZ2FjeSBiaW5hcnkgcGx1Z2lucy4KKyAgICB2b2lkICpyZXNlcnZlZFsyXTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIFRUUyBlbmdpbmUgYW5kIHJldHVybnMgd2hldGhlciBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQuCisgICAgLy8gQHBhcmFtIHN5bnRoRG9uZUNCUHRyIHN5bnRoZXNpcyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmluaXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX2NiX3Qgc3ludGhEb25lUHRyLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZyk7CisKKyAgICAvLyBTaHV0IGRvd24gdGhlIFRUUyBlbmdpbmUgYW5kIHJlbGVhc2VzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2h1dGRvd24pCisgICAgICAgICAgICAodm9pZCAqZW5naW5lKTsKKworICAgIC8vIEludGVycnVwdCBzeW50aGVzaXMgYW5kIGZsdXNoZXMgYW55IHN5bnRoZXNpemVkIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbgorICAgIC8vIG91dHB1dCB5ZXQuIFRoaXMgd2lsbCBibG9jayB1bnRpbCBjYWxsYmFja3MgdW5kZXJ3YXkgYXJlIGNvbXBsZXRlZC4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3RvcCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gUmV0dXJucyB0aGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50LgorICAgIC8vIEByZXR1cm4gVFRTX0xBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBhcmUgc3VwcG9ydGVkLAorICAgIC8vICAgICAgICAgICAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZQorICAgIC8vICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLCBidXQgdGhlcmUgaXMgbm8gbWF0Y2ggZm9yCisgICAgLy8gICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB2YXJpYW50CisgICAgLy8gICAgICAgICBUVFNfTEFOR19BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGlzIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNvdW50cnkgYW5kIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX01JU1NJTkdfREFUQSBpZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIHByb3ZpZGUgYW55IGxldmVsIG9mIHN1cHBvcnQKKyAgICAvLyAgICAgICAgICAgICBmb3IgdGhlIGxhbmd1YWdlIGFyZSBub3QgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVFRTIGVuZ2luZS4KKyAgICBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90ICgqaXNMYW5ndWFnZUF2YWlsYWJsZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLiBUaGUgbG9hZGVkCisgICAgLy8gbGFuZ3VhZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgb25jZSBhIGNhbGwgdG8gc2V0TGFuZ3VhZ2UoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpsb2FkTGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsYW5ndWFnZSwgY291bnRyeSBhbmQgTG9jYWxlIHZhcmlhbnQuCisgICAgLy8gVGhlIGxvYWRlZCBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZUZyb21Mb2NhbGUoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBzZXQgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQsIG9yIGVtcHR5IHN0cmluZ3MgaWYgbm9uZSBvZgorICAgIC8vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIDMtbGV0dGVyIElTTyBjb2RlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIDMtbGV0dGVyIGNvZGUgY291bnRyeSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIHZhcmlhbnQgdmFsdWUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqZ2V0TGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNoYXIgKmxhbmd1YWdlLAorICAgICAgICAgICAgIGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBOb3RpZmllcyB0aGUgZW5naW5lIHdoYXQgYXVkaW8gcGFyYW1ldGVycyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHN5bnRoZXNpcy4KKyAgICAvLyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBoaW50LCB0aGUgZW5naW5lIGltcGxlbWVudGF0aW9uIHdpbGwgc2V0IHRoZSBvdXRwdXQgdmFsdWVzCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHN5bnRoZXNpcyBmb3JtYXQsIGJhc2VkIG9uIGEgZ2l2ZW4gaGludC4KKyAgICAvLyBAcGFyYW1baW5vdXRdIGVuY29kaW5nIGluOiB0aGUgZGVzaXJlZCBhdWRpbyBzYW1wbGUgZm9ybWF0CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW1baW5vdXRdIHJhdGUgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSByYXRlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgc2FtcGxlIHJhdGUgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gY2hhbm5lbHMgaW46IHRoZSBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIG51bWJlciBvZiBjaGFubmVscyB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldEF1ZGlvRm9ybWF0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCogcEVuY29kaW5nLAorICAgICAgICAgICAgIHVpbnQzMl90KiBwUmF0ZSwKKyAgICAgICAgICAgICBpbnQqIHBDaGFubmVscyk7CisKKyAgICAvLyBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHRoZSBUVFMgZW5naW5lCisgICAgLy8gInNpemUiIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgInZhbHVlIiBmb3IgcHJvcGVydGllcyAicHJvcGVydHkiCisgICAgLy8gQHBhcmFtIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW0gdmFsdWUgICAgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAvLyBAcGFyYW0gc2l6ZSAgICAgbWF4aW11bSBzaXplIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgdHlwZSBvZiBwcm9wZXJ0eQorICAgIC8vIEByZXR1cm4gICAgICAgICBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRSwKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9yIFRUU19WQUxVRV9JTlZBTElECisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUpOworCisgICAgLy8gUmV0cmlldmUgYSBwcm9wZXJ0eSBmcm9tIHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtICAgICAgICBwcm9wZXJ0eSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgLy8gQHBhcmFtW291dF0gICB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbGFuZ3VhZ2UgdmFsdWUKKyAgICAvLyBAcGFyYW1baW5vdXRdIGlvc2l6ZSAgIGluOiBzdG9yZXMgdGhlIHNpemUgYXZhaWxhYmxlIHRvIHN0b3JlIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG91dDogc3RvcmVzIHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGxhbmd1YWdlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlmIGdldExhbmd1YWdlKCkgcmV0dXJuZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMLCB1bmNoYW5nZWQgb3RoZXJ3aXNlCisgICAgLy8gQHJldHVybiBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLAorICAgIC8vICAgICAgICAgb3IgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgc2l6ZV90ICppb3NpemUpOworCisgICAgLy8gU3ludGhlc2l6ZSB0aGUgdGV4dC4KKyAgICAvLyBBcyB0aGUgc3ludGhlc2lzIGlzIHBlcmZvcm1lZCwgdGhlIGVuZ2luZSBpbnZva2VzIHRoZSBjYWxsYmFjayB0byBub3RpZnkKKyAgICAvLyB0aGUgVFRTIGZyYW1ld29yayB0aGF0IGl0IGhhcyBmaWxsZWQgdGhlIGdpdmVuIGJ1ZmZlciwgYW5kIGluZGljYXRlcyBob3cKKyAgICAvLyBtYW55IGJ5dGVzIGl0IHdyb3RlLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVuZ2luZQorICAgIC8vIGhhcyBnZW5lcmF0ZWQgYWxsIHRoZSBhdWRpbyBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRleHQuCisgICAgLy8gTm90ZSBhYm91dCB0aGUgZm9ybWF0IG9mIHRoZSBpbnB1dDogdGhlIHRleHQgcGFyYW1ldGVyIG1heSB1c2UgdGhlCisgICAgLy8gZm9sbG93aW5nIGVsZW1lbnRzCisgICAgLy8gYW5kIHRoZWlyIHJlc3BlY3RpdmUgYXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBTU01MIDEuMCBzcGVjaWZpY2F0aW9uOgorICAgIC8vICAgICogbGFuZworICAgIC8vICAgICogc2F5LWFzOgorICAgIC8vICAgICAgICAgIG8gaW50ZXJwcmV0LWFzCisgICAgLy8gICAgKiBwaG9uZW1lCisgICAgLy8gICAgKiB2b2ljZToKKyAgICAvLyAgICAgICAgICBvIGdlbmRlciwKKyAgICAvLyAgICAgICAgICBvIGFnZSwKKyAgICAvLyAgICAgICAgICBvIHZhcmlhbnQsCisgICAgLy8gICAgICAgICAgbyBuYW1lCisgICAgLy8gICAgKiBlbXBoYXNpcworICAgIC8vICAgICogYnJlYWs6CisgICAgLy8gICAgICAgICAgbyBzdHJlbmd0aCwKKyAgICAvLyAgICAgICAgICBvIHRpbWUKKyAgICAvLyAgICAqIHByb3NvZHk6CisgICAgLy8gICAgICAgICAgbyBwaXRjaCwKKyAgICAvLyAgICAgICAgICBvIGNvbnRvdXIsCisgICAgLy8gICAgICAgICAgbyByYW5nZSwKKyAgICAvLyAgICAgICAgICBvIHJhdGUsCisgICAgLy8gICAgICAgICAgbyBkdXJhdGlvbiwKKyAgICAvLyAgICAgICAgICBvIHZvbHVtZQorICAgIC8vICAgICogbWFyaworICAgIC8vIERpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyB0ZXh0IGZvcm1hdCBhbmQgU1NNTCBhcmU6CisgICAgLy8gICAgKiBmdWxsIFNTTUwgZG9jdW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gICAgKiBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gVGV4dCBpcyBjb2RlZCBpbiBVVEYtOC4KKyAgICAvLyBAcGFyYW0gdGV4dCAgICAgIHRoZSBVVEYtOCB0ZXh0IHRvIHN5bnRoZXNpemUKKyAgICAvLyBAcGFyYW0gdXNlcmRhdGEgIHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgY2FsbCBpcyBpbnZva2VkCisgICAgLy8gQHBhcmFtIGJ1ZmZlciAgICB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHN5bnRoZXNpemVkIGRhdGEgbXVzdCBiZSB3cml0dGVuCisgICAgLy8gQHBhcmFtIGJ1ZmZlclNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluIGJ1ZmZlcgorICAgIC8vIEByZXR1cm4gICAgICAgICAgVFRTX1NVQ0NFU1Mgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnN5bnRoZXNpemVUZXh0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgIGludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBTkRST0lEX1RUU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcAppbmRleCA5MjQ3MzdlLi5hMTJlZGYyIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCisrKyBiL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKQEAgLTM5LDYgKzM5LDggQEAKICN1bmRlZiBDQUxMX0dMX0FQSQogI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgogCisjZGVmaW5lIERFQlVHX0NBTExfR0xfQVBJIDAKKwogI2lmIFVTRV9GQVNUX1RMU19LRVkKIAogICAgICNpZmRlZiBIQVZFX0FSTV9UTFNfUkVHSVNURVIKQEAgLTczLDEwICs3NSwyNCBAQAogCiAgICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX2FwaQogCisjaWYgREVCVUdfQ0FMTF9HTF9BUEkKKwogICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKQotICAgIAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgR0xlbnVtIHN0YXR1cyA9IEdMX05PX0VSUk9SOyBcCisgICAgICAgIHdoaWxlICgoc3RhdHVzID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgeyBcCisgICAgICAgICAgICBMT0dEKCJbIiAjX2FwaSAiXSAweCV4Iiwgc3RhdHVzKTsgXAorICAgICAgICB9CisKKyNlbHNlCisKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7CisKKyNlbmRpZgorCiAgICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKICAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NDdjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWdsMl9wZXJmLmNwcCBcCisJZmlsbHRlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliRUdMIFwKKyAgICBsaWJHTEVTdjIgXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWdsMl9wZXJmCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkYjFiMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK0ZJTEUgKiBmT3V0ID0gTlVMTDsKK3ZvaWQgcHRTd2FwKCk7CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgTE9HRSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKKyAgICB9Cit9CisKK0dMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOworICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7CisgICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgICAgICBHTGludCBjb21waWxlZCA9IDA7CisgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKKyAgICAgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgICAgICBpZiAoaW5mb0xlbikgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOworICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsIHNoYWRlclR5cGUsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CisKK2VudW0geworICAgIEFfUE9TLAorICAgIEFfQ09MT1IsCisgICAgQV9URVgwLAorICAgIEFfVEVYMQorfTsKKworR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7CisgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7CisgICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7CisgICAgaWYgKCFwaXhlbFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtKSB7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdiIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgcCIpOworCisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfUE9TLCAiYV9wb3MiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9DT0xPUiwgImFfY29sb3IiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgwLCAiYV90ZXgwIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMSwgImFfdGV4MSIpOworICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7CisgICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7CisgICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOworICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgcHJvZ3JhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tHbEVycm9yKCJjcmVhdGVQcm9ncmFtIik7CisgICAgZ2xVc2VQcm9ncmFtKHByb2dyYW0pOworICAgIHJldHVybiBwcm9ncmFtOworfQorCit1aW50NjRfdCBnZXRUaW1lKCkgeworICAgIHN0cnVjdCB0aW1lc3BlYyB0OworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIHQudHZfbnNlYyArICgodWludDY0X3QpdC50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDApOworfQorCit1aW50NjRfdCBnVGltZTsKK3ZvaWQgc3RhcnRUaW1lcigpIHsKKyAgICBnVGltZSA9IGdldFRpbWUoKTsKK30KKwordm9pZCBlbmRUaW1lcihjb25zdCBjaGFyICpzdHIsIGludCB3LCBpbnQgaCwgZG91YmxlIGRjLCBpbnQgY291bnQpIHsKKyAgICB1aW50NjRfdCB0MiA9IGdldFRpbWUoKTsKKyAgICBkb3VibGUgZGVsdGEgPSAoKGRvdWJsZSkodDIgLSBnVGltZSkpIC8gMTAwMDAwMDAwMDsKKyAgICBkb3VibGUgcGl4ZWxzID0gZGMgKiAodyAqIGgpICogY291bnQ7CisgICAgZG91YmxlIG1wcHMgPSBwaXhlbHMgLyBkZWx0YSAvIDEwMDAwMDA7CisgICAgZG91YmxlIGRjNjAgPSBwaXhlbHMgLyBkZWx0YSAvICh3ICogaCkgLyA2MDsKKworICAgIGlmIChmT3V0KSB7CisgICAgICAgIGZwcmludGYoZk91dCwgIiVzLCAlZiwgJWZcclxuIiwgc3RyLCBtcHBzLCBkYzYwKTsKKyAgICAgICAgZmZsdXNoKGZPdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMsICVmLCAlZlxuIiwgc3RyLCBtcHBzLCBkYzYwKTsKKyAgICB9CisgICAgTE9HSSgiJXMsICVmLCAlZlxyXG4iLCBzdHIsIG1wcHMsIGRjNjApOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9CisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDA7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MTtcbiIKKyAgICAidmFyeWluZyB2ZWM0IHZfY29sb3I7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDE7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgICAgdl9jb2xvciA9IGFfY29sb3I7XG4iCisgICAgIiAgICB2X3RleDAgPSBhX3RleDA7XG4iCisgICAgIiAgICB2X3RleDEgPSBhX3RleDE7XG4iCisgICAgIiAgICBnbF9Qb3NpdGlvbiA9IGFfcG9zO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBnU2hhZGVyUHJlZml4W10gPQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzA7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzE7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzI7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzM7XG4iCisgICAgInZhcnlpbmcgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgxO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MTtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgZ1NoYWRlclBvc3RmaXhbXSA9CisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIjsKKworCitzdGF0aWMgY2hhciAqIGFwcGVuZChjaGFyICpkLCBjb25zdCBjaGFyICpzKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKyAgICBtZW1jcHkoZCwgcywgbGVuKTsKKyAgICByZXR1cm4gZCArIGxlbjsKK30KKworc3RhdGljIGNoYXIgKiBnZW5TaGFkZXIoCisgICAgYm9vbCB1c2VWYXJDb2xvciwKKyAgICBpbnQgdGV4Q291bnQsCisgICAgYm9vbCBtb2R1bGF0ZUZpcnN0VGV4LAorICAgIGludCBleHRyYU1hdGgpCit7CisgICAgY2hhciAqc3RyID0gKGNoYXIgKiljYWxsb2MoMTYgKiAxMDI0LCAxKTsKKyAgICBjaGFyICp0bXAgPSBhcHBlbmQoc3RyLCBnU2hhZGVyUHJlZml4KTsKKworICAgIGlmIChtb2R1bGF0ZUZpcnN0VGV4IHx8ICF0ZXhDb3VudCkgeworICAgICAgICBpZiAodXNlVmFyQ29sb3IpIHsKKyAgICAgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHZfY29sb3I7XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHVfY29sb3I7XG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iKTsKKyAgICB9CisKKyAgICBpZiAobW9kdWxhdGVGaXJzdFRleCAmJiB0ZXhDb3VudCkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iKTsKKyAgICB9CisgICAgaWYgKHRleENvdW50ID4gMSkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHRleHR1cmUyRCh1X3RleDEsIHZfdGV4MSk7XG4iKTsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFNYXRoID4gMCkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMDtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMSkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICs9IHVfMTtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMikgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMjtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMykgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICs9IHVfMztcbiIpOworICAgIH0KKworCisgICAgdG1wID0gYXBwZW5kKHRtcCwgZ1NoYWRlclBvc3RmaXgpOworICAgIHRtcFswXSA9IDA7CisKKyAgICAvL3ByaW50ZigiJXMiLCBzdHIpOworICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwVkEoKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHZ0eFtdID0geworICAgICAgICAtMS4wZiwtMS4wZiwKKyAgICAgICAgIDEuMGYsLTEuMGYsCisgICAgICAgIC0xLjBmLCAxLjBmLAorICAgICAgICAgMS4wZiwgMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBjb2xvcltdID0geworICAgICAgICAxLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMC4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMS4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDBbXSA9IHsKKyAgICAgICAgMC4wZiwwLjBmLAorICAgICAgICAxLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDFbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmIH07CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfUE9TKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfQ09MT1IpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgwKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMSk7CisKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9QT1MsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdnR4KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9DT0xPUiwgNCwgR0xfRkxPQVQsIGZhbHNlLCAxNiwgY29sb3IpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDAsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMSwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgxKTsKK30KKworc3RhdGljIHZvaWQgcmFuZFVuaWZvcm0oaW50IHBnbSwgY29uc3QgY2hhciAqdmFyKSB7CisgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgdmFyKTsKKyAgICBpZiAobG9jID49IDApIHsKKyAgICAgICAgZmxvYXQgeCA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB5ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHogPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgdyA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBnbFVuaWZvcm00Zihsb2MsIHgsIHksIHosIHcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG9Mb29wKGJvb2wgY2xlYXIsIGludCBwZ20sIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IGNoYXIgKnN0cikgeworICAgIGlmIChjbGVhcikgeworICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKKyAgICAgICAgcHRTd2FwKCk7CisgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGFydFRpbWVyKCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDA7IGN0KyspIHsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV9jb2xvciIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzAiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8xIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMiIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzMiKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKKyAgICB9CisgICAgcHRTd2FwKCk7CisgICAgZ2xGaW5pc2goKTsKKyAgICBlbmRUaW1lcihzdHIsIHcsIGgsIDEsIDEwMCk7Cit9CisKK3ZvaWQgZ2VuVGV4dHVyZXMoKSB7CisgICAgdWludDMyX3QgKm0gPSAodWludDMyX3QgKiltYWxsb2MoMTAyNCoxMDI0KjQpOworICAgIGZvciAoaW50IHk9MDsgeSA8IDEwMjQ7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDEwMjQ7IHgrKyl7CisgICAgICAgICAgICBtW3kqMTAyNCArIHhdID0gMHhmZjAwMDBmZiB8ICgoeCAmIDB4ZmYpIDw8IDgpIHwgKHkgPDwgMTYpOworICAgICAgICB9CisgICAgfQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMSk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDEwMjQsIDEwMjQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworCisgICAgZm9yIChpbnQgeT0wOyB5IDwgMTY7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDE2OyB4KyspeworICAgICAgICAgICAgbVt5KjE2ICsgeF0gPSAweGZmMDAwMGZmIHwgKHg8PDEyKSB8ICh5PDwyMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAyKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTYsIDE2LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworfQorCisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ0ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworI2luY2x1ZGUgImZpbGxfY29tbW9uLmNwcCIKKworc3RhdGljIHZvaWQgZG9TaW5nbGVUZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VWYXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtb2R1bGF0ZUZpcnN0VGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYU1hdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleDAsIGludCB0ZXgxKSB7CisgICAgY2hhciAqcGdtVHh0ID0gZ2VuU2hhZGVyKHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoKTsKKyAgICBpbnQgcGdtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBwZ21UeHQpOworICAgIGlmICghcGdtKSB7CisgICAgICAgIHByaW50ZigiZXJyb3IgcnVubmluZyB0ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgwIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDApOworICAgIGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MSIpOworICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAxKTsKKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgwKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4MSk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKworICAgIGNoYXIgc3RyMlsxMDI0XTsKKworICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FKTsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIC8vc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAwIiwKKyAgICAgICAgICAgIC8vdXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgsIHRleDApOworICAgIC8vZG9Mb29wKHRydWUsIHBnbSwgdywgaCwgc3RyMik7CisgICAgLy9kb0xvb3AoZmFsc2UsIHBnbSwgdywgaCwgc3RyMik7CisKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAxIiwKKyAgICAgICAgICAgIHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKyAgICBkb0xvb3AodHJ1ZSwgcGdtLCB3LCBoLCBzdHIyKTsKKyAgICBkb0xvb3AoZmFsc2UsIHBnbSwgdywgaCwgc3RyMik7Cit9CisKK2Jvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKKyAgICBzZXR1cFZBKCk7CisgICAgZ2VuVGV4dHVyZXMoKTsKKworICAgIHByaW50ZigiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKKworICAgIGZvciAoaW50IHRleENvdW50ID0gMDsgdGV4Q291bnQgPCAyOyB0ZXhDb3VudCsrKSB7CisgICAgICAgIGZvciAoaW50IGV4dHJhTWF0aCA9IDA7IGV4dHJhTWF0aCA8IDU7IGV4dHJhTWF0aCsrKSB7CisKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDEsIDEpOworICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAxLCAxKTsKKyAgICAgICAgICAgIGlmICh0ZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMSwgMSk7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDEsIDEpOworCisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAyLCAyKTsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDIsIDIpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAyLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4aXQoMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmY2YxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgorI2luY2x1ZGUgPHVpL0VHTFV0aWxzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKK3N0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKKyAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7CisgICAgfQorCisgICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKKyAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKKyAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKKyAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKKyAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKKyAgICB9Cit9CisKK2Jvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOworCitzdGF0aWMgRUdMRGlzcGxheSBkcHk7CitzdGF0aWMgRUdMU3VyZmFjZSBzdXJmYWNlOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBFR0xCb29sZWFuIHJldHVyblZhbHVlOworICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsKKworICAgIEVHTGludCBjb250ZXh0X2F0dHJpYnNbXSA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FIH07CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCisgICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICBFR0xfTk9ORSB9OworICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgRUdMaW50IHcsIGg7CisKKworICAgIGNoZWNrRWdsRXJyb3IoIjxpbml0PiIpOworICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOworICAgIGlmIChkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IHJldHVybmVkIEVHTF9OT19ESVNQTEFZLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVyblZhbHVlID0gZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgIGNoZWNrRWdsRXJyb3IoImVnbEluaXRpYWxpemUiLCByZXR1cm5WYWx1ZSk7CisgICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7CisgICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsNCisgICAgcmV0dXJuVmFsdWUgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KGRweSwgc19jb25maWdBdHRyaWJzLCB3aW5kb3csICZteUNvbmZpZyk7CisgICAgaWYgKHJldHVyblZhbHVlKSB7CisgICAgICAgIHByaW50ZigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygpIHJldHVybmVkICVkIiwgcmV0dXJuVmFsdWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjaGVja0VnbEVycm9yKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93Iik7CisKKyAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIG15Q29uZmlnLCB3aW5kb3csIE5VTEwpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKKyAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBwcmludGYoImdlbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYnMpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVyblZhbHVlID0gZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldHVyblZhbHVlKTsKKyAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKKyAgICBHTGludCBkaW0gPSB3IDwgaCA/IHcgOiBoOworCisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZG9UZXN0KHcsIGgpOworICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xTd2FwQnVmZmVycyIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIHB0U3dhcCgpIHsKKyAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc1YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9wZW5HTCBFUyBQZXJmIEFwcAorIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkgIyBub3QgNjQgYml0IGNsZWFuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMUGVyZgorCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbHBlcmYKKworIyBSdW4gb24gRWNsYWlyCitMT0NBTF9TREtfVkVSU0lPTiA6PSA3CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIEpOSSBTaGFyZWQgTGlicmFyeQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitMT0NBTF9QQVRIOj0gJChMT0NBTF9QQVRIKS9qbmkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT3B0aW9uYWwgdGFnIHdvdWxkIG1lYW4gaXQgZG9lc24ndCBnZXQgaW5zdGFsbGVkIGJ5IGRlZmF1bHQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgZ2xfY29kZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlidXRpbHMgXAorCWxpYkVHTCBcCisJbGliR0xFU3YyCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJnbHBlcmYKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNWQ5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbHBlcmYiCisgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wLjAiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEwMDAwIiA+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iNyIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI3IiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2xwZXJmX2FjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0xQZXJmQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQzMjkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCkBAIC0wLDAgKzEsMTk0IEBACisvLyBPcGVuR0wgRVMgMi4wIGNvZGUKKworI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KKyNkZWZpbmUgTE9HX1RBRyAiR0xQZXJmIGdsX2NvZGUuY3BwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICIuLi8uLi9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4KKwordWludDMyX3QgdzsKK3VpbnQzMl90IGg7CisKKy8vIFRoZSBzdGF0ZUNsb2NrIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpbmNyZW1lbnRzIGJ5IDEgZXZlcnkgdGltZSB3ZSBkcmF3IGEgZnJhbWUuIEl0IGlzIHVzZWQgdG8gY29udHJvbCB3aGljaCBwaGFzZSBvZiB0aGUgdGVzdCB3ZSBhcmUgaW4uCisKK2ludCBzdGF0ZUNsb2NrOworY29uc3QgaW50IGRvTG9vcFN0YXRlcyA9IDI7Citjb25zdCBpbnQgZG9TaW5nbGVUZXN0U3RhdGVzID0gMjsKK2Jvb2wgZG9uZTsKKworLy8gU2F2ZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRlc3QgKHNvIHdlIGNhbiBwcmludCB0aGVtIG91dCB3aGVuIHdlIGZpbmlzaCB0aGUgdGltaW5nLikKKworY2hhciBzYXZlQnVmWzEwMjRdOworCisKK2ludCBwZ207CisKK3ZvaWQgcHRTd2FwKCkgeworfQorCitzdGF0aWMgdm9pZCBkb1NpbmdsZVRlc3QodWludDMyX3QgdywgdWludDMyX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZVZhckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1vZHVsYXRlRmlyc3RUZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhTWF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGV4MCwgaW50IHRleDEpIHsKKyAgICBpbnQgZG9TaW5nbGVUZXN0U3RhdGUgPSAoc3RhdGVDbG9jayAvIGRvTG9vcFN0YXRlcykgJSBkb1NpbmdsZVRlc3RTdGF0ZXM7CisgICAgLy8gTE9HSSgiZG9TaW5nbGVUZXN0ICVkXG4iLCBkb1NpbmdsZVRlc3RTdGF0ZSk7CisgICAgc3dpdGNoIChkb1NpbmdsZVRlc3RTdGF0ZSkgeworCWNhc2UgMDogeworCSAgICBjaGFyICpwZ21UeHQgPSBnZW5TaGFkZXIodXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgpOworCSAgICBwZ20gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIHBnbVR4dCk7CisJICAgIGlmICghcGdtKSB7CisJCUxPR0UoImVycm9yIHJ1bm5pbmcgdGVzdFxuIik7CisJCXJldHVybjsKKwkgICAgfQorCSAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgwIik7CisJICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAwKTsKKwkgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7CisJICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAxKTsKKworCSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleDApOworCSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleDEpOworCSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisKKwkgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworCSAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICAgICAgY2hhciBzdHIyWzEwMjRdOworCSAgICBzcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDAiLAorCQkgICAgdXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgsIHRleDApOworCisgICAgCSAgICBkb0xvb3AoKHN0YXRlQ2xvY2sgJSBkb0xvb3BTdGF0ZXMpICE9IDAsIHBnbSwgdywgaCwgc3RyMik7CisJIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICBjaGFyIHN0cjJbMTAyNF07CisJICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKwkgICAgc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAxIiwKKwkJICAgIHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKwkgICAgZG9Mb29wKChzdGF0ZUNsb2NrICUgZG9Mb29wU3RhdGVzKSAhPSAwLCBwZ20sIHcsIGgsIHN0cjIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCit2b2lkIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7CisgICAgaW50IHRlc3RTdGF0ZSA9IHN0YXRlQ2xvY2sgLyAoZG9Mb29wU3RhdGVzICogZG9TaW5nbGVUZXN0U3RhdGVzKTsKKyAgICBpbnQgdGV4Q291bnQ7CisgICAgaW50IGV4dHJhTWF0aDsKKyAgICBpbnQgdGVzdFN1YlN0YXRlOworICAgIGNvbnN0IGludCBleHRyYU1hdGhDb3VudCA9IDU7CisgICAgY29uc3QgaW50IHRleENvdW50MFN1YlRlc3RDb3VudCA9IDI7CisgICAgY29uc3QgaW50IHRleENvdW50TlN1YlRlc3RDb3VudCA9IDg7CisKKyAgICBpZiAoIHRlc3RTdGF0ZSA8IGV4dHJhTWF0aENvdW50ICogdGV4Q291bnQwU3ViVGVzdENvdW50KSB7CisgICAgICAgdGV4Q291bnQgPSAwOyAvLyBPbmx5IDEwIHRlc3RzIGZvciB0ZXhDb3VudCAwCisgICAgICAgZXh0cmFNYXRoID0gKHRlc3RTdGF0ZSAvIHRleENvdW50MFN1YlRlc3RDb3VudCkgJSBleHRyYU1hdGhDb3VudDsKKyAgICAgICB0ZXN0U3ViU3RhdGUgPSB0ZXN0U3RhdGUgJSB0ZXhDb3VudDBTdWJUZXN0Q291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICB0ZXhDb3VudCA9IDEgKyAodGVzdFN0YXRlIC0gZXh0cmFNYXRoQ291bnQgKiB0ZXhDb3VudDBTdWJUZXN0Q291bnQpIC8gKGV4dHJhTWF0aENvdW50ICogdGV4Q291bnROU3ViVGVzdENvdW50KTsKKyAgICAgICBleHRyYU1hdGggPSAodGVzdFN0YXRlIC8gdGV4Q291bnROU3ViVGVzdENvdW50KSAlIGV4dHJhTWF0aENvdW50OworICAgICAgIHRlc3RTdWJTdGF0ZSA9IHRlc3RTdGF0ZSAlIHRleENvdW50TlN1YlRlc3RDb3VudDsKKyAgICB9CisgICAgaWYgKHRleENvdW50ID49IDMpIHsKKyAgICAgICBMT0dJKCJkb25lXG4iKTsKKyAgICAgICBpZiAoZk91dCkgeworICAgICAgICAgICBmY2xvc2UoZk91dCk7CisgICAgICAgICAgIGZPdXQgPSBOVUxMOworICAgICAgIH0KKyAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvLyBMT0dJKCJkb1Rlc3QgJWQgJWQgJWRcbiIsIHRleENvdW50LCBleHRyYU1hdGgsIHRlc3RTdWJTdGF0ZSk7CisKKyAgICBzd2l0Y2godGVzdFN1YlN0YXRlKSB7CisJY2FzZSAwOgorICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMSwgMSk7CisJYnJlYWs7CisJY2FzZSAxOgorICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAxLCAxKTsKKwlicmVhazsKKwljYXNlIDI6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAxLCAxKTsKKwlicmVhazsKKwljYXNlIDM6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDEsIDEpOworCWJyZWFrOworCisJY2FzZSA0OgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDIsIDIpOworCWJyZWFrOworCWNhc2UgNToKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDIsIDIpOworCWJyZWFrOworCWNhc2UgNjoKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDIsIDIpOworCWJyZWFrOworCWNhc2UgNzoKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMiwgMik7CisJYnJlYWs7CisgICAgfQorfQorCitleHRlcm4gIkMiIHsKKyAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCk7CisgICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKK307CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQoreworICAgIGlmICghZG9uZSkgeworCSAgICB3ID0gd2lkdGg7CisJICAgIGggPSBoZWlnaHQ7CisJICAgIHN0YXRlQ2xvY2sgPSAwOworCSAgICBkb25lID0gZmFsc2U7CisJICAgIHNldHVwVkEoKTsKKwkgICAgZ2VuVGV4dHVyZXMoKTsKKwkgICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAiL3NkY2FyZC9nbHBlcmYuY3N2IjsKKyAgICAgICAgICAgIGlmIChmT3V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgTE9HSSgiQ2xvc2luZyBwYXJ0aWFsbHkgd3JpdHRlbiBvdXRwdXQubiIpOworICAgICAgICAgICAgICAgICBmY2xvc2UoZk91dCk7CisgICAgICAgICAgICAgICAgIGZPdXQgPSBOVUxMOworICAgICAgICAgICAgfQorCSAgICBMT0dJKCJXcml0aW5nIHRvOiAlc1xuIixmaWxlTmFtZSk7CisJICAgIGZPdXQgPSBmb3BlbihmaWxlTmFtZSwgInciKTsKKwkgICAgaWYgKGZPdXQgPT0gTlVMTCkgeworCQlMT0dFKCJDb3VsZCBub3Qgb3BlbjogJXNcbiIsIGZpbGVOYW1lKTsKKwkgICAgfQorCisJICAgIExPR0koIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisJICAgIGlmIChmT3V0KSBmcHJpbnRmKGZPdXQsInZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcclxuIik7CisgICAgfQorfQorCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCit7CisgICAgaWYgKCEgZG9uZSkgeworICAgICAgICBpZiAoc3RhdGVDbG9jayA+IDAgJiYgKChzdGF0ZUNsb2NrICYgMSkgPT0gMCkpIHsKKwkgICAgZW5kVGltZXIoc2F2ZUJ1ZiwgdywgaCwgMSwgMTAwKTsKKyAgICAgICAgfQorICAgICAgICBkb1Rlc3QodywgaCk7CisgICAgICAgIHN0YXRlQ2xvY2srKzsKKyAgICB9IGVsc2UgeworCSAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIxMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ2xwZXJmX2FjdGl2aXR5Ij5HTFBlcmY8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YzYWJmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworcHVibGljIGNsYXNzIEdMUGVyZkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgR0xQZXJmVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisJZ2V0V2luZG93KCkuc2V0RmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTiwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CisgICAgICAgIG1WaWV3ID0gbmV3IEdMUGVyZlZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisJc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhMGU1NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworCisvLyBXcmFwcGVyIGZvciBuYXRpdmUgbGlicmFyeQorCitwdWJsaWMgY2xhc3MgR0xQZXJmTGliIHsKKworICAgICBzdGF0aWMgeworICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJnbHBlcmYiKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdpZHRoIHRoZSBjdXJyZW50IHZpZXcgd2lkdGgKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBjdXJyZW50IHZpZXcgaGVpZ2h0CisgICAgICovCisgICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0ZXAoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlNGE0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgR0xQZXJmVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0xQZXJmVmlldyI7CisKKyAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoZmFsc2UsIDAsIDApOworICAgIH0KKworICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCh0cmFuc2x1Y2VudCwgZGVwdGgsIHN0ZW5jaWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgc2V0RUdMQ29udGV4dEZhY3RvcnkobmV3IENvbnRleHRGYWN0b3J5KCkpOworICAgICAgICBzZXRFR0xDb25maWdDaG9vc2VyKCB0cmFuc2x1Y2VudCA/CisgICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDgsOCw4LDgsIGRlcHRoLCBzdGVuY2lsKSA6CisgICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDUsNiw1LDAsIGRlcHRoLCBzdGVuY2lsKSk7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29udGV4dEZhY3RvcnkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7CisgICAgICAgIHB1YmxpYyBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImNyZWF0aW5nIE9wZW5HTCBFUyAyLjAgY29udGV4dCIpOworICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOworICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTDEwLkVHTF9OT05FIH07CisgICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBhdHRyaWJfbGlzdCk7CisgICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKFN0cmluZyBwcm9tcHQsIEVHTDEwIGVnbCkgeworICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgIHdoaWxlICgoZXJyb3IgPSBlZ2wuZWdsR2V0RXJyb3IoKSkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiJXM6IEVHTCBlcnJvcjogMHgleCIsIHByb21wdCwgZXJyb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ0Nob29zZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbmZpZ0Nob29zZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc19jb25maWdBdHRyaWJzMiA9CisgICAgICAgIHsKKyAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIENvbmZpZ0Nob29zZXIoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgICAgIG1SZWRTaXplID0gcjsKKyAgICAgICAgICAgIG1HcmVlblNpemUgPSBnOworICAgICAgICAgICAgbUJsdWVTaXplID0gYjsKKyAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhOworICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoOworICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7CisKKyAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBudWxsLCAwLCBudW1fY29uZmlnKTsKKworICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOworCisgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKKyAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgY29uZmlncywgbnVtQ29uZmlncywgbnVtX2NvbmZpZyk7CisgICAgICAgICAgICAvLyBwcmludENvbmZpZ3MoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgICAgIHJldHVybiBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgIEVHTENvbmZpZyBjbG9zZXN0Q29uZmlnID0gbnVsbDsKKyAgICAgICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSAxMDAwOworICAgICAgICAgICAgZm9yKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOworICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOworICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcz49IG1TdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhyIC0gbVJlZFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoZyAtIG1HcmVlblNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYiAtIG1CbHVlU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhhIC0gbUFscGhhU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q29uZmlnID0gY29uZmlnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RDb25maWc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKKworICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3MoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3MubGVuZ3RoOworICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIlZCBjb25maWd1cmF0aW9ucyIsIG51bUNvbmZpZ3MpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uICVkOlxuIiwgaSkpOworICAgICAgICAgICAgICAgIHByaW50Q29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgaW50W10gYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0lELAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9SRU5ERVJBQkxFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9JRCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDMwLCAvLyBFR0wxMC5FR0xfUFJFU0VSVkVEX1JFU09VUkNFUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRVMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVfQlVGRkVSUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NVUkZBQ0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzOSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAorICAgICAgICAgICAgICAgICAgICAweDMwM0IsIC8vIEVHTDEwLkVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNDLCAvLyBFR0wxMC5FR0xfTUFYX1NXQVBfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MVU1JTkFOQ0VfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX01BU0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAweDMwNDIgLy8gRUdMMTAuRUdMX0NPTkZPUk1BTlQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CVUZGRVJfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQkxVRV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9HUkVFTl9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9SRURfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfREVQVEhfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU1RFTkNJTF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfQ0FWRUFUIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfSUQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0xFVkVMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1BJWEVMUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfV0lEVEgiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9SRU5ERVJBQkxFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX0lEIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRVMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRV9CVUZGRVJTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TVVJGQUNFX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NSU5fU1dBUF9JTlRFUlZBTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1NXQVBfSU5URVJWQUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0xVTUlOQU5DRV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9NQVNLX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTE9SX0JVRkZFUl9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9SRU5ERVJBQkxFX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZPUk1BTlQiCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6ICVkXG4iLCBuYW1lLCB2YWx1ZVswXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogZmFpbGVkXG4iLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3ViY2xhc3NlcyBjYW4gYWRqdXN0IHRoZXNlIHZhbHVlczoKKyAgICAgICAgcHJvdGVjdGVkIGludCBtUmVkU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtR3JlZW5TaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtQWxwaGFTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1EZXB0aFNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVN0ZW5jaWxTaXplOworICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZSA9IG5ldyBpbnRbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworICAgICAgICAgICAgR0xQZXJmTGliLnN0ZXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBHTFBlcmZMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzc4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQorIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkgIyBub3QgNjQgYml0IGNsZWFuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RWaWV3cG9ydAorCisjIFNldCBhIHNwZWNpZmljIFNESyB2ZXJzaW9uIHNvIHdlIGNhbiBydW4gb24gRnJveW8uCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDgKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTlkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdF9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmFiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitSZXBybyBzdGVwczoKKworYnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgYXR0YWNoZWQgdGVzdCBwcm9ncmFtIFRlc3RWaWV3cG9ydC5hcGsKKworUnVuIG9uIFNhcHBoaXJlIHdpdGggRnJveW8uCisKK1RoZSBwcm9ncmFtIGNsZWFycyB0aGUgc2NyZWVuIHRvIGJsdWUsIHRoZW4gZHJhd3MgYSBmdWxsIHNjcmVlbiB3aGl0ZSBxdWFkIHRoYXQKK2lzIGFsbGlnbmVkIHRvIHRoZSBzY3JlZW4uCisoVGhlcmVmb3JlIHRoZSB3aG9sZSBzY3JlZW4gc2hvdWxkIGFwcGVhciB0byBiZSB3aGl0ZS4pCisKKworTm90ZSB0aGF0IHNjcmVlbiBpcyBhbGwgd2hpdGUuCisKK1JvdGF0ZSBzY3JlZW4gOTAgZGVncmVlcy4KKworRXhwZWN0ZWQ6IHNjcmVlbiBpcyBzdGlsbCBhbGwgd2hpdGUuCisKK0FjdHVhbDogc2NyZWVuIGlzIGJsdWUgd2l0aCBvZmZzZXQgd2hpdGUgcmVjdGFuZ2xlLgorCitUaGlzIGJ1ZyBvbmx5IGhhcHBlbnMgb24gU2FwcGhpcmUsIGl0IHdvcmtzIGNvcnJlY3RseSBvbiBQYXNzaW9uLgorCitXaGF0IGhhcHBlbnM6CisKK0kgdGhpbmsgdGhlIGJ1ZyBpcyB0aGF0IHRoZSBnbC5nbFZpZXdwb3J0KCkgY2FsbCBpbiBvblN1cmZhY2VDaGFuZ2VkKCkgaXMKK2JlaW5nIGlnbm9yZWQgYnkgdGhlIE9wZW5HTCBkcml2ZXIuCisKK05PVEU6IElmIGEgZ2wuZ2xWaWV3cG9ydCBjYWxsIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9uRHJhd0ZyYW1lKCkKK2NhbGwgKHdoaWNoIG1lYW5zIGl0IGlzIGNhbGxlZCBiZWZvcmUgZXZlcnkgZHJhdyksIHRoZSBwcm9ncmFtIHJ1bnMgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRlc3RfYWN0aXZpdHkiPlRlc3QgVmlld3BvcnQ8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2U0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdEFjdGl2aXR5IjsKKyAgICBUZXN0VmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgVGVzdFZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisJICAgIG1WaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworCSAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2MzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBUZXN0VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgICAgICBzZXRSZW5kZXJNb2RlKFJFTkRFUk1PREVfV0hFTl9ESVJUWSk7CisgICAgfQorICAgIAorICAgICAgICAvKiogQSBncmlkIGlzIGEgdG9wb2xvZ2ljYWxseSByZWN0YW5ndWxhciBhcnJheSBvZiB2ZXJ0aWNlcy4KKyAgICAqCisgICAgKiBUaGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIGFyZSBoZWxkIGluIFZCTyBvYmplY3RzIGJlY2F1c2Ugb24gbW9zdAorICAgICogR1BVcyBWQk8gb2JqZWN0cyBhcmUgdGhlIGZhc3Rlc3Qgd2F5IG9mIHJlbmRlcmluZyBzdGF0aWMgdmVydGV4CisgICAgKiBhbmQgaW5kZXggZGF0YS4KKyAgICAqCisgICAgKi8KKworICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JpZCB7CisgICAgICAgLy8gU2l6ZSBvZiB2ZXJ0ZXggZGF0YSBlbGVtZW50cyBpbiBieXRlczoKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IEZMT0FUX1NJWkUgPSA0OworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUl9TSVpFID0gMjsKKworICAgICAgIC8vIFZlcnRleCBzdHJ1Y3R1cmU6CisgICAgICAgLy8gZmxvYXQgeCwgeSwgejsKKworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgVkVSVEVYX1NJWkUgPSAzICogRkxPQVRfU0laRTsKKworICAgICAgIHByaXZhdGUgaW50IG1WZXJ0ZXhCdWZmZXJPYmplY3RJZDsKKyAgICAgICBwcml2YXRlIGludCBtRWxlbWVudEJ1ZmZlck9iamVjdElkOworCisgICAgICAgLy8gVGhlc2UgYnVmZmVycyBhcmUgdXNlZCB0byBob2xkIHRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgd2hpbGUKKyAgICAgICAvLyBjb25zdHJ1Y3RpbmcgdGhlIGdyaWQuIE9uY2UgY3JlYXRlQnVmZmVyT2JqZWN0cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHRoZSBidWZmZXJzIGFyZSBudWxsZWQgb3V0IHRvIHNhdmUgbWVtb3J5LgorCisgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1WZXJ0ZXhCeXRlQnVmZmVyOworICAgICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgbVZlcnRleEJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIENoYXJCdWZmZXIgbUluZGV4QnVmZmVyOworCisgICAgICAgcHJpdmF0ZSBpbnQgbVc7CisgICAgICAgcHJpdmF0ZSBpbnQgbUg7CisgICAgICAgcHJpdmF0ZSBpbnQgbUluZGV4Q291bnQ7CisKKyAgICAgICBwdWJsaWMgR3JpZChpbnQgdywgaW50IGgpIHsKKyAgICAgICAgICAgaWYgKHcgPCAwIHx8IHcgPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInciKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoaCA8IDAgfHwgaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaCIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmICh3ICogaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyAqIGggPj0gNjU1MzYiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIG1XID0gdzsKKyAgICAgICAgICAgbUggPSBoOworICAgICAgICAgICBpbnQgc2l6ZSA9IHcgKiBoOworCisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJURVhfU0laRSAqIHNpemUpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbVZlcnRleEJ5dGVCdWZmZXIuYXNGbG9hdEJ1ZmZlcigpOworCisgICAgICAgICAgIGludCBxdWFkVyA9IG1XIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRIID0gbUggLSAxOworICAgICAgICAgICBpbnQgcXVhZENvdW50ID0gcXVhZFcgKiBxdWFkSDsKKyAgICAgICAgICAgaW50IGluZGV4Q291bnQgPSBxdWFkQ291bnQgKiA2OworICAgICAgICAgICBtSW5kZXhDb3VudCA9IGluZGV4Q291bnQ7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0hBUl9TSVpFICogaW5kZXhDb3VudCkKKyAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNDaGFyQnVmZmVyKCk7CisKKyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0cmlhbmdsZSBsaXN0IG1lc2guCisgICAgICAgICAgICAqCisgICAgICAgICAgICAqICAgICBbMF0tLS0tLVsgIDFdIC4uLgorICAgICAgICAgICAgKiAgICAgIHwgICAgLyAgIHwKKyAgICAgICAgICAgICogICAgICB8ICAgLyAgICB8CisgICAgICAgICAgICAqICAgICAgfCAgLyAgICAgfAorICAgICAgICAgICAgKiAgICAgW3ddLS0tLS1bdysxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgICAgIHwKKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBxdWFkSDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBxdWFkVzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYSA9IChjaGFyKSAoeSAqIG1XICsgeCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYiA9IChjaGFyKSAoeSAqIG1XICsgeCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGQgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHggKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYSk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOworCisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgZCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgIGlmIChpIDwgMCB8fCBpID49IG1XKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpIik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbUgpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImoiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGludCBpbmRleCA9IG1XICogaiArIGk7CisKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wb3NpdGlvbihpbmRleCAqIFZFUlRFWF9TSVpFIC8gRkxPQVRfU0laRSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHgpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh5KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeik7CisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQnVmZmVyT2JqZWN0cyhHTCBnbCkgeworICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIHRoZSB2ZXJ0ZXggYW5kIGVsZW1lbnQgYnVmZmVyIElEcworICAgICAgICAgICBpbnRbXSB2Ym9JZHMgPSBuZXcgaW50WzJdOworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisgICAgICAgICAgIGdsMTEuZ2xHZW5CdWZmZXJzKDIsIHZib0lkcywgMCk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCA9IHZib0lkc1swXTsKKyAgICAgICAgICAgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCA9IHZib0lkc1sxXTsKKworICAgICAgICAgICAvLyBVcGxvYWQgdGhlIHZlcnRleCBkYXRhCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCeXRlQnVmZmVyLmNhcGFjaXR5KCksIG1WZXJ0ZXhCeXRlQnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXIuY2FwYWNpdHkoKSAqIENIQVJfU0laRSwgbUluZGV4QnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBpbi1tZW1vcnkgZGF0YSBhbnkgbW9yZQorICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBudWxsOworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBudWxsOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR0wxMCBnbCkgeworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisKKyAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIGdsMTEuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIFZFUlRFWF9TSVpFLCAwKTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsRHJhd0VsZW1lbnRzKEdMMTAuR0xfVFJJQU5HTEVTLCBtSW5kZXhDb3VudCwgR0wxMC5HTF9VTlNJR05FRF9TSE9SVCwgMCk7CisgICAgICAgICAgIGdsLmdsRGlzYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIDApOworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICB9CisgICB9CisKKworICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW5kZXJlciI7CisgICAgICAgIHByaXZhdGUgR3JpZCBtR3JpZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKwkJCWdsLmdsQ2xlYXJDb2xvcigwLDAsMSwxKTsKKwkJCWdsLmdsQ2xlYXIoR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgICAgIG1HcmlkLmRyYXcoZ2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIGdsLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9QUk9KRUNUSU9OKTsKKwkJCWdsLmdsTG9hZElkZW50aXR5KCk7CisJCQlnbC5nbE9ydGhvZigwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOworICAgICAgICAgICAgY3JlYXRlR3JpZChnbCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyaWQoR0wxMCBnbCwgZmxvYXQgdywgZmxvYXQgaCkgeworICAgICAgICBtR3JpZCA9IG5ldyBHcmlkKDIsIDIpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQlmbG9hdCB4ID0gdyAqIGk7CisJCQkJCWZsb2F0IHkgPSBoICogajsKKwkJCQkJZmxvYXQgeiA9IDAuMGY7CisJCQkJCW1HcmlkLnNldChpLGosIHgsIHksIHopOworCQkJCX0KKwkJCX0KKwkJCW1HcmlkLmNyZWF0ZUJ1ZmZlck9iamVjdHMoZ2wpOworCQl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc5ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJNZWRpYSBDb250YWluZXIgU2VydmljZSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4iTWVkaWEgQ29udGFpbmVyIFNlcnZpY2UiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTI5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+Ik1lZGllbi1Db250YWluZXJkaWVuc3QiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+Is6lz4DOt8+BzrXPg86vzrEgTWVkaWEgQ29udGFpbmVyIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODkzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJTZXJ2aWNpbyBkZSBjb250ZW5jacOzbiBkZSBtZWRpb3MiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTc1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+IlNlcnZpY2lvIGRlIGNvbnRlbmVkb3IgZGUgbWVkaW9zIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRhOTBkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJTZXJ2aWNlIGRlIHN1cHBvcnQgbXVsdGltw6lkaWEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmQ2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+IlNlcnZpemlvIE1lZGlhIENvbnRhaW5lciI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4i44Oh44OH44Kj44Ki44Kz44Oz44OG44OK44K144O844OT44K5Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc5ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJNZWRpYSBDb250YWluZXIgU2VydmljZSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4iTWVkaWEgQ29udGFpbmVyIFNlcnZpY2UiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzllODUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+Ik1lZGlhIENvbnRhaW5lciBTZXJ2aWNlIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk2ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJVc8WCdWdhIGtvbnRlbmVyYSBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+Ik1lZGlhIENvbnRhaW5lciBTZXJ2aWNlIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI5MGRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiJTZXJ2acOnbyBkZSByZWNpcGllbnRlIGRlIG3DrWRpYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4iTWVkaWEgQ29udGFpbmVyIFNlcnZpY2UiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTc4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIiBtc2dpZD0iMjI2MDc4MTk5Mzc5NTg1ODUxNiI+Ik1lZGlldGrDpG5zdCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkODcwZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4iT3J0YW0gS2Fwc2F5xLFjxLEgSGl6bWV0aSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk5ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiIG1zZ2lkPSIyMjYwNzgxOTkzNzk1ODU4NTE2Ij4i5aqS5L2T5a655Zmo5pyN5YqhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODcwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSIgbXNnaWQ9IjIyNjA3ODE5OTM3OTU4NTg1MTYiPiLlqpLpq5TluqvmnI3li5kiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDM3ZjViNjEuLmZmZDZiNTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTgsNiArMTgsNiBAQAogKi8KIC0tPgogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPCEtLSBzZXJ2aWNlIG5hbWUgIC0tPgorICAgIDwhLS0gc2VydmljZSBuYW1lIFtDSEFSIExJTUlUPTI1XSAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiPlBhY2thZ2UgQWNjZXNzIEhlbHBlcjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tawppbmRleCA0YzgzNzY4Li45MTBlODRlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKQEAgLTEwLDQgKzEwLDYgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTeXN0ZW1VSQogTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KIAorTE9DQUxfUFJPR1VBUkRfRkxBR1MgOj0gLWluY2x1ZGUgJChMT0NBTF9QQVRIKS9wcm9ndWFyZC5mbGFncworCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDBmY2NiZTcuLjdiYzJlN2QgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTMsNyArMTMsMTIgQEAKICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfc2V0dGluZ3MiPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgPHNlcnZpY2UKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLnN0YXR1c2Jhci5TdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8c2VydmljZQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIgogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCiAgICAgICAgICAgICAvPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Byb2d1YXJkLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2M1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpAQCAtMCwwICsxLDQgQEAKKy1rZWVwIGNsYXNzIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyU2VydmljZSB7CisgIHB1YmxpYyB2b2lkIG5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHN5c3RlbUluZm9DbGlja2VkKGFuZHJvaWQudmlldy5WaWV3KTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWM2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI1NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvbm90aWZpY2F0aW9uX2RyYWdnZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY5NTQwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmYzdmOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMDlhYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk1MWRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM1YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmMDQxYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc3OWNmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNkNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MzJiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThjMDFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGE0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQxZjMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvbm90aWZpY2F0aW9uX2RyYWdnZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDY0NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmEzNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxOTcxNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwY2JkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI5MjEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2IyNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMDBjYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjNhNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWUyMWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YTdjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2MWFjOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmYxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY2OTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDExNzExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcyODZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiNjgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0b19ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjE1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbApAQCAtMCwwICsxLDEzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPFJlbGF0aXZlTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCisgICAgPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2ljb25fdHJheSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRNb3JlVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4cGFuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDx2aWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkSWNvbkxheW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9pY29uX3NpemUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSREcmFnZ2VyVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2hhbmRsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYT4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvbm90aWZpY2F0aW9uSWNvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aWNrZXJJY29uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuVGlja2VyVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlclRleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiPgorICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5UaWNrZXJWaWV3PgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvc3RhdHVzX2Jhcl9jZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL21lbnUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFjayIKKyAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjQiCisgICAgICAgICAgICAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iODIiCisgICAgICAgICAgICAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9ob21lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iMyIKKyAgICAgICAgICAgIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZTk5NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIENlbnRlciBvZiBzdGF0dXMgYmFyOiBTeXN0ZW0gaW5mbyBkaXNwbGF5LCBzeXN0ZW0gaW5mbyBwYW5lbCB0cmlnZ2VyIC0tPgorPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvc3lzdGVtSW5mbyIKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9uQ2xpY2s9InN5c3RlbUluZm9DbGlja2VkIgorICAgID4KKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9kb3RzX2VtcHR5IgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvZG90c19mdWxsIgorICAgICAgICAvPgorPC9SZWxhdGl2ZUxheW91dD4KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0OTJkMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApAQCAtMCwwICsxLDM2IEBACis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NXNwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmQiCisgICAgPgorCisgICAgPEltYWdlQnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmV0byIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0byIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5MYXRlc3RJdGVtVmlldyBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL3ZldG8iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRzcCIKKyAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNnNwIgorICAgICAgICAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODllZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucy54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgID4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NsZWFyX2FsbF9idXR0b24iCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iCisgICAgICAgIC8+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworICAgIDxTY3JvbGxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uU2Nyb2xsZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsfGJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICAgICAgPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1Njcm9sbFZpZXc+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMmQwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwMGRpcCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDAwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjhkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjhkaXAiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgPgorICAgICAgICAKKyAgICA8UmVsYXRpdmVMYXlvdXQgCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N5c3RlbVBhbmVsRHVtbXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZDQ0NDQ0MiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKaW5kZXggNWZlOGU3OS4uMmYxYjM2ZTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbApAQCAtMjEsNiArMjEsNyBAQAogPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgogPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJWaWV3CiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTYxYzNmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX2JhY2tncm91bmQiPiMwMDAwMDA8L2RyYXdhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjVkMThkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MTwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTRiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gVGhlIHRleHQgZm9yIHRoZSBidXR0b24gaW4gdGhlIG5vdGlmaWNhdGlvbiB3aW5kb3ctc2hhZGUgdGhhdCBjbGVhcnMKKyAgICAgICAgIGFsbCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgbm90aWZpY2F0aW9ucy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iPkNsZWFyIGFsbDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmNmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJLZXlCdXR0b25WaWV3Ij4KKyAgICAgICAgPGF0dHIgbmFtZT0ia2V5Q29kZSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDhlYTQ2ZTUuLmFjMDBjNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIwLDcgKzIwLDE2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcz4KLSAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CisKKyAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMKKyAgICBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfaHNwYV9kYXRhX2Rpc3Rpbmd1aXNoYWJsZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgMCAtIHRvcAorICAgICAgICAxIC0gYm90dG9tCisgICAgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjA8L2ludGVnZXI+CisKIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQppbmRleCBmNDVjYWY1MS4uMGY2NzIzZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAKIAogcHVibGljIGNsYXNzIENsb3NlRHJhZ0hhbmRsZSBleHRlbmRzIExpbmVhckxheW91dCB7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAKICAgICBwdWJsaWMgQ2xvc2VEcmFnSGFuZGxlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCmluZGV4IGY5MzQ3YjEuLjJjMGFmNjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogY29hbGVzY2luZyB0aGVzZSBjYWxscyBzbyB0aGV5IGRvbid0IHN0YWNrIHVwLiAgRm9yIHRoZSBjYWxscwogICogYXJlIGNvYWxlc2NlZCwgbm90ZSB0aGF0IHRoZXkgYXJlIGFsbCBpZGVtcG90ZW50LgogICovCi1jbGFzcyBDb21tYW5kUXVldWUgZXh0ZW5kcyBJU3RhdHVzQmFyLlN0dWIgeworcHVibGljIGNsYXNzIENvbW1hbmRRdWV1ZSBleHRlbmRzIElTdGF0dXNCYXIuU3R1YiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0dXNCYXIuQ29tbWFuZFF1ZXVlIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTUFTSyA9IDB4ZmZmZjAwMDA7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQppbmRleCAzZDg1ZjI3Li5hMmQ0Yjk1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgRXhwYW5kZWRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBpbnQgbVByZXZIZWlnaHQgPSAtMTsKIAogICAgIHB1YmxpYyBFeHBhbmRlZFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgICAvL1Nsb2cuZChTdGF0dXNCYXJTZXJ2aWNlLlRBRywgImhlaWdodCBjaGFuZ2VkIG9sZD0iICsgbVByZXZIZWlnaHQKICAgICAgICAgICAgICAvLyAgICAgKyAiIG5ldz0iICsgaGVpZ2h0KTsKICAgICAgICAgICAgICBtUHJldkhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFBob25lU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CiAgICAgICAgICB9CiAgICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1MDhiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBLZXlCdXR0b25WaWV3IGV4dGVuZHMgSW1hZ2VWaWV3IHsKKyAgICBJV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKKyAgICBsb25nIG1Eb3duVGltZTsKKyAgICBib29sZWFuIG1TZW5kaW5nOworICAgIGludCBtQ29kZTsKKyAgICBpbnQgbVJlcGVhdDsKKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlldywKKyAgICAgICAgICAgICAgICBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgbUNvZGUgPSBhLmdldEludGVnZXIoUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlld19rZXlDb2RlLCAwKTsKKyAgICAgICAgaWYgKG1Db2RlID09IDApIHsKKyAgICAgICAgICAgIFNsb2cudyhTdGF0dXNCYXJTZXJ2aWNlLlRBRywgIktleUJ1dHRvblZpZXcgd2l0aG91dCBrZXkgY29kZSBpZD0weCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGdldElkKCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBJV2luZG93TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgIG1Eb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIG1SZXBlYXQgPSAwOworICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19TT0ZUX0tFWUJPQVJELCBtRG93blRpbWUpOworICAgICAgICAgICAgICAgIHNldFByZXNzZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICB4ID0gKGludClldi5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIHkgPSAoaW50KWV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gZ2V0V2lkdGgoKSB8fCB5IDwgMCB8fCB5ID49IGdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfU09GVF9LRVlCT0FSRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS2V5RXZlbnQuRkxBR19DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgorICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICBtU2VuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1NPRlRfS0VZQk9BUkQpOworICAgICAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc2VuZEV2ZW50KGFjdGlvbiwgZmxhZ3MsIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uLCBpbnQgZmxhZ3MsIGxvbmcgd2hlbikgeworICAgICAgICBmaW5hbCBLZXlFdmVudCBldiA9IG5ldyBLZXlFdmVudChtRG93blRpbWUsIHdoZW4sIGFjdGlvbiwgbUNvZGUsIG1SZXBlYXQsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgZmxhZ3MsIElucHV0RGV2aWNlLlNPVVJDRV9LRVlCT0FSRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTbG9nLmQoU3RhdHVzQmFyU2VydmljZS5UQUcsICJpbmplY3RpbmcgZXZlbnQgIiArIGV2KTsKKyAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmluamVjdElucHV0RXZlbnROb1dhaXQoZXYpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCmluZGV4IDdhODIyNjcuLjQ1YWJlOTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zNSwyNiArMzYsNDcgQEAKICAgICAgICAgcHVibGljIFZpZXcgcm93OyAvLyB0aGUgb3V0ZXIgZXhwYW5kZWQgdmlldwogICAgICAgICBwdWJsaWMgVmlldyBjb250ZW50OyAvLyB0YWtlcyB0aGUgY2xpY2sgZXZlbnRzIGFuZCBzZW5kcyB0aGUgUGVuZGluZ0ludGVudAogICAgICAgICBwdWJsaWMgVmlldyBleHBhbmRlZDsgLy8gdGhlIGluZmxhdGVkIFJlbW90ZVZpZXdzCisgICAgICAgIHB1YmxpYyBFbnRyeSgpIHt9CisgICAgICAgIHB1YmxpYyBFbnRyeShJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0YXR1c0Jhckljb25WaWV3IGljKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbjsKKyAgICAgICAgICAgIHRoaXMuaWNvbiA9IGljOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEVudHJ5PiBtRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEVudHJ5PiBtRW50cnlDbXAgPSBuZXcgQ29tcGFyYXRvcjxFbnRyeT4oKSB7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShFbnRyeSBhLCBFbnRyeSBiKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoYS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gLSBiLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbik7CisgICAgICAgIH0KKyAgICB9OwogCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUVudHJpZXMuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBFbnRyeSBnZXRFbnRyeUF0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gbUVudHJpZXMuZ2V0KGluZGV4KTsKKyAgICBwdWJsaWMgRW50cnkgZ2V0KGludCBpKSB7CisgICAgICAgIHJldHVybiBtRW50cmllcy5nZXQoaSk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBmaW5kRW50cnkoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICBwdWJsaWMgRW50cnkgZmluZEJ5S2V5KElCaW5kZXIga2V5KSB7CisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZChFbnRyeSBlbnRyeSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IE4gPSBtRW50cmllcy5zaXplKCk7CisgICAgICAgIGZvciAoaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgaWYgKG1FbnRyeUNtcC5jb21wYXJlKG1FbnRyaWVzLmdldChpKSwgZW50cnkpID4gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1FbnRyaWVzLmFkZChpLCBlbnRyeSk7CisgICAgICAgIHJldHVybiBpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgYWRkKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3IHJvdywgVmlldyBjb250ZW50LApAQCAtNjYsNDIgKzg4LDIzIEBACiAgICAgICAgIGVudHJ5LmNvbnRlbnQgPSBjb250ZW50OwogICAgICAgICBlbnRyeS5leHBhbmRlZCA9IGV4cGFuZGVkOwogICAgICAgICBlbnRyeS5pY29uID0gaWNvbjsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY2hvb3NlSW5kZXgobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuKTsKLSAgICAgICAgbUVudHJpZXMuYWRkKGluZGV4LCBlbnRyeSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgcmV0dXJuIGFkZChlbnRyeSk7CiAgICAgfQogCiAgICAgcHVibGljIEVudHJ5IHJlbW92ZShJQmluZGVyIGtleSkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9CisgICAgICAgIEVudHJ5IGUgPSBmaW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlKGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNob29zZUluZGV4KGZpbmFsIGxvbmcgd2hlbikgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID4gd2hlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOOworICAgICAgICByZXR1cm4gZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHZpc2libGUgaXRlbXMgKGkuZS4gaXRlbXMgd2l0aG91dCBhbiBlcnJvcikuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExMiwxMSArMTE1LDkgQEAKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNsZWFyYWJsZSBpdGVtcyAodGhhdCBhcmVuJ3QgZXJyb3JzKS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGVhcmFibGVJdGVtcygpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCi0gICAgICAgICAgICAgICAgaWYgKChlbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fQ0xFQVIpID09IDApIHsKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCisgICAgICAgICAgICAgICAgaWYgKChlLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19OT19DTEVBUikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI1ODNiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE1NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb25MaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuU3RhdHVzQmFyUG9saWN5OworCisKKworcHVibGljIGNsYXNzIFBob25lU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFN0YXR1c0JhclNlcnZpY2UgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBob25lU3RhdHVzQmFyU2VydmljZSI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BFVyA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVRVU0JBUl9TVEFSVAorICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LnN0YXR1c2Jhci5TVEFSVCI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEVfUkVWRUFMID0gMTAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU5UUlVERVIgPSAxMDAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfSElERV9JTlRSVURFUiA9IDEwMDM7CisKKyAgICAvLyB3aWxsIGxpa2VseSBtb3ZlIHRvIGEgcmVzb3VyY2Ugb3Igb3RoZXIgdHVuYWJsZSBwYXJhbSBhdCBzb21lIHBvaW50CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVFJVREVSX0FMRVJUX0RFQ0FZX01TID0gMTAwMDA7CisKKyAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7CisKKyAgICBpbnQgbUljb25TaXplOworICAgIERpc3BsYXkgbURpc3BsYXk7CisKKyAgICBTdGF0dXNCYXJWaWV3IG1TdGF0dXNCYXJWaWV3OworICAgIGludCBtUGl4ZWxGb3JtYXQ7CisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisgICAgT2JqZWN0IG1RdWV1ZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBpY29ucworICAgIExpbmVhckxheW91dCBtSWNvbnM7CisgICAgSWNvbk1lcmdlciBtTm90aWZpY2F0aW9uSWNvbnM7CisgICAgTGluZWFyTGF5b3V0IG1TdGF0dXNJY29uczsKKworICAgIC8vIGV4cGFuZGVkIG5vdGlmaWNhdGlvbnMKKyAgICBEaWFsb2cgbUV4cGFuZGVkRGlhbG9nOworICAgIEV4cGFuZGVkVmlldyBtRXhwYW5kZWRWaWV3OworICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1FeHBhbmRlZFBhcmFtczsKKyAgICBTY3JvbGxWaWV3IG1TY3JvbGxWaWV3OworICAgIFZpZXcgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDsKKyAgICBWaWV3IG1FeHBhbmRlZENvbnRlbnRzOworICAgIC8vIHRvcCBiYXIKKyAgICBUZXh0VmlldyBtTm9Ob3RpZmljYXRpb25zVGl0bGU7CisgICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOworICAgIC8vIGRyYWcgYmFyCisgICAgQ2xvc2VEcmFnSGFuZGxlIG1DbG9zZVZpZXc7CisgICAgLy8gb25nb2luZworICAgIE5vdGlmaWNhdGlvbkRhdGEgbU9uZ29pbmcgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIFRleHRWaWV3IG1PbmdvaW5nVGl0bGU7CisgICAgTGluZWFyTGF5b3V0IG1PbmdvaW5nSXRlbXM7CisgICAgLy8gbGF0ZXN0CisgICAgTm90aWZpY2F0aW9uRGF0YSBtTGF0ZXN0ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICBUZXh0VmlldyBtTGF0ZXN0VGl0bGU7CisgICAgTGluZWFyTGF5b3V0IG1MYXRlc3RJdGVtczsKKyAgICAvLyBwb3NpdGlvbgorICAgIGludFtdIG1Qb3NpdGlvblRtcCA9IG5ldyBpbnRbMl07CisgICAgYm9vbGVhbiBtRXhwYW5kZWQ7CisgICAgYm9vbGVhbiBtRXhwYW5kZWRWaXNpYmxlOworCisgICAgLy8gdGhlIGRhdGUgdmlldworICAgIERhdGVWaWV3IG1EYXRlVmlldzsKKworICAgIC8vIGZvciBpbW1lcnNpdmUgYWN0aXZpdGllcworICAgIHByaXZhdGUgVmlldyBtSW50cnVkZXJBbGVydFZpZXc7CisKKyAgICAvLyB0aGUgdHJhY2tlciB2aWV3CisgICAgVHJhY2tpbmdWaWV3IG1UcmFja2luZ1ZpZXc7CisgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbVRyYWNraW5nUGFyYW1zOworICAgIGludCBtVHJhY2tpbmdQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIHRyYWNraW5nIHZpZXcuCisgICAgcHJpdmF0ZSBib29sZWFuIG1QYW5lbFNsaWdodGx5VmlzaWJsZTsKKworICAgIC8vIHRpY2tlcgorICAgIHByaXZhdGUgVGlja2VyIG1UaWNrZXI7CisgICAgcHJpdmF0ZSBWaWV3IG1UaWNrZXJWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtVGlja2luZzsKKworICAgIC8vIFRyYWNraW5nIGZpbmdlciBmb3Igb3BlbmluZy9jbG9zaW5nLgorICAgIGludCBtRWRnZUJvcmRlcjsgLy8gY29ycmVzcG9uZHMgdG8gUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlCisgICAgYm9vbGVhbiBtVHJhY2tpbmc7CisgICAgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fRlJBTUVfRFVSQVRJT04gPSAoMTAwMC82MCk7CisKKyAgICBib29sZWFuIG1BbmltYXRpbmc7CisgICAgbG9uZyBtQ3VyQW5pbWF0aW9uVGltZTsKKyAgICBmbG9hdCBtRGlzcGxheUhlaWdodDsKKyAgICBmbG9hdCBtQW5pbVk7CisgICAgZmxvYXQgbUFuaW1WZWw7CisgICAgZmxvYXQgbUFuaW1BY2NlbDsKKyAgICBsb25nIG1BbmltTGFzdFRpbWU7CisgICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgaW50IG1WaWV3RGVsdGE7CisgICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07CisKKyAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCisgICAgaW50IG1EaXNhYmxlZCA9IDA7CisKKyAgICBwcml2YXRlIGNsYXNzIEV4cGFuZGVkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKyAgICAgICAgRXhwYW5kZWREaWFsb2coQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgorICAgICAgICAgICAgICAgIGlmICghZG93bikgeworICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbURpc3BsYXkgPSAoKFdpbmRvd01hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworCisgICAgICAgIGFkZEludHJ1ZGVyVmlldygpOworCisgICAgICAgIC8vIExhc3RseSwgY2FsbCB0byB0aGUgaWNvbiBwb2xpY3kgdG8gaW5zdGFsbC91cGRhdGUgYWxsIHRoZSBpY29ucy4KKyAgICAgICAgbUljb25Qb2xpY3kgPSBuZXcgU3RhdHVzQmFyUG9saWN5KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gd2UncmUgbmV2ZXIgZGVzdHJveWVkCisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHZpZXcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHByb3RlY3RlZCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSB0aGlzOworCisgICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworCisgICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisKKyAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKKyAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIG1JbnRydWRlckFsZXJ0VmlldyA9IFZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5pbnRydWRlcl9hbGVydCwgbnVsbCk7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisKKyAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKKyAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCisgICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOworICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7CisgICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOworICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7CisgICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CisgICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKKworICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7CisgICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKKyAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOworICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7CisgICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7CisgICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7CisgICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOworICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7CisgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOworICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOworCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOworCisgICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOworICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOworCisgICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7CisgICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOworICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKKworICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgbW9yZVZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgIm1vcmUiKTsKKyAgICAgICAgbW9yZVZpZXcuc2V0KG5ldyBTdGF0dXNCYXJJY29uKG51bGwsIFIuZHJhd2FibGUuc3RhdF9ub3RpZnlfbW9yZSwgMCkpOworICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkTW9yZVZpZXcobW9yZVZpZXcsCisgICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKKworICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKworICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKKworICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCkgeworICAgICAgICByZXR1cm4gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSW50cnVkZXJWaWV3KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CisKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnkgKz0gaGVpZ2h0ICogMS41OyAvLyBGSVhNRQorICAgICAgICBscC5zZXRUaXRsZSgiSW50cnVkZXJBbGVydCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyX0ludHJ1ZGVyQWxlcnQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobUludHJ1ZGVyQWxlcnRWaWV3LCBscCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJhZGRJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKKyAgICAgICAgICAgICAgICArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IHZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgc2xvdCk7CisgICAgICAgIHZpZXcuc2V0KGljb24pOworICAgICAgICBtU3RhdHVzSWNvbnMuYWRkVmlldyh2aWV3LCB2aWV3SW5kZXgsIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LAorICAgICAgICAgICAgU3RhdHVzQmFySWNvbiBvbGQsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAorICAgICAgICAgICAgICAgICsgIiBvbGQ9IiArIG9sZCArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IHZpZXcgPSAoU3RhdHVzQmFySWNvblZpZXcpbVN0YXR1c0ljb25zLmdldENoaWxkQXQodmlld0luZGV4KTsKKyAgICAgICAgdmlldy5zZXQoaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4KTsKKyAgICAgICAgbVN0YXR1c0ljb25zLnJlbW92ZVZpZXdBdCh2aWV3SW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgaWYgKGljb25WaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICBib29sZWFuIGltbWVyc2l2ZSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW1tZXJzaXZlID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG9wIGFjdGl2aXR5IGlzICIgKyAoaW1tZXJzaXZlPyJpbW1lcnNpdmUiOiJub3QgaW1tZXJzaXZlIikpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1tZXJzaXZlKSB7CisgICAgICAgICAgICBpZiAoKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19ISUdIX1BSSU9SSVRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIlByZXNlbnRpbmcgaGlnaC1wcmlvcml0eSBub3RpZmljYXRpb24gaW4gaW1tZXJzaXZlIGFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBuZXcgdHJhbnNpZW50IHRpY2tlciBtb2RlCisgICAgICAgICAgICAgICAgLy8gMS4gUG9wdWxhdGUgbUludHJ1ZGVyQWxlcnRWaWV3CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgYWxlcnRJY29uID0gKEltYWdlVmlldykgbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmFsZXJ0SWNvbik7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgYWxlcnRUZXh0ID0gKFRleHRWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRUZXh0KTsKKyAgICAgICAgICAgICAgICBhbGVydEljb24uc2V0SW1hZ2VEcmF3YWJsZShTdGF0dXNCYXJJY29uVmlldy5nZXRJY29uKAorICAgICAgICAgICAgICAgICAgICBhbGVydEljb24uZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICBpY29uVmlldy5nZXRTdGF0dXNCYXJJY29uKCkpKTsKKyAgICAgICAgICAgICAgICBhbGVydFRleHQuc2V0VGV4dChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpOworCisgICAgICAgICAgICAgICAgVmlldyBidXR0b24gPSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuaW50cnVkZXJfYWxlcnRfY29udGVudCk7CisgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IExhdW5jaGVyKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworCisgICAgICAgICAgICAgICAgLy8gMi4gQW5pbWF0ZSBtSW50cnVkZXJBbGVydFZpZXcgaW4KKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TSE9XX0lOVFJVREVSKTsKKworICAgICAgICAgICAgICAgIC8vIDMuIFNldCBhbGFybSB0byBhZ2UgdGhlIG5vdGlmaWNhdGlvbiBvZmYgKFRPRE8pCisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19ISURFX0lOVFJVREVSLCBJTlRSVURFUl9BTEVSVF9ERUNBWV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbW1lcnNpdmUgJiBhIGZ1bGwtc2NyZWVuIGFsZXJ0IHNob3VsZCBiZSBzaG93bgorICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vdGlmaWNhdGlvbiBoYXMgZnVsbFNjcmVlbkludGVudCBhbmQgYWN0aXZpdHkgaXMgbm90IGltbWVyc2l2ZTsiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdXN1YWwgY2FzZTogc3RhdHVzIGJhciB2aXNpYmxlICYgbm90IGltbWVyc2l2ZQorCisgICAgICAgICAgICAvLyBzaG93IHRoZSB0aWNrZXIKKyAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSArICIgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOworCisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgb2xkTGlzdDsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1PbmdvaW5nLmZpbmRCeUtleShrZXkpOworICAgICAgICBpZiAob2xkRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgb2xkTGlzdCA9IG1PbmdvaW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2xkRW50cnkgPSBtTGF0ZXN0LmZpbmRCeUtleShrZXkpOworICAgICAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkTGlzdCA9IG1MYXRlc3Q7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZE5vdGlmaWNhdGlvbiA9IG9sZEVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3Mgb2xkQ29udGVudFZpZXcgPSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGNvbnRlbnRWaWV3ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvbGQgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgZXhwYW5kZWQ9IiArIG9sZEVudHJ5LmV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgb2xkQ29udGVudFZpZXcpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5ldyBub3RpZmljYXRpb246IHdoZW49IiArIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgY29udGVudFZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FuIHdlIGp1c3QgcmVhcHBseSB0aGUgUmVtb3RlVmlld3MgaW4gcGxhY2U/ICBJZiB3aGVuIGRpZG4ndCBjaGFuZ2UsIHRoZSBvcmRlcgorICAgICAgICAvLyBkaWRuJ3QgY2hhbmdlLgorICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID09IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICYmIG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKSA9PSBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAmJiBvbGRFbnRyeS5leHBhbmRlZCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcgIT0gbnVsbCAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZXVzaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBSZWFwcGx5IHRoZSBSZW1vdGVWaWV3cworICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnJlYXBwbHkodGhpcywgb2xkRW50cnkuY29udGVudCk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb250ZW50SW50ZW50CisgICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OworICAgICAgICAgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkuY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGljb24uCisgICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICAgICAgICAgIGlmICghb2xkRW50cnkuaWNvbi5zZXQoaWMpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgdXBkYXRlIGljb246ICIgKyBpYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkIHRvIGFkZCBjbGVhbmx5LiAgTG9nLCBhbmQgcmVtb3ZlIHRoZSB2aWV3IGZyb20gdGhlIHBhbmVsLgorICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3VsZG4ndCByZWFwcGx5IHZpZXdzIGZvciBwYWNrYWdlICIgKyBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCksIGUpOworICAgICAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJub3QgcmV1c2luZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKworICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGtleT0iICsga2V5KTsKKyAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZCA9IHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKKyAgICAgICAgICAgIG1UaWNrZXIucmVtb3ZlRW50cnkob2xkKTsKKworICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjaG9vc2VJY29uSW5kZXgoYm9vbGVhbiBpc09uZ29pbmcsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgZmluYWwgaW50IGxhdGVzdFNpemUgPSBtTGF0ZXN0LnNpemUoKTsKKyAgICAgICAgaWYgKGlzT25nb2luZykgeworICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgKyAobU9uZ29pbmcuc2l6ZSgpIC0gdmlld0luZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplIC0gdmlld0luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgVmlld1tdIG1ha2VOb3RpZmljYXRpb25WaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IG4uY29udGVudFZpZXc7CisgICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKKworICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCisgICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7CisgICAgICAgIGNvbnRlbnQuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOworICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG4uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsIG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOworICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpOworICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3W10geyByb3csIGNvbnRlbnQsIGV4cGFuZGVkIH07CisgICAgfQorCisgICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBsaXN0OworICAgICAgICBWaWV3R3JvdXAgcGFyZW50OworICAgICAgICBmaW5hbCBib29sZWFuIGlzT25nb2luZyA9IG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKTsKKyAgICAgICAgaWYgKGlzT25nb2luZykgeworICAgICAgICAgICAgbGlzdCA9IG1PbmdvaW5nOworICAgICAgICAgICAgcGFyZW50ID0gbU9uZ29pbmdJdGVtczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3QgPSBtTGF0ZXN0OworICAgICAgICAgICAgcGFyZW50ID0gbUxhdGVzdEl0ZW1zOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgZmluYWwgVmlld1tdIHZpZXdzID0gbWFrZU5vdGlmaWNhdGlvblZpZXcobm90aWZpY2F0aW9uLCBwYXJlbnQpOworICAgICAgICBpZiAodmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFZpZXcgcm93ID0gdmlld3NbMF07CisgICAgICAgIGZpbmFsIFZpZXcgY29udGVudCA9IHZpZXdzWzFdOworICAgICAgICBmaW5hbCBWaWV3IGV4cGFuZGVkID0gdmlld3NbMl07CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRpbmcgY3JlYXRlIGljb246ICIgKyBpYyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIGZpbmFsIGludCB2aWV3SW5kZXggPSBsaXN0LmFkZChrZXksIG5vdGlmaWNhdGlvbiwgcm93LCBjb250ZW50LCBleHBhbmRlZCwgaWNvblZpZXcpOworICAgICAgICBwYXJlbnQuYWRkVmlldyhyb3csIHZpZXdJbmRleCk7CisgICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgaW50IGljb25JbmRleCA9IGNob29zZUljb25JbmRleChpc09uZ29pbmcsIHZpZXdJbmRleCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRWaWV3KGljb25WaWV3LCBpY29uSW5kZXgsCisgICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKKyAgICAgICAgcmV0dXJuIGljb25WaWV3OworICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU9uZ29pbmcucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IG1MYXRlc3QucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5yb3cpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkuaWNvbik7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCkgeworICAgICAgICBib29sZWFuIG9uZ29pbmcgPSBtT25nb2luZy5oYXNWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgYm9vbGVhbiBsYXRlc3QgPSBtTGF0ZXN0Lmhhc1Zpc2libGVJdGVtcygpOworCisgICAgICAgIC8vIChubyBvbmdvaW5nIG5vdGlmaWNhdGlvbnMgYXJlIGNsZWFyYWJsZSkKKyAgICAgICAgaWYgKG1MYXRlc3QuaGFzQ2xlYXJhYmxlSXRlbXMoKSkgeworICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShvbmdvaW5nID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkobGF0ZXN0ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKworICAgICAgICBpZiAob25nb2luZyB8fCBsYXRlc3QpIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpcyBvbmUgb3IgbW9yZSBvZiB0aGUgRElTQUJMRSBjb25zdGFudHMgZnJvbSBTdGF0dXNCYXJNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGZpbmFsIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IHN0YXRlOworCisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBiYXIgYW5kIG5vdGlmaWNhdGlvbnMgZnVubmVsIHRocm91Z2ggaGVyZSBhbmQgYXJlIGJhdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEU6CisgICAgICAgICAgICAgICAgICAgIGRvQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEVfUkVWRUFMOgorICAgICAgICAgICAgICAgICAgICBkb1JldmVhbEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TSE9XX0lOVFJVREVSOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfSElERV9JTlRSVURFUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1Gb2N1c0NoYW5nZUxpc3RlbmVyID0gbmV3IFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkZvY3VzQ2hhbmdlKFZpZXcgdiwgYm9vbGVhbiBoYXNGb2N1cykgeworICAgICAgICAgICAgLy8gQmVjYXVzZSAndicgaXMgYSBWaWV3R3JvdXAsIGFsbCBpdHMgY2hpbGRyZW4gd2lsbCBiZSAodW4pc2VsZWN0ZWQKKyAgICAgICAgICAgIC8vIHRvbywgd2hpY2ggYWxsb3dzIG1hcnF1ZWVpbmcgdG8gd29yay4KKyAgICAgICAgICAgIHYuc2V0U2VsZWN0ZWQoaGFzRm9jdXMpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBtYWtlRXhwYW5kZWRWaXNpYmxlKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIk1ha2UgZXhwYW5kZWQgdmlzaWJsZTogZXhwYW5kZWQgdmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CisgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOworCisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICBtRXhwYW5kZWRWaWV3LnJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0ZPUldBUkQpOworICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICBpZiAoIW1UaWNraW5nKSB7CisgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRlIGV4cGFuZDogZXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwcmVwYXJlVHJhY2tpbmcoMCwgdHJ1ZSk7CisgICAgICAgIHBlcmZvcm1GbGluZygwLCAyMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYW5pbWF0ZUNvbGxhcHNlKCk6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZworICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1ZPSIgKyBtQW5pbVkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCB5OworICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgeSA9IChpbnQpbUFuaW1ZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeSA9IG1EaXNwbGF5LmdldEhlaWdodCgpLTE7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGV0IHRoZSBmbGluZyB0aGluayB0aGF0IHdlJ3JlIG9wZW4gc28gaXQgZ29lcyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uCisgICAgICAgIC8vIGFuZCBkb2Vzbid0IHRyeSB0byByZS1vcGVuIHRoZSB3aW5kb3dzaGFkZS4KKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksIGZhbHNlKTsKKyAgICAgICAgcGVyZm9ybUZsaW5nKHksIC0yMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1FeHBhbmQoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUV4cGFuZDogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKKworICAgICAgICBpZiAoZmFsc2UpIHBvc3RTdGFydFRyYWNpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSA9PSAwKSB7CisgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgIH0KKyAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7CisgICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcworICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOworICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcworICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAorICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCisgICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCisgICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisgICAgfQorCisgICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKKyAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgeworICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOworICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7CisgICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgeworICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICBpZiAob3BlbmluZykgeworICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKKyAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOworICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7CisgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KKyAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgbUFuaW1ZID0geTsKKyAgICAgICAgbUFuaW1WZWwgPSB2ZWw7CisKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCisgICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgorICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAorICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKKyAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCisgICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKKyAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OworICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgIHN0b3BUcmFja2luZygpOworICAgIH0KKworICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKKyAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7CisKKyAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgeworCisgICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCisgICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAorICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCisgICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOworICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKKyAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOworICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMYXVuY2hlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgICAgIHByaXZhdGUgaW50IG1JZDsKKworICAgICAgICBMYXVuY2hlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVBrZyA9IHBrZzsKKyAgICAgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisgICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhpcyBjbGljayB3YXMgb24gdGhlIGludHJ1ZGVyIGFsZXJ0LCBoaWRlIHRoYXQgaW5zdGVhZAorICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmFkZEVudHJ5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoaXMgbm90aWZpY2F0aW9uIGFuZCB0ZWxsIHRoZSBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSAvIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlCisgICAgICogYWJvdXQgdGhlIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIHdpbGwgY2FsbCBiYWNrIGludG8gdXMuICBEb24ndCBob2xkIGFueSBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNeVRpY2tlciBleHRlbmRzIFRpY2tlciB7CisgICAgICAgIE15VGlja2VyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc2IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgeworICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX2luLCBudWxsKSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0LCBudWxsKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJEb25lKCkgeworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luLCBudWxsKSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckhhbHRpbmcoKSB7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luLCBudWxsKSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGlja2luZ0RvbmVMaXN0ZW5lcikpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIG1UaWNraW5nRG9uZUxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHs7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQW5pbWF0aW9uIGxvYWRBbmltKGludCBpZCwgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIEFuaW1hdGlvbiBhbmltID0gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihQaG9uZVN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKKyAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCisgICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgorICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZworICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAorICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uRGF0YSkgeworICAgICAgICAgICAgaW50IE4gPSBtTm90aWZpY2F0aW9uRGF0YS5vbmdvaW5nQ291bnQoKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0T25nb2luZyhpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOID0gbU5vdGlmaWNhdGlvbkRhdGEubGF0ZXN0Q291bnQoKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0TGF0ZXN0KGkpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtU3RhdHVzQmFyVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtU3RhdHVzQmFyVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZGVidWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1FeHBhbmRlZFZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbUV4cGFuZGVkVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUV4cGFuZGVkVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmRlYnVnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtVHJhY2tpbmdWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1UcmFja2luZ1ZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5kZWJ1ZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQmFyVmlld0F0dGFjaGVkKCkgeworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKKyAgICAgICAgaW50IHBpeGVsRm9ybWF0OworICAgICAgICBEcmF3YWJsZSBiZzsKKworICAgICAgICAvLy8gLS0tLS0tLS0tLSBUcmFja2luZyBWaWV3IC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCWF84ODg4OworICAgICAgICBiZyA9IG1UcmFja2luZ1ZpZXcuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdCk7CisvLyAgICAgICAgbHAudG9rZW4gPSBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlRyYWNraW5nVmlldyIpOworICAgICAgICBscC55ID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgIG1UcmFja2luZ1BhcmFtcyA9IGxwOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1UcmFja2luZ1ZpZXcsIGxwKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVHJhY2tpbmdWaWV3QXR0YWNoZWQoKSB7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOworICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7CisgICAgICAgIERyYXdhYmxlIGJnOworCisgICAgICAgIC8vLyAtLS0tLS0tLS0tIEV4cGFuZGVkIFZpZXcgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKKworICAgICAgICBmaW5hbCBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgbHAgPSBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBscC53aWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICBscC5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOworICAgICAgICBscC54ID0gMDsKKyAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBscC55ID0gLWRpc3BoOyAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgbmVnYXRpdmUKKyAgICAgICAgbHAudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTDsKKyAgICAgICAgbHAuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElUSEVSCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIGxwLmZvcm1hdCA9IHBpeGVsRm9ybWF0OworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlN0YXR1c0JhckV4cGFuZGVkIik7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEZvcm1hdChwaXhlbEZvcm1hdCk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcyA9IGxwOworCisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5zZXRDb250ZW50VmlldyhtRXhwYW5kZWRWaWV3LAorICAgICAgICAgICAgICAgIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5zaG93KCk7CisgICAgICAgIEZyYW1lTGF5b3V0IGhhY2sgPSAoRnJhbWVMYXlvdXQpbUV4cGFuZGVkVmlldy5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERhdGVWaWV3VmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7CisgICAgICAgIG1EYXRlVmlldy5zZXRVcGRhdGVzKHZpc2libGUpOworICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOworICAgICAgICBtRGF0ZVZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOworICAgIH0KKworICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgeworICAgICAgICBpbnQgb2xkID0gbU5vdGlmaWNhdGlvbkljb25zLmdldFZpc2liaWxpdHkoKTsKKyAgICAgICAgaW50IHYgPSB2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEU7CisgICAgICAgIGlmIChvbGQgIT0gdikgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkodik7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoaW50IGV4cGFuZGVkUG9zaXRpb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYmVmb3JlIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBoID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworCisgICAgICAgIC8vIElmIHRoZSBleHBhbmRlZCB2aWV3IGlzIG5vdCB2aXNpYmxlLCBtYWtlIHN1cmUgdGhleSdyZSBzdGlsbCBvZmYgc2NyZWVuLgorICAgICAgICAvLyBNYXliZSB0aGUgdmlldyB3YXMgcmVzaXplZC4KKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICBpZiAobVRyYWNraW5nVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSAtZGlzcGg7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZ1BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1BhcmFtcy55ID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYWNraW5nIHZpZXcuLi4KKyAgICAgICAgaW50IHBvczsKKyAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfRlVMTF9PUEVOKSB7CisgICAgICAgICAgICBwb3MgPSBoOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKKyAgICAgICAgICAgIHBvcyA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPD0gZGlzcGgpIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBleHBhbmRlZFBvc2l0aW9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBkaXNwaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSBkaXNwaC1oOworICAgICAgICB9CisgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbVRyYWNraW5nUGFyYW1zLnkgPSBwb3M7CisgICAgICAgIG1UcmFja2luZ1BhcmFtcy5oZWlnaHQgPSBkaXNwaC1oOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOworCisgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNsb3NlVmlldy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2xvc2VQb3MgPSBtUG9zaXRpb25UbXBbMV07CisKKyAgICAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzLmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50c0JvdHRvbSA9IG1Qb3NpdGlvblRtcFsxXSArIG1FeHBhbmRlZENvbnRlbnRzLmdldEhlaWdodCgpOworCisgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IHBvcyArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgLSAobVRyYWNraW5nUGFyYW1zLmhlaWdodC1jbG9zZVBvcykgLSBjb250ZW50c0JvdHRvbTsKKyAgICAgICAgICAgIGludCBtYXggPSBoOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55ID4gbWF4KSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWluID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1pbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gKG1UcmFja2luZ1Bvc2l0aW9uICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSkgPiBoOworICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRzIGFyZW4ndCB2aXNpYmxlLCBtb3ZlIHRoZSBleHBhbmRlZCB2aWV3IHdheSBvZmYgc2NyZWVuCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgd2luZG93IGl0c2VsZiBleHRlbmRzIGJlbG93IHRoZSBjb250ZW50IHZpZXcuCisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworCisgICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgaXNuJ3QganVzdCBhIHJlcG9zaXRpb25pbmcgdGhhdCdzIG5vdCBzdXBwb3NlZCB0byBhZmZlY3QKKyAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcGVyY2VwdGlvbiBvZiB3aGF0J3Mgc2hvd2luZywgY2FsbCB0byBzYXkgdGhhdCB0aGUgdmlzaWJpbGl0eQorICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIChPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSB3aWxsIGNhbGwgdG8gZG8gdGhhdCkuCisgICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiAhPSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKKyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGFmdGVyICBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLnk9IiArIG1FeHBhbmRlZFBhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0PSIgKyBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBnZXRFeHBhbmRlZEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5LmdldEhlaWdodCgpIC0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkgLSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRIZWlnaHQoKSB7CisgICAgICAgIGlmIChtRXhwYW5kZWRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOworICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBMRURzIGFyZSB0dXJuZWQgbylmZiB3aGVuIHRoZSBub3RpZmljYXRpb24gcGFuZWwgaXMgc2hvd24sIGV2ZW4ganVzdCBhIGxpdHRsZSBiaXQuCisgICAgICogVGhpcyB3YXMgYWRkZWQgbGFzdC1taW51dGUgYW5kIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhlIG5vdGlmaWNhdGlvbnMKKyAgICAgKiBhcmUgaGFuZGxlZCwgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9uIGlzbid0IHJlYWxseSBjYW5jZWxsZWQuICBUaGUgbGlnaHRzIGFyZSBqdXN0CisgICAgICogdHVybmVkIG9mZi4gIElmIGFueSBvdGhlciBub3RpZmljYXRpb25zIGhhcHBlbiwgdGhlIGxpZ2h0cyB3aWxsIHR1cm4gYmFjayBvbi4gIFN0ZXZlIHNheXMKKyAgICAgKiB0aGlzIGlzIHdoYXQgaGUgd2FudHMuIChzZWUgYnVnIDExMzE0NjEpCisgICAgICovCisgICAgdm9pZCB2aXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKG1QYW5lbFNsaWdodGx5VmlzaWJsZSAhPSB2aXNpYmxlKSB7CisgICAgICAgICAgICBtUGFuZWxTbGlnaHRseVZpc2libGUgPSB2aXNpYmxlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vblBhbmVsUmV2ZWFsZWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIFdvbid0IGZhaWwgdW5sZXNzIHRoZSB3b3JsZCBoYXMgZW5kZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7CisgICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7CisKKyAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAvL2NvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShib29sZWFuIHZpcykgeworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eSh2aXMgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgICAqCisgICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5CisgICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKKyAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdHJhY2luZworICAgIC8vCisKKyAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOworICAgIH0KKworICAgIHZvaWQgdmlicmF0ZSgpIHsKKyAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIHZpYi52aWJyYXRlKDI1MCk7CisgICAgfQorCisgICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICB9CisgICAgfTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJQb2xpY3kuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyUG9saWN5LmphdmEKaW5kZXggNGYzOWVlNC4uZTgyOGY2OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJQb2xpY3kuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclBvbGljeS5qYXZhCkBAIC0xMDMzLDYgKzEwMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uSWQgPSBzV2lmaVNpZ25hbEltYWdlc1ttTGFzdFdpZmlTaWduYWxMZXZlbF07CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvbigid2lmaSIsIGljb25JZCwgMCk7CiAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgaWNvbiBzaW5jZSB3aS1maSBpcyBjb25uZWN0ZWQKICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRJY29uVmlzaWJpbGl0eSgid2lmaSIsIHRydWUpOwogCkBAIC0xMDQxLDExICsxMDQyLDExIEBACiAgICAgICAgICAgICAgICAgbUlzV2lmaUNvbm5lY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGljb25JZCA9IHNXaWZpU2lnbmFsSW1hZ2VzWzBdOwogCisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvbigid2lmaSIsIGljb25JZCwgMCk7CiAgICAgICAgICAgICAgICAgLy8gSGlkZSB0aGUgaWNvbiBzaW5jZSB3ZSdyZSBub3QgY29ubmVjdGVkCiAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvblZpc2liaWxpdHkoIndpZmkiLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1TZXJ2aWNlLnNldEljb24oIndpZmkiLCBpY29uSWQsIDApOwogICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikpIHsKICAgICAgICAgICAgIGludCBpY29uSWQ7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3UnNzaSA9IGludGVudC5nZXRJbnRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgLTIwMCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCmluZGV4IDA3YmNjZTcuLmE2NGMzZTcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xNywxODggKzE3LDUzIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5TdGF0dXNCYXJQb2xpY3k7CiAKLQotCi1wdWJsaWMgY2xhc3MgU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgaW1wbGVtZW50cyBDb21tYW5kUXVldWUuQ2FsbGJhY2tzIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIENvbW1hbmRRdWV1ZS5DYWxsYmFja3MgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0JhclNlcnZpY2UiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKLSAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworICAgIHByb3RlY3RlZCBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKKyAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworICAgIC8vIFVwLWNhbGwgbWV0aG9kcworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19JTlRSVURFUiA9IDEwMDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ISURFX0lOVFJVREVSID0gMTAwMzsKLQotICAgIC8vIHdpbGwgbGlrZWx5IG1vdmUgdG8gYSByZXNvdXJjZSBvciBvdGhlciB0dW5hYmxlIHBhcmFtIGF0IHNvbWUgcG9pbnQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMgPSAxMDAwMDsKLQotICAgIFN0YXR1c0JhclBvbGljeSBtSWNvblBvbGljeTsKLQotICAgIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOwotICAgIElTdGF0dXNCYXJTZXJ2aWNlIG1CYXJTZXJ2aWNlOwotCi0gICAgaW50IG1JY29uU2l6ZTsKLSAgICBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7Ci0gICAgaW50IG1QaXhlbEZvcm1hdDsKLSAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKLSAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8vIGljb25zCi0gICAgTGluZWFyTGF5b3V0IG1JY29uczsKLSAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKLSAgICBMaW5lYXJMYXlvdXQgbVN0YXR1c0ljb25zOwotCi0gICAgLy8gZXhwYW5kZWQgbm90aWZpY2F0aW9ucwotICAgIERpYWxvZyBtRXhwYW5kZWREaWFsb2c7Ci0gICAgRXhwYW5kZWRWaWV3IG1FeHBhbmRlZFZpZXc7Ci0gICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbUV4cGFuZGVkUGFyYW1zOwotICAgIFNjcm9sbFZpZXcgbVNjcm9sbFZpZXc7Ci0gICAgVmlldyBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OwotICAgIFZpZXcgbUV4cGFuZGVkQ29udGVudHM7Ci0gICAgLy8gdG9wIGJhcgotICAgIFRleHRWaWV3IG1Ob05vdGlmaWNhdGlvbnNUaXRsZTsKLSAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247Ci0gICAgLy8gZHJhZyBiYXIKLSAgICBDbG9zZURyYWdIYW5kbGUgbUNsb3NlVmlldzsKLSAgICAvLyBvbmdvaW5nCi0gICAgTm90aWZpY2F0aW9uRGF0YSBtT25nb2luZyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7Ci0gICAgVGV4dFZpZXcgbU9uZ29pbmdUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbU9uZ29pbmdJdGVtczsKLSAgICAvLyBsYXRlc3QKLSAgICBOb3RpZmljYXRpb25EYXRhIG1MYXRlc3QgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOwotICAgIFRleHRWaWV3IG1MYXRlc3RUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbUxhdGVzdEl0ZW1zOwotICAgIC8vIHBvc2l0aW9uCi0gICAgaW50W10gbVBvc2l0aW9uVG1wID0gbmV3IGludFsyXTsKLSAgICBib29sZWFuIG1FeHBhbmRlZDsKLSAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7Ci0KLSAgICAvLyB0aGUgZGF0ZSB2aWV3Ci0gICAgRGF0ZVZpZXcgbURhdGVWaWV3OwotCi0gICAgLy8gdGhlIHRyYWNrZXIgdmlldwotICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OwotICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKLSAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7Ci0KLSAgICAvLyB0aWNrZXIKLSAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOwotICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7Ci0KLSAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KLSAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQotICAgIGJvb2xlYW4gbVRyYWNraW5nOwotICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOwotCi0gICAgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7Ci0gICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7Ci0gICAgZmxvYXQgbUFuaW1ZOwotICAgIGZsb2F0IG1BbmltVmVsOwotICAgIGZsb2F0IG1BbmltQWNjZWw7Ci0gICAgbG9uZyBtQW5pbUxhc3RUaW1lOwotICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgIGludCBtVmlld0RlbHRhOwotICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOwotCi0gICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgotICAgIGludCBtRGlzYWJsZWQgPSAwOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKLSAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIC8vIEZpcnN0IHNldCB1cCBvdXIgdmlld3MgYW5kIHN0dWZmLgotICAgICAgICBtRGlzcGxheSA9ICgoV2luZG93TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOwotICAgICAgICBtYWtlU3RhdHVzQmFyVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyBzYiA9IG1ha2VTdGF0dXNCYXJWaWV3KCk7CiAKICAgICAgICAgLy8gQ29ubmVjdCBpbiB0byB0aGUgc3RhdHVzIGJhciBtYW5hZ2VyIHNlcnZpY2UKICAgICAgICAgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QgPSBuZXcgU3RhdHVzQmFySWNvbkxpc3QoKTsKQEAgLTIzNiwxMzcxICsxMDEsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFB1dCB1cCB0aGUgdmlldwotICAgICAgICBhZGRTdGF0dXNCYXJWaWV3KCk7Ci0KLSAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgotICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKLSAgICB9Ci0KLSAgICAvLyBmb3IgaW1tZXJzaXZlIGFjdGl2aXRpZXMKLSAgICBwcml2YXRlIFZpZXcgbUludHJ1ZGVyQWxlcnRWaWV3OwotCi0gICAgLyoqCi0gICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwcml2YXRlIHZvaWQgbWFrZVN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotCi0gICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7Ci0KLSAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKLSAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIG1JbnRydWRlckFsZXJ0VmlldyA9IFZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5pbnRydWRlcl9hbGVydCwgbnVsbCk7Ci0gICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRDbGlja2FibGUodHJ1ZSk7Ci0KLSAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKLSAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7Ci0gICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7Ci0gICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOwotICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7Ci0gICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKLSAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7Ci0gICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7Ci0gICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOwotICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7Ci0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOwotCi0gICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOwotICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOwotCi0gICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7Ci0gICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOwotICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgbW9yZVZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgIm1vcmUiKTsKLSAgICAgICAgbW9yZVZpZXcuc2V0KG5ldyBTdGF0dXNCYXJJY29uKG51bGwsIFIuZHJhd2FibGUuc3RhdF9ub3RpZnlfbW9yZSwgMCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkTW9yZVZpZXcobW9yZVZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNCYXJWaWV3KCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKIAotICAgICAgICBmaW5hbCBTdGF0dXNCYXJWaWV3IHZpZXcgPSBtU3RhdHVzQmFyVmlldzsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLmdyYXZpdHkgPSBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhzYiwgbHApOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KHZpZXcsIGxwKTsKLQotICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKLSAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKLSAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCi0gICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAueSArPSBoZWlnaHQgKiAxLjU7IC8vIEZJWE1FCi0gICAgICAgIGxwLnNldFRpdGxlKCJJbnRydWRlckFsZXJ0Iik7Ci0gICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TdGF0dXNCYXJfSW50cnVkZXJBbGVydDsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtSW50cnVkZXJBbGVydFZpZXcsIGxwKTsKKyAgICAgICAgU2xvZy5kKFRBRywgIkFkZGVkIHN0YXR1cyBiYXIgdmlldyB3LyBncmF2aXR5IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZ3Jhdml0eSkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKLSAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7Ci0gICAgICAgIHZpZXcuc2V0KGljb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGltbWVyc2l2ZSkgewotICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJQcmVzZW50aW5nIGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uIGluIGltbWVyc2l2ZSBhY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgIC8vIEBAQCBzcGVjaWFsIG5ldyB0cmFuc2llbnQgdGlja2VyIG1vZGUKLSAgICAgICAgICAgICAgICAvLyAxLiBQb3B1bGF0ZSBtSW50cnVkZXJBbGVydFZpZXcKLQotICAgICAgICAgICAgICAgIEltYWdlVmlldyBhbGVydEljb24gPSAoSW1hZ2VWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRJY29uKTsKLSAgICAgICAgICAgICAgICBUZXh0VmlldyBhbGVydFRleHQgPSAoVGV4dFZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydFRleHQpOwotICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5zZXRJbWFnZURyYXdhYmxlKFN0YXR1c0Jhckljb25WaWV3LmdldEljb24oCi0gICAgICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgIGljb25WaWV3LmdldFN0YXR1c0Jhckljb24oKSkpOwotICAgICAgICAgICAgICAgIGFsZXJ0VGV4dC5zZXRUZXh0KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBWaWV3IGJ1dHRvbiA9IG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5pbnRydWRlcl9hbGVydF9jb250ZW50KTsKLSAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgTGF1bmNoZXIobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyAyLiBBbmltYXRlIG1JbnRydWRlckFsZXJ0VmlldyBpbgotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU5UUlVERVIpOwotCi0gICAgICAgICAgICAgICAgLy8gMy4gU2V0IGFsYXJtIHRvIGFnZSB0aGUgbm90aWZpY2F0aW9uIG9mZiAoVE9ETykKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfSElERV9JTlRSVURFUik7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0hJREVfSU5UUlVERVIsIElOVFJVREVSX0FMRVJUX0RFQ0FZX01TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm90IGltbWVyc2l2ZSAmIGEgZnVsbC1zY3JlZW4gYWxlcnQgc2hvdWxkIGJlIHNob3duCi0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50IGFuZCBhY3Rpdml0eSBpcyBub3QgaW1tZXJzaXZlOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB1c3VhbCBjYXNlOiBzdGF0dXMgYmFyIHZpc2libGUgJiBub3QgaW1tZXJzaXZlCi0KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHRpY2tlcgotICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7Ci0KLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OwotICAgICAgICBpbnQgb2xkSW5kZXggPSBtT25nb2luZy5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgaWYgKG9sZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9sZEluZGV4ID0gbUxhdGVzdC5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgICAgIGlmIChvbGRJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkTGlzdCA9IG1MYXRlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG9sZExpc3QuZ2V0RW50cnlBdChvbGRJbmRleCk7Ci0gICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247Ci0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKLQotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKLSAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKLSAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgotICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZwotICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0KLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7Ci0gICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotCi0gICAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCi0gICAgICAgICAgICBtVGlja2VyLnJlbW92ZUVudHJ5KG9sZCk7Ci0KLSAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY2hvb3NlSWNvbkluZGV4KGJvb2xlYW4gaXNPbmdvaW5nLCBpbnQgdmlld0luZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBsYXRlc3RTaXplID0gbUxhdGVzdC5zaXplKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplICsgKG1PbmdvaW5nLnNpemUoKSAtIHZpZXdJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSAtIHZpZXdJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFZpZXdbXSBtYWtlTm90aWZpY2F0aW9uVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKLSAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBuLmNvbnRlbnRWaWV3OwotICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3Ci0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQotICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOwotICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBuLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LCBub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7Ci0gICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsgcm93LCBjb250ZW50LCBleHBhbmRlZCB9OwotICAgIH0KLQotICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgbGlzdDsKLSAgICAgICAgVmlld0dyb3VwIHBhcmVudDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc09uZ29pbmcgPSBub3RpZmljYXRpb24uaXNPbmdvaW5nKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIGxpc3QgPSBtT25nb2luZzsKLSAgICAgICAgICAgIHBhcmVudCA9IG1PbmdvaW5nSXRlbXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaXN0ID0gbUxhdGVzdDsKLSAgICAgICAgICAgIHBhcmVudCA9IG1MYXRlc3RJdGVtczsKLSAgICAgICAgfQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3cyA9IG1ha2VOb3RpZmljYXRpb25WaWV3KG5vdGlmaWNhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgaWYgKHZpZXdzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgotICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBWaWV3IHJvdyA9IHZpZXdzWzBdOwotICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSB2aWV3c1sxXTsKLSAgICAgICAgZmluYWwgVmlldyBleHBhbmRlZCA9IHZpZXdzWzJdOwotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCi0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7Ci0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkaW5nIGNyZWF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWRkIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICBmaW5hbCBpbnQgdmlld0luZGV4ID0gbGlzdC5hZGQoa2V5LCBub3RpZmljYXRpb24sIHJvdywgY29udGVudCwgZXhwYW5kZWQsIGljb25WaWV3KTsKLSAgICAgICAgcGFyZW50LmFkZFZpZXcocm93LCB2aWV3SW5kZXgpOwotICAgICAgICAvLyBBZGQgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBjaG9vc2VJY29uSW5kZXgoaXNPbmdvaW5nLCB2aWV3SW5kZXgpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkVmlldyhpY29uVmlldywgaWNvbkluZGV4LAotICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7Ci0gICAgICAgIHJldHVybiBpY29uVmlldzsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOwotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0gICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKLQotICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCi0gICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKLSAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7Ci0gICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKLQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgewotICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgotICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKLSAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19JTlRSVURFUjoKLSAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0hJREVfSU5UUlVERVI6Ci0gICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCi0gICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCi0gICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKLQotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKCFtVGlja2luZykgewotICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOwotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwotICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeTsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOwotICAgICAgICB9Ci0gICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgotICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7Ci0gICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKLQotICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgPT0gMCkgewotICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICB9Ci0gICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLQotICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgZG9BbmltYXRpb24oKSB7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIik7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGJlZm9yZSBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGFmdGVyICBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpZiAobUFuaW1ZID49IG1EaXNwbGF5LmdldEhlaWdodCgpLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gZXhwYW5kZWQgc3RhdGUuIik7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOwotICAgICAgICAgICAgICAgIHBlcmZvcm1FeHBhbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1BbmltWSA8IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGNvbGxhcHNlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKDApOwotICAgICAgICAgICAgICAgIHBlcmZvcm1Db2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0b3BUcmFja2luZygpIHsKLSAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudEFuaW0oKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGZsb2F0IHQgPSAoKGZsb2F0KShub3cgLSBtQW5pbUxhc3RUaW1lKSkgLyAxMDAwOyAgICAgICAgICAgIC8vIG1zIC0+IHMKLSAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1BbmltWTsKLSAgICAgICAgZmluYWwgZmxvYXQgdiA9IG1BbmltVmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBmaW5hbCBmbG9hdCBhID0gbUFuaW1BY2NlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zL3MKLSAgICAgICAgbUFuaW1ZID0geSArICh2KnQpICsgKDAuNWYqYSp0KnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgKLSAgICAgICAgbUFuaW1WZWwgPSB2ICsgKGEqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtcwotICAgICAgICAvL1Nsb2cuZChUQUcsICJ5PSIgKyB5ICsgIiB2PSIgKyB2ICsgIiBhPSIgKyBhICsgIiB0PSIgKyB0ICsgIiBtQW5pbVk9IiArIG1BbmltWQotICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOwotICAgIH0KLQotICAgIHZvaWQgZG9SZXZlYWxBbmltYXRpb24oKSB7Ci0gICAgICAgIGZpbmFsIGludCBoID0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKSArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiBtQW5pbWF0aW5nICYmIG1BbmltWSA8IGgpIHsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gaCkgewotICAgICAgICAgICAgICAgIG1BbmltWSA9IGg7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKLSAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKLSAgICAgICAgaWYgKG9wZW5pbmcpIHsKLSAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOwotICAgICAgICAgICAgbUFuaW1WZWwgPSAyMDA7Ci0gICAgICAgICAgICBtQW5pbVkgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKLSAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCi0gICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGl0J3Mgb3BlbiwgY2xvc2UgaXQ/Ci0gICAgICAgICAgICBpZiAobUFuaW1hdGluZykgewotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRmxpbmcoaW50IHksIGZsb2F0IHZlbCwgYm9vbGVhbiBhbHdheXMpIHsKLSAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIG1BbmltWSA9IHk7Ci0gICAgICAgIG1BbmltVmVsID0gdmVsOwotCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInN0YXJ0aW5nIHdpdGggbUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7Ci0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgaWYgKCFhbHdheXMgJiYgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQtMjUpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgZXhwYW5kZWQgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCBhbmQgYXJlIG5vdyBnb2luZyB0byBhbmltYXRlIGF3YXkuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYWx3YXlzIHx8ICgKLSAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCi0gICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LzIpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGFuZCB0aGV5IG1vdmVkIGVub3VnaCB0byBhbGxvdyB1cyB0bwotICAgICAgICAgICAgICAgIC8vIGV4cGFuZC4gIEFuaW1hdGUgaW4gdGhlIG5vdGlmaWNhdGlvbnMuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQotICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGNvbGxhcHNlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1Nsb2cuZChUQUcsICJtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKLSAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICBzdG9wVHJhY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCi0gICAgICAgICAgICAgICAgKyBtRGlzYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQmFyU2l6ZSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBmaW5hbCBpbnQgaGl0U2l6ZSA9IHN0YXR1c0JhclNpemUqMjsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOwotCi0gICAgICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBzdGF0dXNCYXJTaXplIC0geTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBtQWJzUG9zWzFdICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSAtIHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtRXhwYW5kZWQgJiYgeSA8IGhpdFNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtRXhwYW5kZWQgJiYgeSA+IChtRGlzcGxheS5nZXRIZWlnaHQoKS1oaXRTaXplKSkpIHsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGRyb3AgZXZlbnRzIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gbWFrZSB0aGUgd2luZG93c2hhZGUgY29tZQotICAgICAgICAgICAgICAgIC8vIGRvd24gYnkgYWNjaWRlbnQgbGVzcywgZXNwZWNpYWxseSB3aGVuIHB1c2hpbmcgb3BlbiBhIGRldmljZSB3aXRoIGEga2V5Ym9hcmQKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHJvdGF0ZXMgKGxpa2UgZzEgYW5kIGRyb2lkKQotICAgICAgICAgICAgICAgIGludCB4ID0gKGludClldmVudC5nZXRSYXdYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGVkZ2VCb3JkZXIgPSBtRWRnZUJvcmRlcjsKLSAgICAgICAgICAgICAgICBpZiAoeCA+PSBlZGdlQm9yZGVyICYmIHggPCBtRGlzcGxheS5nZXRXaWR0aCgpIC0gZWRnZUJvcmRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgIW1FeHBhbmRlZCk7Ly8gb3BlbmluZyBpZiB3ZSdyZSBub3QgYWxyZWFkeSBmdWxseSB2aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcpIHsKLSAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgZmluYWwgaW50IG1pblkgPSBzdGF0dXNCYXJTaXplICsgbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgeSA8IG1pblkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwotICAgICAgICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCk7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB5VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0geVZlbCA8IDA7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRYVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeFZlbCA9IC14VmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA+IDE1MC4wZikgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gMTUwLjBmOyAvLyBsaW1pdCBob3cgbXVjaCB3ZSBjYXJlIGFib3V0IHRoZSB4IGF4aXMKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB2ZWwgPSAoZmxvYXQpTWF0aC5oeXBvdCh5VmVsLCB4VmVsKTsKLSAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOwotICAgICAgICBwcml2YXRlIGludCBtSWQ7Ci0KLSAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgewotICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKLSAgICAgICAgICAgIG1Qa2cgPSBwa2c7Ci0gICAgICAgICAgICBtVGFnID0gdGFnOwotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCi0gICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOwotICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KLSAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGNsaWNrIHdhcyBvbiB0aGUgaW50cnVkZXIgYWxlcnQsIGhpZGUgdGhhdCBpbnN0ZWFkCi0gICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7Ci0gICAgICAgIC8vIFNob3cgdGhlIHRpY2tlciBpZiBvbmUgaXMgcmVxdWVzdGVkLiBBbHNvIGRvbid0IGRvIHRoaXMKLSAgICAgICAgLy8gdW50aWwgc3RhdHVzIGJhciB3aW5kb3cgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLAotICAgICAgICAvLyBiZWNhdXNlLi4uICB3ZWxsLCB3aGF0J3MgdGhlIHBvaW50IG90aGVyd2lzZT8gIEFuZCB0cnlpbmcgdG8KLSAgICAgICAgLy8gcnVuIGEgdGlja2VyIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWQgd2lsbCBjcmFzaCEKLSAgICAgICAgaWYgKG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbCAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgewotICAgICAgICAgICAgICAgIG1UaWNrZXIuYWRkRW50cnkobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIC8gTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UKLSAgICAgKiBhYm91dCB0aGUgZmFpbHVyZS4KLSAgICAgKgotICAgICAqIFdBUk5JTkc6IHRoaXMgd2lsbCBjYWxsIGJhY2sgaW50byB1cy4gIERvbid0IGhvbGQgYW55IGxvY2tzLgotICAgICAqLwotICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE15VGlja2VyIGV4dGVuZHMgVGlja2VyIHsKLSAgICAgICAgTXlUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBTdGF0dXNCYXJWaWV3IHNiKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzYik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKLSAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgdm9pZCB0aWNrZXJEb25lKCkgewotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGlja2VySGFsdGluZygpIHsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbVRpY2tpbmdEb25lTGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgezsKLSAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuaW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCi0gICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQotICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgotICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAotICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uRGF0YSkgewotICAgICAgICAgICAgaW50IE4gPSBtTm90aWZpY2F0aW9uRGF0YS5vbmdvaW5nQ291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0T25nb2luZyhpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOID0gbU5vdGlmaWNhdGlvbkRhdGEubGF0ZXN0Q291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0TGF0ZXN0KGkpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOwotICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtU3RhdHVzQmFyVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtU3RhdHVzQmFyVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZGVidWcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1FeHBhbmRlZFZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbUV4cGFuZGVkVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUV4cGFuZGVkVmlldy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmRlYnVnKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtVHJhY2tpbmdWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1UcmFja2luZ1ZpZXcuZ2V0V2lkdGgoKSArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5kZWJ1ZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQmFyVmlld0F0dGFjaGVkKCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKLSAgICAgICAgaW50IHBpeGVsRm9ybWF0OwotICAgICAgICBEcmF3YWJsZSBiZzsKLQotICAgICAgICAvLy8gLS0tLS0tLS0tLSBUcmFja2luZyBWaWV3IC0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCWF84ODg4OwotICAgICAgICBiZyA9IG1UcmFja2luZ1ZpZXcuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBpZiAoYmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKLSAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdCk7Ci0vLyAgICAgICAgbHAudG9rZW4gPSBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpOwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlRyYWNraW5nVmlldyIpOwotICAgICAgICBscC55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcyA9IGxwOwotCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1UcmFja2luZ1ZpZXcsIGxwKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uVHJhY2tpbmdWaWV3QXR0YWNoZWQoKSB7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOwotICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIERyYXdhYmxlIGJnOwotCi0gICAgICAgIC8vLyAtLS0tLS0tLS0tIEV4cGFuZGVkIFZpZXcgLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKLQotICAgICAgICBmaW5hbCBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLSAgICAgICAgbHAgPSBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBscC53aWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICBscC5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICBscC54ID0gMDsKLSAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBscC55ID0gLWRpc3BoOyAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgbmVnYXRpdmUKLSAgICAgICAgbHAudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTDsKLSAgICAgICAgbHAuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElUSEVSCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIGxwLmZvcm1hdCA9IHBpeGVsRm9ybWF0OwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlN0YXR1c0JhckV4cGFuZGVkIik7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEZvcm1hdChwaXhlbEZvcm1hdCk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcyA9IGxwOwotCi0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zZXRDb250ZW50VmlldyhtRXhwYW5kZWRWaWV3LAotICAgICAgICAgICAgICAgIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zaG93KCk7Ci0gICAgICAgIEZyYW1lTGF5b3V0IGhhY2sgPSAoRnJhbWVMYXlvdXQpbUV4cGFuZGVkVmlldy5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERhdGVWaWV3VmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRVcGRhdGVzKHZpc2libGUpOwotICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOwotICAgICAgICBtRGF0ZVZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgIH0KLQotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgewotICAgICAgICBpbnQgb2xkID0gbU5vdGlmaWNhdGlvbkljb25zLmdldFZpc2liaWxpdHkoKTsKLSAgICAgICAgaW50IHYgPSB2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEU7Ci0gICAgICAgIGlmIChvbGQgIT0gdikgewotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkodik7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoaW50IGV4cGFuZGVkUG9zaXRpb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYmVmb3JlIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIC8vIElmIHRoZSBleHBhbmRlZCB2aWV3IGlzIG5vdCB2aXNpYmxlLCBtYWtlIHN1cmUgdGhleSdyZSBzdGlsbCBvZmYgc2NyZWVuLgotICAgICAgICAvLyBNYXliZSB0aGUgdmlldyB3YXMgcmVzaXplZC4KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICBpZiAobVRyYWNraW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZ1BhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1BhcmFtcy55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyYWNraW5nIHZpZXcuLi4KLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfRlVMTF9PUEVOKSB7Ci0gICAgICAgICAgICBwb3MgPSBoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgIHBvcyA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPD0gZGlzcGgpIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBleHBhbmRlZFBvc2l0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBkaXNwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyAtPSBkaXNwaC1oOwotICAgICAgICB9Ci0gICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbVRyYWNraW5nUGFyYW1zLnkgPSBwb3M7Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcy5oZWlnaHQgPSBkaXNwaC1oOwotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOwotCi0gICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsb3NlVmlldy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2xvc2VQb3MgPSBtUG9zaXRpb25UbXBbMV07Ci0KLSAgICAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzLmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50c0JvdHRvbSA9IG1Qb3NpdGlvblRtcFsxXSArIG1FeHBhbmRlZENvbnRlbnRzLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IHBvcyArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgLSAobVRyYWNraW5nUGFyYW1zLmhlaWdodC1jbG9zZVBvcykgLSBjb250ZW50c0JvdHRvbTsKLSAgICAgICAgICAgIGludCBtYXggPSBoOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55ID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbWluID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1pbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gKG1UcmFja2luZ1Bvc2l0aW9uICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSkgPiBoOwotICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRzIGFyZW4ndCB2aXNpYmxlLCBtb3ZlIHRoZSBleHBhbmRlZCB2aWV3IHdheSBvZmYgc2NyZWVuCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgd2luZG93IGl0c2VsZiBleHRlbmRzIGJlbG93IHRoZSBjb250ZW50IHZpZXcuCi0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotCi0gICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgaXNuJ3QganVzdCBhIHJlcG9zaXRpb25pbmcgdGhhdCdzIG5vdCBzdXBwb3NlZCB0byBhZmZlY3QKLSAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcGVyY2VwdGlvbiBvZiB3aGF0J3Mgc2hvd2luZywgY2FsbCB0byBzYXkgdGhhdCB0aGUgdmlzaWJpbGl0eQotICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIChPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSB3aWxsIGNhbGwgdG8gZG8gdGhhdCkuCi0gICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiAhPSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKLSAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGFmdGVyICBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLnk9IiArIG1FeHBhbmRlZFBhcmFtcy55Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0PSIgKyBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRFeHBhbmRlZEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5LmdldEhlaWdodCgpIC0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkgLSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRIZWlnaHQoKSB7Ci0gICAgICAgIGlmIChtRXhwYW5kZWRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBMRURzIGFyZSB0dXJuZWQgbylmZiB3aGVuIHRoZSBub3RpZmljYXRpb24gcGFuZWwgaXMgc2hvd24sIGV2ZW4ganVzdCBhIGxpdHRsZSBiaXQuCi0gICAgICogVGhpcyB3YXMgYWRkZWQgbGFzdC1taW51dGUgYW5kIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhlIG5vdGlmaWNhdGlvbnMKLSAgICAgKiBhcmUgaGFuZGxlZCwgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9uIGlzbid0IHJlYWxseSBjYW5jZWxsZWQuICBUaGUgbGlnaHRzIGFyZSBqdXN0Ci0gICAgICogdHVybmVkIG9mZi4gIElmIGFueSBvdGhlciBub3RpZmljYXRpb25zIGhhcHBlbiwgdGhlIGxpZ2h0cyB3aWxsIHR1cm4gYmFjayBvbi4gIFN0ZXZlIHNheXMKLSAgICAgKiB0aGlzIGlzIHdoYXQgaGUgd2FudHMuIChzZWUgYnVnIDExMzE0NjEpCi0gICAgICovCi0gICAgdm9pZCB2aXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKG1QYW5lbFNsaWdodGx5VmlzaWJsZSAhPSB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBtUGFuZWxTbGlnaHRseVZpc2libGUgPSB2aXNpYmxlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vblBhbmVsUmV2ZWFsZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFdvbid0IGZhaWwgdW5sZXNzIHRoZSB3b3JsZCBoYXMgZW5kZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7Ci0gICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7Ci0gICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7Ci0KLSAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAvL2NvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShib29sZWFuIHZpcykgewotICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eSh2aXMgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqCi0gICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5Ci0gICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKLSAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKLSAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOwotCi0gICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOwotCi0gICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gdHJhY2luZwotICAgIC8vCi0KLSAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOwotICAgIH0KLQotICAgIHZvaWQgdmlicmF0ZSgpIHsKLSAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7Ci0gICAgICAgIHZpYi52aWJyYXRlKDI1MCk7Ci0gICAgfQotCi0gICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOwotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQppbmRleCAxZTE0MGI5Li4yMGZjNDFmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKQEAgLTM0LDcgKzM1LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRElNX0FOSU1fVElNRSA9IDQwMDsKICAgICAKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBpbnQgbVN0YXJ0WCwgbVN0YXJ0WTsKICAgICBWaWV3R3JvdXAgbU5vdGlmaWNhdGlvbkljb25zOwpAQCAtNDYsNiArNDcsOSBAQAogICAgIGludCBtU3RhcnRBbHBoYSA9IDAsIG1FbmRBbHBoYSA9IDA7CiAgICAgbG9uZyBtRW5kVGltZSA9IDA7CiAKKyAgICBSZWN0IG1CdXR0b25Cb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIGJvb2xlYW4gbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CisKICAgICBwdWJsaWMgU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgfQpAQCAtOTQsNyArOTgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKLSAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Nyw2ICsxODEsOSBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoIW1DYXB0dXJpbmdFdmVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICB9CkBAIC0xODUsNiArMTkyLDEzIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBpZiAobUJ1dHRvbkJvdW5kcy5jb250YWlucygoaW50KWV2ZW50LmdldFgoKSwgKGludClldmVudC5nZXRZKCkpKSB7CisgICAgICAgICAgICAgICAgbUNhcHR1cmluZ0V2ZW50cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpCiAgICAgICAgICAgICAgICAgPyB0cnVlIDogc3VwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQppbmRleCAwN2U4NjUzLi4wYWFhMzcwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIFRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKKyAgICBwdWJsaWMgVGlja2VyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1UaWNrZXJWaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgfQogCiAKLSAgICB2b2lkIGFkZEVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgcHVibGljIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKICAgICAgICAgaW50IGluaXRpYWxDb3VudCA9IG1TZWdtZW50cy5zaXplKCk7CiAKICAgICAgICAgLy8gSWYgd2hhdCdzIGJlaW5nIGRpc3BsYXllZCBoYXMgdGhlIHNhbWUgdGV4dCBhbmQgaWNvbiwganVzdCBkcm9wIGl0CkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBmb3IgKGludCBpPW1TZWdtZW50cy5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAobi5pZCA9PSBzZWcubm90aWZpY2F0aW9uLmlkICYmIG4ucGtnLmVxdWFscyhzZWcubm90aWZpY2F0aW9uLnBrZykpIHsKQEAgLTIyMSwxMyArMjIxLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGhhbHQoKSB7CisgICAgcHVibGljIHZvaWQgaGFsdCgpIHsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1BZHZhbmNlVGlja2VyKTsKICAgICAgICAgbVNlZ21lbnRzLmNsZWFyKCk7CiAgICAgICAgIHRpY2tlckhhbHRpbmcoKTsKICAgICB9CiAKLSAgICB2b2lkIHJlZmxvd1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgcmVmbG93VGV4dCgpIHsKICAgICAgICAgaWYgKG1TZWdtZW50cy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoMCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IHNlZy5nZXRUZXh0KCk7CkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobUFkdmFuY2VUaWNrZXIsIFRJQ0tFUl9TRUdNRU5UX0RFTEFZKTsKICAgICB9CiAKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlclN0YXJ0aW5nKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VySGFsdGluZygpOwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCmluZGV4IDk3NDlhZTQuLjgxNDA4MTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCkBAIC0zNCw1ICszNCw5IEBACiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CiAgICAgICAgIG1UaWNrZXIucmVmbG93VGV4dCgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpY2tlcihUaWNrZXIgdCkgeworICAgICAgICBtVGlja2VyID0gdDsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCmluZGV4IDkxMDhlZWUuLmM1OWViNmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCiBwdWJsaWMgY2xhc3MgVHJhY2tpbmdWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKICAgICBmaW5hbCBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkNzRjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25JY29uQXJlYSBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOb3RpZmljYXRpb25JY29uQXJlYSI7CisKKyAgICBJY29uTGF5b3V0IG1JY29uTGF5b3V0OworICAgIERyYWdnZXJWaWV3IG1EcmFnZ2VyVmlldzsKKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25JY29uQXJlYShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgbUljb25MYXlvdXQgPSAoSWNvbkxheW91dClmaW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisgICAgICAgIG1EcmFnZ2VyVmlldyA9IChEcmFnZ2VyVmlldykgZmluZFZpZXdCeUlkKFIuaWQuaGFuZGxlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSWNvbkxheW91dCBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIHB1YmxpYyBJY29uTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhZ2dlclZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHVibGljIERyYWdnZXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ2YWRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRTd2l0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLio7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFRhYmxldFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGFibGV0U3RhdHVzQmFyIjsKKworCisKKyAgICBpbnQgbUljb25TaXplOworCisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisKKyAgICAvLyB0cmFja2luZyBhbGwgY3VycmVudCBub3RpZmljYXRpb25zCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25EYXRhIG1Ob3RucyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgCisgICAgVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYSBtTm90aWZpY2F0aW9uSWNvbkFyZWE7CisKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25QYW5lbDsKKyAgICBWaWV3IG1TeXN0ZW1QYW5lbDsKKworICAgIFZpZXdHcm91cCBtUGlsZTsKKyAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247CisKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYS5JY29uTGF5b3V0IG1JY29uTGF5b3V0OworCisgICAgS2lja2VyQ29udHJvbGxlciBtS2lja2VyOworICAgIFZpZXcgbUtpY2tlclZpZXc7CisgICAgYm9vbGVhbiBtVGlja2luZzsKKyAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7CisKKyAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCisgICAgaW50IG1EaXNhYmxlZCA9IDA7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYW5lbFdpbmRvd3MoKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbCA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucywgbnVsbCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbCA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zeXNiYXJfcGFuZWxfc3lzdGVtLCBudWxsKTsKKworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgaW50IGJhckhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDQwMCwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNICisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5MRUZUOworICAgICAgICBscC5zZXRUaXRsZSgiTm90aWZpY2F0aW9uUGFuZWwiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1NsaWRpbmdDYXJkOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1Ob3RpZmljYXRpb25QYW5lbCwgbHApOworCisgICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDQwMCwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgMjAwLCAvLyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1dBVENIX09VVFNJREVfVE9VQ0gKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOworICAgICAgICBscC5zZXRUaXRsZSgiU3lzdGVtUGFuZWwiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1NsaWRpbmdDYXJkOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1TeXN0ZW1QYW5lbCwgbHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOyAvLyB3aWxsIGFkZCB0aGUgbWFpbiBiYXIgdmlldworICAgIH0KKworICAgIHByb3RlY3RlZCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKKworICAgICAgICBmaW5hbCBWaWV3IHNiID0gVmlldy5pbmZsYXRlKHRoaXMsIFIubGF5b3V0LnN0YXR1c19iYXIsIG51bGwpOworICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOworCisgICAgICAgIC8vIHRoZSBtb3JlIG5vdGlmaWNhdGlvbnMgaWNvbgorICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworCisgICAgICAgIC8vIHdoZXJlIHRoZSBpY29ucyBnbworICAgICAgICBtSWNvbkxheW91dCA9IChOb3RpZmljYXRpb25JY29uQXJlYS5JY29uTGF5b3V0KSBzYi5maW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisKKyAgICAgICAgbUtpY2tlciA9IG5ldyBLaWNrZXJDb250cm9sbGVyKChDb250ZXh0KXRoaXMsIG1TdGF0dXNCYXJWaWV3KTsKKworICAgICAgICAvLyBBZGQgdGhlIHdpbmRvd3MKKyAgICAgICAgYWRkUGFuZWxXaW5kb3dzKCk7CisKKyAgICAgICAgLy8gTG9yZW0gaXBzdW0sIERvbG9yZXMKKyAgICAgICAgVGV4dFZpZXcgdHYgPSAoKFRleHRWaWV3KSBtU3lzdGVtUGFuZWwuZmluZFZpZXdCeUlkKFIuaWQuc3lzdGVtUGFuZWxEdW1teSkpOworICAgICAgICBpZiAodHYgIT0gbnVsbCkgdHYuc2V0VGV4dCgiU3lzdGVtIHN0YXR1czogZ3JlYXQiKTsKKworICAgICAgICBtUGlsZSA9IChWaWV3R3JvdXApbU5vdGlmaWNhdGlvblBhbmVsLmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IChTY3JvbGxWaWV3KW1QaWxlLmdldFBhcmVudCgpOworICAgICAgICBzY3JvbGxlci5zZXRGaWxsVmlld3BvcnQodHJ1ZSk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KW1Ob3RpZmljYXRpb25QYW5lbC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9TWVNURU1fUEFORUwgPSAxMDEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMID0gMTAxMTsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgbm90aWZpY2F0aW9ucyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19PUEVOX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAib3BlbmluZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIHN5c3RlbSBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgLy8gVE9ETworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIik7CisgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgLy8gdGljaygpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikgLy8gVE9ETyIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1Ob3Rucy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTm90aWZpY2F0aW9uQ2xpY2tlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiBmb3Iga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzoga2lja2VyOyBpbW1lcnNpdmUgbW9kZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24oIiArIGtleSArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgeworICAgICAgICAvKgorICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICAvKgorICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKKyAgICAgICAgICAgICAgICBtS2lja2VyLmFkZEVudHJ5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBLaWNrZXJDb250cm9sbGVyIHsKKyAgICAgICAgVmlldyBtVmlldzsKKyAgICAgICAgSW1hZ2VWaWV3IG1LaWNrZXJJY29uOworICAgICAgICBUZXh0U3dpdGNoZXIgbUtpY2tlclRleHQ7CisKKyAgICAgICAgcHVibGljIEtpY2tlckNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CisgICAgICAgICAgICBtVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CisgICAgICAgICAgICBtS2lja2VySWNvbiA9IChJbWFnZVZpZXcpIG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlckljb24pOworICAgICAgICAgICAgbUtpY2tlclRleHQgPSAoVGV4dFN3aXRjaGVyKSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbHQoKSB7CisgICAgICAgICAgICB0aWNrZXJIYWx0aW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAgICAgbUtpY2tlckljb24uc2V0SW1hZ2VSZXNvdXJjZShuLm5vdGlmaWNhdGlvbi5pY29uKTsKKyAgICAgICAgICAgIG1LaWNrZXJUZXh0LnNldEN1cnJlbnRUZXh0KG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpOworICAgICAgICAgICAgdGlja2VyU3RhcnRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgeworICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1LaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgbm90aWZpY2F0aW9uIGljb25zIik7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKworICAgICAgICBpbnQgbXNnID0gKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSAKKyAgICAgICAgICAgID8gSC5NU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwKKyAgICAgICAgICAgIDogSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtSW5mb0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgc3lzdGVtIGluZm8iKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworCisgICAgICAgIGludCBtc2cgPSAobVN5c3RlbVBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgPyBILk1TR19PUEVOX1NZU1RFTV9QQU5FTAorICAgICAgICAgICAgOiBILk1TR19DTE9TRV9TWVNURU1fUEFORUw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBhYm91dCB0aGUgZmFpbHVyZS4gSG9sZCBubyBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uQ2xpY2tlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgICAgIHByaXZhdGUgaW50IG1JZDsKKworICAgICAgICBOb3RpZmljYXRpb25DbGlja2VyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtUGtnID0gcGtnOworICAgICAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhpcyBjbGljayB3YXMgb24gdGhlIGludHJ1ZGVyIGFsZXJ0LCBoaWRlIHRoYXQgaW5zdGVhZAorLy8gICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU5vdG5zLnJlbW92ZShrZXkpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBWaWV3R3JvdXAgcm93UGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChyb3dQYXJlbnQgIT0gbnVsbCkgcm93UGFyZW50LnJlbW92ZVZpZXcoZW50cnkucm93KTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgorLy8gICAgICAgIFZpZXdHcm91cCBpY29uUGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpOworLy8gICAgICAgIGlmIChpY29uUGFyZW50ICE9IG51bGwpIGljb25QYXJlbnQucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKKyAgICAgICAgcmVmcmVzaEljb25zKCk7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb25WaWV3cyhrZXk9IiArIGtleSArICIsIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgaWNvblZpZXcuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuQ0VOVEVSX0lOU0lERSk7CisKKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGF0dGFjaCBTdGF0dXNCYXJJY29uOiAiICsgaWMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEuRW50cnkoa2V5LCBub3RpZmljYXRpb24sIGljb25WaWV3KTsKKyAgICAgICAgaWYgKCFpbmZsYXRlVmlld3MoZW50cnksIG1QaWxlKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KKyAgICAgICAgbU5vdG5zLmFkZChlbnRyeSk7CisgICAgICAgIHJlZnJlc2hJY29ucygpOworCisgICAgICAgIHJldHVybiBpY29uVmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEljb25zKCkgeworICAgICAgICAvLyBYWFg6IG5lZWQgdG8gaW1wbGVtZW50IGEgbmV3IGxpbWl0ZWQgbGluZWFyIGxheW91dCBjbGFzcworICAgICAgICAvLyB0byBhdm9pZCByZW1vdmluZyAmIHJlYWRkaW5nIGV2ZXJ5dGhpbmcKKworICAgICAgICBpbnQgTiA9IG1Ob3Rucy5zaXplKCk7CisgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlZnJlc2hpbmcgaWNvbnMgKCIgKyBOICsgIiBub3RpZmljYXRpb25zLCBtSWNvbkxheW91dD0iCisgICAgICAgICAgICAgICAgICAgICsgbUljb25MYXlvdXQgKyAiLCBtUGlsZT0iICsgbVBpbGUpOworICAgICAgICB9CisKKyAgICAgICAgbUljb25MYXlvdXQucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGk+PU4pIGJyZWFrOworICAgICAgICAgICAgbUljb25MYXlvdXQuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5pY29uLCBpLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgbVBpbGUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgbVBpbGUuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5yb3cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluZmxhdGVWaWV3cyhOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4gPSBlbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gc2JuLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgVmlldyB2ZXRvQnV0dG9uID0gcm93LmZpbmRWaWV3QnlJZChSLmlkLnZldG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgX3BrZyA9IHNibi5wa2c7CisgICAgICAgIGZpbmFsIFN0cmluZyBfdGFnID0gc2JuLnRhZzsKKyAgICAgICAgZmluYWwgaW50IF9pZCA9IHNibi5pZDsKKyAgICAgICAgdmV0b0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGVhcihfcGtnLCBfdGFnLCBfaWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgLy8gWFhYOiB1cGRhdGUgdG8gYWxsb3cgY29udHJvbHMgd2l0aGluIG5vdGlmaWNhdGlvbiB2aWV3cworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKy8vICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IHNibi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5wa2csIHNibi50YWcsIHNibi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBzYm4ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNibi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkucm93ID0gcm93OworICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKKyAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawppbmRleCBiNDE3NTlhLi41ZGMwYzMwIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAJYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCisJZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKIAkkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAppbmRleCAxZDY5MzYxLi44ZGM4OGRiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAorKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0jaW5jbHVkZSA8dHRzL1R0c0VuZ2luZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvdHRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1hdGguaD4KIApAQCAtMTU0LDcgKzE1NCw3IEBACiBjbGFzcyBTeW50aFByb3h5Sm5pU3RvcmFnZSB7CiAgICAgcHVibGljIDoKICAgICAgICAgam9iamVjdCAgICAgICAgICAgICAgICAgICB0dHNfcmVmOwotICAgICAgICBUdHNFbmdpbmUqICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZTsKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QqICAgICAgIG1FbmdpbmU7CiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZUxpYkhhbmRsZTsKICAgICAgICAgQXVkaW9UcmFjayogICAgICAgICAgICAgICBtQXVkaW9PdXQ7CiAgICAgICAgIGludDhfdCAgICAgICAgICAgICAgICAgICAgbVBsYXlTdGF0ZTsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAgICAgICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgdHRzX3JlZiA9IE5VTEw7Ci0gICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UgPSBOVUxMOworICAgICAgICAgICAgbUVuZ2luZSA9IE5VTEw7CiAgICAgICAgICAgICBtRW5naW5lTGliSGFuZGxlID0gTlVMTDsKICAgICAgICAgICAgIG1BdWRpb091dCA9IE5VTEw7CiAgICAgICAgICAgICBtUGxheVN0YXRlID0gIFNZTlRIUExBWVNUQVRFX0lTX1NUT1BQRUQ7CkBAIC0xODQsOSArMTg0LDkgQEAKICAgICAgICAgflN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgLy9MT0dWKCJlbnRlcmluZyB+U3ludGhQcm94eUpuaVN0b3JhZ2UoKSIpOwogICAgICAgICAgICAga2lsbEF1ZGlvKCk7Ci0gICAgICAgICAgICBpZiAobU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zaHV0ZG93bigpOwotICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUVuZ2luZSkgeworICAgICAgICAgICAgICAgIG1FbmdpbmUtPmZ1bmNzLT5zaHV0ZG93bihtRW5naW5lKTsKKyAgICAgICAgICAgICAgICBtRW5naW5lID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtRW5naW5lTGliSGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgLy9MT0dFKCJ+U3ludGhQcm94eUpuaVN0b3JhZ2UoKTogYmVmb3JlIGNsb3NlIGxpYnJhcnkiKTsKQEAgLTI3MywyOCArMjczLDQ1IEBACiAgKiBDYWxsYmFjayBmcm9tIFRUUyBlbmdpbmUuCiAgKiBEaXJlY3RseSBzcGVha3MgdXNpbmcgQXVkaW9UcmFjayBvciB3cml0ZSB0byBmaWxlCiAgKi8KLXN0YXRpYyB0dHNfY2FsbGJhY2tfc3RhdHVzIHR0c1N5bnRoRG9uZUNCKHZvaWQgKiYgdXNlcmRhdGEsIHVpbnQzMl90IHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IComd2F2LCBzaXplX3QgJmJ1ZmZlclNpemUsIHR0c19zeW50aF9zdGF0dXMgc3RhdHVzKSB7CitleHRlcm4gIkMiIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190CitfX3R0c1N5bnRoRG9uZUNCKHZvaWQgKiogcFVzZXJkYXRhLCB1aW50MzJfdCByYXRlLAorICAgICAgICAgICAgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgIGludDhfdCAqKnBXYXYsIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICBhbmRyb2lkX3R0c19zeW50aF9zdGF0dXNfdCBzdGF0dXMpIAorewogICAgIC8vTE9HVigidHRzU3ludGhEb25lQ2FsbGJhY2s6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAgZW5jb2Rpbmc7CiAKLSAgICBpZiAodXNlcmRhdGEgPT0gTlVMTCl7CisgICAgaWYgKCpwVXNlcmRhdGEgPT0gTlVMTCl7CiAgICAgICAgIExPR0UoInVzZXJkYXRhID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICB9Ci0gICAgYWZ0ZXJTeW50aERhdGFfdCogcEZvckFmdGVyID0gKGFmdGVyU3ludGhEYXRhX3QqKXVzZXJkYXRhOworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkNhbid0IHBsYXksIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgfQorICAgIGFmdGVyU3ludGhEYXRhX3QqIHBGb3JBZnRlciA9IChhZnRlclN5bnRoRGF0YV90KikgKnBVc2VyZGF0YTsKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcEpuaURhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKShwRm9yQWZ0ZXItPmpuaVN0b3JhZ2UpOwogCiAgICAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZKXsKICAgICAgICAgLy9MT0dWKCJEaXJlY3Qgc3BlZWNoIik7CiAKLSAgICAgICAgaWYgKHdhdiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgqcFdhdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOworICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChidWZmZXJTaXplID4gMCkgewotICAgICAgICAgICAgcHJlcEF1ZGlvVHJhY2socEpuaURhdGEsIHBGb3JBZnRlci0+c3RyZWFtVHlwZSwgcmF0ZSwgKEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQpZm9ybWF0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKCpwQnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHByZXBBdWRpb1RyYWNrKHBKbmlEYXRhLCBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUsIHJhdGUsIGVuY29kaW5nLCBjaGFubmVsKTsKICAgICAgICAgICAgIGlmIChwSm5pRGF0YS0+bUF1ZGlvT3V0KSB7CiAgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1QbGF5TG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYocEpuaURhdGEtPm1BdWRpb091dC0+c3RvcHBlZCgpCkBAIC0zMDMsMjggKzMyMCwzMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiVXNlRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90KikqcFdhdiwgKnBCdWZmZXJTaXplLzIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bUF1ZGlvT3V0LT53cml0ZSh3YXYsIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIG1lbXNldCh3YXYsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tQXVkaW9PdXQtPndyaXRlKCpwV2F2LCAqcEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICAvL0xPR1YoIkF1ZGlvVHJhY2sgd3JvdGU6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPR0UoIkNhbid0IHBsYXksIG51bGwgYXVkaW90cmFjayIpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CisgICAgICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9XUklURV9UT19GSUxFKSB7CiAgICAgICAgIC8vTE9HVigiU2F2ZSB0byBmaWxlIik7Ci0gICAgICAgIGlmICh3YXYgPT0gTlVMTCkgeworICAgICAgICBpZiAoKnBXYXYgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDApeworICAgICAgICBpZiAoKnBCdWZmZXJTaXplID4gMCl7CiAgICAgICAgICAgICBpZiAoYlVzZUZpbHRlcikgewotICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKSpwV2F2LCAqcEJ1ZmZlclNpemUvMik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmd3JpdGUod2F2LCAxLCBidWZmZXJTaXplLCBwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOwotICAgICAgICAgICAgbWVtc2V0KHdhdiwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmd3JpdGUoKnBXYXYsIDEsICpwQnVmZmVyU2l6ZSwgcEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBGdXR1cmUgdXBkYXRlOgpAQCAtMzMyLDcgKzM1Miw3IEBACiAgICAgLy8gICAgICBqYXZhVFRTRmllbGRzLnN5bnRoUHJveHlNZXRob2RQb3N0IG1ldGhvZGUgdG8gbm90aWZ5CiAgICAgLy8gICAgICBwbGF5YmFjayBoYXMgY29tcGxldGVkIGlmIHRoZSBzeW50aGVzaXMgaXMgZG9uZSBvciBpZiBhIG1hcmtlciBoYXMgYmVlbiByZWFjaGVkLgogCi0gICAgaWYgKHN0YXR1cyA9PSBUVFNfU1lOVEhfRE9ORSkgeworICAgIGlmIChzdGF0dXMgPT0gQU5EUk9JRF9UVFNfU1lOVEhfRE9ORSkgewogICAgICAgICAvLyB0aGlzIHN0cnVjdCB3YXMgYWxsb2NhdGVkIGluIHRoZSBvcmlnaW5hbCBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrIGNhbGwsCiAgICAgICAgIC8vIGFsbCBwcm9jZXNzaW5nIG1hdGNoaW5nIHRoaXMgY2FsbCBpcyBub3cgZG9uZS4KICAgICAgICAgTE9HVigiU3BlZWNoIHN5bnRoZXNpcyBkb25lLiIpOwpAQCAtMzQyLDE2ICszNjIsMTYgQEAKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CiAgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgfQogCiAgICAgLy8gd2UgZG9uJ3QgdXBkYXRlIHRoZSB3YXYgKG91dHB1dCkgcGFyYW1ldGVyIGFzIHdlJ2xsIGxldCB0aGUgbmV4dCBjYWxsYmFjawogICAgIC8vIHdyaXRlIGF0IHRoZSBzYW1lIGxvY2F0aW9uLCB3ZSd2ZSBjb25zdW1lZCB0aGUgZGF0YSBhbHJlYWR5LCBidXQgd2UgbmVlZAogICAgIC8vIHRvIHVwZGF0ZSBidWZmZXJTaXplIHRvIGxldCB0aGUgVFRTIGVuZ2luZSBrbm93IGhvdyBtdWNoIGl0IGNhbiB3cml0ZSB0aGUKICAgICAvLyBuZXh0IHRpbWUgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbi4KLSAgICBidWZmZXJTaXplID0gcEpuaURhdGEtPm1CdWZmZXJTaXplOworICAgICpwQnVmZmVyU2l6ZSA9IHBKbmlEYXRhLT5tQnVmZmVyU2l6ZTsKIAotICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfQ09OVElOVUU7CisgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFOwogfQogCiAKQEAgLTM2MCw3ICszODAsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMb3dTaGVsZihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiBhcHBseUZpbHRlciwKICAgICAgICAgamZsb2F0IGZpbHRlckdhaW4sIGpmbG9hdCBhdHRlbnVhdGlvbkluRGIsIGpmbG9hdCBmcmVxSW5IeiwgamZsb2F0IHNsb3BlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfU1VDQ0VTUzsKIAogICAgIGJVc2VGaWx0ZXIgPSBhcHBseUZpbHRlcjsKICAgICBpZiAoYXBwbHlGaWx0ZXIpIHsKQEAgLTM3Myw3ICszOTMsNyBAQAogICAgICAgICAgICAgaW5pdGlhbGl6ZUVRKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNsb3BlLCBjYW4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4NSw3ICs0MDUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9uYXRpdmVfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKICAgICAgICAgam9iamVjdCB3ZWFrX3RoaXMsIGpzdHJpbmcgbmF0aXZlU29MaWIsIGpzdHJpbmcgZW5nQ29uZmlnKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGJVc2VGaWx0ZXIgPSBmYWxzZTsKIApAQCAtNDAyLDE4ICs0MjIsMjggQEAKICAgICBpZiAoZW5naW5lX2xpYl9oYW5kbGUgPT0gTlVMTCkgewogICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbmF0aXZlX3NldHVwKCk6IGVuZ2luZV9saWJfaGFuZGxlID09IE5VTEwiKTsKICAgICB9IGVsc2UgewotICAgICAgICBUdHNFbmdpbmUgKigqZ2V0X1R0c0VuZ2luZSkoKSA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFR0c0VuZ2luZSogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiZ2V0VHRzRW5naW5lIikpOworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqICgqZ2V0X1R0c0VuZ2luZSkoKSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJhbmRyb2lkX2dldFR0c0VuZ2luZSIpKTsKIAotICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gKCpnZXRfVHRzRW5naW5lKSgpOwotICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZUxpYkhhbmRsZSA9IGVuZ2luZV9saWJfaGFuZGxlOwotCi0gICAgICAgIGlmIChwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7Ci0gICAgICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5pbml0KHR0c1N5bnRoRG9uZUNCLCBlbmdDb25maWdTdHJpbmcpOworICAgICAgICAvLyBTdXBwb3J0IG9ic29sZXRlL2xlZ2FjeSBiaW5hcnkgbW9kdWxlcworICAgICAgICBpZiAoZ2V0X1R0c0VuZ2luZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBnZXRfVHRzRW5naW5lID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJnZXRUdHNFbmdpbmUiKSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmUgPSAoKmdldF9UdHNFbmdpbmUpKCk7CisgICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lTGliSGFuZGxlID0gZW5naW5lX2xpYl9oYW5kbGU7CisKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBKbmlTdG9yYWdlLT5tRW5naW5lOworICAgICAgICBpZiAoZW5naW5lKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CisgICAgICAgICAgICBlbmdpbmUtPmZ1bmNzLT5pbml0KAorICAgICAgICAgICAgICAgIGVuZ2luZSwKKyAgICAgICAgICAgICAgICBfX3R0c1N5bnRoRG9uZUNCLAorICAgICAgICAgICAgICAgIGVuZ0NvbmZpZ1N0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBBTkRST0lEX1RUU19TVUNDRVNTOwogICAgIH0KIAogICAgIC8vIHdlIHVzZSBhIHdlYWsgcmVmZXJlbmNlIHNvIHRoZSBTeW50aFByb3h5IG9iamVjdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCkBAIC00NjIsNyArNDkyLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00NzQsOCArNTA0LDEwIEBACiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+aXNMYW5ndWFnZUF2YWlsYWJsZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5pc0xhbmd1YWdlQXZhaWxhYmxlKGVuZ2luZSxsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC00ODcsNyArNTE5LDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0Q29uZmlnKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwganN0cmluZyBlbmdpbmVDb25maWcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldENvbmZpZygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00OTgsOSArNTMwLDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBjb25zdCBjaGFyICplbmdpbmVDb25maWdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGVuZ2luZUNvbmZpZywgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSxBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHLAogICAgICAgICAgICAgICAgIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZywgc3RybGVuKGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZykpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbmdpbmVDb25maWcsIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZyk7CkBAIC01MTIsNyArNTQ1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TGFuZ3VhZ2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTUyNSw5ICs1NTgsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0TGFuZ3VhZ2UobGFuZ05hdGl2ZVN0cmluZywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldExhbmd1YWdlKGVuZ2luZSwgbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNTQxLDcgKzU3NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X2xvYWRMYW5ndWFnZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbG9hZExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTU1Miw5ICs1ODYsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+bG9hZExhbmd1YWdlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5sb2FkTGFuZ3VhZ2UoZW5naW5lLCBsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC01NjksNyArNjA0LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgc3BlZWNoUmF0ZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01ODQsOSArNjE5LDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBMT0dJKCJzZXR0aW5nIHNwZWVjaCByYXRlIHRvICVkIiwgc3BlZWNoUmF0ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInJhdGUiLCBidWZmZXIsIGJ1ZlNpemUpOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLCAicmF0ZSIsIGJ1ZmZlciwgYnVmU2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTU5Nyw3ICs2MzMsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRQaXRjaChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgcGl0Y2gpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFBpdGNoKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTYxMiw5ICs2NDgsMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIExPR0koInNldHRpbmcgcGl0Y2ggdG8gJWQiLCBwaXRjaCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSwgInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNjI1LDcgKzY2Miw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqc3RyaW5nIGZpbGVuYW1lSmF2YVN0cmluZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC02MzMsNyArNjcwLDcgQEAKICAgICB9CiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKLSAgICBpZiAoIXBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmICghcFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogaW52YWxpZCBlbmdpbmUgaGFuZGxlIik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjQzLDEyICs2ODAsMjIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CiAKICAgICAvLyBSZXRyaWV2ZSBhdWRpbyBwYXJhbWV0ZXJzIGJlZm9yZSB3cml0aW5nIHRoZSBmaWxlIGhlYWRlcgotICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgZW5jb2RpbmcgPSBERUZBVUxUX1RUU19GT1JNQVQ7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCBlbmNvZGluZzsKICAgICB1aW50MzJfdCByYXRlID0gREVGQVVMVF9UVFNfUkFURTsKICAgICBpbnQgY2hhbm5lbHMgPSBERUZBVUxUX1RUU19OQl9DSEFOTkVMUzsKLSAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldEF1ZGlvRm9ybWF0KGVuY29kaW5nLCByYXRlLCBjaGFubmVscyk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9ERUZBVUxUOwogCi0gICAgaWYgKChlbmNvZGluZyAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgJiYgKGVuY29kaW5nICE9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpKSB7CisgICAgZW5naW5lLT5mdW5jcy0+c2V0QXVkaW9Gb3JtYXQoZW5naW5lLCAmZm9ybWF0LCAmcmF0ZSwgJmNoYW5uZWxzKTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBlbmdpbmUgdXNlcyBpbnZhbGlkIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTY3Nyw3ICs3MjQsOCBAQAogICAgIHVuc2lnbmVkIGludCB1bmlxdWVfaWRlbnRpZmllcjsKIAogICAgIG1lbXNldChwU3ludGhEYXRhLT5tQnVmZmVyLCAwLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSk7Ci0gICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorCisgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3ludGhlc2l6ZVRleHQoZW5naW5lLCB0ZXh0TmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKIAogICAgIGxvbmcgZmlsZWxlbiA9IGZ0ZWxsKHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7CkBAIC03MzcsNyArNzg1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqaW50IGphdmFTdHJlYW1UeXBlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhaygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03NTksMTAgKzgwNywxMiBAQAogICAgIHBGb3JBZnRlci0+dXNhZ2VNb2RlICA9IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZOwogICAgIHBGb3JBZnRlci0+c3RyZWFtVHlwZSA9IChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpIGphdmFTdHJlYW1UeXBlOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRleHROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHRleHRKYXZhU3RyaW5nLCAwKTsKICAgICAgICAgbWVtc2V0KHBTeW50aERhdGEtPm1CdWZmZXIsIDAsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplKTsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zeW50aGVzaXplVGV4dChlbmdpbmUsIHRleHROYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnModGV4dEphdmFTdHJpbmcsIHRleHROYXRpdmVTdHJpbmcpOwogICAgIH0KQEAgLTc3NCw3ICs4MjQsNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03OTAsOCArODQwLDkgQEAKICAgICB9CiAgICAgcFN5bnRoRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN0b3AoKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN0b3AoZW5naW5lKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODAxLDcgKzg1Miw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3BTeW5jKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC04MjksNyArODgwLDcgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIHNpemVfdCBidWZTaXplID0gMTAwOwogICAgICAgICBjaGFyIGxhbmdbYnVmU2l6ZV07CiAgICAgICAgIGNoYXIgY291bnRyeVtidWZTaXplXTsKQEAgLTgzOSw3ICs4OTAsOSBAQAogICAgICAgICBtZW1zZXQodmFyaWFudCwgMCwgYnVmU2l6ZSk7CiAgICAgICAgIGpvYmplY3RBcnJheSByZXRMb2NhbGUgPSAoam9iamVjdEFycmF5KWVudi0+TmV3T2JqZWN0QXJyYXkoMywKICAgICAgICAgICAgICAgICBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpLCBlbnYtPk5ld1N0cmluZ1VURigiIikpOwotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldExhbmd1YWdlKGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOworCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRMYW5ndWFnZShlbmdpbmUsIGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDAsIGVudi0+TmV3U3RyaW5nVVRGKGxhbmcpKTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAxLCBlbnYtPk5ld1N0cmluZ1VURihjb3VudHJ5KSk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMiwgZW52LT5OZXdTdHJpbmdVVEYodmFyaWFudCkpOwpAQCAtODY0LDggKzkxNyw5IEBACiAgICAgY2hhciBidWZbYnVmU2l6ZV07CiAgICAgbWVtc2V0KGJ1ZiwgMCwgYnVmU2l6ZSk7CiAgICAgLy8gVE9ETyBjaGVjayByZXR1cm4gY29kZXMKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+Z2V0UHJvcGVydHkoInJhdGUiLCBidWYsICZidWZTaXplKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmdldFByb3BlcnR5KGVuZ2luZSwicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOwogICAgIH0KICAgICByZXR1cm4gYXRvaShidWYpOwogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDI3NzA2ZWYuLjg2OTMyOTQgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTY2Nyw2ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlBhc3N3b3JkOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc6CkBAIC02ODcsOCArNjg4LDE3IEBACiAKICAgICBwcml2YXRlIHZvaWQgc2hvd1RpbWVvdXREaWFsb2coKSB7CiAgICAgICAgIGludCB0aW1lb3V0SW5TZWNvbmRzID0gKGludCkgTG9ja1BhdHRlcm5VdGlscy5GQUlMRURfQVRURU1QVF9USU1FT1VUX01TIC8gMTAwMDsKKyAgICAgICAgaW50IG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOzsKKyAgICAgICAgaWYoZ2V0VW5sb2NrTW9kZSgpID09IFVubG9ja01vZGUuUGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGlmKG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkgPT0KKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQykgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQ29udGV4dC5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgbWVzc2FnZUlkLAogICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldEZhaWxlZEF0dGVtcHRzKCksCiAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyk7CiAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQppbmRleCBhNWVmMWZhLi5iMzcwN2IwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQpAQCAtMjIwLDcgKzIyMCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtNTE4LDcgKzUxNyw3IEBACiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KCIiKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAotICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjU4LDcgKzY1Nyw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yKTsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtNjc2LDYgKzY3NCw1IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25QaG9uZVN0YXRlQ2hhbmdlZChTdHJpbmcgbmV3U3RhdGUpIHsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggMzlmMjkxNy4uNjBjZDU2YyAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQpAQCAtNTMsNiArNTMsOCBAQAogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKQEAgLTg3LDggKzg5LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGludCBxdWFsaXR5ID0gbG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQWxwaGEgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9PSBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgfHwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyA9PSBxdWFsaXR5OworICAgICAgICBtSXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCA9PSBxdWFsaXR5OwogCiAgICAgICAgIG1LZXlib2FyZFZpZXcgPSAoUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldykgZmluZFZpZXdCeUlkKFIuaWQua2V5Ym9hcmQpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeSA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRFbnRyeSk7CkBAIC05OSw3ICsxMDIsNyBAQAogICAgICAgICBtVGl0bGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVudGVyX3Bhc3N3b3JkX2xhYmVsKTsKIAogICAgICAgICBtS2V5Ym9hcmRIZWxwZXIgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKGNvbnRleHQsIG1LZXlib2FyZFZpZXcsIHRoaXMpOwotICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKGlzQWxwaGEgPyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKG1Jc0FscGhhID8gUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfQUxQSEEKICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOwogCiAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KQEAgLTEwOCwxMCArMTExLDExIEBACiAKICAgICAgICAgLy8gVGhpcyBhbGxvd3Mga2V5Ym9hcmRzIHdpdGggb3ZlcmxhcHBpbmcgcXdlcnR5L251bWVyaWMga2V5cyB0byBjaG9vc2UganVzdCB0aGUKICAgICAgICAgLy8gbnVtZXJpYyBrZXlzLgotICAgICAgICBpZiAoaXNBbHBoYSkgeworICAgICAgICBpZiAobUlzQWxwaGEpIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKFRleHRLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKERpZ2l0c0tleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KQEAgLTEzOCw2ICsxNDIsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICAvLyBzdGFydCBmcmVzaAogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRUZXh0KCIiKTsKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnJlcXVlc3RGb2N1cygpOwogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogCkBAIC0xNzQsNiArMTc5LDkgQEAKICAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gbUxvY2tQYXR0ZXJuVXRpbHMuc2V0TG9ja291dEF0dGVtcHREZWFkbGluZSgpOwogICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmcpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTk3LDggKzIwNSw4IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKCkgewogICAgICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSk7CiAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICAgICAgfQogICAgICAgICB9LnN0YXJ0KCk7CiAgICAgfQpAQCAtMjY0LDQgKzI3MiwxMiBAQAogCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggYjkyMzJjOC4uOGE2NDI4YiAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMjQsMTEgKzI0LDE1IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5TdGFuZGFsb25lQWN0aW9uTW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CkBAIC01Myw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTY2LDYgKzcxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC05NSw3ICsxMDEsNyBAQAogICAgICAqIFNpbXBsZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1lbnUgYW5kIGl0cyBzdWJtZW51cy4gVGhlIG9wdGlvbnMKICAgICAgKiBtZW51IHN1Ym1lbnVzIGRvIG5vdCB1c2UgdGhpcyAodGhlaXIgYmVoYXZpb3IgaXMgbW9yZSBjb21wbGV4KS4KICAgICAgKi8KLSAgICBDb250ZXh0TWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IENvbnRleHRNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOworICAgIERpYWxvZ01lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBEaWFsb2dNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIHZpZXcgb2YgdGhlIHdpbmRvdywgY29udGFpbmluZyB0aGUgd2luZG93IGRlY29yLgogICAgIHByaXZhdGUgRGVjb3JWaWV3IG1EZWNvcjsKQEAgLTExNCw2ICsxMjAsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTE5MSw5ICsxOTksNiBAQAogICAgICAgICAgICAgLyogQ3VzdG9tIHRpdGxlIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGVuYWJsZSBhbm90aGVyIGZlYXR1cmUgKi8KICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbigiWW91IGNhbm5vdCBjb21iaW5lIGN1c3RvbSB0aXRsZXMgd2l0aCBvdGhlciB0aXRsZSBmZWF0dXJlcyIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUEVOR0wpIHsKLSAgICAgICAgICAgIGdldEF0dHJpYnV0ZXMoKS5tZW1vcnlUeXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0RmVhdHVyZShmZWF0dXJlSWQpOwogICAgIH0KIApAQCAtMjc2LDYgKzI4MSw4IEBACiAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CiAgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0gZWxzZSBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFdpbmRvd1RpdGxlKHRpdGxlKTsKICAgICAgICAgfQogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICB9CkBAIC0zMDEsNyArMzA4LDcgQEAKICAgICAgICAgLy8gQWxyZWFkeSBwcmVwYXJlZCAoaXNQcmVwYXJlZCB3aWxsIGJlIHJlc2V0IHRvIGZhbHNlIGxhdGVyKQogICAgICAgICBpZiAoc3QuaXNQcmVwYXJlZCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCisgICAgICAgIAogICAgICAgICBpZiAoKG1QcmVwYXJlZFBhbmVsICE9IG51bGwpICYmIChtUHJlcGFyZWRQYW5lbCAhPSBzdCkpIHsKICAgICAgICAgICAgIC8vIEFub3RoZXIgUGFuZWwgaXMgcHJlcGFyZWQgYW5kIHBvc3NpYmx5IG9wZW4sIHNvIGNsb3NlIGl0CiAgICAgICAgICAgICBjbG9zZVBhbmVsKG1QcmVwYXJlZFBhbmVsLCBmYWxzZSk7CkBAIC0zMTUsOSArMzIyLDExIEBACiAKICAgICAgICAgaWYgKHN0LmNyZWF0ZWRQYW5lbFZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gSW5pdCB0aGUgcGFuZWwgc3RhdGUncyBtZW51LS1yZXR1cm4gZmFsc2UgaWYgaW5pdCBmYWlsZWQKLSAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVQYW5lbE1lbnUoc3QpIHx8IChzdC5tZW51ID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwgfHwgc3QucmVmcmVzaE1lbnVDb250ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVQYW5lbE1lbnUoc3QpIHx8IChzdC5tZW51ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gQ2FsbCBjYWxsYmFjaywgYW5kIHJldHVybiBpZiBpdCBkb2Vzbid0IHdhbnQgdG8gZGlzcGxheSBtZW51CiAgICAgICAgICAgICAgICAgaWYgKChjYiA9PSBudWxsKSB8fCAhY2Iub25DcmVhdGVQYW5lbE1lbnUoc3QuZmVhdHVyZUlkLCBzdC5tZW51KSkgewpAQCAtMzI2LDYgKzMzNSwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3QucmVmcmVzaE1lbnVDb250ZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0TWVudShzdC5tZW51KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENhbGxiYWNrIGFuZCByZXR1cm4gaWYgdGhlIGNhbGxiYWNrIGRvZXMgbm90IHdhbnQgdG8gc2hvdyB0aGUgbWVudQpAQCAtMzc0LDExICszODksOSBAQAogICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhck1lbnVWaWV3cyhQYW5lbEZlYXR1cmVTdGF0ZSBzdCkgewotCiAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBjb25maWcgY2hhbmdlcywgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZQogICAgICAgICAvLyB0aGUgdmlld3Mgd2lsbCBiZSByZWNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSBuZXcgb3JpZW50YXRpb24sIGV0Yy4KIApAQCAtMzkzLDcgKzQwNiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgb3BlblBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb3BlblBhbmVsKFBhbmVsRmVhdHVyZVN0YXRlIHN0LCBLZXlFdmVudCBldmVudCkgewpAQCAtNDg0LDcgKzUwMiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2VQYW5lbChpbnQgZmVhdHVyZUlkKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CiAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZVBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgdHJ1ZSk7CkBAIC01NDUsNiArNTY2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTc3Nyw4ICs4MTgsMjAgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIHdpbGwgZ2l2ZSB1cyBhIHZhbGlkIHdpbmRvdyB0b2tlbgotICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICBmaW5hbCBNZW51IHBhcmVudE1lbnUgPSBzdWJNZW51LmdldFJvb3RNZW51KCk7CisgICAgICAgIGZpbmFsIFBhbmVsRmVhdHVyZVN0YXRlIHBhbmVsID0gZmluZE1lbnVQYW5lbChwYXJlbnRNZW51KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVc2UgdGhlIHBhbmVsIG9wZW4gc3RhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiBvcGVuIHBhbmVsCisgICAgICAgICAqIG9yIGFuIGFjdGlvbiBidXR0b24uIElmIGl0J3MgYW4gb3BlbiBwYW5lbCB3ZSB3YW50IHRvIHVzZSBNZW51RGlhbG9nSGVscGVyLgorICAgICAgICAgKiBJZiBpdCdzIGNsb3NlZCB3ZSB3YW50IHRvIGdyYWIgdGhlIHJlbGV2YW50IHZpZXcgYW5kIGNyZWF0ZSBhIHBvcHVwIGFuY2hvcmVkIHRvIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhbmVsLmlzT3BlbikgeworICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIHdpbGwgZ2l2ZSB1cyBhIHZhbGlkIHdpbmRvdyB0b2tlbgorICAgICAgICAgICAgbmV3IE1lbnVEaWFsb2dIZWxwZXIoc3ViTWVudSkuc2hvdyhudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBzdWJNZW51KS5zaG93KCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMzM0LDggKzEzODcsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FTlU6IHsKLSAgICAgICAgICAgICAgICBvbktleVVwUGFuZWwoZmVhdHVyZUlkIDwgMCA/IEZFQVRVUkVfT1BUSU9OU19QQU5FTCA6IGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsICYmIG1BY3Rpb25CYXIuaXNPdmVyZmxvd1Jlc2VydmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb25LZXlVcFBhbmVsKGZlYXR1cmVJZCA8IDAgPyBGRUFUVVJFX09QVElPTlNfUEFORUwgOiBmZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTU5Miw2ICsxNjQ5LDkgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1XYXRjaGluZ0Zvck1lbnU7CiAgICAgICAgIHByaXZhdGUgaW50IG1Eb3duWTsKIAorICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUFjdGlvbk1vZGVWaWV3OworCiAgICAgICAgIHB1YmxpYyBEZWNvclZpZXcoQ29udGV4dCBjb250ZXh0LCBpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CkBAIC0xODc5LDYgKzE5MzksNTMgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dE1lbnVIZWxwZXIgIT0gbnVsbDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywKKyAgICAgICAgICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyBvcmlnaW5hbFZpZXcgY2FuIGJlIHVzZWQgaGVyZSB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgb2JzY3VyZQorICAgICAgICAgICAgLy8gcmVsZXZhbnQgY29udGVudCB3aXRoIHRoZSBjb250ZXh0IG1vZGUgVUkuCisgICAgICAgICAgICByZXR1cm4gc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gZ2V0Q2FsbGJhY2soKS5vblN0YXJ0QWN0aW9uTW9kZShjYWxsYmFjayk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3ID0gbmV3IEFjdGlvbkJhckNvbnRleHRWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRDSF9QQVJFTlQsIFdSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRWaWV3KG1BY3Rpb25Nb2RlVmlldywgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdTdHViIHN0dWIgPSAoVmlld1N0dWIpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fbW9kZV9iYXJfc3R1Yik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIHN0dWIuaW5mbGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBuZXcgU3RhbmRhbG9uZUFjdGlvbk1vZGUoZ2V0Q29udGV4dCgpLCBtQWN0aW9uTW9kZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoY2FsbGJhY2spKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LmluaXRGb3JNb2RlKG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTW9kZTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q2hhbmdpbmcoKSB7CiAgICAgICAgICAgICBtQ2hhbmdpbmcgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMDU4LDYgKzIxNjUsMzUgQEAKICAgICAgICAgICAgIGlmIChrZWVwT24pIFBob25lV2luZG93LnRoaXMuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgICAgICBlbHNlIFBob25lV2luZG93LnRoaXMuY2xlYXJGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgb3V0IGludGVybmFsIHJlZmVyZW5jZSB3aGVuIHRoZSBhY3Rpb24gbW9kZSBpcyBkZXN0cm95ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtV3JhcHBlZDsKKworICAgICAgICAgICAgcHVibGljIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoQWN0aW9uTW9kZS5DYWxsYmFjayB3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uUHJlcGFyZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQWN0aW9uSXRlbUNsaWNrZWQobW9kZSwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQub25EZXN0cm95QWN0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgRGVjb3JWaWV3IGdlbmVyYXRlRGVjb3IoKSB7CkBAIC0yMTA2LDYgKzIyNDIsMTMgQEAKIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb1RpdGxlLCBmYWxzZSkpIHsKICAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGFuIGFjdGlvbiBiYXIgaWYgdGhlcmUgaXMgbm8gdGl0bGUuCisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uTW9kZU92ZXJsYXksIGZhbHNlKSkgeworICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0Z1bGxzY3JlZW4sIGZhbHNlKSkgewpAQCAtMjE4OSw2ICsyMzMyLDggQEAKICAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgZmxvYXRpbmcsIHdlIG5lZWQgYSBkaWFsb2cgbGF5b3V0CiAgICAgICAgICAgICBpZiAobUlzRmxvYXRpbmcpIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmRpYWxvZ190aXRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlOwogICAgICAgICAgICAgfQpAQCAtMjI3Myw2ICsyNDE4LDIwIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyID0gKEFjdGlvbkJhclZpZXcpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIuZ2V0VGl0bGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFdpbmRvd1RpdGxlKG1UaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCB0aGUgcGFuZWwgaW52YWxpZGF0ZSBmb3IgbGF0ZXI7IGF2b2lkIGFwcGxpY2F0aW9uIG9uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2Ygb25DcmVhdGUgb3Igc2ltaWxhci4KKyAgICAgICAgICAgICAgICAgICAgbURlY29yLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYW5lbE1lbnUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjYyNiw2ICsyNzg1LDggQEAKIAogICAgICAgICBib29sZWFuIHJlZnJlc2hEZWNvclZpZXc7CiAKKyAgICAgICAgYm9vbGVhbiByZWZyZXNoTWVudUNvbnRlbnQ7CisgICAgICAgIAogICAgICAgICBib29sZWFuIHdhc0xhc3RPcGVuOwogICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0RXhwYW5kZWQ7CkBAIC0yNzQ4LDExICsyOTA5LDExIEBACiAgICAgICogPGxpPiBDYWxscyBiYWNrIHRvIHRoZSBjYWxsYmFjaydzIG9uTWVudUl0ZW1TZWxlY3RlZCB3aGVuIGFuIGl0ZW0gaXMKICAgICAgKiBzZWxlY3RlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRleHRNZW51Q2FsbGJhY2sgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBEaWFsb2dNZW51Q2FsbGJhY2sgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CiAgICAgICAgIHByaXZhdGUgaW50IG1GZWF0dXJlSWQ7CiAgICAgICAgIHByaXZhdGUgTWVudURpYWxvZ0hlbHBlciBtU3ViTWVudUhlbHBlcjsKIAotICAgICAgICBwdWJsaWMgQ29udGV4dE1lbnVDYWxsYmFjayhpbnQgZmVhdHVyZUlkKSB7CisgICAgICAgIHB1YmxpYyBEaWFsb2dNZW51Q2FsbGJhY2soaW50IGZlYXR1cmVJZCkgewogICAgICAgICAgICAgbUZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQppbmRleCA4M2Q5YzQ3Li5jYjdmZTA2IDEwMDc1NQotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTE5Miw2ICsxOTIsNyBAQAogICAgIAogICAgIGJvb2xlYW4gbVNhZmVNb2RlOwogICAgIFdpbmRvd1N0YXRlIG1TdGF0dXNCYXIgPSBudWxsOworICAgIGJvb2xlYW4gbVN0YXR1c0JhckNhbkhpZGU7CiAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiBtU3RhdHVzQmFyUGFuZWxzID0gbmV3IEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4oKTsKICAgICBXaW5kb3dTdGF0ZSBtS2V5Z3VhcmQgPSBudWxsOwogICAgIEtleWd1YXJkVmlld01lZGlhdG9yIG1LZXlndWFyZE1lZGlhdG9yOwpAQCAtNTQ2LDYgKzU0Nyw5IEBACiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVEaXNhYmxlZFZpYmVQYXR0ZXJuKTsKICAgICAgICAgbVNhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuID0gZ2V0TG9uZ0ludEFycmF5KG1Db250ZXh0LmdldFJlc291cmNlcygpLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3NhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuKTsKKworICAgICAgICAvLyBOb3RlOiB0aGUgQ29uZmlndXJhdGlvbiBpcyBub3Qgc3RhYmxlIGhlcmUsIHNvIHdlIGNhbm5vdCBsb2FkIG1TdGF0dXNCYXJDYW5IaWRlIGZyb20KKyAgICAgICAgLy8gY29uZmlnX3N0YXR1c0JhckNhbkhpZGUgYmVjYXVzZSB0aGUgbGF0dGVyIGRlcGVuZHMgb24gdGhlIHNjcmVlbiBzaXplCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7CkBAIC05NTQsNiArOTU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5BRERfTVVMVElQTEVfU0lOR0xFVE9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyID0gd2luOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdGFibGUgYnkgbm93LCBzbyB3ZSBjYW4gbG9hZCB0aGlzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlKTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUWVBFX1NUQVRVU19CQVJfUEFORUw6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTIxMiw3ICsxMjIxLDcgQEAKICAgICBwdWJsaWMgdm9pZCBnZXRDb250ZW50SW5zZXRIaW50THcoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFJlY3QgY29udGVudEluc2V0KSB7CiAgICAgICAgIGZpbmFsIGludCBmbCA9IGF0dHJzLmZsYWdzOwogICAgICAgICAKLSAgICAgICAgaWYgKChmbCAmCisgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgY29udGVudEluc2V0LnNldChtQ3VyTGVmdCwgbUN1clRvcCwgbVcgLSBtQ3VyUmlnaHQsIG1IIC0gbUN1ckJvdHRvbSk7CkBAIC0xMjQ1LDEwICsxMjU0LDE3IEBACiAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5pc1Zpc2libGVMdygpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBiYXIgaXMgaGlkZGVuLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBiZWhpbmQgaXQgdG8gc2Nyb2xsLgotICAgICAgICAgICAgICAgIG1Eb2NrVG9wID0gbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCkuYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrQm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbURvY2tCb3R0b20gKyAiIG1Db250ZW50Qm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRCb3R0b20gKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpOworICAgICAgICAgICAgICAgIGlmIChtRG9ja1RvcCA9PSByLnRvcCkgbURvY2tUb3AgPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtRG9ja0JvdHRvbSA9PSByLmJvdHRvbSkgbURvY2tCb3R0b20gPSByLnRvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudEJvdHRvbSA9IG1DdXJCb3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja1RvcD0iICsgbURvY2tUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudFRvcD0iICsgbUNvbnRlbnRUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyVG9wPSIgKyBtQ3VyVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbURvY2tCb3R0b209IiArIG1Eb2NrQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRCb3R0b209IiArIG1Db250ZW50Qm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzMzLDcgKzEzNDksNyBAQAogICAgICAgICAgICAgYXR0cnMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwogICAgICAgICAgICAgbURvY2tMYXllciA9IHdpbi5nZXRTdXJmYWNlTGF5ZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoZmwgJgorICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5vcm1hbCBhY3Rpdml0eSB3aW5kb3c6IHdlIHdhbnQgaXQKQEAgLTEzNjUsNyArMTM4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwogICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEEgd2luZG93IHRoYXQgaGFzIHJlcXVlc3RlZCB0byBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIGp1c3QKICAgICAgICAgICAgICAgICAvLyBnZXRzIGV2ZXJ5dGhpbmcsIHBlcmlvZC4KICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gZGYubGVmdCA9IGNmLmxlZnQgPSAwOwpAQCAtMTUwOSw5ICsxNTI1LDEzIEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlU3RhdHVzQmFyID0KICAgICAgICAgICAgICAgICAgICAgKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOwogICAgICAgICAgICAgICAgIGlmIChoaWRlU3RhdHVzQmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwotICAgICAgICAgICAgICAgICAgICBoaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5oaWRlTHcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxMT0dWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJQcmV2ZW50aW5nIHN0YXR1cyBiYXIgZnJvbSBoaWRpbmcgYnkgcG9saWN5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuc2hvd0x3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CmRpZmYgLS1naXQgYS9wcmVsb2FkZWQtY2xhc3NlcyBiL3ByZWxvYWRlZC1jbGFzc2VzCmluZGV4IDFkNWZiYzA4Li4zM2RiYTM3IDEwMDY0NAotLS0gYS9wcmVsb2FkZWQtY2xhc3NlcworKysgYi9wcmVsb2FkZWQtY2xhc3NlcwpAQCAtNTYzLDggKzU2Myw2IEBACiBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwogYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldwotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcgotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25MaXN0VmlldwogYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94CkBAIC01ODIsNiArNTgwLDcgQEAKIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZQogYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0CithbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3cKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5MaXN0VmlldyRTYXZlZFN0YXRlCiBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIKQEAgLTY4NSw3ICs2ODQsNiBAQAogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Db250YWN0SGVhZGVyV2lkZ2V0CiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlhbG9nVGl0bGUKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5FZGl0YWJsZUlucHV0Q29ubmVjdGlvbgogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQKQEAgLTcyNyw3ICs3MjUsNiBAQAogamF2YS5pby5GaWxlCiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yCiBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbQotamF2YS5pby5GaWxlSW5wdXRTdHJlYW0kUmVwb3NpdGlvbmluZ0xvY2sKIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCiBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0KIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0KQEAgLTExMzEsNyArMTEyOCw2IEBACiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLkZpbGVDaGFubmVsRmFjdG9yeQogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5EaXJlY3RCdWZmZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCRSZXBvc2l0aW9uaW5nTG9jawogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlTG9ja0ltcGwKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIkMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCmluZGV4IDFkODdjMGQuLjQ2MTRjOGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKQEAgLTEwMDIsOCArMTAwMiw4IEBACiAjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKICAgICBUaHJlYWQoZmFsc2UpLAogI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLSAgICBtUGhvbmVTdGF0ZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpLCBtUmluZ2VyTW9kZSgwKSwgbU11c2ljU3RvcFRpbWUoMCksCi0gICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKQorICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLAorICAgIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKQogewogICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOwogCkBAIC0xODI5LDI5ICsxODI5LDM4IEBACiAgICAgfQogCiAgICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7Ci0gICAgLy8gZG8gbm90IHNldCB2b2x1bWUgaWYgdGhlIGZsb2F0IHZhbHVlIGRpZCBub3QgY2hhbmdlCi0gICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwgZm9yY2UpIHsKKyAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKKyAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAorICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0CisgICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKKyAgICAgICAgICAgIGZvcmNlKSB7CiAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKICAgICAgICAgTE9HVigic2V0U3RyZWFtVm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpEVE1GIHx8CiAgICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lID0gLTEuMDsKICAgICAgICAgICAgIC8vIG9mZnNldCB2YWx1ZSB0byByZWZsZWN0IGFjdHVhbCBoYXJkd2FyZSB2b2x1bWUgdGhhdCBuZXZlciByZWFjaGVzIDAKICAgICAgICAgICAgIC8vIDElIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gZmlyc3Qgc3RlcCBpbiBWT0lDRV9DQUxMIHN0cmVhbSB2b2x1bWUgc2V0dGluZyAoc2VlIEF1ZGlvU2VydmljZS5qYXZhKQogICAgICAgICAgICAgdm9sdW1lID0gMC4wMSArIDAuOTkgKiB2b2x1bWU7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2ljZVZvbHVtZSA+PSAwICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKICAgICB9CiAKKyAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOworICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggM2VkNmMxMi4uMzA1OTczMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKQEAgLTQyNSw2ICs0MjUsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIGlmIChhcHBXaWRnZXRJZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhcHBXaWRnZXRJZHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IGFwcFdpZGdldElkcy5sZW5ndGg7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtQXBwV2lkZ2V0SWRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXBwV2lkZ2V0SWQgaWQgPSBsb29rdXBBcHBXaWRnZXRJZExvY2tlZChhcHBXaWRnZXRJZHNbaV0pOworICAgICAgICAgICAgICAgIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgdmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFwcFdpZGdldFByb3ZpZGVyKENvbXBvbmVudE5hbWUgcHJvdmlkZXIsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUFwcFdpZGdldElkcykgewogICAgICAgICAgICAgUHJvdmlkZXIgcCA9IGxvb2t1cFByb3ZpZGVyTG9ja2VkKHByb3ZpZGVyKTsKQEAgLTQ2Miw2ICs0NzksMjcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIC8vIGFsbG93IGZvciBzdGFsZSBhcHBXaWRnZXRJZHMgYW5kIG90aGVyIGJhZG5lc3MKKyAgICAgICAgLy8gbG9va3VwIGFsc28gY2hlY2tzIHRoYXQgdGhlIGNhbGxpbmcgcHJvY2VzcyBjYW4gYWNjZXNzIHRoZSBhcHBXaWRnZXRJZAorICAgICAgICAvLyBkcm9wIHVuYm91bmQgYXBwV2lkZ2V0SWRzIChzaG91bGRuJ3QgYmUgcG9zc2libGUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMpCisgICAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkLnByb3ZpZGVyICE9IG51bGwgJiYgIWlkLnByb3ZpZGVyLnpvbWJpZSAmJiAhaWQuaG9zdC56b21iaWUpIHsKKyAgICAgICAgICAgIGlkLnZpZXdzID0gdmlld3M7CisKKyAgICAgICAgICAgIC8vIGlzIGFueW9uZSBsaXN0ZW5pbmc/CisgICAgICAgICAgICBpZiAoaWQuaG9zdC5jYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NrIGlzIGhlbGQsIGJ1dCB0aGlzIGlzIGEgb25ld2F5IGNhbGwKKyAgICAgICAgICAgICAgICAgICAgaWQuaG9zdC5jYWxsYmFja3Mudmlld0RhdGFDaGFuZ2VkKGlkLmFwcFdpZGdldElkLCB2aWV3cywgdmlld0lkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQ7IHJlbW92ZSB0aGUgY2FsbGJhY2suIE5vIG5lZWQgdG8gcHJ1bmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgdGhpcyBob3N0IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgaWQuaG9zdC5jYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBpbnRbXSBzdGFydExpc3RlbmluZyhJQXBwV2lkZ2V0SG9zdCBjYWxsYmFja3MsIFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGhvc3RJZCwKICAgICAgICAgICAgIExpc3Q8UmVtb3RlVmlld3M+IHVwZGF0ZWRWaWV3cykgewogICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IGVuZm9yY2VDYWxsaW5nVWlkKHBhY2thZ2VOYW1lKTsKQEAgLTc0MSw2ICs3NzksOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5mby5sYWJlbCA9IGFjdGl2aXR5SW5mby5sb2FkTGFiZWwobVBhY2thZ2VNYW5hZ2VyKS50b1N0cmluZygpOwogICAgICAgICAgICAgaW5mby5pY29uID0gcmkuZ2V0SWNvblJlc291cmNlKCk7CisgICAgICAgICAgICBpbmZvLnByZXZpZXdJbWFnZSA9IHNhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAJCWNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFwcFdpZGdldFByb3ZpZGVySW5mb19wcmV2aWV3SW1hZ2UsIDApOworCiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBPayB0byBjYXRjaCBFeGNlcHRpb24gaGVyZSwgYmVjYXVzZSBhbnl0aGluZyBnb2luZyB3cm9uZyBiZWNhdXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKaW5kZXggYWE4Y2RlZC4uNGU0ZmMwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQpAQCAtMTYsNDIgKzE2LDc3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIENsaXBwZWREYXRhIG1QcmltYXJ5Q2xpcDsKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4gbVByaW1hcnlDbGlwTGlzdGVuZXJzCisgICAgICAgICAgICA9IG5ldyBSZW1vdGVDYWxsYmFja0xpc3Q8SU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIGNsaXBib2FyZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwcGVkRGF0YSBjbGlwKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gaXRlbXMiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcCA9IGNsaXA7CisgICAgICAgICAgICBmaW5hbCBpbnQgbiA9IG1QcmltYXJ5Q2xpcExpc3RlbmVycy5iZWdpbkJyb2FkY2FzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZ2V0QnJvYWRjYXN0SXRlbShpKS5kaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFJlbW90ZUNhbGxiYWNrTGlzdCB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVhZCBvYmplY3QgZm9yIHVzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy5maW5pc2hCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKLSAgICAgICAgICAgIG1DbGlwYm9hcmQgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpIHsKKyAgICBwdWJsaWMgQ2xpcHBlZERhdGEgZ2V0UHJpbWFyeUNsaXAoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJpbWFyeUNsaXAgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbVByaW1hcnlDbGlwTGlzdGVuZXJzLnJlZ2lzdGVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbVByaW1hcnlDbGlwTGlzdGVuZXJzLnVucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpcGJvYXJkVGV4dCgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsaXBib2FyZC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICBpZiAobVByaW1hcnlDbGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1QcmltYXJ5Q2xpcC5nZXRJdGVtKDApLmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCmluZGV4IDgxYjhkNDAuLmFlNGUxNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTI2LDEzICsyNiwxNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNDYsOCArNDksMTMgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5LlRldGhlcmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTY0LDcgKzcyLDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODEsNiArODgsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTA0LDYgKzExMywxMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUluaXRpYWxCcm9hZGNhc3Q7CiAKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtTmV0VHJhbnNpdGlvbldha2VMb2NrOworICAgIHByaXZhdGUgU3RyaW5nIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9ICIiOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQ7CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrQXR0cmlidXRlcyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDbGFzcyBmb3IgaG9sZGluZyBzZXR0aW5ncyByZWFkIGZyb20gcmVzb3VyY2VzLgpAQCAtMTk0LDYgKzIwOCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwogICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKQEAgLTI5NCwxMiArMzE0LDE1IEBACiAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJOgogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBXaWZpIFNlcnZpY2UuIik7CiAgICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlciB3c3QgPSBuZXcgV2lmaVN0YXRlVHJhY2tlcihjb250ZXh0LCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgV2lmaVNlcnZpY2Ugd2lmaVNlcnZpY2UgPSBuZXcgV2lmaVNlcnZpY2UoY29udGV4dCwgd3N0KTsKKyAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFLCB3aWZpU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgd2lmaVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICAgICAgd2lmaVNlcnZpY2UuY2hlY2tBbmRTdGFydFdpZmkoKTsKICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkldID0gd3N0OwogICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoKTsKIAorICAgICAgICAgICAgICAgIC8vVE9ETzogYXMgcGFydCBvZiBXV1MgcmVmYWN0b3IsIGNyZWF0ZSBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShjb250ZXh0KTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOgogICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyLApAQCAtNTgyLDcgKzYwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAhbmV0d29yay5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5pLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBwaWQtc3BlY2lmaWMgZG5zCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKG5ldHdvcmtUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJzcGVjaWFsIG5ldHdvcmsgYWxyZWFkeSBhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fQUxSRUFEWV9BQ1RJVkU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU5NywxNSArNjIwLDcgQEAKICAgICAgICAgICAgICAgICBuZXR3b3JrLnJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZVVzZXJzLmFkZChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLLAotICAgICAgICAgICAgICAgICAgICAgICAgZiksIGdldFJlc3RvcmVEZWZhdWx0TmV0d29ya0RlbGF5KCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmsuc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKGZlYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwpAQCAtNzI0LDggKzczOSw3IEBACiAgICAgICAgICAgICB0cmFja2VyLnRlYXJkb3duKCk7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRvIGl0IHRoZSBvbGQgZmFzaGlvbmVkIHdheQotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIuc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwgcGlkLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MzYsNiArNzUwLDcgQEAKICAgICAgKiBzcGVjaWZpZWQgaG9zdCBpcyB0byBiZSByb3V0ZWQKICAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzCiAgICAgICogZGVzaXJlZAorICAgICAqIHRvZG8gLSBkZXByZWNhdGUgKG9ubHkgdjQhKQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgbmV0d29ya1R5cGUsIGludCBob3N0QWRkcmVzcykgewpAQCAtNzUyLDcgKzc2NywzOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFja2VyLnJlcXVlc3RSb3V0ZVRvSG9zdChob3N0QWRkcmVzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKE5ldHdvcmtVdGlscy52NEludFRvQXJyYXkoaG9zdEFkZHJlc3MpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRIb3N0Um91dGUodHJhY2tlciwgYWRkcik7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHt9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogaG9zdCB2aWEgdGhlIG1vYmlsZSBkYXRhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAorICAgICAqIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAgICAgKiBUT0RPIC0gZGVwcmVjYXRlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFkZEhvc3RSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50LCBJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgeworICAgICAgICBpZiAobnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlKCkgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIHAgPSBudC5nZXROZXR3b3JrUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlJlcXVlc3RlZCBob3N0IHJvdXRlIHRvICIgKyBob3N0QWRkcmVzcyArICIoIiArIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGhvc3RBZGRyZXNzKSA9PSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKERCRykgU2xvZy5lKFRBRywgImFkZEhvc3RSb3V0ZSBmYWlsZWQgZHVlIHRvIG51bGwgaW50ZXJmYWNlIG5hbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtODU5LDYgKzkwNiwxMiBAQAogICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogSGFuZGxlIGEge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZXZlbnQuIElmIHRoaXMgcGVydGFpbnMgdG8gdGhlIG5vbi1hY3RpdmUKICAgICAgKiBuZXR3b3JrLCB3ZSBpZ25vcmUgaXQuIElmIGl0IGlzIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIHdlIHNlbmQgb3V0IGEKQEAgLTkxNCw3ICs5NjcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGRvIHRoaXMgYmVmb3JlIHdlIGJyb2FkY2FzdCB0aGUgY2hhbmdlCi0gICAgICAgIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZSgpOworICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UocHJldk5ldFR5cGUpOwogCiAgICAgICAgIHNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKICAgICAgICAgLyoKQEAgLTEwNzAsOSArMTEyMyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBkbyB0aGlzIGJlZm9yZSB3ZSBicm9hZGNhc3QgdGhlIGNoYW5nZQotICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UoKTsKLQogICAgICAgICBzZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoZSBmYWlsb3ZlciBuZXR3b3JrIGlzIGFscmVhZHkgY29ubmVjdGVkLCB0aGVuIGltbWVkaWF0ZWx5IHNlbmQKQEAgLTExMzQsMjkgKzExODQsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJOZXR3b3JrIGRlY2xpbmVkIHRlYXJkb3duIHJlcXVlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWlsb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOZXQucmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvbm5lY3Rpdml0eVNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBuZXcgZGVmYXVsdCBuZXR3b3JrLCByZWxlYXNlIHRoZSB0cmFuc2l0aW9uIHdha2Vsb2NrIGluIGEgc2Vjb25kCisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBoZWxkLiAgVGhlIHNlY29uZCBwYXVzZSBpcyB0byBhbGxvdyBhcHBzIHRvIHJlY29ubmVjdCBvdmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyBuZXR3b3JrCisgICAgICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQWN0aXZlRGVmYXVsdE5ldHdvcmsgPSB0eXBlOwogICAgICAgICB9CiAgICAgICAgIHRoaXNOZXQuc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwotICAgICAgICB0aGlzTmV0LnVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpOwotICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UoKTsKKyAgICAgICAgdXBkYXRlTmV0d29ya1NldHRpbmdzKHRoaXNOZXQpOworICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UodHlwZSk7CiAgICAgICAgIHNlbmRDb25uZWN0ZWRCcm9hZGNhc3QoaW5mbyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNjYW5SZXN1bHRzQXZhaWxhYmxlKE5ldHdvcmtJbmZvIGluZm8pIHsKLSAgICAgICAgaW50IG5ldHdvcmtUeXBlID0gaW5mby5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChuZXR3b3JrVHlwZSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgewotICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkdvdCBTY2FuUmVzdWx0c0F2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0VHlwZU5hbWUoKSArICIgbmV0d29yay4gRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXS5pbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UoYm9vbGVhbiB2aXNpYmxlLCBpbnQgaWQsCiAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtQ29udGV4dApAQCAtMTE3MCw0MiArMTIxOCwxNzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZnRlciBhbnkga2luZCBvZiBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhbnkgbmV0d29yaywKLSAgICAgKiBtYWtlIHN1cmUgdGhhdCBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZgotICAgICAqIG1vcmUgdGhhbiBvbmUgbmV0d29yayBpcyBzZXQgdXAgY29ycmVjdGx5LiBXZSdyZSBtYWlubHkgY29uY2VybmVkCi0gICAgICogd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldCB1cCAgYWNjb3JkaW5nCi0gICAgICogdG8gd2hpY2ggbmV0d29ya3MgYXJlIGNvbm5lY3RlZCwgYW5kIGVuc3VyaW5nIHRoYXQgdGhlIHJpZ2h0IHJvdXRpbmcKLSAgICAgKiB0YWJsZSBlbnRyaWVzIGV4aXN0LgorICAgICAqIEFmdGVyIGEgY2hhbmdlIGluIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBuZXR3b3JrLiBXZSdyZSBtYWlubHkKKyAgICAgKiBjb25jZXJuZWQgd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldCB1cAorICAgICAqIGFjY29yZGluZyB0byB3aGljaCBuZXR3b3JrcyBhcmUgY29ubmVjdGVkLCBhbmQgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAgKiByaWdodCByb3V0aW5nIHRhYmxlIGVudHJpZXMgZXhpc3QuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZSgpIHsKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKGludCBuZXRUeXBlKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIGEgbm9uLWRlZmF1bHQgbmV0d29yayBpcyBlbmFibGVkLCBhZGQgdGhlIGhvc3Qgcm91dGVzIHRoYXQKLSAgICAgICAgICogd2lsbCBhbGxvdyBpdCdzIEROUyBzZXJ2ZXJzIHRvIGJlIGFjY2Vzc2VkLiAgT25seQotICAgICAgICAgKiBJZiBib3RoIG1vYmlsZSBhbmQgd2lmaSBhcmUgZW5hYmxlZCwgYWRkIHRoZSBob3N0IHJvdXRlcyB0aGF0Ci0gICAgICAgICAqIHdpbGwgYWxsb3cgTU1TIHRyYWZmaWMgdG8gcGFzcyBvbiB0aGUgbW9iaWxlIG5ldHdvcmsuIEJ1dAotICAgICAgICAgKiByZW1vdmUgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBtb2JpbGUgbmV0d29yaywgc28gdGhhdCB0aGVyZQotICAgICAgICAgKiB3aWxsIGJlIG9ubHkgb25lIGRlZmF1bHQgcm91dGUsIHRvIGVuc3VyZSB0aGF0IGFsbCB0cmFmZmljCi0gICAgICAgICAqIGV4Y2VwdCBNTVMgd2lsbCB0cmF2ZWwgdmlhIFdpLUZpLgorICAgICAgICAgKiB3aWxsIGFsbG93IGl0J3MgRE5TIHNlcnZlcnMgdG8gYmUgYWNjZXNzZWQuCiAgICAgICAgICAqLwotICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKCk7CisgICAgICAgIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UobmV0VHlwZSk7CiAKLSAgICAgICAgZm9yIChpbnQgbmV0VHlwZSA6IG1Qcmlvcml0eUxpc3QpIHsKLSAgICAgICAgICAgIGlmIChtTmV0VHJhY2tlcnNbbmV0VHlwZV0uZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGREZWZhdWx0Um91dGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkUHJpdmF0ZURuc1JvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgICAgIGFkZERlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZURlZmF1bHRSb3V0ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVQcml2YXRlRG5zUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZFByaXZhdGVEbnNSb3V0ZXMobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZURlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZW1vdmVQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKyAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgcCA9IG50LmdldE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50ICsKKyAgICAgICAgICAgICAgICAgICAgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIgKyBwcml2YXRlRG5zUm91dGVTZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIXByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zTGlzdCA9IHAuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICIgIGFkZGluZyAiICsgZG5zKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGRucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAorICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKKyAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgcCA9IG50LmdldE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIHByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIHAgPSBudC5nZXROZXR3b3JrUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIEluZXRBZGRyZXNzIGRlZmF1bHRHYXRld2F5QWRkciA9IHAuZ2V0R2F0ZXdheSgpOworCisgICAgICAgIGlmICgoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAoZGVmYXVsdEdhdGV3YXlBZGRyICE9IG51bGwgKSkgeworICAgICAgICAgICAgaWYgKChOZXR3b3JrVXRpbHMuc2V0RGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUsIGRlZmF1bHRHYXRld2F5QWRkcikgPj0gMCkgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBuZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBkZWZhdWx0R2F0ZXdheUFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwID0gbnQuZ2V0TmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgoTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lKSA+PSAwKSAmJiBEQkcpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcworICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQorICAgICAqIHdpZGUgdXNlCisgICAgICovCisgICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBTdHJpbmcga2V5ID0gbnQuZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOworICAgICAgICBTdHJpbmcgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKKworICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKKyAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7CisgICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAorICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIFRDUCBidWZmZXIgc2l6ZXMgdG8gL3N5cy9rZXJuZWwvaXB2NC90Y3BfW3Ivd11tZW1fW21pbi9kZWYvbWF4XQorICAgICAqIHdoaWNoIG1hcHMgdG8gL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9ybWVtIGFuZCB0Y3B3bWVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCisgICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgeworICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIC8qKgogICAgICAqIEFkanVzdCB0aGUgcGVyLXByb2Nlc3MgZG5zIGVudHJpZXMgKG5ldC5kbnM8eD4uPHBpZD4pIGJhc2VkCiAgICAgICogb24gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIG5ldCB3aGljaCB0aGlzIHByb2Nlc3MgcmVxdWVzdGVkLgpAQCAtMTIyMSwxMiArMTM5OSwxNCBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciBudCA9IG1OZXRUcmFja2Vyc1tpXTsKICAgICAgICAgICAgIGlmIChudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIHAgPSBudC5nZXROZXR3b3JrUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIExpc3QgcGlkcyA9IG1OZXRSZXF1ZXN0ZXJzUGlkc1tpXTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cGlkcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KGopOwogICAgICAgICAgICAgICAgICAgICBpZiAocGlkLmludFZhbHVlKCkgPT0gbXlQaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgbXlQaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zZXMgPSBwLmdldERuc2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgbXlQaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvQnVtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyNDgsMTIgKzE0MjgsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZVBpZERucyhTdHJpbmdbXSBkbnNMaXN0LCBpbnQgcGlkKSB7CisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGlkRG5zKENvbGxlY3Rpb24gPEluZXRBZGRyZXNzPiBkbnNlcywgaW50IHBpZCkgewogICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKysgKyAiLiIgKyBwaWQsIGRucyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKyArICIuIiArIHBpZCwgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjcyLDQyICsxNDUwLDM3IEBACiAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zY2hhbmdlIiwgIiIgKyAobisxKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UoaW50IG5ldFR5cGUpIHsKICAgICAgICAgLy8gYWRkIGRlZmF1bHQgbmV0J3MgZG5zIGVudHJpZXMKLSAgICAgICAgZm9yIChpbnQgeCA9IG1Qcmlvcml0eUxpc3QubGVuZ3RoLTE7IHg+PSAwOyB4LS0pIHsKLSAgICAgICAgICAgIGludCBuZXRUeXBlID0gbVByaW9yaXR5TGlzdFt4XTsKLSAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbbmV0VHlwZV07Ci0gICAgICAgICAgICBpZiAobnQgIT0gbnVsbCAmJiBudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOwotICAgICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGRpbmcgZG5zICIgKyBkbnMgKyAiIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKyssIGRucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbbmV0VHlwZV07CisgICAgICAgIGlmIChudCAhPSBudWxsICYmIG50LmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSAmJiAhbnQuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwID0gbnQuZ2V0TmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc2VzID0gcC5nZXREbnNlcygpOworICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7CisgICAgICAgICAgICAgICAgaW50IGogPSAxOworICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZGluZyBkbnMgIiArIGRucyArICIgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9aiA7IGs8bU51bURuc0VudHJpZXM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImVyYXNpbmcgbmV0LmRucyIgKyBrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGssICIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTnVtRG5zRW50cmllcyA9IGo7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHBlci1waWQgZG5zIGZvciBhdHRhY2hlZCBzZWNvbmRhcnkgbmV0cwotICAgICAgICAgICAgICAgICAgICBMaXN0IHBpZHMgPSBtTmV0UmVxdWVzdGVyc1BpZHNbbmV0VHlwZV07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHk9MDsgeTwgcGlkcy5zaXplKCk7IHkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldCh5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc0xpc3QsIHBpZC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKyssIGRucy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaz1qIDsgazxtTnVtRG5zRW50cmllczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJlcmFzaW5nIG5ldC5kbnMiICsgayk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGssICIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU51bURuc0VudHJpZXMgPSBqOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgcGVyLXBpZCBkbnMgZm9yIGF0dGFjaGVkIHNlY29uZGFyeSBuZXRzCisgICAgICAgICAgICAgICAgTGlzdCBwaWRzID0gbU5ldFJlcXVlc3RlcnNQaWRzW25ldFR5cGVdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHk9MDsgeTwgcGlkcy5zaXplKCk7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KHkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgcGlkLmludFZhbHVlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgfQotCi0gICAgICAgIGJ1bXBEbnMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRSZXN0b3JlRGVmYXVsdE5ldHdvcmtEZWxheSgpIHsKQEAgLTEzNjIsNiArMTUzNSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIk5ldHdvcmtUcmFuc3Rpb25XYWtlTG9jayBpcyBjdXJyZW50bHkgIiArCisgICAgICAgICAgICAgICAgICAgIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpID8gIiIgOiAibm90ICIpICsgImhlbGQuIik7CisgICAgICAgICAgICBwdy5wcmludGxuKCJJdCB3YXMgbGFzdCByZXF1ZXN0ZWQgZm9yICIrbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5KTsKKyAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisKICAgICAgICAgbVRldGhlcmluZy5kdW1wKGZkLCBwdywgYXJncyk7CiAgICAgfQogCkBAIC0xNDI5LDE5ICsxNjA5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2NhblJlc3VsdHNBdmFpbGFibGUoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UobXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vdGlmaWNhdGlvbikgbXNnLm9iaik7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIG1ha2UgdGhpcyBoYW5kbGUgaXAvcHJveHkvZ2F0ZXdheS9kbnMgY2hhbmdlcworICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICB0eXBlID0gaW5mby5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UodHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9ST0FNSU5HX0NIQU5HRUQ6CiAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbWUgaW4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDUzLDYgKzE2MzEsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZVVzZXIgdSA9IChGZWF0dXJlVXNlciltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICB1LmV4cGlyZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXVzZWRCeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29ubmVjdGl2aXR5U2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzEgPT0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkQnkgPSBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXNlZEJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJOZXRUcmFuc2l0aW9uIFdha2Vsb2NrIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkQnkgKyAiIHJlbGVhc2VkIGJ5IHRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1MzYsNCArMTcyOCwyMyBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5URVRIRVJfU1VQUE9SVEVELCBkZWZhdWx0VmFsKSAhPSAwKTsKICAgICAgICAgcmV0dXJuIHRldGhlckVuYWJsZWRJblNldHRpbmdzICYmIG1UZXRoZXJpbmdDb25maWdWYWxpZDsKICAgICB9CisKKyAgICAvLyBBbiBBUEkgTmV0d29ya1N0YXRlVHJhY2tlcnMgY2FuIGNhbGwgd2hlbiB0aGV5IGxvc2UgdGhlaXIgbmV0d29yay4KKyAgICAvLyBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGFmdGVyIFggc2Vjb25kcyBvciBhIG5ldHdvcmsgYmVjb21lcyBDT05ORUNURUQsCisgICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuICBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgZmlyc3QgY2FsbGVyIGFuZCBub3QKKyAgICAvLyByZXN0YXJ0ZWQgYnkgc3Vic2VxdWVudCBjYWxsZXJzLgorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgcmV0dXJuOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcisrOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSBmb3JXaG9tOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4gdGhyb3VnaAorICoge0BsaW5rIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3J9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGV4dGVuZHMgSUNvdW50cnlEZXRlY3Rvci5TdHViIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBsaXN0ZW5lciwgaXQgd2lsbCBhbHNvIHJlbW92ZXMgaXRzZWxmCisgICAgICogZnJvbSBsaXN0ZW5lciBsaXN0IHdoZW4gdGhlIHJlbW90ZSBwcm9jZXNzIHdhcyBkaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVjZWl2ZXIgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyIG1LZXk7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUtleSA9IGxpc3RlbmVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobUtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iaikgeworICAgICAgICAgICAgaWYgKG90aGVyT2JqIGluc3RhbmNlb2YgUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUtleS5lcXVhbHMoKChSZWNlaXZlcikgb3RoZXJPYmopLm1LZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb3VudHJ5TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4gbVJlY2VpdmVyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIG1Db3VudHJ5RGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyOworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SZWNlaXZlcnMgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4oKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBJQ291bnRyeUxpc3RlbmVyIGludG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIElDb3VudHJ5TGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBSZWNlaXZlciByID0gbmV3IFJlY2VpdmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChyLCAwKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJzLnB1dChsaXN0ZW5lci5hc0JpbmRlcigpLCByKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVGhlIGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldENvdW50cnlMaXN0ZW5lcihtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImxpbmtUb0RlYXRoIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihJQmluZGVyIGtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vIGxpc3RlbmVyIGlzIGxlZnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlY2VpdmVycykgeworICAgICAgICAgICAgZm9yIChSZWNlaXZlciByZWNlaXZlciA6IG1SZWNlaXZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRMaXN0ZW5lcigpLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNoYWxsIHdlIHJlbW92ZSB0aGUgcmVjZWl2ZXI/CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJub3RpZnlSZWNlaXZlcnMgZmFpbGVkOiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIFNoYWxsIHdlIHdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2guCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIik7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBtQ291bnRyeURldGVjdG9yID0gbmV3IENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eShQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHRlc3RpbmcKKyAgICBib29sZWFuIGlzU3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBtU3lzdGVtUmVhZHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLjBjM2EwZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLklEZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CkBAIC01OCw0NiArNjEsNjYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHBvbGljeSBBUElzLgogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJRGV2aWNlUG9saWN5TWFuYWdlci5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSI7Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIE15UGFja2FnZU1vbml0b3IgbU1vbml0b3I7CiAKICAgICBJUG93ZXJNYW5hZ2VyIG1JUG93ZXJNYW5hZ2VyOwotICAgIAorCiAgICAgaW50IG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgaW50IG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgaW50IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKLSAgICAKKwogICAgIGludCBtUGFzc3dvcmRPd25lciA9IC0xOwotICAgIAorCiAgICAgZmluYWwgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4gbUFkbWluTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVBZG1pbj4gbUFkbWluTGlzdAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPigpOwotICAgIAorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZUFkbWluIHsKICAgICAgICAgZmluYWwgRGV2aWNlQWRtaW5JbmZvIGluZm87Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgbG9uZyBtYXhpbXVtVGltZVRvVW5sb2NrID0gMDsKICAgICAgICAgaW50IG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlID0gMDsKLSAgICAgICAgCisKKyAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQorICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBnbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMzMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTIzLDggKzE4MSwyMyBAQAogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Iik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKHNwZWNpZmllc0dsb2JhbFByb3h5KSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic3BlY2lmaWVzX2dsb2JhbF9wcm94eSIpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LXNwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgcmVhZEZyb21YbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0xNDMsMTkgKzIxNiw0OSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Ii5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1zcGVjIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm94eVNwZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBhZG1pbiB0YWc6ICIgKyB0YWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjY5LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNwZWNpZmllc0dsb2JhbFByb3h5PSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNwZWNpZmllc0dsb2JhbFByb3h5KTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJnbG9iYWxQcm94eVNwZWM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlFY2x1c2lvbkxpc3Q9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNvbWVQYWNrYWdlc0NoYW5nZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPW1BZG1pbkxpc3Quc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhYSA9IG1BZG1pbkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7IAorICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9QRVJNQU5FTlRfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbmdlID09IFBBQ0tBR0VfVEVNUE9SQVJZX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkFkbWluIHVuZXhwZWN0ZWRseSB1bmluc3RhbGxlZDogIgpAQCAtMjA3LDcgKzMzNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIHNlcnZpY2UuCiAgICAgICovCkBAIC0yMjQsNyArMzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5NYXAuZ2V0KHdobyk7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsCkBAIC0yMzQsNyArMzYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobywgaW50IHJlcVBvbGljeSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTI2NSwxMyArMzkyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSArICIgZm9yIHBvbGljeSAjIiArIHJlcVBvbGljeSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChTdHJpbmcgYWN0aW9uLCBpbnQgcmVxUG9saWN5KSB7CiAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChOID4gMCkgewpAQCAtMjgzLDE5ICs0MTAsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRvUHJveHlDbGVhbnVwID0KKyAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoYWRtaW4sCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFRCk7CiAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KICAgICAgICAgICAgIG1BZG1pbkxpc3QucmVtb3ZlKGFkbWluKTsKICAgICAgICAgICAgIG1BZG1pbk1hcC5yZW1vdmUoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIGlmIChkb1Byb3h5Q2xlYW51cCkgeworICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBEZXZpY2VBZG1pbkluZm8gZmluZEFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5OYW1lKSB7CiAgICAgICAgIEludGVudCByZXNvbHZlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICByZXNvbHZlSW50ZW50LnNldENvbXBvbmVudChhZG1pbk5hbWUpOwpAQCAtMzA0LDcgKzQzNiw3IEBACiAgICAgICAgIGlmIChpbmZvcyA9PSBudWxsIHx8IGluZm9zLnNpemUoKSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkbWluOiAiICsgYWRtaW5OYW1lKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIGluZm9zLmdldCgwKSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtMzE1LDcgKzQ0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEpvdXJuYWxlZEZpbGUgbWFrZUpvdXJuYWxlZEZpbGUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gIi9kYXRhL3N5c3RlbS9kZXZpY2VfcG9saWNpZXMueG1sIjsKICAgICAgICAgcmV0dXJuIG5ldyBKb3VybmFsZWRGaWxlKG5ldyBGaWxlKGJhc2UpLCBuZXcgRmlsZShiYXNlICsgIi50bXAiKSk7CkBAIC0zMzEsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG91dC5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOwogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtMzQyLDI2ICs0NzQsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1QYXNzd29yZE93bmVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDApIHsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAicXVhbGl0eSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxlbmd0aCIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidXBwZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsb3dlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxldHRlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJudW1lcmljIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJzeW1ib2xzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibm9ubGV0dGVyIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwb2xpY2llcyIpOwogCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKQEAgLTQzOSw2ICs1ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInF1YWxpdHkiKSk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZW5ndGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ1cHBlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsb3dlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGV0dGVycyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJudW1lcmljIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bWJvbHMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJub25sZXR0ZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdGFnOiAiICsgdGFnKTsKQEAgLTQ3NiwxMCArNjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyh1dGlscy5nZXRBY3RpdmVQYXNzd29yZFF1YWxpdHkoKSkpOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00OTgsMTIgKzY1OCwxMyBAQAogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHF1YWxpdHkgY29uc3RhbnQ6IDB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICBib29sZWFuIGhhdmVPd25lciA9IGZhbHNlOwpAQCAtNTIwLDE3ICs2ODEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvYWRTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBEZXZpY2VBZG1pbkluZm8gaW5mbyA9IGZpbmRBZG1pbihhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGFkbWluOiAiICsgYWRtaW5SZWNlaXZlcik7CkBAIC01NTIsMTMgKzcxMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcikgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTcyLDcgKzczMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcGFja2FnZUhhc0FjdGl2ZUFkbWlucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTg0LDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwpAQCAtNjAzLDEwICs3NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobywgaW50IHF1YWxpdHkpIHsKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKQEAgLTYxOSwxNiArNzgwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBtb2RlID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkUXVhbGl0eSA6IG1vZGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTYzOSw3ICs4MDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTY1MywxNiArODE0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExlbmd0aCA6IGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjczLDE4ICs4MzQsMjY3IEBACiAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGggOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9sczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA+PSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID49IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5IDwgZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCA8IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA+PSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID49IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID49IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC02OTQsNyArMTEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobywgaW50IG51bSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNzA5LDE2ICsxMTE5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IGNvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC03MzIsNyArMTE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGludCBxdWFsaXR5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTc0MywxNCArMTE1MywxNSBAQAogICAgICAgICAgICAgcXVhbGl0eSA9IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICAgICAgICAgIGlmIChxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgIGludCByZWFsUXVhbGl0eSA9IExvY2tQYXR0ZXJuVXRpbHMuY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eSkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1YWxpdHkgPSByZWFsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gTWF0aC5tYXgocmVhbFF1YWxpdHksIHF1YWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA8IGxlbmd0aCkgewpAQCAtNzU4LDE0ICsxMTY5LDg2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBsZW5ndGggIiArIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTGV0dGVycyA9IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYobGV0dGVycyA8IG5lZWRlZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsZXR0ZXJzICIgKyBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxldHRlcnMgIiArIG5lZWRlZExldHRlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROdW1iZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtYmVycyA8IG5lZWRlZE51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIgKyBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE51bWJlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMb3dlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZSA8IG5lZWRlZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIgKyBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkVXBwZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmICh1cHBlcmNhc2UgPCBuZWVkZWRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiICsgdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZFVwcGVyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFN5bWJvbHMgPSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xzIDwgbmVlZGVkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgc3ltYm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIG5lZWRlZFN5bWJvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROb25MZXR0ZXIgPSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG5vbmxldHRlciA8IG5lZWRlZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiICsgbm9ubGV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROb25MZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIHV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICAgICAgaWYodXRpbHMuY2hlY2tQYXNzd29yZEhpc3RvcnkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKSArICIgcGFzc3dvcmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDAgJiYgbVBhc3N3b3JkT3duZXIgIT0gY2FsbGluZ1VpZCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IGFscmVhZHkgc2V0IGJ5IGFub3RoZXIgdWlkIGFuZCBub3QgZW50ZXJlZCBieSB1c2VyIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gY2FsbAogICAgICAgICAvLyBiYWNrIGluIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC03ODMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobywgbG9uZyB0aW1lTXMpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTc5NiwxNiArMTI3OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyk7CiAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSB0aW1lTXMpIHsKICAgICAgICAgICAgICAgICBhcC5tYXhpbXVtVGltZVRvVW5sb2NrID0gdGltZU1zOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVBvd2VyTWFuYWdlcigpLnNldE1heGltdW1TY3JlZW5PZmZUaW1lb3VudCgoaW50KXRpbWVNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC04MTcsMTYgKzEzMDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyB0aW1lID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtVGltZVRvVW5sb2NrIDogdGltZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtODQwLDcgKzEzMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBsb2NrTm93KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODU3LDcgKzEzNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB3aXBlRGF0YUxvY2tlZChpbnQgZmxhZ3MpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlY292ZXJ5U3lzdGVtLnJlYm9vdFdpcGVVc2VyRGF0YShtQ29udGV4dCk7CkBAIC04NjUsNyArMTM0OCw3IEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg4MCwxMSArMTM2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGNvbXApOwogICAgICAgICAgICAgaWYgKGFkbWluID09IG51bGwpIHsKQEAgLTkwNywyMCArMTM5MCwzMCBAQAogICAgICAgICAgICAgfSwgbnVsbCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gcXVhbGl0eSB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gbG93ZXJjYXNlIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gbnVtYmVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IHN5bWJvbHMgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IG5vbmxldHRlcikgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gbGV0dGVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gbG93ZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSB1cHBlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gc3ltYm9sczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gbm9ubGV0dGVyOwogICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCkBAIC05MzEsMTEgKzE0MjQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydEZhaWxlZFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTk1MiwxMSArMTQ0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0U3VjY2Vzc2Z1bFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTk3Miw3ICsxNDY1LDk1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShDb21wb25lbnROYW1lIHdobywgU3RyaW5nIHByb3h5U3BlYywKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKKworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gY29tcFNldCA9IG1BZG1pbk1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgIGZvciAgKENvbXBvbmVudE5hbWUgY29tcG9uZW50IDogY29tcFNldCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTWFwLmdldChjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpICYmICghY29tcG9uZW50LmVxdWFscyh3aG8pKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGFkbWluIGFscmVhZHkgc2V0cyB0aGUgZ2xvYmFsIHByb3h5CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eVNwZWMgPSBwcm94eVNwZWM7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm94eSBhY2NvcmRpbmdseQorICAgICAgICAgICAgLy8gRG8gdGhpcyB1c2luZyBzeXN0ZW0gcGVybWlzc2lvbnMsIGFzIGFwcHMgY2Fubm90IHdyaXRlIHRvIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbG9uZyBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAvLyBTY2FuIHRocm91Z2ggYWN0aXZlIGFkbWlucyBhbmQgZmluZCBpZiBhbnlvbmUgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNldCB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGV2aWNlIGFkbWluIHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmluZm8uZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEdsb2JhbFByb3h5KCkgeworICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcC5zcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIHNhdmVHbG9iYWxQcm94eShhcC5nbG9iYWxQcm94eVNwZWMsIGFwLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbnMgZGVmaW5pbmcgZ2xvYmFsIHByb3hpZXMgLSByZXNldCBnbG9iYWwgcHJveHkgc2V0dGluZ3MgdG8gbm9uZQorICAgICAgICBzYXZlR2xvYmFsUHJveHkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVHbG9iYWxQcm94eShTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5U3BlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm94eVNwZWMgPSAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHByb3h5U3BlYyA9IHByb3h5U3BlYy50cmltKCk7CisgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0LnRyaW0oKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFksIHByb3h5U3BlYyk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcocmVzLCBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCwgZXhjbHVzaW9uTGlzdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE1NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE1ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBmZjNmODBmLi4xNjQxNDJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NzUsOCArNDc1LDEwIEBACiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7CiAgICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHM6ICIgKyBlbmFibGVkU3RyKTsKLSAgICAgICAgaWYgKGVuYWJsZWRTdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIkVuYWJsZWQgaW5wdXQgbWV0aG9kcyBoYXMgbm90IGJlZW4gc2V0LCBlbmFibGluZyBhbGwiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRJbWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOworICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KGRlZmF1bHRJbWUpKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRW5hYmxlZCBpbnB1dCBtZXRob2RzIG9yIGRlZmF1bHQgSU1FIGhhcyBub3QgYmVlbiBzZXQsIGVuYWJsaW5nIGFsbCIpOwogICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGRlZkltID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyNTYpOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWV0aG9kTGlzdC5zaXplKCk7CkBAIC05ODEsNyArOTgzLDcgQEAKICAgICB2b2lkIHNldElucHV0TWV0aG9kTG9ja2VkKFN0cmluZyBpZCkgewogICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW5mbyA9IG1NZXRob2RNYXAuZ2V0KGlkKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBpZDogIiArIG1DdXJNZXRob2RJZCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgaWQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlkLmVxdWFscyhtQ3VyTWV0aG9kSWQpKSB7CkBAIC0xNDgwLDcgKzE0ODIsNyBAQAogCiAgICAgICAgIFN0cmluZyBkZWZhdWx0SW1lID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dAogICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKLSAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoZGVmYXVsdEltZSkpIHsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZWZhdWx0SW1lKSAmJiAhbWFwLmNvbnRhaW5zS2V5KGRlZmF1bHRJbWUpKSB7CiAgICAgICAgICAgICBpZiAoY2hvb3NlTmV3RGVmYXVsdElNRUxvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgdXBkYXRlRnJvbVNldHRpbmdzTG9ja2VkKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggM2JjZjQyNy4uNTY5NzE4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNDY1LDEwICs0NjUsMTEgQEAKICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuYWRkKHBhc3NpdmVQcm92aWRlci5nZXROYW1lKCkpOwogCiAgICAgICAgIC8vIGluaXRpYWxpemUgZXh0ZXJuYWwgbmV0d29yayBsb2NhdGlvbiBhbmQgZ2VvY29kZXIgc2VydmljZXMKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC4gZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19uZXR3b3JrTG9jYXRpb25Qcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvblByb3ZpZGVyUHJveHkobUNvbnRleHQsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUsIG1Mb2NhdGlvbkhhbmRsZXIpOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX2dlb2NvZGVQcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtR2VvY29kZVByb3ZpZGVyID0gbmV3IEdlb2NvZGVyUHJveHkobUNvbnRleHQsIHNlcnZpY2VOYW1lKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCmluZGV4IDgzNTFhYzEuLjRhMGUxNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCkBAIC0xMjcsNiArMTI3LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRVbXNDb25uZWN0ZWRPbkJvb3QgPSBmYWxzZTsKKyAgICAvLyB0cnVlIGlmIHdlIHNob3VsZCBmYWtlIE1FRElBX01PVU5URUQgc3RhdGUgZm9yIGV4dGVybmFsIHN0b3JhZ2UKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByaXZhdGUgaGFzaCBvZiBjdXJyZW50bHkgbW91bnRlZCBzZWN1cmUgY29udGFpbmVycy4KQEAgLTMxOSw3ICszMjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IGdldFZvbHVtZVN0YXRlKHBhdGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmVxdWFscyhFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVZvbHVtZVN0YXRlQ2hhbmdlKG51bGwsIHBhdGgsIFZvbHVtZVN0YXRlLk5vTWVkaWEsIFZvbHVtZVN0YXRlLk1vdW50ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gZG9Nb3VudFZvbHVtZShwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IFN0b3JhZ2VSZXN1bHRDb2RlLk9wZXJhdGlvblN1Y2NlZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiQm9vdC10aW1lIG1vdW50IGZhaWxlZCAoJWQpIiwgcmMpKTsKQEAgLTM5MCwxMSArMzk0LDEzIEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJEdXBsaWNhdGUgc3RhdGUgdHJhbnNpdGlvbiAoJXMgLT4gJXMpIiwgbUxlZ2FjeVN0YXRlLCBzdGF0ZSkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSBvbiBQYWNrYWdlTWFuYWdlcgotICAgICAgICBpZiAoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKLSAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKHRydWUsIGZhbHNlKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyLCBidXQgb25seSBvZiByZWFsIGV2ZW50cworICAgICAgICBpZiAoIW1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlKSB7CisgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTdHJpbmcgb2xkU3RhdGUgPSBtTGVnYWN5U3RhdGU7CiAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IHN0YXRlOwpAQCAtODk0LDYgKzkwMCwxMyBAQAogICAgIHB1YmxpYyBNb3VudFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpOworICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1c2luZyBlbXVsYXRlZCBleHRlcm5hbCBzdG9yYWdlIik7CisgICAgICAgICAgICBtTGVnYWN5U3RhdGUgPSBFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEOworICAgICAgICB9CisKICAgICAgICAgLy8gWFhYOiBUaGlzIHdpbGwgZ28gYXdheSBzb29uIGluIGZhdm9yIG9mIElNb3VudFNlcnZpY2VPYnNlcnZlcgogICAgICAgICBtUG1zID0gKFBhY2thZ2VNYW5hZ2VyU2VydmljZSkgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicGFja2FnZSIpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA2MzMyNWRkLi42Nzc5NmM2IDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CkBAIC0yODEsNiArMjgyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5GTEFHX0ZPUkVHUk9VTkRfU0VSVklDRSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKHBrZywgdGFnLCBpZCwgMCwgMCk7IC8vIG1heWJlIGFkZCBzb21lIGZsYWdzPworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgb25QYW5lbFJldmVhbGVkKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uTGlzdCkgewogICAgICAgICAgICAgICAgIC8vIHNvdW5kCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDBmZjMzZDEuLjhhODc2YTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC05NTk0LDcgKzk1OTQsOCBAQAogICAgICogVXBkYXRlIG1lZGlhIHN0YXR1cyBvbiBQYWNrYWdlTWFuYWdlci4KICAgICAqLwogICAgcHVibGljIHZvaWQgdXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmaW5hbCBib29sZWFuIG1lZGlhU3RhdHVzLCBmaW5hbCBib29sZWFuIHJlcG9ydFN0YXR1cykgewotICAgICAgIGlmIChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKyAgICAgICBpZiAoY2FsbGluZ1VpZCAhPSAwICYmIGNhbGxpbmdVaWQgIT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiTWVkaWEgc3RhdHVzIGNhbiBvbmx5IGJlIHVwZGF0ZWQgYnkgdGhlIHN5c3RlbSIpOwogICAgICAgIH0KICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYWNrYWdlcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZjdmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Ecm9wQm94TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGV4dGVuZHMgQmluZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2FtcGxpbmdQcm9maWxlclNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX0RJUiA9IFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5TTkFQU0hPVF9ESVI7CisKKyAgICBwcml2YXRlIEZpbGVPYnNlcnZlciBzbmFwc2hvdE9ic2VydmVyOworCisgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZWdpc3RlclNldHRpbmdPYnNlcnZlcihjb250ZXh0KTsKKyAgICAgICAgc3RhcnRXb3JraW5nKGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFdvcmtpbmcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCAic3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UhIik7CisKKyAgICAgICAgZmluYWwgRHJvcEJveE1hbmFnZXIgZHJvcGJveCA9CisgICAgICAgICAgICAgICAgKERyb3BCb3hNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UpOworCisgICAgICAgIC8vIGJlZm9yZSBGaWxlT2JzZXJ2ZXIgaXMgcmVhZHksIHRoZXJlIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNvbWUgc25hcHNob3RzCisgICAgICAgIC8vIGluIHRoZSBkaXJlY3RvcnksIHdlIGRvbid0IHdhbnQgdG8gbWlzcyB0aGVtCisgICAgICAgIEZpbGVbXSBzbmFwc2hvdEZpbGVzID0gbmV3IEZpbGUoU05BUFNIT1RfRElSKS5saXN0RmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHNuYXBzaG90RmlsZXMgIT0gbnVsbCAmJiBpIDwgc25hcHNob3RGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKHNuYXBzaG90RmlsZXNbaV0sIGRyb3Bib3gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGV0ZWN0IG5ldyBzbmFwc2hvdCBhbmQgcHV0IGl0IGluIGRyb3Bib3gKKyAgICAgICAgLy8gZGVsZXRlIGl0IGFmdGVyd2FyZHMgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgYmVmb3JlCisgICAgICAgIC8vIE5vdGU6IG5lZWRzIGxpc3RlbmluZyBhdCBldmVudCBBVFRSSUIgcmF0aGVyIHRoYW4gQ0xPU0VfV1JJVEUsIGJlY2F1c2Ugd2Ugc2V0IHRoZQorICAgICAgICAvLyByZWFkYWJpbGl0eSBvZiBzbmFwc2hvdCBmaWxlcyBhZnRlciB3cml0aW5nIHRoZW0hCisgICAgICAgIHNuYXBzaG90T2JzZXJ2ZXIgPSBuZXcgRmlsZU9ic2VydmVyKFNOQVBTSE9UX0RJUiwgRmlsZU9ic2VydmVyLkFUVFJJQikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KGludCBldmVudCwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTbmFwc2hvdEZpbGUobmV3IEZpbGUoU05BUFNIT1RfRElSLCBwYXRoKSwgZHJvcGJveCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNuYXBzaG90T2JzZXJ2ZXIuc3RhcnRXYXRjaGluZygpOworCisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCAiU2FtcGxpbmdQcm9maWxlclNlcnZpY2UgYWN0aXZhdGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNuYXBzaG90RmlsZShGaWxlIGZpbGUsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3gpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRyb3Bib3guYWRkRmlsZShUQUcsIGZpbGUsIDApOworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsIGZpbGUuZ2V0UGF0aCgpICsgIiBhZGRlZCB0byBkcm9wYm94Iik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBhZGQgIiArIGZpbGUuZ2V0UGF0aCgpICsgIiB0byBkcm9wYm94IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyU2V0dGluZ09ic2VydmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgY29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLlNBTVBMSU5HX1BST0ZJTEVSX0haKSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKGNvbnRlbnRSZXNvbHZlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHB3LnByaW50bG4oIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlOiIpOworICAgICAgICBwdy5wcmludGxuKCJXYXRjaGluZyBkaXJlY3Rvcnk6ICIgKyBTTkFQU0hPVF9ESVIpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgICAgICBwdWJsaWMgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIoQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlcikgeworICAgICAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOworICAgICAgICAgICAgb25DaGFuZ2UoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIEludGVnZXIgc2FtcGxpbmdQcm9maWxlckh6ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLlNBTVBMSU5HX1BST0ZJTEVSX0haLCAwKTsKKyAgICAgICAgICAgIC8vIHNldHRpbmcgdGhpcyBzZWN1cmUgcHJvcGVydHkgd2lsbCBzdGFydCBvciBzdG9wIHNhbXBsaW5nIHByb2ZpbGVyLAorICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhZGp1c3QgdGhlIGZyZXF1ZW5jeSBvZiB0YWtpbmcgc25hcHNob3RzLgorICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoInBlcnNpc3Quc3lzLnByb2ZpbGVyX2h6Iiwgc2FtcGxpbmdQcm9maWxlckh6LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0MTc3NDMyLi43MTdjMzA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTg0LDYgKzg0LDcgQEAKICAgICAgICAgdm9pZCBvblNldERpc2FibGVkKGludCBzdGF0dXMpOwogICAgICAgICB2b2lkIG9uQ2xlYXJBbGwoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogICAgICAgICB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CkBAIC0zMDIsNiArMzAzLDEyIEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25FcnJvcihwa2csIHRhZywgaWQsIHVpZCwgaW5pdGlhbFBpZCwgbWVzc2FnZSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgZW5mb3JjZVN0YXR1c0JhclNlcnZpY2UoKTsKKworICAgICAgICBtTm90aWZpY2F0aW9uQ2FsbGJhY2tzLm9uTm90aWZpY2F0aW9uQ2xlYXIocGtnLCB0YWcsIGlkKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBvbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpIHsKICAgICAgICAgZW5mb3JjZVN0YXR1c0JhclNlcnZpY2UoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQppbmRleCAxYTIwOWUyLi5kNDRjZTk3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YQpAQCAtMjQsMjYgKzI0LDI2IEBACiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWU7CiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5aeWdvdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuUGVvcGxlOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwpAQCAtNTEsMTEgKzUxLDggQEAKIAogY2xhc3MgU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVNlcnZlciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBJTkNMVURFX0RFTU8gPSBmYWxzZTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQk9PVF9QUk9HUkVTU19TWVNURU1fUlVOID0gMzAxMDsKLQotICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisgICAgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAKICAgICBwcml2YXRlIGNsYXNzIEFkYlNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewogICAgICAgICBwdWJsaWMgQWRiU2V0dGluZ3NPYnNlcnZlcigpIHsKQEAgLTIxMCw2ICsyMDcsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZSBub3RpZmljYXRpb24gPSBudWxsOwogICAgICAgICBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB3YWxscGFwZXIgPSBudWxsOwogICAgICAgICBMb2NhdGlvbk1hbmFnZXJTZXJ2aWNlIGxvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3IgPSBudWxsOwogCiAgICAgICAgIGlmIChmYWN0b3J5VGVzdCAhPSBTeXN0ZW1TZXJ2ZXIuRkFDVE9SWV9URVNUX0xPV19MRVZFTCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTMyMCw2ICszMTgsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQ291bnRyeSBEZXRlY3RvciIpOworICAgICAgICAgICAgICAgIGNvdW50cnlEZXRlY3RvciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SLCBjb3VudHJ5RGV0ZWN0b3IpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBDb3VudHJ5IERldGVjdG9yIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNlYXJjaCBTZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlYXJjaE1hbmFnZXJTZXJ2aWNlKGNvbnRleHQpKTsKQEAgLTMyNywxMSArMzMzLDYgQEAKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTZWFyY2ggU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoSU5DTFVERV9ERU1PKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkluc3RhbGxpbmcgZGVtbyBkYXRhLi4uIik7Ci0gICAgICAgICAgICAgICAgKG5ldyBEZW1vVGhyZWFkKGNvbnRleHQpKS5zdGFydCgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJEcm9wQm94IFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFLApAQCAtNDE4LDEwICs0MTksMjIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCB0aGlzIHNlcnZpY2UgZXZlbiBpZiBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uaXNFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAvLyBpcyBmYWxzZSwgYmVjYXVzZSBpdCBpcyB0aGlzIHNlcnZpY2UgdGhhdCBkZXRlY3RzIHN5c3RlbSBwcm9wZXJ0eSBjaGFuZ2UgYW5kCisgICAgICAgICAgICAgICAgLy8gdHVybnMgb24gU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLiBQbHVzLCB3aGVuIHNhbXBsaW5nIHByb2ZpbGVyIGRvZXNuJ3Qgd29yaywKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBsaXR0bGUgb3ZlcmhlYWQgZm9yIHJ1bm5pbmcgdGhpcyBzZXJ2aWNlLgorICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTYW1wbGluZ1Byb2ZpbGVyIFNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKCJzYW1wbGluZ3Byb2ZpbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UoY29udGV4dCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTYW1wbGluZ1Byb2ZpbGVyIFNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2lwIFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKCJzaXAiLCBuZXcgU2lwU2VydmljZShjb250ZXh0KSk7CiAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIERpc2tTdGF0cyBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU0lQIFNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00ODMsNiArNDk2LDcgQEAKICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZSBpbW1GID0gaW1tOwogICAgICAgICBmaW5hbCBSZWNvZ25pdGlvbk1hbmFnZXJTZXJ2aWNlIHJlY29nbml0aW9uRiA9IHJlY29nbml0aW9uOwogICAgICAgICBmaW5hbCBMb2NhdGlvbk1hbmFnZXJTZXJ2aWNlIGxvY2F0aW9uRiA9IGxvY2F0aW9uOworICAgICAgICBmaW5hbCBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGNvdW50cnlEZXRlY3RvckYgPSBjb3VudHJ5RGV0ZWN0b3I7CiAKICAgICAgICAgLy8gV2Ugbm93IHRlbGwgdGhlIGFjdGl2aXR5IG1hbmFnZXIgaXQgaXMgb2theSB0byBydW4gdGhpcmQgcGFydHkKICAgICAgICAgLy8gY29kZS4gIEl0IHdpbGwgY2FsbCBiYWNrIGludG8gdXMgb25jZSBpdCBoYXMgZ290dGVuIHRvIHRoZSBzdGF0ZQpAQCAtNTEwLDYgKzUyNCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHdhbGxwYXBlckYgIT0gbnVsbCkgd2FsbHBhcGVyRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChpbW1GICE9IG51bGwpIGltbUYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25GICE9IG51bGwpIGxvY2F0aW9uRi5zeXN0ZW1SZWFkeSgpOworICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5RGV0ZWN0b3JGICE9IG51bGwpIGNvdW50cnlEZXRlY3RvckYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVGICE9IG51bGwpIHRocm90dGxlRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKQEAgLTUxOSwzNyArNTM0LDcgQEAKICAgICB9CiB9CiAKLWNsYXNzIERlbW9UaHJlYWQgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgICBEZW1vVGhyZWFkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEN1cnNvciBjID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoUGVvcGxlLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzRGF0YSA9IGMgIT0gbnVsbCAmJiBjLm1vdmVUb0ZpcnN0KCk7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYy5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc0RhdGEpIHsKLSAgICAgICAgICAgICAgICBEZW1vRGF0YVNldCBkYXRhc2V0ID0gbmV3IERlbW9EYXRhU2V0KCk7Ci0gICAgICAgICAgICAgICAgZGF0YXNldC5hZGQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgU2xvZy5lKCJTeXN0ZW1TZXJ2ZXIiLCAiRmFpbHVyZSBpbnN0YWxsaW5nIGRlbW8gZGF0YSIsIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotfQotCi1wdWJsaWMgY2xhc3MgU3lzdGVtU2VydmVyCi17CitwdWJsaWMgY2xhc3MgU3lzdGVtU2VydmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVNlcnZlciI7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNUT1JZX1RFU1RfT0ZGID0gMDsKQEAgLTU3Myw3ICs1NTgsNyBAQAogICAgICAgICAgICAgdGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KCJzeXN0ZW1fc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KCJzeXN0ZW1fc2VydmVyIiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwgU05BUFNIT1RfSU5URVJWQUwsIFNOQVBTSE9UX0lOVEVSVkFMKTsKICAgICAgICAgfQpAQCAtNTgxLDcgKzU2Niw3IEBACiAgICAgICAgIC8vIFRoZSBzeXN0ZW0gc2VydmVyIGhhcyB0byBydW4gYWxsIG9mIHRoZSB0aW1lLCBzbyBpdCBuZWVkcyB0byBiZQogICAgICAgICAvLyBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUgd2l0aCBpdHMgbWVtb3J5IHVzYWdlLgogICAgICAgICBWTVJ1bnRpbWUuZ2V0UnVudGltZSgpLnNldFRhcmdldEhlYXBVdGlsaXphdGlvbigwLjhmKTsKLSAgICAgICAgCisKICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJhbmRyb2lkX3NlcnZlcnMiKTsKICAgICAgICAgaW5pdDEoYXJncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKaW5kZXggNjY0ZGZhNS4uNzMyMzRkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5OwpAQCAtODgsOSArOTAsOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTmV0d29ya1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uUHJvcGVydGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMCw2ICsxMjIsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzIsMTkgKzIzNSwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTUsOCArMjU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjY5LDEwICsyNzIsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MiwxMCArMjg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTQsMTggKzI5OCwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxMywxOCArMzE4LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMyLDU2ICszMzgsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBOZXR3b3JrUHJvcGVydGllcyBuZXR3b3JrUHJvcGVydGllcywKKyAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSkgewogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5RGF0YUNvbm5lY3Rpb24oKSIgKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gVGVsZXBob255TWFuYWdlci5EQVRBX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZEFwbnMuY29udGFpbnMoYXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMuYWRkKGFwblR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFDb25uZWN0aW9uU3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcG5zLnJlbW92ZShhcG5UeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZEFwbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtRGF0YUNvbm5lY3Rpb25TdGF0ZSBhcyBpcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBvdXQgdGhlIG5ldyBzdGF0dXMgZm9yIHRoZSBBUE4gaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwbiA9IGFwbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gYXBuVHlwZXM7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25Qcm9wZXJ0aWVzID0gbmV0d29ya1Byb3BlcnRpZXM7CisgICAgICAgICAgICBpZiAobURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgIT0gbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSA9IG5ldHdvcmtUeXBlOworICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOworICAgICAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBuZXR3b3JrVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLCByZWFzb24sIGFwbiwKLSAgICAgICAgICAgICAgICBhcG5UeXBlcywgaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgYXBuVHlwZSwgbmV0d29ya1Byb3BlcnRpZXMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhlcmUgaXMgb24gb25EYXRhQ29ubmVjdGlvbkZhaWxlZCBjYWxsYmFjawotICAgICAgICAgKiBvbiBQaG9uZVN0YXRlTGlzdGVuZXIuIFRoZXJlIHNob3VsZCBiZQorICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBubyBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCisgICAgICAgICAqIGluIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25GYWlsZWRSZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1SZWNvcmRzLnNpemUoKTsKQEAgLTM5Myw3ICs0MjQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICovCi0gICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKEJ1bmRsZSBjZWxsTG9jYXRpb24pIHsKQEAgLTQwMiw4ICs0MzMsNyBAQAogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DZWxsTG9jYXRpb24gPSBjZWxsTG9jYXRpb247Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NFTExfTE9DQVRJT04pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZENlbGxMb2NhdGlvbihyLCBjZWxsTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNCw3ICs0NDQsNyBAQAogICAgIC8qKgogICAgICAqIENvcHkgdGhlIHNlcnZpY2Ugc3RhdGUgb2JqZWN0IHNvIHRoZXkgY2FuJ3QgbWVzcyBpdCB1cCBpbiB0aGUgbG9jYWwgY2FsbHMKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNlcnZpY2VTdGF0ZShSZWNvcmQgciwgU2VydmljZVN0YXRlIHN0YXRlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2VydmljZVN0YXRlQ2hhbmdlZChuZXcgU2VydmljZVN0YXRlKHN0YXRlKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewpAQCAtNDYwLDExICs0OTAsMTAgQEAKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uUG9zc2libGU9IiArIG1EYXRhQ29ubmVjdGlvblBvc3NpYmxlKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uUmVhc29uPSIgKyBtRGF0YUNvbm5lY3Rpb25SZWFzb24pOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25BcG49IiArIG1EYXRhQ29ubmVjdGlvbkFwbik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWU9IiArIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qcm9wZXJ0aWVzPSIgKyBtRGF0YUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNlbGxMb2NhdGlvbj0iICsgbUNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCJyZWdpc3RyYXRpb25zOiBjb3VudD0iICsgcmVjb3JkQ291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICIgKyByLnBrZ0ZvckRlYnVnICsgIiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHIuZXZlbnRzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNSw3ICs1NjQsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwKICAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBOZXR3b3JrUHJvcGVydGllcyBuZXR3b3JrUHJvcGVydGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NDgsMjMgKzU3NywyMyBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChuZXR3b3JrUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9ORVRXT1JLX1BST1BFUlRJRVNfS0VZLCBuZXR3b3JrUHJvcGVydGllcyk7CisgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIGlmYWNlID0gbmV0d29ya1Byb3BlcnRpZXMuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIHR5cGVzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGludGVyZmFjZU5hbWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZLCByZWFzb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCmluZGV4IGE5M2E2ZWUuLmQ4NDFjYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCkBAIC02MCw2ICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTgzLDggKzg1LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RJTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHJpdmF0ZSBpbnQgbVBvbGljeVBvbGxQZXJpb2RTZWM7Ci0gICAgcHJpdmF0ZSBsb25nIG1Qb2xpY3lUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgcHJpdmF0ZSBBdG9taWNMb25nIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOwogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lSZXNldERheTsgLy8gMS0yOAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2s7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgSW50ZXJmYWNlT2JzZXJ2ZXIgbUludGVyZmFjZU9ic2VydmVyOwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKIAotICAgIHByaXZhdGUgaW50IG1UaHJvdHRsZUluZGV4OyAvLyAwIGZvciBub25lLCAxIGZvciBmaXJzdCB0aHJvdHRsZSB2YWwsIDIgZm9yIG5leHQsIGV0YworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCA9IC0xOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCAgID0gIDA7CiAKQEAgLTEyNiw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKFZEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBUaHJvdHRsZVNlcnZpY2UiKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICBtTnRwQWN0aXZlID0gZmFsc2U7CiAKICAgICAgICAgbUlmYWNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvbmZpZ19kYXRhdXNlX2lmYWNlKTsKQEAgLTIxNCw3ICsyMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBudHBUb1dhbGxUaW1lKGxvbmcgbnRwVGltZSkgewotICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSgpOworICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSh0cnVlKTsgLy8gZG8gaXQgcXVpY2tseQogICAgICAgICBsb25nIGxvY2FsTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHVybiBsb2NhbE5vdyArIChudHBUaW1lIC0gYmVzdE5vdyk7CiAgICAgfQpAQCAtMjIyLDQwICsyMjgsNDIgQEAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZXNldFRpbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgcHVibGljIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBsb25nIHJlc2V0VGltZSA9IDA7CiAgICAgICAgIGlmIChtUmVjb3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRUaW1lID0gbnRwVG9XYWxsVGltZShtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkpOworICAgICAgICAgICAgcmVzZXRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZEVuZCgpOwogICAgICAgICB9CisgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUocmVzZXRUaW1lKTsKICAgICAgICAgcmV0dXJuIHJlc2V0VGltZTsKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UGVyaW9kU3RhcnRUaW1lKFN0cmluZyBpZmFjZSkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgIHB1YmxpYyBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCkpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lID0gbnRwVG9XYWxsVGltZShzdGFydFRpbWUpOwogICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwogICAgIH0KICAgICAvL1RPRE8gLSBhIGJldHRlciBuYW1lPyAgZ2V0Q2xpZmZCeXRlQ291bnRUaHJlc2hvbGQ/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRDbGlmZlRocmVzaG9sZChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZT8gZ2V0VGhyb3R0bGVSYXRlPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgeworICAgIHB1YmxpYyBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI2NywxMCArMjc1LDkgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlQ291bnQoU3RyaW5nIGlmYWNlLCBpbnQgZGlyLCBpbnQgcGVyaW9kLCBpbnQgYWdvKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoKHBlcmlvZCA9PSBUaHJvdHRsZU1hbmFnZXIuUEVSSU9EX0NZQ0xFKSAmJgotICAgICAgICAgICAgICAgIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYgKG1SZWNvcmRlciAhPSBudWxsKSkgewogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1RYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFR4KGFnbyk7CiAgICAgICAgICAgICBpZiAoZGlyID09IFRocm90dGxlTWFuYWdlci5ESVJFQ1RJT05fUlgpIHJldHVybiBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoYWdvKTsKICAgICAgICAgfQpAQCAtMjc5LDEwICsyODYsMTAgQEAKIAogICAgIC8vIFRPRE8gLSBhIGJldHRlciBuYW1lIC0gZ2V0Q3VycmVudFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBpbnQgZ2V0VGhyb3R0bGUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzA1LDIyICszMTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1JFU0VUKSk7CiAKLSAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCi0gICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwotICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKLQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMzcsNiArMzI4LDIyIEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgYSBuZXcgdGhyZWFkIGFzIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlIHN5c3RlbSBmb3IgZmlsZSB3cml0ZXMKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1JFQk9PVF9SRUNPVkVSWSkuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgbUludGVyZmFjZU9ic2VydmVyID0gbmV3IEludGVyZmFjZU9ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9JRkFDRV9VUCwgbUlmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OTVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtSW50ZXJmYWNlT2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCByZWdpc3RlciBJbnRlcmZhY2VPYnNlcnZlciAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyLm9ic2VydmUobUNvbnRleHQpOwogICAgIH0KIAogCkBAIC0zNzUsNyArMzgyLDcgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzaW0gY2hhbmdlIFRPRE8KICAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBwb2xpY3kgY2hhbmdlCiAKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgbVJlY29yZGVyID0gbmV3IERhdGFSZWNvcmRlcihtQ29udGV4dCwgVGhyb3R0bGVTZXJ2aWNlLnRoaXMpOwogCkBAIC00MDMsMTUgKzQxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyZXNob2xkX2J5dGVzKTsKICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyb3R0bGVfa2JpdHNwcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1RIUkVTSE9MRF9CWVRFUywgZGVmYXVsdFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFRFU1RJTkdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gU2V0dGluZ3MuU2VjdXJlLmdldExvbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOworICAgICAgICAgICAgaW50IHZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KHRocmVzaG9sZCk7CisgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5zZXQodmFsdWUpOworICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5UG9sbFBlcmlvZFNlYyA9IFRFU1RJTkdfUE9MTElOR19QRVJJT0RfU0VDOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KFRFU1RJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvbGljeVJlc2V0RGF5ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKQEAgLTQyMywxMCArNDMxLDggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9SRVNFVF9EQVksIG1Qb2xpY3lSZXNldERheSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgZGVmYXVsdE5vdGlmaWNhdGlvblR5cGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKApAQCAtNDM3LDE1ICs0NDMsMTYgQEAKICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9NQVhfTlRQX0NBQ0hFX0FHRV9TRUMsIE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyk7CiAKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGljeUNoYW5nZWQgdGVzdGluZz0iICsgdGVzdGluZyArIiwgcGVyaW9kPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiLCB2YWx1ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArICIsIG5vdGVUeXBlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKyBtTWF4TnRwQ2FjaGVBZ2VTZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdmFsdWU9IiArIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3RlVHlwZT0iICsgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1heE50cENhY2hlQWdlU2VjKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZm9yY2UgdXBkYXRlcwotICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQpOwogCiAgICAgICAgICAgICBvblJlc2V0QWxhcm0oKTsKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBsb25nIHBlcmlvZFJ4ID0gbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApOwogICAgICAgICAgICAgbG9uZyBwZXJpb2RUeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKTsKICAgICAgICAgICAgIGxvbmcgdG90YWwgPSBwZXJpb2RSeCArIHBlcmlvZFR4OwotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUG9sbEFsYXJtIC0gcm9hbWluZyA9IiArIHJvYW1pbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVhZCA9IiArIGluY1JlYWQgKyAiLCB3cml0dGVuID0iICsgaW5jV3JpdGUgKyAiLCBuZXcgdG90YWwgPSIgKyB0b3RhbCk7CiAgICAgICAgICAgICB9CkBAIC01MTAsMTEgKzUxNywxMSBAQAogICAgICAgICBwcml2YXRlIHZvaWQgb25JZmFjZVVwKCkgewogICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSB0aHJvdHRsZWQgYmVmb3JlLCBiZSBzdXJlIGFuZCBzZXQgaXQgYWdhaW4gLSB0aGUgaWZhY2Ugd2VudCBkb3duCiAgICAgICAgICAgICAvLyAoYW5kIG1heSBoYXZlIGRpc2FwcGVhcmVkIGFsbCB0b2dldGhlcikgYW5kIHRoZXNlIHNldHRpbmdzIHdlcmUgbG9zdAotICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiZXJyb3Igc2V0dGluZyBUaHJvdHRsZTogIiArIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUyMyw3ICs1MzAsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm90dGxlQW5kUG9zdE5vdGlmaWNhdGlvbihsb25nIGN1cnJlbnRUb3RhbCkgewogICAgICAgICAgICAgLy8gaXMgdGhyb3R0bGluZyBlbmFibGVkPwotICAgICAgICAgICAgaWYgKG1Qb2xpY3lUaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgbG9uZyB0aHJlc2hvbGQgPSBtUG9saWN5VGhyZXNob2xkLmdldCgpOworICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTUzNSwxNSArNTQzLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdGhyb3R0bGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiIGV4Y2VlZGVkISIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIlRocmVzaG9sZCAiICsgdGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSwgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CiAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoVGhyb3R0bGVNYW5hZ2VyLlRIUk9UVExFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKFRocm90dGxlTWFuYWdlci5FWFRSQV9USFJPVFRMRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoYnJvYWRjYXN0KTsKIAogICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBhbHJlYWR5IHVwIQpAQCAtNTc5LDggKzU4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzZWQgPSBub3cgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0gMiptUG9saWN5VGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkLzQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqdGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQvNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLmRyYXdhYmxlLnN0YXRfc3lzX3Rocm90dGxlZCk7CkBAIC02MjUsMTEgKzYzMiw5IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhclRocm90dGxlQW5kTm90aWZpY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4LmdldCgpICE9IFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKSB7CisgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwgLTEsIC0xKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNjg3LDEyICs2OTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBvblJlc2V0QWxhcm0oKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SZXNldEFsYXJtIC0gbGFzdCBwZXJpb2QgaGFkICIgKyBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoMCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyByZWFkIGFuZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFR4KDApICsgIiB3cml0dGVuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoZmFsc2UpOwogCiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSB8fCAobU50cFNlcnZlciA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZCA9IGNhbGN1bGF0ZVBlcmlvZEVuZChub3cpOwpAQCAtNzE5LDIwICs3MjQsMjMgQEAKIAogICAgICAgICAvLyB3aWxsIHRyeSB0byBnZXQgdGhlIG50cCB0aW1lIGFuZCBzd2l0Y2ggdG8gaXQgaWYgZm91bmQuCiAgICAgICAgIC8vIHdpbGwgYWxzbyBjYWNoZSB0aGUgdGltZSBzbyB3ZSBkb24ndCBmZXRjaCBpdCByZXBlYXRlZGx5LgotICAgICAgICBnZXRCZXN0VGltZSgpOworICAgICAgICBnZXRCZXN0VGltZShmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyA9IDYwICogNjAgKiAyNDsgLy8gMSBkYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMTAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVQgPSAyMCAqIDEwMDA7CiAgICAgcHJpdmF0ZSBpbnQgbU1heE50cENhY2hlQWdlU2VjID0gTUFYX05UUF9DQUNIRV9BR0VfU0VDOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHA7CiAgICAgcHJpdmF0ZSBsb25nIGNhY2hlZE50cFRpbWVzdGFtcDsKIAotICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZSgpIHsKKyAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIFVJIGFuZCBBTlIncyBhcmUgYSBkYW5nZXIsIHJlcXVlc3QgYSBmYXN0IHJlc3VsdAorICAgIC8vIHRoZSByZWd1bGFyIHBvbGxpbmcgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIHRpbWUgcmVjZW50bHkgdXNpbmcgdGhlCisgICAgLy8gc2xvd2VyIG1ldGhvZCAoIWZhc3QpCisgICAgcHJpdmF0ZSBsb25nIGdldEJlc3RUaW1lKGJvb2xlYW4gZmFzdCkgewogICAgICAgICBpZiAobU50cFNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSkgewogICAgICAgICAgICAgICAgIGxvbmcgbnRwQWdlID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBjYWNoZWROdHBUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnRwQWdlIDwgbU1heE50cENhY2hlQWdlU2VjICogMTAwMCB8fCBmYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAidXNpbmcgY2FjaGVkIHRpbWUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE50cCArIG50cEFnZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDI1LDM5ICsxMDMzLDU3IEBACiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImRhdGEgZmlsZSBlbXB0eSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyc2VkVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkID0gZGF0YS5zcGxpdCgiOiIpOworICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOworICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggaW5zdWZmaWNpZW50IGxlbmd0aCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgcGVyaW9kQ291bnQ7CisgICAgICAgICAgICBsb25nW10gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICBDYWxlbmRhciBwZXJpb2RFbmQ7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKSAhPSBEQVRBX0ZJTEVfVkVSU0lPTikgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBiYWQgdmVyc2lvbiAtIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBtUGVyaW9kQ291bnQpKSB7CisgICAgICAgICAgICAgICAgcGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBwZXJpb2RDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIGxlbmd0aCAoIiArIHBhcnNlZC5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1KygyKm1QZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1ICsgKDIgKiBwZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW3BlcmlvZENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmlvZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kUnhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFR4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gbmV3IGxvbmdbbVBlcmlvZENvdW50XTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbVBlcmlvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnQuc2V0VGltZUluTWlsbGlzKExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKSk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBkYXRhIGZpbGUgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgeworICAgICAgICAgICAgICAgIG1QZXJpb2RDb3VudCA9IHBlcmlvZENvdW50OworICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGEgPSBwZXJpb2RSeERhdGE7CisgICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IGN1cnJlbnRQZXJpb2Q7CisgICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICAgICAgbVBlcmlvZEVuZCA9IHBlcmlvZEVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDkxLDE1ICsxMTE3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgIHB3LnByaW50bG4oIlRoZSB0aHJlc2hvbGQgaXMgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKworICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKICAgICAgICAgICAgICAgICAiLCBhZnRlciB3aGljaCB5b3UgZXhwZXJpbmNlIHRocm90dGxpbmcgdG8gIiArCi0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgKyAia2JwcyIpOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgImticHMiKTsKICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBwZXJpb2QgaXMgIiArCiAgICAgICAgICAgICAgICAgKG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKSAtIG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKS8xMDAwICsgIiBzZWNvbmRzIGxvbmcgIiArCiAgICAgICAgICAgICAgICAgImFuZCBlbmRzIGluICIgKyAoZ2V0UmVzZXRUaW1lKG1JZmFjZSkgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgLyAxMDAwICsKICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIik7CiAgICAgICAgIHB3LnByaW50bG4oIlBvbGxpbmcgZXZlcnkgIiArIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiBzZWNvbmRzIik7Ci0gICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4KTsKKyAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBUaHJvdHRsZSBJbmRleCBpcyAiICsgbVRocm90dGxlSW5kZXguZ2V0KCkpOwogICAgICAgICBwdy5wcmludGxuKCJNYXggTlRQIENhY2hlIEFnZSBpcyAiICsgbU1heE50cENhY2hlQWdlU2VjKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRlci5nZXRQZXJpb2RDb3VudCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCmluZGV4IGQwOGZlOWIuLjU0NmU1ZjhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtMTQ3LDggKzE0OCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOworCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhQWRkZWQoaW50IGRldmljZUlEKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwLkRldmljZS5nZXRDb250ZW50VXJpKGRldmljZUlEKSk7CisgICAgICAgIExvZy5kKFRBRywgInVzYkNhbWVyYUFkZGVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhUmVtb3ZlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0RFVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0SG9zdFN1cHBvcnQoKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAvLyBUaGlzIHRocmVhZCB3aWxsIGNhbGwgdXMgYmFjayBvbiB1c2JDYW1lcmFBZGRlZCBhbmQgdXNiQ2FtZXJhUmVtb3ZlZC4KKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbmV3IFRocmVhZChudWxsLCBydW5uYWJsZSwgIlVzYk9ic2VydmVyIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICB9CisKICAgICB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1cGRhdGUoKTsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IDUwOWM3ODkuLmI0M2IzM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDE5ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CkBAIC0zOCw2OSArMjgsNjAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKLWltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuSUJhY2t1cE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJhdHRlcnlTdGF0c1NlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiBXaWZpU2VydmljZSBoYW5kbGVzIHJlbW90ZSBXaUZpIG9wZXJhdGlvbiByZXF1ZXN0cyBieSBpbXBsZW1lbnRpbmcKLSAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLiBJdCBhbHNvIGNyZWF0ZXMgYSBXaWZpTW9uaXRvciB0byBsaXN0ZW4KLSAqIGZvciBXaWZpLXJlbGF0ZWQgZXZlbnRzLgorICogdGhlIElXaWZpTWFuYWdlciBpbnRlcmZhY2UuCiAgKgogICogQGhpZGUKICAqLworLy9UT0RPOiBDbGVhbiB1cCBtdWx0aXBsZSBsb2NrcyBhbmQgaW1wbGVtZW50IFdpZmlTZXJ2aWNlCisvLyBhcyBhIFNNIHRvIHRyYWNrIHNvZnQgQVAvY2xpZW50L2FkaG9jIGJyaW5nIHVwIGJhc2VkCisvLyBvbiBkZXZpY2UgaWRsZSBzdGF0ZSwgYWlycGxhbmUgbW9kZSBhbmQgYm9vdC4KKwogcHVibGljIGNsYXNzIFdpZmlTZXJ2aWNlIGV4dGVuZHMgSVdpZmlNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGludCBtV2lmaUFwU3RhdGU7CiAKICAgICBwcml2YXRlIEFsYXJtTWFuYWdlciBtQWxhcm1NYW5hZ2VyOwogICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSWRsZUludGVudDsKQEAgLTEwOSwxMCArOTAsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtRGV2aWNlSWRsZTsKICAgICBwcml2YXRlIGludCBtUGx1Z2dlZFR5cGU7CiAKLSAgICBwcml2YXRlIGVudW0gRHJpdmVyQWN0aW9uIHtEUklWRVJfVU5MT0FELCBOT19EUklWRVJfVU5MT0FEfTsKLQogICAgIC8vIHRydWUgaWYgdGhlIHVzZXIgZW5hYmxlZCBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKICAgICBwcml2YXRlIGZpbmFsIExvY2tMaXN0IG1Mb2NrcyA9IG5ldyBMb2NrTGlzdCgpOwogICAgIC8vIHNvbWUgd2lmaSBsb2NrIHN0YXRpc3RpY3MKQEAgLTEyOCw5ICsxMDcsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CiAKLSAgICBwcml2YXRlIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbndTZXJ2aWNlOwogICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOwotICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtV2lmaVJlZ2V4czsKIAogICAgIC8qKgpAQCAtMTQyLDYwICsxMTksNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9JRExFX01JTExJUyA9IDE1ICogNjAgKiAxMDAwOyAvKiAxNSBtaW51dGVzICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FLRUxPQ0tfVEFHID0gIldpZmlTZXJ2aWNlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIGhvbGQgdGhlIHdha2UgbG9jayBhZnRlciBhIGRpc2Nvbm5lY3QKLSAgICAgKiBjYXVzZWQgYnkgc3RvcHBpbmcgdGhlIGRyaXZlci4gRXN0YWJsaXNoaW5nIGFuIEVER0UgY29ubmVjdGlvbiBoYXMgYmVlbgotICAgICAqIG9ic2VydmVkIHRvIHRha2UgYWJvdXQgNSBzZWNvbmRzIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBUaGlzCi0gICAgICogcHJvdmlkZXMgYSBiaXQgb2YgZXh0cmEgbWFyZ2luLgotICAgICAqIDxwPgotICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUjV0lGSV9NT0JJTEVfREFUQV9UUkFOU0lUSU9OX1dBS0VMT0NLX1RJTUVPVVRfTVN9LgotICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBTZXR0aW5ncy5TZWN1cmUgdmFsdWUgaXMgbm90IHByZXNlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0FLRUxPQ0tfVElNRU9VVCA9IDgwMDA7Ci0KLSAgICAvLyBXYWtlIGxvY2sgdXNlZCBieSBkcml2ZXItc3RvcCBvcGVyYXRpb24KLSAgICBwcml2YXRlIHN0YXRpYyBQb3dlck1hbmFnZXIuV2FrZUxvY2sgc0RyaXZlclN0b3BXYWtlTG9jazsKLSAgICAvLyBXYWtlIGxvY2sgdXNlZCBieSBvdGhlciBvcGVyYXRpb25zCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNXYWtlTG9jazsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0VOQUJMRV9XSUZJICAgICAgICA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRElTQUJMRV9XSUZJICAgICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVE9QX1dJRkkgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUQVJUX1dJRkkgICAgICAgICA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSyAgID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9VUERBVEVfU1RBVEUgICAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVCA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9BQ0NFU1NfUE9JTlQgID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfQ0hBTk5FTFMgICAgICAgPSA4OwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMDUsNDcgKzEyOCw4MCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisKKyAgICBXaWZpU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHRyYWNrZXI7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZSA9IG5ldyBXaWZpU3RhdGVNYWNoaW5lKG1Db250ZXh0KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7CiAgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBCYXR0ZXJ5U3RhdHNTZXJ2aWNlLmdldFNlcnZpY2UoKTsKIAotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7Ci0gICAgICAgIG53U2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKLQotICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKLSAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCi0gICAgICAgICAgICAgICAgICogZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIHdpZmlUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiV2lmaVNlcnZpY2UiKTsKLSAgICAgICAgd2lmaVRocmVhZC5zdGFydCgpOwotICAgICAgICBtV2lmaUhhbmRsZXIgPSBuZXcgV2lmaUhhbmRsZXIod2lmaVRocmVhZC5nZXRMb29wZXIoKSk7Ci0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRElTQUJMRUQpOwotICAgICAgICBtV2lmaUFwU3RhdGUgPSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCiAgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKICAgICAgICAgSW50ZW50IGlkbGVJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9ERVZJQ0VfSURMRSwgbnVsbCk7CiAgICAgICAgIG1JZGxlSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIElETEVfUkVRVUVTVCwgaWRsZUludGVudCwgMCk7CiAKLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwotICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKKyAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7CisgICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKAogICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91ciBmbGFnIGluZGljYXRpbmcgdGhlIHVzZXIgaGFzIG92ZXJ3cmlkZGVuIGFpcnBsYW5lIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhaXJwbGFuZSBkaXNhYmxlLCByZXN0b3JlIFdpZmkgaWYgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBzbwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FpcnBsYW5lTW9kZU9uKCkgJiYgdGVzdEFuZENsZWFyV2lmaVNhdmVkU3RhdGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZCh0cnVlKTsKQEAgLTI2MCwxNCArMjE2LDUwIEBACiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewogCi0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQVZBSUxBQkxFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZShhdmFpbGFibGUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF2YWlsYWJsZSA9IGludGVudC5nZXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BQ1RJVkVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSxuZXcgSW50ZW50RmlsdGVyKENvbm5lY3Rpdml0eU1hbmFnZXIuQUNUSU9OX1RFVEhFUl9TVEFURV9DSEFOR0VEKSk7CisKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTik7CisKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0ICYgY2xlYXIgbm90aWZpY2F0aW9uIG9uIGFueSB3aWZpIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhIG5ldHdvcmsgY29ubmVjdCAmIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgZmlsdGVyKTsKKworICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKKyAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzYsNyArMjY4LDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGF0IGJvb3QgdGltZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFN0YXJ0V2lmaSgpIHsKICAgICAgICAgLyogU3RhcnQgaWYgV2ktRmkgaXMgZW5hYmxlZCBvciB0aGUgc2F2ZWQgc3RhdGUgaW5kaWNhdGVzIFdpLUZpIHdhcyBvbiAqLwogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gIWlzQWlycGxhbmVNb2RlT24oKQogICAgICAgICAgICAgICAgICYmIChnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpIHx8IHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpOwpAQCAtMjkzLDcgKzI4NSwxMCBAQAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIAotICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKwogICAgICAgICBtV2lmaVJlZ2V4cyA9IG1DbS5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGludGYgOiBhdmFpbGFibGUpIHsKQEAgLTMxMywxNyArMzA4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlICIgKyBpbnRmICsgIiwgOiIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZChudWxsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZihtQ20udGV0aGVyKGludGYpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nIG9uICIgKyBpbnRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTM1OSwxOCArMzUxLDEzIEBACiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoY3IsIFNldHRpbmdzLlNlY3VyZS5XSUZJX09OLCBlbmFibGVkID8gMSA6IDApOwogICAgIH0KIAotICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgZ2V0TmV0d29ya1N0YXRlVHJhY2tlcigpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNwaW5nU3VwcGxpY2FudCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHBpbmdTdXBwbGljYW50KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5waW5nKCk7CisgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5waW5nU3VwcGxpY2FudCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzc5LDE3MCArMzY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHN3aXRjaCAobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0U3VwcGxpY2FudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKLSAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6Ci0gICAgICAgICAgICBjYXNlIERPUk1BTlQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5SZXN1bHRIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIuU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zY2FuKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc2V0V2lmaUVuYWJsZWQoYm9vbGVhbil9Ci0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlLCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuYWJsZS9kaXNhYmxlIG9wZXJhdGlvbiB3YXMKLSAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlciBtYXkgbm90IGhhdmUgV0FLRV9MT0NLIHBlcm1pc3Npb24gLSBpdCdzIG5vdCByZXF1aXJlZCBoZXJlCi0gICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQotICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSk7Ci0gICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShlbmFibGUsIHRydWUsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBzeW5jaHJvbm91c2x5LgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIHR1cm4gV2ktRmkgb24sIHtAY29kZSBmYWxzZX0gdG8gdHVybiBpdCBvZmYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSBwZXJzaXN0ZWQuCi0gICAgICogQHBhcmFtIHVpZCBUaGUgVUlEIG9mIHRoZSBwcm9jZXNzIG1ha2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBmaW5hbCBpbnQgZXZlbnR1YWxXaWZpU3RhdGUgPSBlbmFibGUgPyBXSUZJX1NUQVRFX0VOQUJMRUQgOiBXSUZJX1NUQVRFX0RJU0FCTEVEOwotICAgICAgICBmaW5hbCBpbnQgd2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBldmVudHVhbFdpZmlTdGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE11bHRpcGxlIGNhbGxzIHRvIHVucmVnaXN0ZXJSZWNlaXZlcigpIGNhdXNlIGV4Y2VwdGlvbiBhbmQgYSBzeXN0ZW0gY3Jhc2guCi0gICAgICAgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHN1cHBsaWNhbnQgaXMgbG9zdCAob3IgZmlybXdhcmUgY3Jhc2ggb2NjdXJzKSBhbmQgdXNlciBpbmRpY2F0ZXMKLSAgICAgICAgICogZGlzYWJsZSB3aWZpIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgICAqIEF2b2lkIGRvaW5nIGEgZGlzYWJsZSB3aGVuIHRoZSBjdXJyZW50IFdpZmkgc3RhdGUgaXMgVU5LTk9XTgotICAgICAgICAgKiBUT0RPOiBIYW5kbGUgZHJpdmVyIGxvYWQgZmFpbCBhbmQgc3VwcGxpY2FudCBsb3N0IGFzIHNlcGVyYXRlIHN0YXRlcwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9VTktOT1dOKSAmJiAhZW5hYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBXaWZpIGlmIEFQIGlzIGVuYWJsZWQKLSAgICAgICAgICogVE9ETzogRGVwcmVjYXRlIFdJRklfU1RBVEVfVU5LTk9XTiBhbmQgcmVuYW1lIGl0Ci0gICAgICAgICAqIFdJRklfU1RBVEVfRkFJTEVECi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxJTkcgOiBXSUZJX1NUQVRFX0RJU0FCTElORywgdWlkKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBXaS1GaSBkcml2ZXIuIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdGFydFN1cHBsaWNhbnQoKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpOwotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0RXZlbnRMb29wKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gKGl0IHdpbGwgbm8tb3AgaWYgaXQgaXNuJ3QgdmlzaWJsZSkKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdG9wU3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdG9wIHN1cHBsaWNhbnQgZGFlbW9uLiIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgKiBiZWZvcmUgd2UgdW5sb2FkIHRoZSBkcml2ZXIKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gdW5sb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWNjZXNzIQotCi0gICAgICAgIGlmIChwZXJzaXN0KSB7Ci0gICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGV2ZW50dWFsV2lmaVN0YXRlLCB1aWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUVuYWJsZWRTdGF0ZShpbnQgd2lmaVN0YXRlLCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpOwotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKHVpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZih1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZSh3aWZpU3RhdGUpOwotCi0gICAgICAgIC8vIEJyb2FkY2FzdAotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLCB3aWZpU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9TVEFURSwgcHJldmlvdXNXaWZpU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFNjYW4oZm9yY2VBY3RpdmUpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpIHsKQEAgLTU2Myw2ICszODcsNDAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc2V0V2lmaUVuYWJsZWQoYm9vbGVhbil9CisgICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlLCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuYWJsZS9kaXNhYmxlIG9wZXJhdGlvbiB3YXMKKyAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdpZmlFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludm9raW5nIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBhIGZsYWcgaWYgdGhlIHVzZXIgaXMgZW5hYmxpbmcgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCisgICAgICAgIGlmIChlbmFibGUgJiYgaXNBaXJwbGFuZU1vZGVPbigpICYmIGlzQWlycGxhbmVUb2dnbGVhYmxlKCkpIHsKKyAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbi5zZXQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZChlbmFibGUpOworICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKworICAgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgICBpZiAoIW1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yQnJvYWRjYXN0cygpOworICAgICAgICAgICAgICAgIG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUlzUmVjZWl2ZXJSZWdpc3RlcmVkKXsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIpOworICAgICAgICAgICAgbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlTdGF0ZSgpfQogICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTEVEfSwKICAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTElOR30sCkBAIC01NzIsNjYgKzQzMCw1MyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0V2lmaUVuYWJsZWRTdGF0ZSgpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNkaXNjb25uZWN0KCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVjb25uZWN0KCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVjb25uZWN0Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWFzc29jaWF0ZSgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLmdldFdpZmlTdGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpQXBFbmFibGVkKFdpZmlDb25maWd1cmF0aW9uLCBib29sZWFuKX0KICAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBTU0lELCBzZWN1cml0eSBhbmQgY2hhbm5lbCBkZXRhaWxzIGFzCiAgICAgICogICAgICAgIHBhcnQgb2YgV2lmaUNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCwgdHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdGFydCBvcGVyYXRpb24gd2FzCiAgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0KLSAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0KLSAgICAgICAgICAgIG1MYXN0QXBFbmFibGVVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShlbmFibGVkLCB3aWZpQ29uZmlnLCBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KKyAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFdpZmlBcENvbmZpZ3VyYXRpb24od2lmaUNvbmZpZyk7CiAgICAgICAgIH0KIAorICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKHdpZmlDb25maWcsIGVuYWJsZWQpOworCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaUFwU3RhdGUoKX0KKyAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9GQUlMRUR9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5nZXRXaWZpQXBTdGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpfQorICAgICAqIEByZXR1cm4gc29mdCBhY2Nlc3MgcG9pbnQgY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaW50IGF1dGhUeXBlOwpAQCAtNjQ5LDcgKzQ5NCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNzZXRXaWZpQXBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uKX0KKyAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBXaWZpQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciBzb2Z0IGFjY2VzcyBwb2ludAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRXaWZpQXBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAgICAgICAgIGJvb2xlYW4gaXNXcGE7CkBAIC02NjUsMTQzICs1MTQsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzL2Rpc2FibGVzIFdpLUZpIEFQIHN5bmNocm9ub3VzbHkuIFRoZSBkcml2ZXIgaXMgbG9hZGVkCi0gICAgICogYW5kIHNvZnQgYWNjZXNzIHBvaW50IGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgb3BlcmF0aW9uLgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIHR1cm4gV2ktRmkgb24sIHtAY29kZSBmYWxzZX0gdG8gdHVybiBpdCBvZmYuCi0gICAgICogQHBhcmFtIHVpZCBUaGUgVUlEIG9mIHRoZSBwcm9jZXNzIG1ha2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBUaGUgV2lmaUNvbmZpZ3VyYXRpb24gZm9yIEFQCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyAob3IgaWYgdGhlIGV4aXN0aW5nIHN0YXRlCi0gICAgICogICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgcmVxdWVzdGVkIHN0YXRlKQorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNkaXNjb25uZWN0KCl9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKLSAgICAgICAgZmluYWwgaW50IGV2ZW50dWFsV2lmaUFwU3RhdGUgPSBlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgOiBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCi0gICAgICAgIGlmIChtV2lmaUFwU3RhdGUgPT0gZXZlbnR1YWxXaWZpQXBTdGF0ZSkgewotICAgICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBjaGFuZ2VkIG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmKGVuYWJsZSAmJiAod2lmaUNvbmZpZyAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCh3aWZpQ29uZmlnLCBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBBUCByZXN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIEFQIGlmIFdpZmkgaXMgZW5hYmxlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0KLSAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KLSAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdGFydEFjY2Vzc1BvaW50KCkiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBXaS1GaSBkcml2ZXIgZm9yIEFQIG1vZGUiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLk5PX0RSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShldmVudHVhbFdpZmlBcFN0YXRlLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLmRpc2Nvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBTdGF0ZSgpfQotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVjb25uZWN0KCl9CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0V2lmaUFwRW5hYmxlZFN0YXRlKCkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICByZXR1cm4gbVdpZmlBcFN0YXRlOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKGludCB3aWZpQVBTdGF0ZSwgaW50IHVpZCwgRHJpdmVyQWN0aW9uIGZsYWcpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVubG9hZCB0aGUgZHJpdmVyIGlmIGdvaW5nIHRvIGEgZmFpbGVkIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0ZBSUxFRCkgJiYgKGZsYWcgPT0gRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpQVBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYodWlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQotICAgICAgICBtV2lmaUFwU3RhdGUgPSB3aWZpQVBTdGF0ZTsKLQotICAgICAgICAvLyBCcm9hZGNhc3QKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFQU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5yZWFzc29jaWF0ZUNvbW1hbmQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgxMCwyMTcgKzU0Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgU3RyaW5nIGxpc3RTdHI7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgZG9uJ3QgY2FjaGUgdGhlIGxpc3QsIGJlY2F1c2Ugd2Ugd2FudCB0byBhbGxvdwotICAgICAgICAgKiBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAgICAgKiBoYXMgYmVlbiBtb2RpZmllZCB0aHJvdWdoIHNvbWUgZXh0ZXJuYWwgbWVhbnMsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIHdwYV9jbGkgY29tbWFuZCBsaW5lIHByb2dyYW0uCi0gICAgICAgICAqLwotICAgICAgICBsaXN0U3RyID0gbVdpZmlTdGF0ZVRyYWNrZXIubGlzdE5ldHdvcmtzKCk7Ci0KLSAgICAgICAgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxXaWZpQ29uZmlndXJhdGlvbj4oKTsKLSAgICAgICAgaWYgKGxpc3RTdHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXR3b3JrczsKLQotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IGxpc3RTdHIuc3BsaXQoIlxuIik7Ci0gICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgaGVhZGVyCi0gICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBsaW5lc1tpXS5zcGxpdCgiXHQiKTsKLSAgICAgICAgICAgLy8gbmV0d29yay1pZCB8IHNzaWQgfCBic3NpZCB8IGZsYWdzCi0gICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzBdKTsKLSAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAzKSB7Ci0gICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltDVVJSRU5UXSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuQ1VSUkVOVDsKLSAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbRElTQUJMRURdIikgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgcmVhZE5ldHdvcmtWYXJpYWJsZXMoY29uZmlnKTsKLSAgICAgICAgICAgbmV0d29ya3MuYWRkKGNvbmZpZyk7Ci0gICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXR3b3JrczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgc3VwcGxpY2FudCBkYWVtb24gdGhhdCBhcmUgbmVlZGVkIHRvCi0gICAgICogZmlsbCBpbiB0aGUgV2lmaUNvbmZpZ3VyYXRpb24gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgc3luY2hyb25pemF0aW9uIG1vbml0b3IuCi0gICAgICogQHBhcmFtIGNvbmZpZyB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QgdG8gYmUgZmlsbGVkIGluLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkTmV0d29ya1ZhcmlhYmxlcyhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOwotICAgICAgICBpZiAobmV0SWQgPCAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86IG1heWJlIHNob3VsZCBoYXZlIGEgbmF0aXZlIG1ldGhvZCB0aGF0IHRha2VzIGFuIGFycmF5IG9mCi0gICAgICAgICAqIHZhcmlhYmxlIG5hbWVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcy4gQnV0IHdlJ2Qgc3RpbGwKLSAgICAgICAgICogYmUgZG9pbmcgYSByb3VuZCB0cmlwIHRvIHRoZSBzdXBwbGljYW50IGRhZW1vbiBmb3IgZWFjaCB2YXJpYWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uc3NpZFZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgY29uZmlnLlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcuQlNTSUQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSk7Ci0gICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IC0xOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcucHJpb3JpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSk7Ci0gICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gZmFsc2U7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgIT0gMDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUpOwotICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IC0xOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHVwIHRvIDQgV0VQIGtleXMuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGtleXMgYXJlIG5vdCBwYXNzZWQgYmFjaywKLSAgICAgICAgICoganVzdCBhICIqIiBpZiB0aGUga2V5IGlzIHNldCwgb3IgdGhlIG51bGwgc3RyaW5nIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0pOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIHByaXZhdGUgc2hhcmVkIGtleS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwga2V5cyBhcmUgbm90IHBhc3NlZCBiYWNrLAotICAgICAgICAgKiBqdXN0IGEgIioiIGlmIHRoZSBrZXkgaXMgc2V0LCBvciB0aGUgbnVsbCBzdHJpbmcgb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkIDoKLSAgICAgICAgICAgICAgICBjb25maWcuZW50ZXJwcmlzZUZpZWxkcykgewotICAgICAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhck5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB2YWx1ZSA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZmllbGQuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZURvdWJsZVF1b3RlcyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPD0gMikgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygxLCBzdHJpbmcubGVuZ3RoKCkgLSAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUXVvdGVkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuICJcIiIgKyBzdHJpbmcgKyAiXCIiOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDMwLDI4MCArNTU2LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5Ci0gICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAotICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gbmV0SWQgPT0gLTE7Ci0gICAgICAgIGJvb2xlYW4gZG9SZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAvLyBuZXR3b3JrSWQgb2YgLTEgbWVhbnMgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbmV0d29yawotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgICAgIG5ldElkID0gbVdpZmlTdGF0ZVRyYWNrZXIuYWRkTmV0d29yaygpOwotICAgICAgICAgICAgICAgIGlmIChuZXRJZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9SZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gbU5lZWRSZWNvbmZpZyB8fCBkb1JlY29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTm90ZSB0aGF0IGlmIGEgbmV0d29ya0lkIGZvciBhIG5vbi1leGlzdGVudCBuZXR3b3JrCi0gICAgICAgICAgICAgKiB3YXMgc3VwcGxpZWQsIHRoZW4gdGhlIGZpcnN0IHNldE5ldHdvcmtWYXJpYWJsZSgpCi0gICAgICAgICAgICAgKiB3aWxsIGZhaWwsIHNvIHdlIGRvbid0IGJvdGhlciB0byBtYWtlIGEgc2VwYXJhdGUgY2hlY2sKLSAgICAgICAgICAgICAqIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIElEIHVwIGZyb250LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5CU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5CU1NJRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IEJTU0lEOiAiK2NvbmZpZy5CU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFByb3RvY29scy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwcm90bzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcGFpcndpc2U6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAotICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX2tleSIraSsiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWRkZW5TU0lEICYmICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcuaGlkZGVuU1NJRCA/IDEgOiAwKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBoaWRkZW5TU0lEOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAotICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgYW4gdXBkYXRlLCBpZiBvbmUgb2YgdGhlIHNldE5ldHdvcmtWYXJpYWJsZSBvcGVyYXRpb25zIGZhaWxzLAotICAgICAgICAgKiB3ZSBtaWdodCB3YW50IHRvIHJvbGwgYmFjayBhbGwgdGhlIGNoYW5nZXMgYWxyZWFkeSBtYWRlLiBCdXQgdGhlCi0gICAgICAgICAqIGNoYW5jZXMgYXJlIHRoYXQgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8gZ28gd3JvbmcsIGl0J2xsIGhhcHBlbgotICAgICAgICAgKiB0aGUgZmlyc3QgdGltZSB3ZSB0cnkgdG8gc2V0IG9uZSBvZiB0aGUgdmFyaWFibGVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKLSAgICAgICAgICAgIHJlbW92ZU5ldHdvcmsobmV0SWQpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuYWRkT3JVcGRhdGVOZXR3b3JrKGNvbmZpZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKLSAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KLSAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7Ci0KLSAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQotICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCi0gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCi0gICAgICAgICAgICAvLyB2YWx1ZSB0byBXaWZpQ29uZmlndXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncwotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAotICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCB0byBsb29rLXVwIGEgc3RyaW5nOiAiICsgc3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlbW92ZU5ldHdvcmsoaW50KX0KICAgICAgKiBAcGFyYW0gbmV0SWQgdGhlIGludGVnZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24KICAgICAgKiB0byB0aGUgc3VwcGxpY2FudApAQCAtMTMxMSw4ICs1NjcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUucmVtb3ZlTmV0d29yayhuZXRJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzI0LDE0ICs1NzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICBTdHJpbmcgaWZuYW1lID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpOwotICAgICAgICBOZXR3b3JrVXRpbHMuZW5hYmxlSW50ZXJmYWNlKGlmbmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlTmV0d29yayhuZXRJZCwgZGlzYWJsZU90aGVycyk7Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShpZm5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5lbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNDIsOCArNTkwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzYWJsZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuZGlzYWJsZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1Niw3ICs2MDMsNyBAQAogICAgICAgICAgKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLCBieSBzZW5kaW5nCiAgICAgICAgICAqIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHN1cHBsaWNhbnQuCiAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5yZXF1ZXN0Q29ubmVjdGlvbkluZm8oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNjYsMTgwICs2MTMsMTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0cygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgU3RyaW5nIHJlcGx5OwotCi0gICAgICAgIHJlcGx5ID0gbVdpZmlTdGF0ZVRyYWNrZXIuc2NhblJlc3VsdHMoKTsKLSAgICAgICAgaWYgKHJlcGx5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKLQotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLQotICAgICAgICBpbnQgcmVwbHlMZW4gPSByZXBseS5sZW5ndGgoKTsKLSAgICAgICAgLy8gUGFyc2UgdGhlIHJlc3VsdCBzdHJpbmcsIGtlZXBpbmcgaW4gbWluZCB0aGF0IHRoZSBsYXN0IGxpbmUgZG9lcwotICAgICAgICAvLyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgotICAgICAgICBmb3IgKGludCBsaW5lQmVnID0gMCwgbGluZUVuZCA9IDA7IGxpbmVFbmQgPD0gcmVwbHlMZW47ICsrbGluZUVuZCkgewotICAgICAgICAgICAgaWYgKGxpbmVFbmQgPT0gcmVwbHlMZW4gfHwgcmVwbHkuY2hhckF0KGxpbmVFbmQpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICArK2xpbmVDb3VudDsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNraXAgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgaGVhZGVyCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVCZWcgPSBsaW5lRW5kICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsaW5lRW5kID4gbGluZUJlZykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlcGx5LnN1YnN0cmluZyhsaW5lQmVnLCBsaW5lRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gcGFyc2VTY2FuUmVzdWx0KGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuTGlzdC5hZGQoc2NhblJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAibWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IGZvcjogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVCZWcgPSBsaW5lRW5kICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRTY2FuUmVzdWx0c0xpc3Qoc2Nhbkxpc3QpOwotICAgICAgICByZXR1cm4gc2Nhbkxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIHNjYW4gcmVzdWx0IGxpbmUgcGFzc2VkIHRvIHVzIGJ5IHdwYV9zdXBwbGljYW50IChoZWxwZXIpLgotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIHBhcnNlCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFNjYW5SZXN1bHR9IG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgU2NhblJlc3VsdCBwYXJzZVNjYW5SZXN1bHQoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENhY2hlIGltcGxlbWVudGF0aW9uIChMaW5rZWRIYXNoTWFwKSBpcyBub3Qgc3luY2hyb25pemVkLCB0aHVzLAotICAgICAgICAgICAgICogbXVzdCBzeW5jaHJvbml6ZWQgaGVyZSEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtU2NhblJlc3VsdENhY2hlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gc2NhblJlc3VsdFBhdHRlcm4uc3BsaXQobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKDMgPD0gcmVzdWx0Lmxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDw9IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJzc2lkID0gcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCB8IGZyZXF1ZW5jeSB8IGxldmVsIHwgZmxhZ3MgfCBzc2lkCi0gICAgICAgICAgICAgICAgICAgIGludCBmcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IDApIGxldmVsIC09IDI1NjsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgZm9ybWF0dGluZyBvZiB0aGUgcmVzdWx0cyByZXR1cm5lZCBieQotICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCBpcyBpbnRlbmRlZCB0byBtYWtlIHRoZSBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICogbGluZSB1cCBuaWNlbHkgd2hlbiBwcmludGVkLAotICAgICAgICAgICAgICAgICAgICAgKiBub3QgdG8gbWFrZSB0aGVtIGVhc3kgdG8gcGFyc2UuIFNvIHdlIGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgc29tZSBoZXVyaXN0aWNzIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICogaXMgdGhlIFNTSUQgYW5kIHdoaWNoIGZpZWxkIGlzIHRoZSBmbGFncy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzc2lkOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uY2hhckF0KDApID09ICdbJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gcmVzdWx0WzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggPT0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gcmVzdWx0WzRdOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgbXVzdCBoYXZlIDMgZmllbGRzOiBubyBmbGFncyBhbmQgc3NpZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgKyBzc2lkIGlzIHRoZSBoYXNoIGtleQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYnNzaWQgKyBzc2lkOwotICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0gbVNjYW5SZXN1bHRDYWNoZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5sZXZlbCA9IGxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5TU0lEID0gc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuY2FwYWJpbGl0aWVzID0gZmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgc2NhbiByZXN1bHRzIHRoYXQgaGF2ZSBubyBTU0lEIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBzc2lkLnRyaW0oKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2NhblJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQsIGJzc2lkLCBmbGFncywgbGV2ZWwsIGZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjYW5SZXN1bHRDYWNoZS5wdXQoa2V5LCBzY2FuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgdGV4dCB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgIiBmaWVsZHM6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2NhblJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgImZsYWdzIiBmaWVsZCBwYXNzZWQgYmFjayBpbiBhIHNjYW4gcmVzdWx0IGJ5IHdwYV9zdXBwbGljYW50LAotICAgICAqIGFuZCBjb25zdHJ1Y3QgYSB7QGNvZGUgV2lmaUNvbmZpZ3VyYXRpb259IHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNyeXB0aW9uLAotICAgICAqIGtleSBtYW5hZ2VtZW50LCBhbmQgYXV0aGVudGljYWlvbiBjYXBhYmlsaXRpZXMgb2YgdGhlIGFjY2VzcyBwb2ludC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIHN0cmluZyByZXR1cm5lZCBieSB3cGFfc3VwcGxpY2FudAotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LCBmaWxsZWQgaW4KLSAgICAgKi8KLSAgICBXaWZpQ29uZmlndXJhdGlvbiBwYXJzZVNjYW5GbGFncyhTdHJpbmcgZmxhZ3MpIHsKLSAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGZsYWdzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5OT05FKTsKLSAgICAgICAgfQotICAgICAgICAvLyAuLi4gdG8gYmUgaW1wbGVtZW50ZWQKLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLmdldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIHN1cHBsaWNhbnQgdG8gcGVyc2lzdCB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaVN0YXRlVHJhY2tlcikgewotICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIuc2F2ZUNvbmZpZygpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBtTmVlZFJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgbU5lZWRSZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLnJlbG9hZENvbmZpZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCi0gICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7Ci0gICAgICAgIGlmIChpYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc2F2ZUNvbmZpZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1NCw3ICs2NDAsNyBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAogICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBTbG9nLmkoVEFHLCAiV2lmaVNlcnZpY2UgdHJ5aW5nIHRvIHNldE51bUFsbG93ZWQgdG8gIitudW1DaGFubmVscysKICAgICAgICAgICAgICAgICAiIHdpdGggcGVyc2lzdCBzZXQgdG8gIitwZXJzaXN0KTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTE1NzYsMjggKzY2MiwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfU0VUX0NIQU5ORUxTLCBudW1DaGFubmVscywgKHBlcnNpc3QgPyAxIDogMCkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBzeW5jaHJvbm91c2x5Ci0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSByZW1lbWJlcmVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CiAgICAgICAgIGlmIChwZXJzaXN0KSB7CiAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUywKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldE51bUFsbG93ZWRDaGFubmVscyhudW1DaGFubmVscyk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjE1LDcgKzY4OCw3IEBACiAgICAgICAgICAqIFdpLUZpIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZCksIGdldCB0aGUgdmFsdWUgZnJvbQogICAgICAgICAgKiBTZXR0aW5ncy4KICAgICAgICAgICovCi0gICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisgICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CiAgICAgICAgIGlmIChudW1DaGFubmVscyA8IDApIHsKICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCkBAIC0xNjQxLDkgKzcxNCw1OSBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmdldERoY3BJbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5nZXREaGNwSW5mbygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzdGFydFdpZml9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdpZmkoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIC8qIFRPRE86IG1heSBiZSBhZGQgcGVybWlzc2lvbnMgZm9yIGFjY2VzcyBvbmx5IHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlCisgICAgICAgICAqIFRPRE86IGlmIGEgc3RhcnQgaXNzdWVkLCBrZWVwIHdpZmkgYWxpdmUgdW50aWwgYSBzdG9wIGlzc3VlZCBpcnJlc3BlY3RpdmUKKyAgICAgICAgICogb2YgV2lmaUxvY2sgJiBkZXZpY2UgaWRsZSBzdGF0dXMgdW5sZXNzIHdpZmkgZW5hYmxlZCBzdGF0dXMgaXMgdG9nZ2xlZAorICAgICAgICAgKi8KKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydCh0cnVlKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzdG9wV2lmaX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BXaWZpKCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICAvKiBUT0RPOiBtYXkgYmUgYWRkIHBlcm1pc3Npb25zIGZvciBhY2Nlc3Mgb25seSB0byBjb25uZWN0aXZpdHkgc2VydmljZQorICAgICAgICAgKiBUT0RPOiBpZiBhIHN0b3AgaXMgaXNzdWVkLCB3aWZpIGlzIGJyb3VnaHQgdXAgb25seSBieSBzdGFydFdpZmkKKyAgICAgICAgICogdW5sZXNzIHdpZmkgZW5hYmxlZCBzdGF0dXMgaXMgdG9nZ2xlZAorICAgICAgICAgKi8KKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQoZmFsc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2FkZFRvQmxhY2tsaXN0fQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuYWRkVG9CbGFja2xpc3QoYnNzaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNjbGVhckJsYWNrbGlzdH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxhY2tsaXN0KCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgfQorCisKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKQEAgLTE2NjAsMTEgKzc4MywxMSBAQAogICAgICAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1JZGxlSW50ZW50KTsKICAgICAgICAgICAgICAgICBtRGV2aWNlSWRsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1TY3JlZW5PZmYgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkFDVElPTl9TQ1JFRU5fT0ZGIik7CiAgICAgICAgICAgICAgICAgbVNjcmVlbk9mZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKGZhbHNlKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCBhIHRpbWVyIHRvIHB1dCBXaS1GaSB0byBzbGVlcCwgYnV0IG9ubHkgaWYgdGhlIHNjcmVlbiBpcyBvZmYKICAgICAgICAgICAgICAgICAgKiBBTkQgdGhlICJzdGF5IG9uIHdoaWxlIHBsdWdnZWQgaW4iIHNldHRpbmcgZG9lc24ndCBtYXRjaCB0aGUKQEAgLTE2NzIsMTEgKzc5NSwxMSBAQAogICAgICAgICAgICAgICAgICAqIG9yIHBsdWdnZWQgaW4gdG8gQUMpLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmICghc2hvdWxkV2lmaVN0YXlBd2FrZShzdGF5QXdha2VDb25kaXRpb25zLCBtUGx1Z2dlZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdpZmlJbmZvIGluZm8gPSBtV2lmaVN0YXRlVHJhY2tlci5yZXF1ZXN0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVNYWNoaW5lLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTcyMyw3ICs4NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc3NSwzMSArODk4LDkgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU1lc3NhZ2UoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5hYmxlID8gTUVTU0FHRV9FTkFCTEVfV0lGSSA6IE1FU1NBR0VfRElTQUJMRV9XSUZJKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVyc2lzdCA/IDEgOiAwKSwgdWlkKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kU3RhcnRNZXNzYWdlKGJvb2xlYW4gc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwgTUVTU0FHRV9TVEFSVF9XSUZJLCBzY2FuT25seU1vZGUgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoYm9vbGVhbiBlbmFibGUsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcsIGludCB1aWQpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIChlbmFibGUgPyBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVCA6IE1FU1NBR0VfU1RPUF9BQ0NFU1NfUE9JTlQpLAotICAgICAgICAgICAgICAgIHVpZCwgMCwgd2lmaUNvbmZpZykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZmlTdGF0ZSgpIHsKLSAgICAgICAgLy8gc2VuZCBhIG1lc3NhZ2Ugc28gaXQncyBhbGwgc2VyaWFsaXplZAotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfVVBEQVRFX1NUQVRFLCAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9VcGRhdGVXaWZpU3RhdGUoKSB7CiAgICAgICAgIGJvb2xlYW4gd2lmaUVuYWJsZWQgPSBnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOwogICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7CiAgICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZTsKICAgICAgICAgYm9vbGVhbiB3aWZpU2hvdWxkQmVFbmFibGVkID0gd2lmaUVuYWJsZWQgJiYgIWFpcnBsYW5lTW9kZTsKQEAgLTE4MTAsNDMgKzkxMSwyMyBAQAogICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoKG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpID09IFdJRklfU1RBVEVfRU5BQkxJTkcpICYmICFhaXJwbGFuZU1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCisgICAgICAgIGlmIChhaXJwbGFuZU1vZGUpIHsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCi0gICAgICAgICAgICBpZiAoYWlycGxhbmVNb2RlICYmCi0gICAgICAgICAgICAgICAgKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIHx8IG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpKSB7Ci0gICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGZhbHNlLCBudWxsLCBtTGFzdEFwRW5hYmxlVWlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZSh0cnVlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kU3RhcnRNZXNzYWdlKHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB3YWtlTG9ja1RpbWVvdXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01PQklMRV9EQVRBX1RSQU5TSVRJT05fV0FLRUxPQ0tfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfV0FLRUxPQ0tfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFdlIGFyZSBhc3N1bWluZyB0aGF0IENvbm5lY3Rpdml0eVNlcnZpY2UgY2FuIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICogYSB0cmFuc2l0aW9uIHRvIGNlbGx1bGFyIGRhdGEgd2l0aGluIHdha2VMb2NrVGltZW91dCB0aW1lLgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgd2FrZWxvY2sgaXMgcmVsZWFzZWQgYnkgdGhlIGRlbGF5ZWQgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNRVNTQUdFX1NUT1BfV0lGSSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0ssIHdha2VMb2NrVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAod2lmaVNob3VsZEJlRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRTY2FuT25seU1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydCh0cnVlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShmYWxzZSwgZmFsc2UsIG1MYXN0RW5hYmxlVWlkKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZXF1ZXN0Q21XYWtlTG9jaygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KGZhbHNlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg4NCw3NSArOTY1LDYgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgYWxsb3dzIHBvc3RpbmcgdG8gdGhlIFdpZmlUaHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBXaWZpSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgV2lmaUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRU5BQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcodHJ1ZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlXYXRjaGRvZ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShtQ29udGV4dCwgbVdpZmlTdGF0ZVRyYWNrZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5Pbmx5TW9kZShtc2cuYXJnMSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9VUERBVEVfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGRvVXBkYXRlV2lmaVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX0RJU0FCTEVfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBub24temVybyBtc2cuYXJnMSB2YWx1ZSBtZWFucyB0aGUgImVuYWJsZWQiIHNldHRpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHBlcnNpc3RlZAotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZEJsb2NraW5nKGZhbHNlLCBtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpV2F0Y2hkb2dTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RPUF9XSUZJOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5kaXNjb25uZWN0QW5kU3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZWxlYXNlIHdha2Vsb2NrCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRCbG9ja2luZyh0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2lmaUNvbmZpZ3VyYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2lmaUNvbmZpZ3VyYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TRVRfQ0hBTk5FTFM6Ci0gICAgICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKG1zZy5hcmcxLCBtc2cuYXJnMiA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtMTk2MiwxNyArOTc0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBwdy5wcmludGxuKCJXaS1GaSBpcyAiICsgc3RhdGVOYW1lKG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpKSk7CisgICAgICAgIHB3LnByaW50bG4oIldpLUZpIGlzICIgKyBtV2lmaVN0YXRlTWFjaGluZS5nZXRXaWZpU3RhdGVCeU5hbWUoKSk7CiAgICAgICAgIHB3LnByaW50bG4oIlN0YXktYXdha2UgY29uZGl0aW9uczogIiArCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TVEFZX09OX1dISUxFX1BMVUdHRURfSU4sIDApKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogCiAgICAgICAgIHB3LnByaW50bG4oIkludGVybmFsIHN0YXRlOiIpOwotICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVUcmFja2VyKTsKKyAgICAgICAgcHcucHJpbnRsbihtV2lmaVN0YXRlTWFjaGluZSk7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTGF0ZXN0IHNjYW4gcmVzdWx0czoiKTsKLSAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsICYmIHNjYW5SZXN1bHRzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIEJTU0lEICAgICAgICAgICAgICBGcmVxdWVuY3kgICBSU1NJICBGbGFncyAgICAgICAgICAgICBTU0lEIik7CiAgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgciA6IHNjYW5SZXN1bHRzKSB7CkBAIC0xOTk0LDIzICsxMDA2LDYgQEAKICAgICAgICAgbUxvY2tzLmR1bXAocHcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0ZU5hbWUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHdpZmlTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBXaWZpTG9jayBleHRlbmRzIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgV2lmaUxvY2soaW50IGxvY2tNb2RlLCBTdHJpbmcgdGFnLCBJQmluZGVyIGJpbmRlcikgewogICAgICAgICAgICAgc3VwZXIobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIyMTYsNyArMTIxMSw3IEBACiAgICAgICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjIzMSw3ICsxMjI2LDcgQEAKICAgICAgICAgICAgIC8vIG91ciBuZXcgc2l6ZSA9PSAxIChmaXJzdCBjYWxsKSwgYnV0IHRoaXMgZnVuY3Rpb24gd29uJ3QKICAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBvZnRlbiBhbmQgYnkgbWFraW5nIHRoZSBzdG9wUGFja2V0IGNhbGwgZWFjaAogICAgICAgICAgICAgLy8gdGltZSB3ZSdyZSBsZXNzIGZyYWdpbGUgYW5kIHNlbGYtaGVhbGluZy4KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtMjI2OCw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIHJlbW92ZWQudW5saW5rRGVhdGhSZWNpcGllbnQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBMb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC0yMjg3LDQgKzEyODIsMTY2IEBACiAgICAgICAgICAgICByZXR1cm4gKG1NdWx0aWNhc3RlcnMuc2l6ZSgpID4gMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKSB7CisgICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKKworICAgICAgICBTdGF0ZSBzdGF0ZSA9IG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKKyAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIG9wZW4gbmV0d29yaworICAgICAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVNYWNoaW5lLmdldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtT3Blbk5ldHdvcmtzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2NhblJlc3VsdHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gc2NhblJlc3VsdHMuZ2V0KGkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzY2FuUmVzdWx0LmNhcGFiaWxpdGllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU9wZW5OZXR3b3JrcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG51bU9wZW5OZXR3b3JrcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPj0gTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlJ3ZlIHNjYW5uZWQgY29udGludW91c2x5IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBOVU1fU0NBTlNfQkVGT1JFX05PVElGSUNBVElPTiB0aW1lcy4gVGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb2JhYmx5IGRvZXMgbm90IGhhdmUgYSByZW1lbWJlcmVkIG5ldHdvcmsgaW4gcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvdGhlcndpc2Ugc3VwcGxpY2FudCB3b3VsZCBoYXZlIHRyaWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3NvY2lhdGUgYW5kIHRodXMgcmVzZXR0aW5nIHRoaXMgY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZSh0cnVlLCBudW1PcGVuTmV0d29ya3MsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0cmFja2luZyB3aGV0aGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuCisgICAgICogc2hvd24gcmVjZW50bHkgYW5kIGNsZWFycyB0aGUgY3VycmVudCBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7CisgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgorICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKKyAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgorICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCisgICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsCisgICAgICAgICAgICBpbnQgZGVsYXkpIHsKKworICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKKyAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKKyAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93CisgICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKKyAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQorCisgICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKKyAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgorICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG1haW5seSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQorICAgICAgICAgICAgICAgIC8vIEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEIG1lc3NhZ2Ugd2l0aCB0aGlzIE5vdGlmaWNhdGlvbiBmcm9tCisgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGxhdGVyCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKKworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRPRE86IENsZWFuIHVwIGNvbm5lY3Rpdml0eSBzZXJ2aWNlICYgcmVtb3ZlIHRoaXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogbWVzc2FnZSA9IG1Dc0hhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgMSwKKyAgICAgICAgICAgICAgICAgICAgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOyAqLworCisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRPRE86IENsZWFuIHVwIGNvbm5lY3Rpdml0eSBzZXJ2aWNlICYgcmVtb3ZlIHRoaXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24KKyAgICAgICAgICAgIG1Dc0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIG1Ob3RpZmljYXRpb24pOworCisgICAgICAgICAgICBtZXNzYWdlID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAwLAorICAgICAgICAgICAgICAgICAgICBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vbUNzSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobWVzc2FnZSwgZGVsYXkpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25TaG93biA9IHZpc2libGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoKSB7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiksIHRydWUsIHRoaXMpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgc3VwZXIub25DaGFuZ2Uoc2VsZkNoYW5nZSk7CisKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiwgMSkgPT0gMTsKKyAgICAgICAgfQorICAgIH0KKworCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKaW5kZXggNDQ1ZGQwMy4uNDZkNmJlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU2NhblJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC03Nyw3ICs3Niw2IEBACiAgICAgCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwogICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogICAgIAogICAgIC8qKgpAQCAtMTA4LDEwICsxMDYsOSBAQAogICAgIC8qKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFQIGNoZWNrIHNob3VsZCBiZSBjYW5jZWxlZC4gKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3VsZENhbmNlbDsKICAgICAKLSAgICBXaWZpV2F0Y2hkb2dTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgV2lmaVN0YXRlVHJhY2tlciB3aWZpU3RhdGVUcmFja2VyKSB7CisgICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB3aWZpU3RhdGVUcmFja2VyOwogICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CiAgICAgICAgIAogICAgICAgICBjcmVhdGVUaHJlYWQoKTsKQEAgLTI3NSwxMiArMjcyLDEzIEBACiAgICAgLyoqCiAgICAgICogVW5yZWdpc3RlciBicm9hZGNhc3RzIGFuZCBxdWl0IHRoZSB3YXRjaGRvZyB0aHJlYWQKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKLSAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7Ci0gICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNvbnRlbnRPYnNlcnZlcik7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOwotICAgIH0KKyAgICAvL1RPRE86IENoYW5nZSBiYWNrIHRvIHJ1bm5pbmcgV1dTIHdoZW4gbmVlZGVkCisvLyAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKKy8vICAgICAgICB1bnJlZ2lzdGVyRm9yV2lmaUJyb2FkY2FzdHMoKTsKKy8vICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOworLy8gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKKy8vICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7CisvLyAgICB9CiAKICAgICAvKioKICAgICAgKiBXYWl0cyBmb3IgdGhlIG1haW4gd2F0Y2hkb2cgdGhyZWFkIHRvIGNyZWF0ZSB0aGUgaGFuZGxlci4KQEAgLTc1MSw3ICs3NDksNyBAQAogICAgICAgICAvLyBCbGFjayBsaXN0IHRoaXMgImJhZCIgQVAsIHRoaXMgd2lsbCBjYXVzZSBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYW5vdGhlcgogICAgICAgICBibGFja2xpc3RBcChhcC5ic3NpZCk7CiAgICAgICAgIC8vIEluaXRpYXRlIGFuIGFzc29jaWF0aW9uIHRvIGFuIGFsdGVybmF0ZSBBUAotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICBtV2lmaU1hbmFnZXIucmVhc3NvY2lhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYmxhY2tsaXN0QXAoU3RyaW5nIGJzc2lkKSB7CkBAIC03NjIsMTAgKzc2MCw3IEBACiAgICAgICAgIC8vIEJlZm9yZSB0YWtpbmcgYWN0aW9uLCBtYWtlIHN1cmUgd2Ugc2hvdWxkIG5vdCBjYW5jZWwgb3VyIHByb2Nlc3NpbmcKICAgICAgICAgaWYgKHNob3VsZENhbmNlbCgpKSByZXR1cm47CiAgICAgICAgIAotICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKSkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgLy9TbG9nLmUoVEFHLCAiQmxhY2tsaXN0aW5nICIgKyBic3NpZCArICIgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbVdpZmlNYW5hZ2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKIAogICAgICAgICBpZiAoRCkgewogICAgICAgICAgICAgbXlMb2dEKCJCbGFja2xpc3RpbmcgIiArIGJzc2lkKTsKQEAgLTg2MCwxMCArODU1LDcgQEAKICAgICAgICAgICAgICAqIChhbmQgYmxhY2tsaXN0ZWQgdGhlbSkuIENsZWFyIHRoZSBibGFja2xpc3Qgc28gdGhlIEFQIHdpdGggYmVzdAogICAgICAgICAgICAgICogc2lnbmFsIGlzIGNob3Nlbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkNsZWFyaW5nIGJsYWNrbGlzdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoVikgewogICAgICAgICAgICAgICAgIG15TG9nVigiaGFuZGxlU2xlZXA6IFNldCBzdGF0ZSB0byBTTEVFUCBhbmQgY2xlYXJlZCBibGFja2xpc3QiKTsKQEAgLTkzNCw3ICs5MjYsNyBAQAogICAgICAqIHNob3VsZCByZXZlcnQgYW55dGhpbmcgZG9uZSBieSB0aGUgd2F0Y2hkb2cgbW9uaXRvcmluZy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzZXQoKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICBzZXRJZGxlU3RhdGUodHJ1ZSk7CiAgICAgfQogICAgIApAQCAtMTE1MSw3ICsxMTQzLDcgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lmaVN0YXRlQ2hhbmdlZChpbnQgd2lmaVN0YXRlKSB7CiAgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBxdWl0KCk7CisgICAgICAgICAgICAgICAgb25EaXNjb25uZWN0ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRCkgewogICAgICAgICAgICAgICAgIG9uRW5hYmxlZCgpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMGRlZjVmMi4uZTRlZjA5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNTYsNyArMTU2LDYgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TVEFSVElOR19XSU5ET1cgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRU9SREVSID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfV0FMTFBBUEVSID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRlJFRVpFID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX1NUQUNLX0NSQVdMUyA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVBU1VSRV9MQVRFTkNZID0gZmFsc2U7CkBAIC0xNzkxLDE4ICsxNzkwLDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwOCw3ICsxOTAwLDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4NSwxNCArMTk3NywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC0zMTA1LDggKzMwOTMsMTEgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gb2J2aW91cyBhY3Rpb24gd2UgbmVlZCB0byB0YWtlLCBidXQgaWYgb3VyIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYWFuYWdlcidzLCB1cGRhdGUgaXQKKyAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYW5hZ2VyJ3MsIHVwZGF0ZSBpdCwKKyAgICAgICAgICAgICAgICAvLyBkaXNyZWdhcmRpbmcgZm9udCBzY2FsZSwgd2hpY2ggc2hvdWxkIHJlbWFpbiBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgbVRlbXBDb25maWd1cmF0aW9uLnNldFRvRGVmYXVsdHMoKTsKKyAgICAgICAgICAgICAgICBtVGVtcENvbmZpZ3VyYXRpb24uZm9udFNjYWxlID0gY3VycmVudENvbmZpZy5mb250U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVOZXdDb25maWd1cmF0aW9uTG9ja2VkKG1UZW1wQ29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb25maWcuZGlmZihtVGVtcENvbmZpZ3VyYXRpb24pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yQ29uZmlnID0gdHJ1ZTsKQEAgLTQ0MjIsOCArNDQxMyw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gbVdpbmRvd3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICh3LmlzVmlzaWJsZUx3KCkgJiYgIXcubU9ic2N1cmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAody5tT3JpZW50YXRpb25DaGFuZ2luZyB8fCAhdy5pc0RyYXduTHcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZCAmJiAhdy5pc0RyYXduTHcoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTU4Nyw2ICs1NTc3LDIyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBpZiAobURpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci51cGRhdGVDb25maWd1cmF0aW9uKG51bGwpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCkBAIC02ODY0LDcgKzY4NzAsNyBAQAogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1BdHRhY2hlZEhpZGRlbgogICAgICAgICAgICAgICAgICAgICAmJiAoYXRva2VuID09IG51bGwgPyBtUG9saWN5VmlzaWJpbGl0eSA6ICFhdG9rZW4uaGlkZGVuUmVxdWVzdGVkKQotICAgICAgICAgICAgICAgICAgICAmJiAobU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgKCFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZykpCisgICAgICAgICAgICAgICAgICAgICYmICFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZwogICAgICAgICAgICAgICAgICAgICAmJiAhbUV4aXRpbmcgJiYgIW1EZXN0cm95aW5nOwogICAgICAgICB9CiAKQEAgLTY5NjgsMTQgKzY5NzQsMTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaGFzIGEgc3VyZmFjZSB0aGF0IGl0IGhhcyBkcmF3biBhCi0gICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgKiBpcyBjaGFuZ2luZyBldmVuIGlmIHRoZSB3aW5kb3cgaGFzbid0IHJlZHJhd24gYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAqIHRvIHN0b3AgdGhpbmdzIGZyb20gZXhlY3V0aW5nIGR1cmluZyB0aGF0IHRpbWUuCisgICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEcmF3bkx3KCkgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1EZXN0cm95aW5nCi0gICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWxsc1NjcmVlbkx3KGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwKQEAgLTg0OTYsNiArODUwMCwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05Mjc0LDEyICs5MjgzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05Njc2LDMwICs5Njc5LDI2IEBACiAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nKSB7CiAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKygxMDAwLzYwKS1TeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgbUlucHV0TW9uaXRvci51cGRhdGVJbnB1dFdpbmRvd3NMdygpOwotICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIkxheW91dDogbURpc3BsYXlGcm96ZW49IiArIG1EaXNwbGF5RnJvemVuCi0gICAgICAgICAgICAgICAgKyAiIGhvbGRTY3JlZW49IiArIGhvbGRTY3JlZW4pOwotICAgICAgICBpZiAoIW1EaXNwbGF5RnJvemVuKSB7Ci0gICAgICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2NyZWVuQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgewotICAgICAgICAgICAgICAgIG1Ib2xkaW5nU2NyZWVuT24gPSBob2xkU2NyZWVuOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7CisgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7CisgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKKyAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UdXJuT25TY3JlZW4pIHsKQEAgLTk5ODgsOCArOTk4Nyw2IEBACiAgICAgICAgICAgICBtRnJlZXplR2NQZW5kaW5nID0gbm93OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIioqKiBGUkVFWklORyBESVNQTEFZIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IHRydWU7CiAgICAgICAgIAogICAgICAgICBtSW5wdXRNb25pdG9yLmZyZWV6ZUlucHV0RGlzcGF0Y2hpbmdMdygpOwpAQCAtMTAwMTYsOCArMTAwMTMsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIFVORlJFRVpJTkcgRElTUExBWSIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwotICAgICAgICAKICAgICAgICAgbURpc3BsYXlGcm96ZW4gPSBmYWxzZTsKICAgICAgICAgbUgucmVtb3ZlTWVzc2FnZXMoSC5BUFBfRlJFRVpFX1RJTUVPVVQpOwogICAgICAgICBpZiAoUFJPRklMRV9PUklFTlRBVElPTikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGNiMjY3NjkuLmEzMmNkNGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTIzNTksNiArMjM1OSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAocHJvYy50aHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwcm9jLnBpZCA9PSBQcm9jZXNzLm15UGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY3Jhc2hBcHBsaWNhdGlvbjogdHJ5aW5nIHRvIGNyYXNoIHNlbGYhIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2MudGhyZWFkLnNjaGVkdWxlQ3Jhc2gobWVzc2FnZSk7CkBAIC0xMTcyMyw3ICsxMTcyNyw2OSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwKKyAgICAgICAgICAgIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIC8vIG5vdGU6IGhpamFja2luZyBTRVRfQUNUSVZJVFlfV0FUQ0hFUiwgYnV0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCisgICAgICAgICAgICAgICAgLy8gaXRzIG93biBwZXJtaXNzaW9uIChzYW1lIGFzIHByb2ZpbGVDb250cm9sKS4KKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBwZXJtaXNzaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBmZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFByb2Nlc3NSZWNvcmQgcHJvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpZCA9IEludGVnZXIucGFyc2VJbnQocHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBpZHNTZWxmTG9ja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jID0gbVBpZHNTZWxmTG9ja2VkLmdldChwaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTcGFyc2VBcnJheTxQcm9jZXNzUmVjb3JkPj4gYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBtUHJvY2Vzc05hbWVzLmdldE1hcCgpOworICAgICAgICAgICAgICAgICAgICBTcGFyc2VBcnJheTxQcm9jZXNzUmVjb3JkPiBwcm9jcyA9IGFsbC5nZXQocHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jcyAhPSBudWxsICYmIHByb2NzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBwcm9jcy52YWx1ZUF0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb2MgPT0gbnVsbCB8fCBwcm9jLnRocmVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcHJvY2VzczogIiArIHByb2Nlc3MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZWN1cmUgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KFNZU1RFTV9TRUNVUkUsICIwIikpOworICAgICAgICAgICAgICAgIGlmIChpc1NlY3VyZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2MuaW5mby5mbGFncyZBcHBsaWNhdGlvbkluZm8uRkxBR19ERUJVR0dBQkxFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlByb2Nlc3Mgbm90IGRlYnVnZ2FibGU6ICIgKyBwcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2MudGhyZWFkLmR1bXBIZWFwKG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgICAgICBmZCA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9jZXNzIGRpc2FwcGVhcmVkIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBJbiB0aGlzIG1ldGhvZCB3ZSB0cnkgdG8gYWNxdWlyZSBvdXIgbG9jayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIG5vdCBkZWFkbG9ja2VkICovCiAgICAgcHVibGljIHZvaWQgbW9uaXRvcigpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQppbmRleCBlYjBhOGE5Li5hY2VkZDI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCkBAIC02NSw3ICs2NSw4IEBACiBwdWJsaWMgY2xhc3MgVGV0aGVyaW5nIGV4dGVuZHMgSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlci5TdHViIHsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiVGV0aGVyaW5nIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Cb290ZWQgPSBmYWxzZTsKICAgICAvL3VzZWQgdG8gcmVtZW1iZXIgaWYgd2UgZ290IGNvbm5lY3RlZCBiZWZvcmUgYm9vdCBmaW5pc2hlZApAQCAtMTc0LDcgKzE3NSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlTGlua1N0YXR1c0NoYW5nZWQoU3RyaW5nIGlmYWNlLCBib29sZWFuIGxpbmspIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiaW50ZXJmYWNlTGlua1N0YXR1c0NoYW5nZWQgIiArIGlmYWNlICsgIiwgIiArIGxpbmspOworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkICIgKyBpZmFjZSArICIsICIgKyBsaW5rKTsKICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHVzYiA9IGZhbHNlOwogICAgICAgICBpZiAoaXNXaWZpKGlmYWNlKSkgewpAQCAtMjI5LDI4ICsyMzAsMzAgQEAKICAgICAgICAgICAgIHVzYiA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWN0aXZlIGlmYWNlICgiICsgaWZhY2UgKyAiKSByZXBvcnRlZCBhcyBhZGRlZCwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc20gPSBuZXcgVGV0aGVySW50ZXJmYWNlU00oaWZhY2UsIG1Mb29wZXIsIHVzYik7CiAgICAgICAgICAgICBtSWZhY2VzLnB1dChpZmFjZSwgc20pOwogICAgICAgICAgICAgc20uc3RhcnQoKTsKICAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VSZW1vdmVkKFN0cmluZyBpZmFjZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhdHRlbXB0aW5nIHRvIHJlbW92ZSB1bmtub3duIGlmYWNlICgiICsgaWZhY2UgKyAiKSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKFRldGhlckludGVyZmFjZVNNLkNNRF9JTlRFUkZBQ0VfRE9XTik7CkBAIC0zNTAsOCArMzUzLDEwIEBACiAgICAgICAgIGJyb2FkY2FzdC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0VSUk9SRURfVEVUSEVSLAogICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0KTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChicm9hZGNhc3QpOwotICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKwotICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3Quc2l6ZSgpICsgIiwgIiArIGVycm9yZWRMaXN0LnNpemUoKSk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCAiICsgYXZhaWxhYmxlTGlzdC5zaXplKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh1c2JUZXRoZXJlZCkgewogICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCkgewpAQCAtNDM1LDcgKzQ0MCw3IEBACiAgICAgICAgICAgICAgICAgbVVzYk1hc3NTdG9yYWdlT2ZmID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJpbmcgZ290IENPTk5FQ1RJVklUWV9BQ1RJT04iKTsKICAgICAgICAgICAgICAgICBtVGV0aGVyTWFzdGVyU00uc2VuZE1lc3NhZ2UoVGV0aGVyTWFzdGVyU00uQ01EX1VQU1RSRUFNX0NIQU5HRUQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQk9PVF9DT01QTEVURUQpKSB7CiAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IHRydWU7CkBAIC00NjgsNyArNDczLDcgQEAKIAogICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGVhdGhlcmVkIHN0YXRlCiAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZVVzYlJuZGlzKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBMb2cuZChUQUcsICJlbmFibGVVc2JSbmRpcygiICsgZW5hYmxlZCArICIpIik7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiZW5hYmxlVXNiUm5kaXMoIiArIGVuYWJsZWQgKyAiKSIpOwogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwogCkBAIC00OTMsNyArNDk4LDcgQEAKIAogICAgIC8vIGNvbmZpZ3VyZWQgd2hlbiB3ZSBzdGFydCB0ZXRoZXJpbmcgYW5kIHVuY29uZmlnJ2Qgb24gZXJyb3Igb3IgY29uY2x1c2lvbgogICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVVc2JJZmFjZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlndXJlVXNiSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImNvbmZpZ3VyZVVzYklmYWNlKCIgKyBlbmFibGVkICsgIikiKTsKIAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKQEAgLTc0MCw3ICs3NDUsNyBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiSW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX1JFUVVFU1RFRDoKQEAgLTc4MSw3ICs3ODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF5YmUgYSBwYXJlbnQgY2xhc3M/CkBAIC04MzMsNyArODM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVVzYikgVGV0aGVyaW5nLnRoaXMuZW5hYmxlVXNiUm5kaXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgc2V0VGV0aGVyZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCgpOwpAQCAtODQ0LDcgKzg0OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKQEAgLTg4Nyw3ICs4OTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLndoYXQgPT0gQ01EX0lOVEVSRkFDRV9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmF2YWlsYWJsZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVudGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfQ09OTkVDVElPTl9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Vwc3RyZWFtSWZhY2VOYW1lID0gKFN0cmluZykobWVzc2FnZS5vYmopOwpAQCAtOTYwLDcgKzk2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9NQVNURVJfRVJST1IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyIGxvc3QgdXBzdHJlYW0gY29ubmVjdGlvbiAiICsgbUlmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlciBsb3N0IHVwc3RyZWFtIGNvbm5lY3Rpb24gIiArIG1JZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Vc2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRldGhlcmluZy50aGlzLmNvbmZpZ3VyZVVzYklmYWNlKGZhbHNlKSkgewpAQCAtMTE5OCw4ICsxMjAzLDEwIEBACiAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgICAgICAgICBJQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25SZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaG9vc2VVcHN0cmVhbVR5cGUoIiArIHRyeUNlbGwgKyAiKSwgIGR1blJlcXVpcmVkID0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1EdW5SZXF1aXJlZCArICIsIGlmYWNlPSIgKyBpZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNob29zZVVwc3RyZWFtVHlwZSgiICsgdHJ5Q2VsbCArICIpLCAgZHVuUmVxdWlyZWQgPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1EdW5SZXF1aXJlZCArICIsIGlmYWNlPSIgKyBpZmFjZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUR1blJlcXVpcmVkKSB7CkBAIC0xMjA3LDcgKzEyMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBjbS5nZXROZXR3b3JrSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfRFVOKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldHRpbmcgZHVuIGlmYWNlbmFtZSA9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzZXR0aW5nIGR1biBpZmFjZW5hbWUgPSIgKyBpZmFjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgd2UncmUgYWxyZWFkeSBjb25uZWN0ZWQgLSBpdCBtYXkgYmUgc29tZWJvZHkgZWxzZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmNvdW50LCBzbyBhZGQgb3VyIG93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuT25Nb2JpbGVDb25uZWN0aW9uKCk7CkBAIC0xMjE5LDExICsxMjI2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNoZWNraW5nIGlmIGhpcHJpIGJyb3VnaHQgdXMgdGhpcyBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJjaGVja2luZyBpZiBoaXByaSBicm91Z2h0IHVzIHRoaXMgY29ubmVjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBjbS5nZXROZXR3b3JrSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAieWVzIC0gaGlwcmkgaW4gdXNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAieWVzIC0gaGlwcmkgaW4gdXNlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgd2UncmUgYWxyZWFkeSBjb25uZWN0ZWQgLSBpdCBtYXkgYmUgc29tYm9keSBlbHNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmY291bnQsIHNvIGFkZCBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKQEAgLTEyNDUsNyArMTI1Miw3IEBACiAgICAgICAgICAgICAgICAgbm90aWZ5VGV0aGVyZWRPZk5ld1Vwc3RyZWFtSWZhY2UoaWZhY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5VGV0aGVyZWRPZk5ld1Vwc3RyZWFtSWZhY2UoU3RyaW5nIGlmYWNlTmFtZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm5vdGlmeWluZyB0ZXRoZXJlZCB3aXRoIGlmYWNlID0iICsgaWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm5vdGlmeWluZyB0ZXRoZXJlZCB3aXRoIGlmYWNlID0iICsgaWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICBtVXBzdHJlYW1JZmFjZU5hbWUgPSBpZmFjZU5hbWU7CiAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IG1Ob3RpZnlMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gKFRldGhlckludGVyZmFjZVNNKW87CkBAIC0xMjYyLDE5ICsxMjY5LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk1hc3RlckluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiTWFzdGVySW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfUkVRVUVTVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgbUR1blJlcXVpcmVkID0gaXNEdW5SZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gd2hvID0gKFRldGhlckludGVyZmFjZVNNKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgcmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxpc3QuYWRkKHdobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVRldGhlck1vZGVBbGl2ZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9VTlJFUVVFU1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHdobyA9IChUZXRoZXJJbnRlcmZhY2VTTSltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHVucmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHVucmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtTm90aWZ5TGlzdC5pbmRleE9mKHdobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TGlzdC5yZW1vdmUod2hvKTsKQEAgLTEzMDQsNyArMTMxMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlck1vZGVBbGl2ZVN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJNb2RlQWxpdmVTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1JFUVVFU1RFRDoKQEAgLTEzMzIsOCArMTMzOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3JlIHN0aWxsIHVzaW5nIGEgcmVxdWVzdGVkIGNvbm5lY3Rpb24gLSBtYXkgaGF2ZSBmb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lmaSBvciBzb21ldGhpbmcgc2luY2UgdGhlbi4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblJlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbmV3aW5nIG1vYmlsZSBjb25uZWN0aW9uIC0gcmVxdWV1aW5nIGZvciBhbm90aGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9DT05ORUNUSU9OX1JFTkVXX01TICsgIm1zIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbmV3aW5nIG1vYmlsZSBjb25uZWN0aW9uIC0gcmVxdWV1aW5nIGZvciBhbm90aGVyICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExfQ09OTkVDVElPTl9SRU5FV19NUyArICJtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuT25Nb2JpbGVDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjkyZjhkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5HZW9jb2RlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXRlY3QgdGhlIGNvdW50cnkgd2hlcmUgdGhlIHVzZXIgaXMuIFRoZSBzb3VyY2VzIG9mCisgKiBjb3VudHJ5IGFyZSBxdWVyaWVkIGluIG9yZGVyIG9mIHJlbGlhYmlsaXR5LCBsaWtlCisgKiA8dWw+CisgKiA8bGk+TW9iaWxlIG5ldHdvcms8L2xpPgorICogPGxpPkxvY2F0aW9uPC9saT4KKyAqIDxsaT5TSU0ncyBjb3VudHJ5PC9saT4KKyAqIDxsaT5QaG9uZSdzIGxvY2FsZTwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBDYWxsIHRoZSB7QGxpbmsgI2RldGVjdENvdW50cnkoKX0gdG8gZ2V0IHRoZSBhdmFpbGFibGUgY291bnRyeSBpbW1lZGlhdGVseS4KKyAqIDxwPgorICogVG8gYmUgbm90aWZpZWQgb2YgdGhlIGZ1dHVyZSBjb3VudHJ5IGNoYW5nZSwgdXNpbmcgdGhlCisgKiB7QGxpbmsgI3NldENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIpfQorICogPHA+CisgKiBVc2luZyB0aGUge0BsaW5rICNzdG9wKCl9IHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb3VudHJ5IGNoYW5nZS4KKyAqIDxwPgorICogVGhlIGNvdW50cnkgaW5mb3JtYXRpb24gd2lsbCBiZSByZWZyZXNoZWQgZXZlcnkKKyAqIHtAbGluayAjTE9DQVRJT05fUkVGUkVTSF9JTlRFUlZBTH0gb25jZSB0aGUgbG9jYXRpb24gYmFzZWQgY291bnRyeSBpcyB1c2VkLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkNvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IiOworCisgICAgLyoqCisgICAgICogVGhlIHJlZnJlc2ggaW50ZXJ2YWwgd2hlbiB0aGUgbG9jYXRpb24gYmFzZWQgY291bnRyeSB3YXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTE9DQVRJT05fUkVGUkVTSF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwICogMjQ7IC8vIDEgZGF5CisKKyAgICBwcm90ZWN0ZWQgQ291bnRyeURldGVjdG9yQmFzZSBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcjsKKyAgICBwcm90ZWN0ZWQgVGltZXIgbUxvY2F0aW9uUmVmcmVzaFRpbWVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBob25lVHlwZTsKKyAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnk7CisgICAgcHJpdmF0ZSBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOworICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeUZyb21Mb2NhdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIFNlcnZpY2VTdGF0ZSBtTGFzdFN0YXRlOworCisgICAgcHJpdmF0ZSBQaG9uZVN0YXRlTGlzdGVuZXIgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlIHNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgaG93IG9mdGVuIHdlIHdpbGwgYmUgbm90aWZpZWQsIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0b28KKyAgICAgICAgICAgIC8vIG1hbnkgdGltZXMsIGxldCdzIGNvbnNpZGVyIHF1ZXJ5aW5nIHRoZSBuZXR3b3JrLgorICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uU2VydmljZVN0YXRlQ2hhbmdlZCIpOworICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIGlmIChtTGFzdFN0YXRlID09IG51bGwgfHwgbUxhc3RTdGF0ZS5nZXRTdGF0ZSgpICE9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgZGV0ZWN0Q291bnRyeSh0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtTGFzdFN0YXRlID0gbmV3IFNlcnZpY2VTdGF0ZShzZXJ2aWNlU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0ZW5lciBmb3IgcmVjZWl2aW5nIHRoZSBub3RpZmljYXRpb24gZnJvbSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdGlvbkxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtQ291bnRyeUZyb21Mb2NhdGlvbiA9IGNvdW50cnk7CisgICAgICAgICAgICAvLyBEb24ndCBzdGFydCB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci4KKyAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIgPSAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICBtUGhvbmVUeXBlID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0UGhvbmVUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpIHsKKyAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgdGhlIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgaWYgd2UgaGF2ZSBiZWVuIHN0b3BwZWQuCisgICAgICAgIHJldHVybiBkZXRlY3RDb3VudHJ5KGZhbHNlLCAhbVN0b3BwZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIFNsb2cuaShUQUcsICJTdG9wIHRoZSBkZXRlY3Rvci4iKTsKKyAgICAgICAgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgICAgIG1TdG9wcGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvdW50cnkgZnJvbSBkaWZmZXJlbnQgc291cmNlcyBpbiBvcmRlciBvZiB0aGUgcmVsaWFiaWxpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgIENvdW50cnkgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgcmVzdWx0ID0gZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldExhc3RLbm93bkxvY2F0aW9uQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRTaW1CYXNlZENvdW50cnkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldExvY2FsZUNvdW50cnkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSB0aGUgbW9iaWxlIG5ldHdvcmsuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgU3RyaW5nIGNvdW50cnlJc28gPSBudWxsOworICAgICAgICAvLyBUT0RPOiBUaGUgZG9jdW1lbnQgc2F5cyB0aGUgcmVzdWx0IG1heSBiZSB1bnJlbGlhYmxlIG9uIENETUEgbmV0d29ya3MuIFNoYWxsIHdlIHVzZQorICAgICAgICAvLyBpdCBvbiBDRE1BIHBob25lPyBXZSBtYXkgdGVzdCB0aGUgQW5kcm9pZCBwcmltYXJpbHkgdXNlZCBjb3VudHJpZXMuCisgICAgICAgIGlmIChtUGhvbmVUeXBlID09IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9HU00pIHsKKyAgICAgICAgICAgIGNvdW50cnlJc28gPSBtVGVsZXBob255TWFuYWdlci5nZXROZXR3b3JrQ291bnRyeUlzbygpOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb3VudHJ5SXNvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShjb3VudHJ5SXNvLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExhc3RLbm93bkxvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICByZXR1cm4gbUNvdW50cnlGcm9tTG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBmcm9tIFNJTSBjYXJkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBTdHJpbmcgY291bnRyeUlzbyA9IG51bGw7CisgICAgICAgIGNvdW50cnlJc28gPSBtVGVsZXBob255TWFuYWdlci5nZXRTaW1Db3VudHJ5SXNvKCk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY291bnRyeUlzbykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShjb3VudHJ5SXNvLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBmcm9tIHRoZSBzeXN0ZW0ncyBsb2NhbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoZGVmYXVsdExvY2FsZS5nZXRDb3VudHJ5KCksIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5vdGlmeUNoYW5nZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkIHRoZSBjaGFuZ2Ugb2YgdGhlCisgICAgICogY291bnRyeQorICAgICAqIEBwYXJhbSBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgY291bGQKKyAgICAgKiBiZSBzdGFydGVkIGlmIHRoZSBjdXJyZW50IGNvdW50cnkgc291cmNlIGlzIGxlc3MgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24uCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBhdmFpbGFibGUgVXNlckNvdW50cnkKKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnkgZGV0ZWN0Q291bnRyeShib29sZWFuIG5vdGlmeUNoYW5nZSwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gZ2V0Q291bnRyeSgpOworICAgICAgICBydW5BZnRlckRldGVjdGlvbkFzeW5jKG1Db3VudHJ5ICE9IG51bGwgPyBuZXcgQ291bnRyeShtQ291bnRyeSkgOiBtQ291bnRyeSwgY291bnRyeSwKKyAgICAgICAgICAgICAgICBub3RpZnlDaGFuZ2UsIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbik7CisgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdGFza3MgaW4gdGhlIHNlcnZpY2UncyB0aHJlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuQWZ0ZXJEZXRlY3Rpb25Bc3luYyhmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5LAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGZpbmFsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSwgZGV0ZWN0ZWRDb3VudHJ5LCBub3RpZnlDaGFuZ2UsIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyIHByZXZMaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIGlmIChtTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gU3RvcCBsaXN0ZW5pbmcgYWxsIHNlcnZpY2VzCisgICAgICAgICAgICByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICB9IGVsc2UgaWYgKHByZXZMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGRldGVjdENvdW50cnkoZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBydW5BZnRlckRldGVjdGlvbihmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5LAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGZpbmFsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgIGlmIChub3RpZnlDaGFuZ2UpIHsKKyAgICAgICAgICAgIG5vdGlmeUlmQ291bnRyeUNoYW5nZWQoY291bnRyeSwgZGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uICYmIChkZXRlY3RlZENvdW50cnkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGRldGVjdGVkQ291bnRyeS5nZXRTb3VyY2UoKSA+IENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pCisgICAgICAgICAgICAgICAgJiYgaXNBaXJwbGFuZU1vZGVPZmYoKSAmJiBtTGlzdGVuZXIgIT0gbnVsbCAmJiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSkgeworICAgICAgICAgICAgLy8gU3RhcnQgZmluZGluZyBsb2NhdGlvbiB3aGVuIHRoZSBzb3VyY2UgaXMgbGVzcyByZWxpYWJsZSB0aGFuIHRoZQorICAgICAgICAgICAgLy8gbG9jYXRpb24gYW5kIHRoZSBhaXJwbGFuZSBtb2RlIGlzIG9mZiAoYXMgZ2VvY29kZXIgd2lsbCBub3QKKyAgICAgICAgICAgIC8vIHdvcmspLgorICAgICAgICAgICAgLy8gVE9ETyA6IFNoYWxsIHdlIGdpdmUgdXAgc3RhcnRpbmcgdGhlIGRldGVjdG9yIHdpdGhpbiBhCisgICAgICAgICAgICAvLyBwZXJpb2Qgb2YgdGltZT8KKyAgICAgICAgICAgIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdG9yKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV0ZWN0ZWRDb3VudHJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBkZXRlY3RlZENvdW50cnkuZ2V0U291cmNlKCkgPj0gQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTikgeworICAgICAgICAgICAgLy8gU2NoZWR1bGUgdGhlIGxvY2F0aW9uIHJlZnJlc2ggaWYgdGhlIGNvdW50cnkgc291cmNlIGlzCisgICAgICAgICAgICAvLyBub3QgbW9yZSByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbiBvciBubyBjb3VudHJ5IGlzCisgICAgICAgICAgICAvLyBmb3VuZC4KKyAgICAgICAgICAgIC8vIFRPRE86IExpc3RlbiB0byB0aGUgcHJlZmVyZW5jZSBjaGFuZ2Ugb2YgR1BTLCBXaWZpIGV0YywKKyAgICAgICAgICAgIC8vIGFuZCBzdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkuCisgICAgICAgICAgICBzY2hlZHVsZUxvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSBsb2NhdGlvbiByZWZyZXNoIG9uY2UgdGhlIGN1cnJlbnQgc291cmNlIGlzCisgICAgICAgICAgICAvLyBtb3JlIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uLgorICAgICAgICAgICAgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBjb3VudHJ5IGZyb20gTG9jYXRpb25Qcm92aWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdG9yKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID0gY3JlYXRlTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcigpOworICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCkgeworICAgICAgICBpZiAobUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgY3JlYXRlTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FpcnBsYW5lTW9kZU9mZigpIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLCAwKSA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY291bnRyeSBjaGFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUlmQ291bnRyeUNoYW5nZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSkgeworICAgICAgICBpZiAoZGV0ZWN0ZWRDb3VudHJ5ICE9IG51bGwgJiYgbUxpc3RlbmVyICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAoY291bnRyeSA9PSBudWxsIHx8ICFjb3VudHJ5LmVxdWFscyhkZXRlY3RlZENvdW50cnkpKSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBjb3VudHJ5IHdhcyBjaGFuZ2VkIGZyb20gIiArIGNvdW50cnkgIT0gbnVsbCA/IGNvdW50cnkuZ2V0Q291bnRyeUlzbygpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgKyAiIHRvICIgKyBkZXRlY3RlZENvdW50cnkuZ2V0Q291bnRyeUlzbygpKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKGRldGVjdGVkQ291bnRyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2hlZHVsZSB0aGUgbmV4dCBsb2NhdGlvbiByZWZyZXNoLiBXZSB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlIHNjaGVkdWxlZCB0YXNrIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNjaGVkdWxlTG9jYXRpb25SZWZyZXNoKCkgeworICAgICAgICBpZiAobUxvY2F0aW9uUmVmcmVzaFRpbWVyICE9IG51bGwpIHJldHVybjsKKyAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgTE9DQVRJT05fUkVGUkVTSF9JTlRFUlZBTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoZSBzY2hlZHVsZWQgcmVmcmVzaCB0YXNrIGlmIGl0IGV4aXN0cworICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCkgeworICAgICAgICBpZiAobUxvY2F0aW9uUmVmcmVzaFRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBpZiAobVBob25lU3RhdGVMaXN0ZW5lciA9PSBudWxsICYmIG1QaG9uZVR5cGUgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0dTTSkgeworICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlIHNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBob3cgb2Z0ZW4gd2Ugd2lsbCBiZSBub3RpZmllZCwgaWYgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaXMgY2FsbGVkIHRvbworICAgICAgICAgICAgICAgICAgICAvLyBtYW55IHRpbWVzLCBsZXQncyBjb25zaWRlciBxdWVyeWluZyB0aGUgbmV0d29yay4KKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uU2VydmljZVN0YXRlQ2hhbmdlZCIpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgdGhlIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSA9PSBudWxsIHx8IG1MYXN0U3RhdGUuZ2V0U3RhdGUoKSAhPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0Q291bnRyeSh0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBuZXcgU2VydmljZVN0YXRlKHNlcnZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0VSVklDRV9TVEFURSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBpZiAobVBob25lU3RhdGVMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9OT05FKTsKKyAgICAgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNHZW9Db2RlckltcGxlbWVudGVkKCkgeworICAgICAgICByZXR1cm4gR2VvY29kZXIuaXNJbXBsZW1lbnRlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI2ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ291bnRyeURldGVjdG9yQmFzZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIG1ldGhvZHMgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY291bnRyeQorICogZGV0ZWN0b3IuCisgKiA8cD4KKyAqIENhbGxpbmcge0BsaW5rICNkZXRlY3RDb3VudHJ5fSB0byBzdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkuIFRoZSBjb3VudHJ5CisgKiBjb3VsZCBiZSByZXR1cm5lZCBpbW1lZGlhdGVseSBpZiBpdCBpcyBhdmFpbGFibGUuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvdW50cnlEZXRlY3RvckJhc2UgeworICAgIHByb3RlY3RlZCBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByb3RlY3RlZCBDb3VudHJ5TGlzdGVuZXIgbUxpc3RlbmVyOworICAgIHByb3RlY3RlZCBDb3VudHJ5IG1EZXRlY3RlZENvdW50cnk7CisKKyAgICBwdWJsaWMgQ291bnRyeURldGVjdG9yQmFzZShDb250ZXh0IGN0eCkgeworICAgICAgICBtQ29udGV4dCA9IGN0eDsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBpZiBpdCBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBudWxsIHNob3VsZAorICAgICAqICAgICAgICAgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENvdW50cnkgZGV0ZWN0Q291bnRyeSgpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcmV2aW91cyBsaXN0ZW5lciB3aWxsIGJlIHJlcGxhY2VkIGlmIGl0IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgZGV0ZWN0b3Igc2hvdWxkIHJlbGVhc2UgYWxsIHN5c3RlbSBzZXJ2aWNlcyBhbmQgYmUgcmVhZHkgdG8KKyAgICAgKiBiZSBmcmVlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKTsKKworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVyKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNvdW50cnlEZXRlY3RlZChjb3VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzlmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQWRkcmVzczsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5HZW9jb2RlcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRldGVjdHMgd2hpY2ggY291bnRyeSB0aGUgdXNlciBjdXJyZW50bHkgaXMgaW4gdGhyb3VnaCB0aGUgZW5hYmxlZAorICogbG9jYXRpb24gcHJvdmlkZXJzIGFuZCB0aGUgR2VvQ29kZXIKKyAqIDxwPgorICogVXNlIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgcXVlcnlpbmcuIElmIHRoZSBsb2NhdGlvbiBjYW4gbm90IGJlCisgKiByZXNvbHZlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWUsIHRoZSBsYXN0IGtub3duIGxvY2F0aW9uIHdpbGwgYmUgdXNlZCB0byBnZXQKKyAqIHRoZSB1c2VyIGNvdW50cnkgdGhyb3VnaCB0aGUgR2VvQ29kZXIuIFRoZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZQorICogdGhyb3duIGlmIHRoZXJlIGlzIGEgb25nb2luZyBxdWVyeS4KKyAqIDxwPgorICogVGhlIGN1cnJlbnQgcXVlcnkgY2FuIGJlIHN0b3BwZWQgYnkge0BsaW5rICNzdG9wKCl9CisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgUVVFUllfTE9DQVRJT05fVElNRU9VVCA9IDEwMDAgKiA2MCAqIDU7IC8vIDUgbWlucworCisgICAgLyoqCisgICAgICogVXNlZCBmb3IgY2FuY2VsaW5nIGxvY2F0aW9uIHF1ZXJ5CisgICAgICovCisgICAgcHJvdGVjdGVkIFRpbWVyIG1UaW1lcjsKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlYWQgdG8gcXVlcnkgdGhlIGNvdW50cnkgZnJvbSB0aGUgR2VvQ29kZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocmVhZCBtUXVlcnlUaHJlYWQ7CisgICAgcHJvdGVjdGVkIExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbUxvY2F0aW9uTGlzdGVuZXJzOworCisgICAgcHJpdmF0ZSBMb2NhdGlvbk1hbmFnZXIgbUxvY2F0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtRW5hYmxlZFByb3ZpZGVyczsKKworICAgIHB1YmxpYyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKGN0eCk7CisgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBjdHguZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIGZyb20gdGhlIGxvY2F0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbnVsbDsKKyAgICAgICAgR2VvY29kZXIgZ2VvQ29kZXIgPSBuZXcgR2VvY29kZXIobUNvbnRleHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdDxBZGRyZXNzPiBhZGRyZXNzZXMgPSBnZW9Db2Rlci5nZXRGcm9tTG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdldExhdGl0dWRlKCksIGxvY2F0aW9uLmdldExvbmdpdHVkZSgpLCAxKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzZXMgIT0gbnVsbCAmJiBhZGRyZXNzZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGNvdW50cnkgPSBhZGRyZXNzZXMuZ2V0KDApLmdldENvdW50cnlDb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJFeGNlcHRpb24gb2NjdXJzIHdoZW4gZ2V0dGluZyBjb3VudHJ5IGZyb20gbG9jYXRpb24iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgbGlzdGVuZXJzIHdpdGggdGhlIGxvY2F0aW9uIHByb3ZpZGVycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRW5hYmxlZFByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICBpbnQgdG90YWwgPSBsaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgdG90YWw7IGkrKykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKAorICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5nZXQoaSksIDAsIDAsIGxpc3RlbmVycy5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciB0aGUgbGlzdGVuZXJzIHdpdGggdGhlIGxvY2F0aW9uIHByb3ZpZGVycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVVwZGF0ZXMobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiBmcm9tIGFsbCBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwcm92aWRlcnMgPSBtTG9jYXRpb25NYW5hZ2VyLmdldEFsbFByb3ZpZGVycygpOworICAgICAgICBMb2NhdGlvbiBiZXN0TG9jYXRpb24gPSBudWxsOworICAgICAgICBmb3IgKFN0cmluZyBwcm92aWRlciA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgTG9jYXRpb24gbGFzdEtub3duTG9jYXRpb24gPSBtTG9jYXRpb25NYW5hZ2VyLmdldExhc3RLbm93bkxvY2F0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIGlmIChsYXN0S25vd25Mb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGJlc3RMb2NhdGlvbiA9PSBudWxsIHx8IGJlc3RMb2NhdGlvbi5nZXRUaW1lKCkgPCBsYXN0S25vd25Mb2NhdGlvbi5nZXRUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdExvY2F0aW9uID0gbGFzdEtub3duTG9jYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiZXN0TG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdGltZW91dCBmb3IgcXVlcnlpbmcgdGhlIGxvY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGdldFF1ZXJ5TG9jYXRpb25UaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gUVVFUllfTE9DQVRJT05fVElNRU9VVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZW5hYmxlZCBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpIHsKKyAgICAgICAgaWYgKG1FbmFibGVkUHJvdmlkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1FbmFibGVkUHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRQcm92aWRlcnModHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1FbmFibGVkUHJvdmlkZXJzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkuCisgICAgICogPHA+CisgICAgICogUXVlcmllcyB0aGUgbG9jYXRpb24gZnJvbSBhbGwgbG9jYXRpb24gcHJvdmlkZXJzLCB0aGVuIHN0YXJ0cyBhIHRocmVhZCB0byBxdWVyeSB0aGUKKyAgICAgKiBjb3VudHJ5IGZyb20gR2VvQ29kZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25MaXN0ZW5lcnMgICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZXF1ZXN0IHRoZSBsb2NhdGlvbiBmcm9tIGFsbCBlbmFibGVkIHByb3ZpZGVycy4KKyAgICAgICAgaW50IHRvdGFsUHJvdmlkZXJzID0gZ2V0VG90YWxFbmFibGVkUHJvdmlkZXJzKCk7CisgICAgICAgIGlmICh0b3RhbFByb3ZpZGVycyA+IDApIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TG9jYXRpb25MaXN0ZW5lcj4odG90YWxQcm92aWRlcnMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFByb3ZpZGVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyICgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2NhdGlvbkNoYW5nZWQoTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50cnlDb2RlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyRGlzYWJsZWQoU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckVuYWJsZWQoU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGF0dXNDaGFuZ2VkKFN0cmluZyBwcm92aWRlciwgaW50IHN0YXR1cywgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2lzdGVyRW5hYmxlZFByb3ZpZGVycyhtTG9jYXRpb25MaXN0ZW5lcnMpOworICAgICAgICAgICAgbVRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2Ugbm8gcHJvdmlkZXIgY291bGQgcHJvdmlkZSB0aGUgbG9jYXRpb24sIGxldCdzIHRyeSB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAvLyBrbm93biBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHByb3ZpZGVyIGVuYWJsZWQuCisgICAgICAgICAgICBxdWVyeUNvdW50cnlDb2RlKGdldExhc3RLbm93bkxvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGV0ZWN0ZWRDb3VudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGN1cnJlbnQgcXVlcnkgd2l0aG91dCBub3RpZnlpbmcgdGhlIGxpc3RlbmVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gR2VvY29kZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBxdWVyeUNvdW50cnlDb2RlKGZpbmFsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVF1ZXJ5VGhyZWFkICE9IG51bGwpIHJldHVybjsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvdW50cnlJc28gPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50cnlJc28gPSBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlJc28gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRGV0ZWN0ZWRDb3VudHJ5ID0gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1EZXRlY3RlZENvdW50cnkpOworICAgICAgICAgICAgICAgIG1RdWVyeVRocmVhZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtUXVlcnlUaHJlYWQuc3RhcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCmluZGV4IGNkYzBhNmYuLjQ1OTU1MWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rCkBAIC04LDYgKzgsNyBAQAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyLmNwcCBcCisgICAgY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZS5jcHAgXAogCWNvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBcCiAgICAgb25sb2FkLmNwcApAQCAtMjUsNiArMjYsOCBAQAogCWxpYnV0aWxzIFwKIAlsaWJ1aQogCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnVzYmhvc3QKKwogaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogaWZlcSAoJChUQVJHRVRfT1MpLGxpbnV4KQogaWZlcSAoJChUQVJHRVRfQVJDSCkseDg2KQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ3OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlVzYk9ic2VydmVyIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIwKQorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQ7CisKK1ZlY3RvcjxpbnQ+IG1EZXZpY2VMaXN0OworCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIGNhbWVyYQorICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqIGRlc2M7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2l0ZXIgaXRlcjsKKworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSB1c2JfZGV2aWNlX29wZW4oZGV2bmFtZSk7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgTE9HRSgidXNiX2RldmljZV9vcGVuIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisKKyAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2ludHJfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCB8fCBlcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHdlIGZvdW5kIGEgY2FtZXJhCisgICAgICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWRfZnJvbV9uYW1lKGRldm5hbWUpOworICAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChpZCk7CisKKyAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JDYW1lcmFBZGRlZCwgaWQpOworICAgICAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZG9uZToKKyAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKworICAgIC8vIHNlZSBpZiBpdCBpcyBhIGRldmljZSB3ZSBrbm93IGFib3V0CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaWQgID09IG1EZXZpY2VMaXN0W2ldKSB7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKworICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCwgaWQpOworICAgICAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogY29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIWNvbnRleHQpIHsKKyAgICAgICAgTE9HRSgidXNiX2hvc3RfaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIHNvIGl0IGlzIHNhZmUgdG8gcGFzcyB0aGl6IGRpcmVjdGx5CisgICAgdXNiX2hvc3RfcnVuKGNvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgTlVMTCwgKHZvaWQgKil0aGl6KTsKK30KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RfdGFibGVbXSA9IHsKKyAgICB7ICJtb25pdG9yVXNiSG9zdEJ1cyIsICIoKVYiLCAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMgfQorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFBZGRlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiQ2FtZXJhQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFSZW1vdmVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIiwKKyAgICAgICAgICAgIG1ldGhvZF90YWJsZSwgTkVMRU0obWV0aG9kX3RhYmxlKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAppbmRleCA1OWQ3Y2RlLi45MzA2OGU2IDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKQEAgLTI0NSw5ICsyNDUsOSBAQAogICAgICAgICBzQUdwc0ludGVyZmFjZS0+aW5pdCgmc0FHcHNDYWxsYmFja3MpOwogCiAgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7CiAgICAgaWYgKHNHcHNOaUludGVyZmFjZSkKLSAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CisgICAgICAgIHNHcHNOaUludGVyZmFjZS0+aW5pdCgmc0dwc05pQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc0RlYnVnSW50ZXJmYWNlKQogICAgICAgIHNHcHNEZWJ1Z0ludGVyZmFjZSA9IChjb25zdCBHcHNEZWJ1Z0ludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfREVCVUdfSU5URVJGQUNFKTsKQEAgLTQxMywxMiArNDEzLDEwIEBACiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfc2VuZF9uaV9yZXNwb25zZShKTklFbnYqIGVudiwgam9iamVjdCBvYmosCiAgICAgICBqaW50IG5vdGlmSWQsIGppbnQgcmVzcG9uc2UpCiB7Ci0gICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkKICAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwotICAgIH0KLSAgICBpZiAoc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKHNHcHNOaUludGVyZmFjZSkKICAgICAgICAgc0dwc05pSW50ZXJmYWNlLT5yZXNwb25kKG5vdGlmSWQsIHJlc3BvbnNlKTsKLSAgICB9CiB9CiAKIHN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9nZXRfaW50ZXJuYWxfc3RhdGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAppbmRleCBjZDRmMGE0Li4zNTAyYWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcApAQCAtOSw2ICs5LDcgQEAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UoSk5JRW52KiBlbnYpOworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcihKTklFbnYqIGVudik7CkBAIC0zMiw2ICszMyw3IEBACiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0FsYXJtTWFuYWdlclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZShlbnYpOworICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcihlbnYpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGIwN2ExMGIuLjE4NmIzNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKQEAgLTcsOCArNywxMCBAQAogIyBJbmNsdWRlIGFsbCB0ZXN0IGphdmEgZmlsZXMuCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBlYXN5bW9ja2xpYgogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIHNlcnZpY2VzCisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGcmFtZXdvcmtzU2VydmljZXNUZXN0cwogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVjZTEwOWYuLmYxMTVmNDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDYgKzIzLDE5IEBACiAgICAgCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlM2E4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhlCisgKiB7QGxpbmsgY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZX0gYnkgbW9ja2luZyB0aGUKKyAqIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcn0gd2hpY2ggdGFsa3MgdG8gdG8gdGhlCisgKiBzZXJ2aWNlLiBUaGUgc2VydmljZSBpdHNlbGYgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcGxhdGZvcm0uIE5vdGU6IFRlc3RpbmcKKyAqIHRoZSBzZXJ2aWNlIGluIGZ1bGwgaXNvbGF0aW9uIHdvdWxkIHJlcXVpcmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHdvcmsgZm9yCisgKiBtb2NraW5nIGFsbCBzeXN0ZW0gaW50ZXJhY3Rpb25zLiBJdCB3b3VsZCBhbHNvIHJlcXVpcmUgYSBsb3Qgb2YgbW9ja2luZyBjb2RlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX0JJTkRFUl9DQUxMID0gMTAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCBpbiB3aGljaCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIHN5c3RlbSB0byBzdGFydCB0aGUgbW9jaworICAgICAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgdXNlZCBmb3IgdGVzdGluZyB0aGF0IGEgc2VydmljZSBpcyBub3RpZmllZCBvbmx5IHVwb24gYQorICAgICAqIG5vdGlmaWNhdGlvbiB0aW1lb3V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUID0gMzAwOworCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1BhY2thZ2VOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSB1c2VkIHRvIHRhbGsgdG8gdGhlIHRlc3RlZCBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1NYW5hZ2VyU2VydmljZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7CisgICAgICAgIGlmIChzUGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc1BhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCgpIHsKKyAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZFRoZW5FbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IG1vY2sgaW5zdGFuY2UKKyAgICAgICAgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgbW9ja0NsaWVudCA9IG5ldyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjbGllbnQgbXVzdCBiZSBkaXNhYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xpZW50IG11c3QgYmUgZW5hYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkVGhlbkRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGJlZm9yZSByZWdpc3RlcmluZyB0aGUgY2xpZW50CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0d28gbW9jayBzZXJ2aWNlcworICAgICAgICBmb3IgKFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvIDogbU1hbmFnZXJTZXJ2aWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IG1vY2sgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCIsIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJuby5zZXJ2aWNlLnJlZ2lzdGVyZWQuZm9yLnRoaXMucGFja2FnZSIpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdE1hdGNoaW5nRXZlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90aWZpdmF0aW9uQWZ0ZXJUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZmlyc3QgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZmlyc3RFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgc2Vjb25kIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlY29uZEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZWNvbmRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlY29uZEV2ZW50KTsKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudHMKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyB3YWl0IGZvciAjc2VuZEFjY2Vzc2liaWxpdHlFdmVudCB0byByZWFjaCB0aGUgYmFja2luZyBzZXJ2aWNlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV2ZW50cyBtdXN0IGJlIGRpc3BhdGNoZWQgYmVmb3JlIHRoZSBleHBpcmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24gdGltZW91dC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgLyogZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjb25maWd1cmVkIG5vdGlmaWNhdGlvbiB0aW1lb3V0IHRvIGV4cGlyZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX0RpZmZGZWVkYmFjaygpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBzZWNvbmRJbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0hBUFRJQzsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhzZWNvbmRJbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfT25lRGVmYXVsdCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9Ud29EZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0SW50ZXJydXB0KCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLmludGVycnVwdCgpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGx5IHBvcHVsYXRlcyB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gdG8gbWFyc2hhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZW50RXZlbnQgVGhlIGV2ZW50IHRvIHBvcHVsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50KSB7CisgICAgICAgIHNlbnRFdmVudC5zZXRBZGRlZENvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0QmVmb3JlVGV4dCgiQmVmb3JlVGV4dCIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENsYXNzTmFtZSgiZm9vLmJhci5iYXouQ2xhc3MiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbigiQ29udGVudERlc2NyaXB0aW9uIik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDdXJyZW50SXRlbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUaW1lKDEwMDApOworICAgICAgICBzZW50RXZlbnQuc2V0RnJvbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RnVsbFNjcmVlbih0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEl0ZW1Db3VudCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJmb28uYmFyLmJheiIpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFyY2VsYWJsZURhdGEoTWVzc2FnZS5vYnRhaW4obnVsbCwgMSwgbnVsbCkpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRSZW1vdmVkQ291bnQoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyBhIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0uCisgICAgICovCisgICAgcHVibGljIGNsYXNzIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LlN0dWIgeworICAgICAgICBib29sZWFuIG1Jc0VuYWJsZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyBhY2Nlc3NpYmlsaXR5IGlzIGluIGEgZ2l2ZW4gc3RhdGUgYnkgd3JpdGluZyB0aGUgc3RhdGUgdG8gdGhlCisgICAgICogc2V0dGluZ3MgYW5kIHdhaXRpbmcgdW50aWwgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2sgaXQgdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGVuYWJsZWQgVGhlIGFjY2Vzc2liaWxpdHkgc3RhdGUgdG8gd3JpdGUgdG8gdGhlIHNldHRpbmdzLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSAoU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDApID09IDEgPyB0cnVlIDogZmFsc2UpOworCisgICAgICAgIGlmIChpc0VuYWJsZWQgPT0gZW5hYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELAorICAgICAgICAgICAgICAgIGVuYWJsZWQgPyAxIDogMCk7CisKKyAgICAgICAgLy8gd2FpdCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgdG8gcGljayB0aGUgY2hhbmdlIHVwCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSBvbmx5IHtAbGluayBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3aXRoIGdpdmVuIGNvbXBvbmVudAorICAgICAqIG5hbWVzIGFyZSBlbmFibGVkIGJ5IHdyaXRpbmcgdG8gdGhlIHN5c3RlbSBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUKKyAgICAgKiBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrcyB0aGF0IHVwIG9yIHRoZQorICAgICAqIHtAbGluayAjVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVN9IGlzIGV4Y2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGhhbmRsZSB0byBhY2Nlc3MgdGhlIHNldHRpbmdzLgorICAgICAqIEBwYXJhbSBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCBJZiB0aGUgZmlyc3QgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBzZWNvbmQgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBzb21lIG9mIHRoZSByZXF1ZXN0ZWQgZm9yIGVuYWJsaW5nIG1vY2sgc2VydmljZXMKKyAgICAgKiAgICAgICAgIGlzIG5vdCBwcm9wZXJseSBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZUVuYWJsZWQsCisgICAgICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlbmFibGVkU2VydmljZXMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzZXJ2aWNlc1RvRW5hYmxlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmljZXNUb0VuYWJsZS5lcXVhbHMoZW5hYmxlZFNlcnZpY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMsIHNlcnZpY2VzVG9FbmFibGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gd2UgaGF2ZSBlbmFibGVkIHRoZSBzZXJ2aWNlcyBvZiBpbnRlcmVzdCBhbmQgbmVlZCB0byB3YWl0IHVudGlsIHRoZXkKKyAgICAgICAgLy8gYXJlIGluc3RhbnRpYXRlZCBhbmQgc3RhcnRlZCAoaWYgbmVlZGVkKSBhbmQgdGhlIHN5c3RlbSBiaW5kcyB0byB0aGVtCisgICAgICAgIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VPSyA9IGZhbHNlOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgcG9sbGluZ0ludGVydmFsID0gVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMgLyA2OworCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpICB7CisgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlT0sgPSAhZmlyc3RNb2NrU2VydmljZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZU9LID0gIXNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlLmlzU3lzdGVtQm91bmRBc0NsaWVudCgpKTsKKworICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VPSyAmJiBzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAocG9sbGluZ0ludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJNb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgbm90IHN0YXJ0ZWQgb3Igc3lzdGVtIG5vdCBib3VuZCBhcyBhIGNsaWVudDogIik7CisgICAgICAgIGlmICghZmlyc3RNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmVyaWZpZWQKKyAgICAgKiAod2hpY2ggaXMgaXQgaGFzIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBtZXRob2QgY2FsbHMgd2l0aCBleHBlY3RlZAorICAgICAqIGFyZ3VtZW50cykgd2l0aGluIHRoZSB7QGxpbmsgI1RJTUVPVVRfQklOREVSX0NBTEx9LiBUaGUgdmVyaWZpZWQgc3RhdGUgaXMKKyAgICAgKiBjaGVja2VkIGJ5IHBvbGxpbmcgdXBvbiBzbWFsbCBpbnRlcnZhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0byB2ZXJpZnkuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgdGhlIHZlcmlmaWNhdGlvbiBoYXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIGFmdGVyIHRoZQorICAgICAqICAgICAgICAgICAgIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEV4Y2VwdGlvbiBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsVG1lb3V0ID0gVElNRU9VVF9CSU5ERVJfQ0FMTCAvIDU7CisKKyAgICAgICAgLy8gcG9sbCB1bnRpbCB0aGUgdGltZW91dCBoYXMgZWxhcHNlZAorICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBiZWdpblRpbWUgPCBUSU1FT1VUX0JJTkRFUl9DQUxMKSB7CisgICAgICAgICAgICAvLyBzbGVlcCBmaXJzdCBzaW5jZSBpbW1lZGlhdGUgY2FsbCB3aWxsIGFsd2F5cyBmYWlsCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsVG1lb3V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb2xsIGZvciB2ZXJpZmljYXRpb24gYW5kIGlmIHRoaXMgZmFpbHMgc2F2ZSB0aGUgZXhjZXB0aW9uIGFuZAorICAgICAgICAgICAgLy8ga2VlcCBwb2xsaW5nCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZpY2UudmVyaWZ5KCk7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgc28gaXQgZG9lcyBub3QgYWNjZXB0IG1vcmUgZXZlbnRzCisgICAgICAgICAgICAgICAgc2VydmljZS5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbGFzdFZlcmlmeUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXNldCwgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZAorICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisKKyAgICAgICAgLy8gYWx3YXlzIG5vdCBudWxsCisgICAgICAgIHRocm93IGxhc3RWZXJpZnlFeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgZmlyc3QgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzSW5zdGFuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmZWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVTdHJpY3RNb2NrOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwb3J0TWF0Y2hlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OworCitpbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIHdoaWNoIG1vY2tpbmcgdGhlIGJhY2tpbmcgc2VydmljZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSA1MDsKKworICAgIC8qKgorICAgICAqIFRoZSByZXVzYWJsZSBtb2NrIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1Nb2NrU2VydmljZUludGVyZmFjZSA9CisgICAgICAgIGNyZWF0ZVN0cmljdE1vY2soSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KG1Nb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhIGxpc3Qgb2YgaW5zdGFsbGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgdGhlIG1vY2sgc2VydmljZSByZXR1cm5zCisgICAgICAgIExpc3Q8U2VydmljZUluZm8+IGV4cGVjdGVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VJbmZvPigpOworICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IG5ldyBTZXJ2aWNlSW5mbygpOworICAgICAgICBzZXJ2aWNlSW5mby5uYW1lID0gIlRlc3RTZXJ2aWNlSW5mb05hbWUiOworICAgICAgICBleHBlY3RlZFNlcnZpY2VzLmFkZChzZXJ2aWNlSW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpLmFuZFJldHVybihleHBlY3RlZFNlcnZpY2VzKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gcmVjZWl2ZWRTZXJ2aWNlcyA9IG1hbmFnZXIuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0IChsaXN0IGVxdWFscygpIGNvbXBhcmVzIGl0IGNvbnRlbnRzIGFzIHdlbGwpCisgICAgICAgIGFzc2VydEVxdWFscygiQWxsIGV4cGVjdGVkIHNlcnZpY2VzIG11c3QgYmUgcmV0dXJuZWQiLCByZWNlaXZlZFNlcnZpY2VzLCBleHBlY3RlZFNlcnZpY2VzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgbW9ja1NlcnZpY2VJbnRlcmZhY2UuaW50ZXJydXB0KCk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIG1hbmFnZXIuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIk11c3QgYmUgZW5hYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGVuYWJsZWQiLCBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIG1hbmFnZXIuZ2V0Q2xpZW50KCkuc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGFzeW5jaHJvbm91cyBJQmluZGVyIGNhbGwgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQgPSBtYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiTXVzdCBiZSBkaXNhYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGRpc2FibGVkIiwKKyAgICAgICAgICAgICAgICBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCB0byBiZSBkaXNwYXRjaGVkCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChtYW5hZ2VyIGFuZCBzZXJ2aWNlIGluIGRpZmZlcmVudCBwcm9jZXNzZXMpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGFzc2VydFNhbWUoIlRoZSBtYW5hZ2VyIGFuZCB0aGUgc2VydmljZSBhcmUgaW4gZGlmZmVyZW50IHByb2Nlc3Nlcywgc28gdGhlIGV2ZW50IG11c3QgYmUgIiArCisgICAgICAgICAgICAgICAgInJlY3ljbGVkIiwgc2VudEV2ZW50LCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gdGhlIHNhbWUgcHJvY2VzcykKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnRTYW1lUHJvY2VzcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLCBzbyB0aGUgZXZlbnQgbXVzdCBub3QiICsKKyAgICAgICAgICAgICAgICAiYmUgcmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudFNhbWVQcm9jZXNzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9BY2Nlc3NpYmlsaXR5RGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKGFjY2Vzc2liaWxpdHkgZGlzYWJsZWQpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICAgICAgZmFpbCgiTm8gYWNjZXNzaWJpbGl0eSBldmVudHMgYXJlIHNlbnQgaWYgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWNjZXNzaWJpbGl0eSBvZmYuIERpZCB5b3UgZm9yZ2V0IHRvIGNoZWNrIHRoYXQ/IiwgaXNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQKKyAgICAgKiBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXRjaGVkIFRoZSBldmVudCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgZXhwZWN0YXRpb25zIGFyZSBtYXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlFdmVudCBlcUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgbWF0Y2hlZCkgeworICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIobWF0Y2hlZCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zIHdoaWNoIGluIHRoaXMgY2FzZSBhcmUgdGhhdCBhbnkgaW5zdGFuY2UgaXMgYWNjZXB0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudE1hdGhlcigpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlciBmb3Ige0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlFdmVudCBtRXhwZWN0ZWRFdmVudDsKKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50KSB7CisgICAgICAgICAgICBtRXhwZWN0ZWRFdmVudCA9IGV4cGVjdGVkRXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBtYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoIShtYXRjaGVkIGluc3RhbmNlb2YgQWNjZXNzaWJpbGl0eUV2ZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50ID0gKEFjY2Vzc2liaWxpdHlFdmVudCkgbWF0Y2hlZDsKKyAgICAgICAgICAgIHJldHVybiBtRXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSA9PSByZWNlaXZlZEV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgic2VuZEFjY2Vzc2liaWxpdHlFdmVudCgpIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgd2l0aCBldmVudCB0eXBlIFwiIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJhZGRDbGllbnQoKSB3aXRoIGFueSBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMTU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lclRlc3RlciBleHRlbmRzIElDb3VudHJ5TGlzdGVuZXIuU3R1YiB7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5ICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHsKKworICAgICAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlSZWNlaXZlcnMoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBzdXBlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyU2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lciAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgc2VydmljZVRlc3RlciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgd2FpdEZvclN5c3RlbVJlYWR5KHNlcnZpY2VUZXN0ZXIpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyVGVzdGVyKCk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIucmVtb3ZlQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZnlMaXN0ZW5lcnMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQSA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQiA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIubm90aWZ5UmVjZWl2ZXJzKGNvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckEuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckIuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yU3lzdGVtUmVhZHkoQ291bnRyeURldGVjdG9yU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VydmljZS5pc1N5c3RlbVJlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldhaXQgU3lzdGVtIFJlYWR5IHRpbWVvdXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEFjY2Vzc2liaWxpdHlFdmVudD4gbUV4cGVjdGVkRXZlbnRzID0gbmV3IExpbmtlZExpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOworCisgICAgLyoqCisgICAgICogSW50ZXJydXB0aW9uIGNhbGwgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUV4cGVjdGVkSW50ZXJydXB0OworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgbW9jayBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGF5aW5nOworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGEgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30gcG9wdWxhdGVkIHdpdGggZGVmYXVsdAorICAgICAqIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBjcmVhdGVEZWZhdWx0SW5mbygpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGRlZmF1bHRJbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICBkZWZhdWx0SW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEOworICAgICAgICBkZWZhdWx0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZGVmYXVsdEluZm8uZmxhZ3MgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ucGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJmb28uYmFyLmJheiIKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gZGVmYXVsdEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHJlcGxheWluZyB0aGUgbW9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsYXkoKSB7CisgICAgICAgIG1SZXBsYXlpbmcgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIGlmIGFsbCBleHBlY3RlZCBzZXJ2aWNlIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZXBsYXkoKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgY2FsbCB0byAjaW50ZXJydXB0KCkgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGNhbGwgdG8gb25BY2Nlc3NpYmlsaXR5RXZlbnQoKSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJldmVudHMgXCIiICsgbUV4cGVjdGVkRXZlbnRzICsgIlwiIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmNsZWFyKCk7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgICAgICBtUmVwbGF5aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIHRvCisgICAgICoge0BsaW5rICNvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQpfSB3aXRoIGdpdmVuIGV2ZW50IGFzCisgICAgICogYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRFdmVudCBUaGUgZXhwZWN0ZWQgZXZlbnQgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmFkZChleHBlY3RlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgb2Yge0BsaW5rICNvbkludGVycnVwdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnJ1cHQoKSB7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBldmVudDogIiArIHJlY2VpdmVkRXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQgPSBtRXhwZWN0ZWRFdmVudHMucG9sbCgpOworICAgICAgICBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIG9uSW50ZXJydXB0KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIHRoZQorICAgICAqIDxjb2RlPnJlY2V2aWVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0IHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lCisgICAgICogdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImFkZGVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJiZWZvcmVUZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEJlZm9yZVRleHQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEJlZm9yZVRleHQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2hlY2tlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0NoZWNrZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjbGFzc05hbWUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY29udGVudERlc2NyaXB0aW9uIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCByZWNlaXZlZEV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjdXJyZW50SXRlbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJdGVtSW5kZXgoKSwgcmVjZWl2ZWRFdmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImVuYWJsZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZXZlbnRUeXBlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZyb21JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEZyb21JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmdWxsU2NyZWVuIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRnVsbFNjcmVlbigpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNGdWxsU2NyZWVuKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIml0ZW1Db3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRJdGVtQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEl0ZW1Db3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJwYXNzd29yZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc1Bhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc1Bhc3N3b3JkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInJlbW92ZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzVGV4dChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIGFuZHJvaWQub3MuUGFyY2VsYWJsZX0gZGF0YSBvZiB0aGUKKyAgICAgKiA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQKKyAgICAgKiB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZSB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAicGFyY2VsYWJsZURhdGEgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIGV4cGVjdGVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKyAgICAgICAgTWVzc2FnZSByZWNlaXZlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgcmVjZWl2ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworCisgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlY2VpdmVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtZXNzYWdlLCByZWNlaXZlZE1lc3NhZ2UpOworCisgICAgICAgIC8vIHdlIGRvIGEgdmVyeSBzaW1wbGUgc2FuaXR5IGNoZWNrIHNpbmNlIHdlIGRvIG5vdCB0ZXN0IE1lc3NhZ2UKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkTWVzc2FnZS53aGF0LCByZWNlaXZlZE1lc3NhZ2Uud2hhdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHRleHQgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IGJ5IGNvbXBhcmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIENoYXJTZXF1ZW5jZX1zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNUZXh0KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAidGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dCA9IGV4cGVjdGVkRXZlbnQuZ2V0VGV4dCgpOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0ID0gcmVjZWl2ZWRFdmVudC5nZXRUZXh0KCk7CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dC5zaXplKCksIHJlY2VpdmVkVGV4dC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0SXRlcmF0b3IgPSBleHBlY3RlZFRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHRJdGVyYXRvciA9IHJlY2VpdmVkVGV4dC5pdGVyYXRvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXh0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPVU5UUllfSVNPID0gInVzIjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIENvdW50cnkgbU5vdGlmaWVkQ291bnRyeTsKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Ob3RpZmllZENvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TGlzdGVuZXIoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID09IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnlEZXRlY3RvckJhc2UobUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGZpbmFsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbihjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXJBZGRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENvdW50cnlMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpZWQ7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdExvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIGZpbmFsIENvdW50cnkgbG9jYXRpb25CYXNlZENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKGxvY2F0aW9uQmFzZWRDb3VudHJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShsaXN0ZW5lci5nZXRDb3VudHJ5KCksIGxvY2F0aW9uQmFzZWRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BwaW5nRGV0ZWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3Qgc3RvcHBpbmcgZGV0ZWN0b3Igd2hlbiBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHdhcyBzdGFydGVkCisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGUgTG9jYXRpb25CYXNlZERldGVjdG9yIHNob3VsZCBiZSBzdG9wcGVkLgorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICAvLyBUaGUgbG9jYXRpb24gcmVmcmVzaCBzaG91bGQgbm90IHJ1bm5pbmcuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25CYXNlZENvdW50cnlOb3RGb3VuZCgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ291bnRyeUZvdW5kKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlb2NvZGVyTm90SW1wbGVtZW50ZWQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzYW1lQ291bnRyeShDb3VudHJ5IGNvdW50cnkxLCBDb3VudHJ5IGNvdW50cnkyKSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5MSA9PSBudWxsICYmIGNvdW50cnkyID09IG51bGwgfHwgY291bnRyeTEgIT0gbnVsbCAmJiBjb3VudHJ5MiAhPSBudWxsICYmCisgICAgICAgIGNvdW50cnkxLmdldENvdW50cnlJc28oKS5lcXVhbHNJZ25vcmVDYXNlKGNvdW50cnkyLmdldENvdW50cnlJc28oKSkgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0U291cmNlKCkgPT0gY291bnRyeTIuZ2V0U291cmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWU4ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMX1BST1ZJREVSUyA9IDI7CisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY291bnRyeUZvdW5kTG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlDb3VudHJ5ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9jYXRpb24gbUxvY2F0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ291bnRyeTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1MaXN0ZW5lcnM7CisKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoU3RyaW5nIGNvdW50cnksIFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgdGhpcyhjb3VudHJ5LCBwcm92aWRlciwgMTAwMCAqIDYwICogNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyLCBsb25nIHF1ZXJ5TG9jYXRpb25UaW1lb3V0KSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uID0gbmV3IExvY2F0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1RdWVyeUxvY2F0aW9uVGltZW91dCA9IHF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TG9jYXRpb25MaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvY2F0aW9uLmdldFByb3ZpZGVyKCkuZW5kc1dpdGgobG9jYXRpb24uZ2V0UHJvdmlkZXIoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJFbmFibGVkUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzLmFkZEFsbChsaXN0ZW5lcnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1Mb2NhdGlvbkxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gVE9UQUxfUFJPVklERVJTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25Gb3VuZCgpIHsKKyAgICAgICAgICAgIC8vIExpc3RlbmVyIGNvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgTG9jYXRpb25MaXN0ZW5lclttTGlzdGVuZXJzLnNpemUoKV07CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMudG9BcnJheShsaXN0ZW5lcnMpOworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDpsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkxvY2F0aW9uQ2hhbmdlZChtTG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRMaXN0ZW5lcnNDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvdW50cnlGb3VuZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5Q291bnRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgY291bnRyeUZvdW5kTG9ja2VyLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRpbWVyIGdldFRpbWVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UaW1lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJlYWQgZ2V0UXVlcnlUaHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5VGhyZWFkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvdW50cnlDb2RlOworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvdW50cnlDb2RlID0gY291bnRyeS5nZXRDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnlDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHN0b3AgdGhlIHRocmVhZCwgbGV0J3MgdGVzdCBpdCBjb3VsZCBiZSBzdG9wcGVkLCBhZnRlciBnZXQgY291bnRyeQorICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlGYWlsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgbm90aWZ5Q291bnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGNvdW50cnkuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlXaXRoTGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBsb25nIHRpbWVvdXQgPSAxMDAwOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIsIHRpbWVvdXQpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIHdhaXRGb3JUaW1lclJlc2V0KGRldGVjdG9yKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIC8vIENvdW50cnlMaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclRpbWVyUmVzZXQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRUaW1lcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGltZXIgdGltZXIgPSBkZXRlY3Rvci5nZXRUaW1lcigpOworICAgICAgICBhc3NlcnRUcnVlKHRpbWVyID09IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGhyZWFkRW5kaW5nKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZC5qb2luKDUwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWQgd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHRocmVhZCA9IGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCk7CisgICAgICAgIGFzc2VydFRydWUodGhyZWFkICE9IG51bGwpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCmluZGV4IDhhNDczMzkuLmZmYWJiN2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQpAQCAtMTYsODMgKzE2LDIwMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5Bc1lvdVR5cGVGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogV2F0Y2hlcyBhIHtAbGluayBUZXh0Vmlld30gYW5kIGlmIGEgcGhvbmUgbnVtYmVyIGlzIGVudGVyZWQgd2lsbCBmb3JtYXQgaXQgdXNpbmcKLSAqIHtAbGluayBQaG9uZU51bWJlclV0aWxzI2Zvcm1hdE51bWJlcihFZGl0YWJsZSwgaW50KX0uIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uCi0gKiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIHdoZW4gdGhpcyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCi0gKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgKiBXYXRjaGVzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZAorICogd2lsbCBmb3JtYXQgaXQuCisgKiA8cD4KKyAqIFN0b3AgZm9ybWF0dGluZyB3aGVuIHRoZSB1c2VyCisgKiA8dWw+CisgKiA8bGk+SW5wdXRzIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzPC9saT4KKyAqIDxsaT5SZW1vdmVzIHRoZSBzZXBhcmF0b3IgaW4gdGhlIG1pZGRsZSBvZiBzdHJpbmcuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgcmVzdGFydGVkIG9uY2UgdGhlIHRleHQgaXMgY2xlYXJlZC4KICAqLwogcHVibGljIGNsYXNzIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyIGltcGxlbWVudHMgVGV4dFdhdGNoZXIgeworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVNT1ZFX0xBU1QgPSAwOwogCi0gICAgc3RhdGljIHByaXZhdGUgaW50IHNGb3JtYXRUeXBlOwotICAgIHN0YXRpYyBwcml2YXRlIExvY2FsZSBzQ2FjaGVkTG9jYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRm9ybWF0dGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nSHlwaGVuOwotICAgIHByaXZhdGUgaW50IG1IeXBoZW5TdGFydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nQmFja3dhcmQ7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9BUFBFTkQgPSAxOwogCisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgZGlnaXRzIHdlcmUgY2hhbmdlZCBpbiB0aGUgYmVnaW5uaW5nIG9yIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTU9ESUZZX0RJR0lUUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhbmdlcyBvdGhlciB0aGFuIHRoZSBhYm92ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfT1RIRVIgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlIGNvdWxkIGJlIG9uZSB2YWx1ZSBvZiB0aGUgYWJvdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGNoYW5nZSB3YXMgY2F1c2VkIGJ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgZm9ybWF0dGluZyBoYXMgYmVlbiBzdG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcEZvcm1hdHRpbmc7CisKKyAgICBwcml2YXRlIEFzWW91VHlwZUZvcm1hdHRlciBtRm9ybWF0dGVyOworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGxvY2FsZSBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCisgICAgICogbWF5IG5vdCB0YWtlIGVmZmVjdCBvbiB0aGlzIGluc3RhbmNlLgorICAgICAqLwogICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpIHsKLSAgICAgICAgaWYgKHNDYWNoZWRMb2NhbGUgPT0gbnVsbCB8fCBzQ2FjaGVkTG9jYWxlICE9IExvY2FsZS5nZXREZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNDYWNoZWRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgc0Zvcm1hdFR5cGUgPSBQaG9uZU51bWJlclV0aWxzLmdldEZvcm1hdFR5cGVGb3JMb2NhbGUoc0NhY2hlZExvY2FsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldENvdW50cnkoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgdGV4dCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdG8gaWdub3JlIGNhbGxzIHRvIGFmdGVyVGV4dENoYW5nZWQgY2F1c2VkIGJ5IHRoZSB3b3JrIGRvbmUgYmVsb3cKLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgbUZvcm1hdHRpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBJZiBkZWxldGluZyB0aGUgaHlwaGVuLCBhbHNvIGRlbGV0ZSB0aGUgY2hhciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAotICAgICAgICAgICAgaWYgKG1EZWxldGluZ0h5cGhlbiAmJiBtSHlwaGVuU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZWxldGluZ0JhY2t3YXJkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSHlwaGVuU3RhcnQgLSAxIDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUobUh5cGhlblN0YXJ0IC0gMSwgbUh5cGhlblN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUh5cGhlblN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQsIG1IeXBoZW5TdGFydCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIodGV4dCwgc0Zvcm1hdFR5cGUpOwotCi0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IGZhbHNlOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGdpdmVuIDxjb2RlPmNvdW50cnlDb2RlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5Q29kZSB0aGUgSVNPIDMxNjYtMSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgY291bnRyeS9yZWdpb24KKyAgICAgKiB3aGVyZSB0aGUgcGhvbmUgbnVtYmVyIGlzIGJlaW5nIGVudGVyZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcihTdHJpbmcgY291bnRyeUNvZGUpIHsKKyAgICAgICAgaWYgKGNvdW50cnlDb2RlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgbUZvcm1hdHRlciA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpLmdldEFzWW91VHlwZUZvcm1hdHRlcihjb3VudHJ5Q29kZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgYSBoeXBoZW4KLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHVzZXIgaXMgZGVsZXRpbmcgb25lIGNoYXIsIHdpdGhvdXQgYSBzZWxlY3Rpb24KLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHMpOwotICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxIC8vIENhbiBkZWxldGUgYW5vdGhlciBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgY291bnQgPT0gMSAvLyBEZWxldGluZyBvbmx5IG9uZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgYWZ0ZXIgPT0gMCAvLyBEZWxldGluZwotICAgICAgICAgICAgICAgICAgICAmJiBzLmNoYXJBdChzdGFydCkgPT0gJy0nIC8vIGEgaHlwaGVuCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbFN0YXJ0ID09IHNlbEVuZCkgeyAvLyBubyBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IeXBoZW5TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGRlbGV0aW5nIGZvcndhcmQgb3IgYmFja3dhcmQKLSAgICAgICAgICAgICAgICBpZiAoc2VsU3RhcnQgPT0gc3RhcnQgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRGVsZXRpbmdCYWNrd2FyZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURlbGV0aW5nSHlwaGVuID0gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGFmdGVyKSB7CisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPT0gMCAmJiBzLmxlbmd0aCgpID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvLyBBcHBlbmQgb25lIG9yIG1vcmUgbmV3IGNoYXJzCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BUFBFTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIgPT0gMCAmJiBzdGFydCArIGNvdW50ID09IHMubGVuZ3RoKCkgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgb25lIG9yIG1vcmUgY2hhcnMgZnJvbSB0aGUgZW5kIG9mIHN0cmluZy4KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFTU9WRV9MQVNUOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID4gMCAmJiAhaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGlhbGFibGUgY2hhcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX09USEVSOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nCisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgaW5zZXJ0ZWQgdGhlIGRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01PRElGWV9ESUdJVFM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FQUEVORCAmJiBjb3VudCA+IDAgJiYgaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgYXBwZW5kZWQgdGhlIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICAvLyBVc2VyIG11c3QgaW5zZXJ0IG9yIHJlbW92ZSB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZgorICAgICAgICAgICAgLy8gbnVtYmVyLCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICBpZiAobVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBmb3JtYXR0aW5nIHdoZW4gYWxsIHRleHRzIHdlcmUgY2xlYXIuCisgICAgICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSAhKHMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNoYW5nZSBjYXVzZWQgYnkgcy5yZXBsYWNlKCkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZCA9IHJlZm9ybWF0KHMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocykpOworICAgICAgICBpZiAoZm9ybWF0dGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCByZW1lbWJlcmVkUG9zID0gbUZvcm1hdHRlci5nZXRSZW1lbWJlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHMucmVwbGFjZSgwLCBzLmxlbmd0aCgpLCBmb3JtYXR0ZWQsIDAsIGZvcm1hdHRlZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAvLyBUaGUgdGV4dCBjb3VsZCBiZSBjaGFuZ2VkIGJ5IG90aGVyIFRleHRXYXRjaGVyIGFmdGVyIHdlIGNoYW5nZWQgaXQuIElmIHdlIGZvdW5kIHRoZQorICAgICAgICAgICAgLy8gdGV4dCBpcyBub3QgdGhlIG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywganVzdCBnaXZlIHVwIGNhbGxpbmcgc2V0U2VsZWN0aW9uKCkuCisgICAgICAgICAgICBpZiAoZm9ybWF0dGVkLmVxdWFscyhzLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzLCByZW1lbWJlcmVkUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZm9ybWF0dGVkIG51bWJlciBieSBpZ25vcmluZyBhbGwgbm9uLWRpYWxhYmxlIGNoYXJzIGFuZCBzdGljayB0aGUgY3Vyc29yIHRvIHRoZQorICAgICAqIG5lYXJlc3QgZGlhbGFibGUgY2hhciB0byB0aGUgbGVmdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbnVtYmVyIGlzICAoNjUwKSAxMjMtNDU2NzggYW5kICc0JyBpcworICAgICAqIHJlbW92ZWQgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBiZWhpbmQgJzMnIGluc3RlYWQgb2YgJy0nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZm9ybWF0KENoYXJTZXF1ZW5jZSBzLCBpbnQgY3Vyc29yKSB7CisgICAgICAgIC8vIFRoZSBpbmRleCBvZiBjaGFyIHRvIHRoZSBsZWZ0d2FyZCBvZiB0aGUgY3Vyc29yLgorICAgICAgICBpbnQgY3VySW5kZXggPSBjdXJzb3IgLSAxOworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gbnVsbDsKKyAgICAgICAgbUZvcm1hdHRlci5jbGVhcigpOworICAgICAgICBjaGFyIGxhc3ROb25TZXBhcmF0b3IgPSAwOworICAgICAgICBib29sZWFuIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gZ2V0Rm9ybWF0dGVkTnVtYmVyKGxhc3ROb25TZXBhcmF0b3IsIGhhc0N1cnNvcik7CisgICAgICAgICAgICAgICAgICAgIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0Tm9uU2VwYXJhdG9yID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGN1ckluZGV4KSB7CisgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdE5vblNlcGFyYXRvciAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZvcm1hdHRlZE51bWJlcihjaGFyIGxhc3ROb25TZXBhcmF0b3IsIGJvb2xlYW4gaGFzQ3Vyc29yKSB7CisgICAgICAgIHJldHVybiBoYXNDdXJzb3IgPyBtRm9ybWF0dGVyLmlucHV0RGlnaXRBbmRSZW1lbWJlclBvc2l0aW9uKGxhc3ROb25TZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgOiBtRm9ybWF0dGVyLmlucHV0RGlnaXQobGFzdE5vblNlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSB0cnVlOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcGFyYXRvcihmaW5hbCBDaGFyU2VxdWVuY2UgcywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKaW5kZXggMzY1ODk2MS4uMTEzMTVjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuTnVtYmVyUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWwuUGhvbmVOdW1iZXJGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZW51bWJlci5QaG9uZU51bWJlcjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CkBAIC02MTcsNyArNjIyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEluIHRoZSBVUywgMS02NTAtNTU1LTEyMzQgbXVzdCBiZSBlcXVhbCB0byA2NTAtNTU1LTEyMzQsCi0gICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsdCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCisgICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsIHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KICAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCBleGlzdHMganVzdCBpbiBVUyAod2l0aCAxIHRydW5rIChOREQpIHByZWZpeCkuCiAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiwgIjAxMSAxMSA3MDA1NTU0MTQxIiBtdXN0IG5vdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIiwKICAgICAgICAgICAgIC8vIHdoaWxlICIwMTEgMSA3MDA1NTU0MTQxIiBtdXN0IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiCkBAIC03NzksMTAgKzc4NCwxMCBAQAogICAgICAgICBpZiAocHJlcGVuZFBsdXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gImludGVybmF0aW9uYWwgbnVtYmVyIiBhbmQgc2hvdWxkIGhhdmUKICAgICAgICAgICAgIC8vIGEgcGx1cyBwcmVwZW5kZWQgdG8gdGhlIGRpYWxpbmcgbnVtYmVyLiBCdXQgdGhlcmUKLSAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdzbSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKKyAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdTTSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRob3NlIGFsc28uCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bSBpcyBhCisgICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtCiAgICAgICAgICAgICAvLyBoYXMgYSBuaWNlIGxpc3Qgb2Ygc29tZSBvZiB0aGVzZSBHU00gY29kZXMuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gRXhhbXBsZXMgYXJlOgpAQCAtODcwLDEwICs4NzUsMTAgQEAKIAogICAgICAgICAgICAgLy8gRklYTUUobWtmKSBUUyAyMy4wNDAgOS4xLjIuMyBzYXlzCiAgICAgICAgICAgICAvLyAiaWYgYSBtb2JpbGUgcmVjZWl2ZXMgMTExMSBpbiBhIHBvc2l0aW9uIHByaW9yIHRvCi0gICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5zZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5jZSB3aXRoCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzZW1pLW9jdGV0IGFuZCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAgICAgICAgIC8vIHNlbWktb2N0ZXQgc2hhbGwgYmUgaWdub3JlZCIKLSAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LDAwOCAxMC41LjQuNworICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQuMDA4IDEwLjUuNC43CiAKICAgICAgICAgICAgIGIgPSAoYnl0ZSkoKGJ5dGVzW2ldID4+IDQpICYgMHhmKTsKIApAQCAtMTAwNCw3ICsxMDA5LDcgQEAKICAgICAgKiBDb252ZXJ0IGEgZGlhbGluZyBudW1iZXIgdG8gQkNEIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBudW1iZXIgZGlhbGluZyBudW1iZXIgc3RyaW5nCi0gICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmwgVE9BCisgICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmFsIFRPQQogICAgICAqIEByZXR1cm4gQkNEIGJ5dGUgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXQpAQCAtMTEwOCwxMCArMTExMywxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdAogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKiBAcmV0dXJuIFRoZSBwaG9uZSBudW1iZXIgZm9ybWF0dGVkIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRpbmcgdHlwZS4KICAgICAgKgotICAgICAqIEBoaWRlIFRPRE86U2h1b2xkIGJlIHVuaGlkZGVuLgorICAgICAqIEBoaWRlIFRPRE86IFNob3VsZCBiZSB1bmhpZGRlbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoU3RyaW5nIHNvdXJjZSwgaW50IGRlZmF1bHRGb3JtYXR0aW5nVHlwZSkgewogICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzb3VyY2UpOwpAQCAtMTEzOCw3ICsxMTQzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLCB3aWxsIGJlIG1vZGlmaWVkIHdpdGggdGhlIGZvcm1hdHRpbmcKICAgICAgKiBAcGFyYW0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgcnVsZXMgdG8gYXBwbHkgaWYgdGhlIG51bWJlciBkb2VzCi0gICAgICogbm90IGJlZ2luIHdpdGggKzxjb3VudHJ5X2NvZGU+CisgICAgICogbm90IGJlZ2luIHdpdGggK1tjb3VudHJ5X2NvZGVdCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdE51bWJlcihFZGl0YWJsZSB0ZXh0LCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIGludCBmb3JtYXRUeXBlID0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlOwpAQCAtMTMxOSw2ICsxMzI0LDg4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIGdpdmVuIHBob25lTnVtYmVyIHRvIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIG11c3QgaGF2ZSBhbiBhcmVhIGNvZGUgYW5kIGNvdWxkIGhhdmUgYSBjb3VudHJ5CisgICAgICogY29kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdENvdW50cnlJc28gaXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCBnZW5lcmF0ZQorICAgICAqIHRoZSBFLjE2NCBwaG9uZSBudW1iZXIgaWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgYSBjb3VudHJ5IGNvZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbiwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIGlzCisgICAgICogICAgICAgICBub3QgdmFsaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlclRvRTE2NChTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZShwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgaWYgKHV0aWwuaXNWYWxpZE51bWJlcihwbikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdChwbiwgUGhvbmVOdW1iZXJGb3JtYXQuRTE2NCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCBhIHBob25lIG51bWJlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLCB0aGUgcGhvbmUgd2lsbCBiZQorICAgICAqIGZvcm1hdHRlZCB0byB0aGUgZGVmYXVsdCBjb3VudHJ5J3MgY29udmVudGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUgd2hvc2UgY29udmVudGlvbiB3aWxsCisgICAgICogICAgICAgICAgICBiZSB1c2VkIGlmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG51bWJlciwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIG5vdCB2YWxpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlKHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdEluT3JpZ2luYWxGb3JtYXQocG4sIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsaXplIGEgcGhvbmUgbnVtYmVyIGJ5IHJlbW92aW5nIHRoZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gZGlnaXRzLiBJZgorICAgICAqIHRoZSBnaXZlbiBudW1iZXIgaGFzIGtleXBhZCBsZXR0ZXJzLCB0aGUgbGV0dGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0bworICAgICAqIGRpZ2l0cyBmaXJzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIG51bWJlci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGxlbiA9IHBob25lTnVtYmVyLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwaG9uZU51bWJlci5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc0lTT0RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JyB8fCBjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVOdW1iZXIoUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKHBob25lTnVtYmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCiAgICAgLy8gVGhyZWUgYW5kIGZvdXIgZGlnaXQgcGhvbmUgbnVtYmVycyBmb3IgZWl0aGVyIHNwZWNpYWwgc2VydmljZXMsCiAgICAgLy8gb3IgMy02IGRpZ2l0IGFkZHJlc3NlcyBmcm9tIHRoZSBuZXR3b3JrIChlZyBjYXJyaWVyLW9yaWdpbmF0ZWQgU01TIG1lc3NhZ2VzKSBzaG91bGQKICAgICAvLyBub3QgbWF0Y2guCkBAIC0xNTQ2LDcgKzE2MzMsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKLSAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm10KSB7CisgICAgY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoU3RyaW5nIGRpYWxTdHIsaW50IGN1cnJGb3JtYXQsaW50IGRlZmF1bHRGb3JtYXQpIHsKICAgICAgICAgU3RyaW5nIHJldFN0ciA9IGRpYWxTdHI7CiAKICAgICAgICAgLy8gQ2hlY2tzIGlmIHRoZSBwbHVzIHNpZ24gY2hhcmFjdGVyIGlzIGluIHRoZSBwYXNzZWQtaW4gZGlhbCBzdHJpbmcKQEAgLTE1NTQsNyArMTY0MSw3IEBACiAgICAgICAgICAgICBkaWFsU3RyLmxhc3RJbmRleE9mKFBMVVNfU0lHTl9TVFJJTkcpICE9IC0xKSB7CiAgICAgICAgICAgICAvLyBGb3JtYXQgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgcnVsZXMgZm9yIHRoZSBjb3VudHJ5IHRoZSBudW1iZXIgaXMgZnJvbSwKICAgICAgICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBjb3VudHJ5IHRoZSBwaG9uZSBpcyBjYW1wZWQgb24uCi0gICAgICAgICAgICBpZiAoKGN1cnJGb3JtYXQgPT0gZGVmYXVsdEZvcm10KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKKyAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybWF0KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBkZWZhdWx0IGFuZCBjdXJyZW50IHRlbGVwaG9uZSBudW1iZXJpbmcgcGxhbnMgYXJlIE5BTlAuCiAgICAgICAgICAgICAgICAgU3RyaW5nIHBvc3REaWFsU3RyID0gbnVsbDsKICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcERpYWxTdHIgPSBkaWFsU3RyOwpAQCAtMTczMiw3ICsxODE5LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWJsYWJsZSBQL1cgY2hhcmFjdGVyIHRvIHRoZSBvcmlnaW5hbAorICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCiAgICAgLy8gZGlhbCBzdHJpbmcgYmFzZWQgb24gdGhlIGRpYWxhYmxlIGluZGV4IHBhc3NlZCBpbgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZwogICAgIGFwcGVuZFB3Q2hhckJhY2tUb09yaWdEaWFsU3RyKGludCBkaWFsYWJsZUluZGV4LFN0cmluZyBvcmlnU3RyLCBTdHJpbmcgZGlhbFN0cikgewpAQCAtMTc1Miw3ICsxODM5LDcgQEAKICAgICAgICAgcmV0dXJuIHJldFN0cjsKICAgICB9CiAKLSAgICAvLz09PT09IEJlZ2luaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKICAgICAvKioKICAgICAgKiBQaG9uZSBudW1iZXJzIGFyZSBzdG9yZWQgaW4gImxvb2t1cCIgZm9ybSBpbiB0aGUgZGF0YWJhc2UKQEAgLTE4NzQsMTIgKzE5NjEsMTIgQEAKIAogICAgIC8vPT09PT0gRW5kIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQogCi0gICAgLy89PT09PSBCZWdnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CisgICAgLy89PT09PSBCZWdpbm5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CiAKICAgICAvKgogICAgICAqIElmIHRydWUsIHRoZSBudW1iZXIgaXMgY291bnRyeSBjYWxsaW5nIGNvZGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVExZX0NBTExJTkdfQ0FMTFtdID0geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRSWV9DQUxMSU5HX0NBTExbXSA9IHsKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAogICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwKQEAgLTE4OTEsMTggKzE5NzgsMTggQEAKICAgICAgICAgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsCiAgICAgICAgIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCiAgICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UTFlfQ0FMTElOR19DQUxMLmxlbmd0aDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UUllfQ0FMTElOR19DQUxMLmxlbmd0aDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGlucHV0IGlzIHZhbGlkIENvdW50cnkgQ2FsbGluZyBDb2RlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb3VudHJ5Q2FsbGluZ0NvZGUoaW50IGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSkgewogICAgICAgICByZXR1cm4gY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlID4gMCAmJiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPCBDQ0NfTEVOR1RIICYmCi0gICAgICAgICAgICAgICAgQ09VTlRMWV9DQUxMSU5HX0NBTExbY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlXTsKKyAgICAgICAgICAgICAgICBDT1VOVFJZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaW50ZXJnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgaWYgaW5wdXQgImNoIiBpcworICAgICAqIFJldHVybnMgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCiAgICAgICogSVNPLUxBVElOIGNoYXJhY3RlcnMgMC05LgogICAgICAqIFJldHVybnMgLTEgb3RoZXJ3aXNlCiAgICAgICovCkBAIC0yMDM3LDcgKzIxMjQsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHByZWZpeCBvZiAic3RyIiBpcyAiaWdub3JhYmxlIi4gSGVyZSwgImlnbm9yYWJsZSIgbWVhbnMKLSAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdGVyIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKKyAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKICAgICAgKiBhc3N1bWVkIHRvIGJlIHRydW5rIHByZWZpeC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUHJlZml4SXNJZ25vcmFibGUoZmluYWwgU3RyaW5nIHN0ciwKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggODMwYWY0Ny4uMzhmNDRkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogCiAvKioKICAqIEEgbGlzdGVuZXIgY2xhc3MgZm9yIG1vbml0b3JpbmcgY2hhbmdlcyBpbiBzcGVjaWZpYyB0ZWxlcGhvbnkgc3RhdGVzCkBAIC0yODQsNyArMjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFLCBzdGF0ZSwgbmV0d29ya1R5cGUsIG51bGwpLgorICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSkuCiAgICAgICAgICAgICAgICAgICAgIHNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQppbmRleCBmNWU5NzUxLi45NTM2OTZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVNtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNSYXdEYXRhOwpAQCAtMzMsNyArMzIsNyBAQAogLyoKICAqIFRPRE8oY29kZSByZXZpZXcpOiBDdXJpb3VzIHF1ZXN0aW9uLi4uIFdoeSBhcmUgYSBsb3Qgb2YgdGhlc2UKICAqIG1ldGhvZHMgbm90IGRlY2xhcmVkIGFzIHN0YXRpYywgc2luY2UgdGhleSBkbyBub3Qgc2VlbSB0byByZXF1aXJlCi0gKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgQXNzdW1lZGx5IHRoaXMgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAorICogYW55IGxvY2FsIG9iamVjdCBzdGF0ZT8gIFByZXN1bWFibHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CiAgKiBpbnRlcmZlcmluZyB3aXRoIHRoZSBBUEkuLi4KICAqLwogCkBAIC00Miw3ICs0MSw4IEBACiAgKiBHZXQgdGhpcyBvYmplY3QgYnkgY2FsbGluZyB0aGUgc3RhdGljIG1ldGhvZCBTbXNNYW5hZ2VyLmdldERlZmF1bHQoKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNtc01hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIFNtc01hbmFnZXIgc0luc3RhbmNlOworICAgIC8qKiBTaW5nbGV0b24gb2JqZWN0IGNvbnN0cnVjdGVkIGR1cmluZyBjbGFzcyBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTbXNNYW5hZ2VyIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7CiAKICAgICAvKioKICAgICAgKiBTZW5kIGEgdGV4dCBiYXNlZCBTTVMuCkBAIC01Miw4ICs1Miw4IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKICAgICAgKiAgIGJyb2FkY2FzdCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgcGFydCBoYXMgYmVlbiBzZW50LgotICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAqICAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCkBAIC0xNzgsOCArMTc4LDggQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCi0gICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTIyNCw5ICsyMjQsNiBAQAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIFNtc01hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNtc01hbmFnZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgU21zTWFuYWdlcigpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKaW5kZXggYTI4NGVhNS4uZDg5OTQzMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuU3VibWl0UGR1QmFzZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKaW5kZXggNGRjMTk5MS4uMjkzNGU2YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKQEAgLTMyOSw3ICszMjksNyBAQAogICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0uCiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiBpZiBhY3RpdmUgY2FsbCBpcyByaW5naW5nLCB3YWl0aW5nLCBvcgotICAgICAqIGRpYWxpbmcvYWxlcnRpbmcsIG9yIGhlbGRDYWxsIGNhbu+/vXQgYmUgYWN0aXZlLgorICAgICAqIGRpYWxpbmcvYWxlcnRpbmcsIG9yIGhlbGRDYWxsIGNhbid0IGJlIGFjdGl2ZS4KICAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcGVyYXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3dpdGNoSG9sZGluZ0FuZEFjdGl2ZShDYWxsIGhlbGRDYWxsKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKaW5kZXggNWRlMDQyNi4uMjdhNGRjYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKQEAgLTI3LDggKzI3LDggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21tYW5kc0ludGVyZmFjZSB7CiAgICAgZW51bSBSYWRpb1N0YXRlIHsKLSAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY3RseSBwb3dlcmVkIG9mZiAoZWcgQ0ZVTj0wKSAqLwotICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGVnLCByZXNldHRpbmcgb3Igbm90IGJvb3RlZCkgKi8KKyAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY2l0bHkgcG93ZXJlZCBvZmYgKGUuZy4gQ0ZVTj0wKSAqLworICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGUuZy4gcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCiAgICAgICAgIFNJTV9OT1RfUkVBRFksICAgICAvKiBSYWRpbyBpcyBvbiwgYnV0IHRoZSBTSU0gaW50ZXJmYWNlIGlzIG5vdCByZWFkeSAqLwogICAgICAgICBTSU1fTE9DS0VEX09SX0FCU0VOVCwgIC8qIFNJTSBQSU4gbG9ja2VkLCBQVUsgcmVxdWlyZWQsIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hbGl6YXRpb24sIG9yIFNJTSBhYnNlbnQgKi8KQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIC8vIFNlZSAyNy4wMDcgK0NDRkMgb3IgK0NMQ0sKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfTk9ORSAgICAgPSAwOyAvLyBubyB1c2VyIGlucHV0CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1ZPSUNFICAgID0gKDEgPDwgMCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub3ltIGZvciAxNiszMis2NCsxMjgKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQSAgICAgPSAoMSA8PCAxKTsgLy9zeW5vbnltIGZvciAxNiszMis2NCsxMjgKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfRkFYICAgICAgPSAoMSA8PCAyKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfU01TICAgICAgPSAoMSA8PCAzKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQV9TWU5DID0gKDEgPDwgNCk7CkBAIC05NTIsMTkgKzk1MiwxOSBAQAogICAgIHZvaWQgd3JpdGVTbXNUb1J1aW0oaW50IHN0YXR1cywgU3RyaW5nIHBkdSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBhcG4KICAgICAgKiBAcGFyYW0gdXNlcgogICAgICAqIEBwYXJhbSBwYXNzd29yZAogICAgICAqIEBwYXJhbSByZXNwb25zZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBjaWQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoaW50IGNpZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICB2b2lkIHNldFJhZGlvUG93ZXIoYm9vbGVhbiBvbiwgTWVzc2FnZSByZXNwb25zZSk7CkBAIC05NzQsNyArOTc0LDcgQEAKICAgICB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nQ2RtYVNtcyhib29sZWFuIHN1Y2Nlc3MsIGludCBjYXVzZSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIEljY0lvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KQEAgLTEwNzksNyArMTA3OSw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTExNTIsNyArMTE1Miw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZS9kaXNhYmxlIG5ldHdvcmsgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgd2hlbgotICAgICAqIGxvY2F0aW9uIGluZm9ybWF0ZWlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgorICAgICAqIGxvY2F0aW9uIGluZm9ybWF0aW9uIChsYWMgYW5kL29yIGNpZCkgaGFzIGNoYW5nZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHBhcmFtIHJlc3BvbnNlIGNhbGxiYWNrIG1lc3NhZ2UKQEAgLTExODMsNyArMTE4Myw3IEBACiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHZlbmRvciByaWwgdGhhdCBTdGtTZXJ2aWNlIGlzIHJ1bm5pbmcKLSAgICAgKiByYW5kIGlzIGVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFggY29tbWFuZHMuCisgICAgICogYW5kIGlzIHJlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBjYWxsYmFjayBtZXNzYWdlCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCmluZGV4IDY2MzQwMTcuLjEzYzc2ZTUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC00MTksMTcgKzQxOSwxNCBAQAogICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgY2lkID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZVswXSk7CiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJuZXQuIiArIGludGVyZmFjZU5hbWUgKyAiLiI7CisgICAgICAgICAgICAgICAgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKKyAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzBdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczEiKTsKKyAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzFdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczIiKTsKKwogICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9IHJlc3BvbnNlWzJdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKLSAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKLSAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1swXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMxIik7Ci0gICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coImludGVyZmFjZT0iICsgaW50ZXJmYWNlTmFtZSArICIgaXBBZGRyZXNzPSIgKyBpcEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ2F0ZXdheT0iICsgZ2F0ZXdheUFkZHJlc3MgKyAiIEROUzE9IiArIGRuc1NlcnZlcnNbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRE5TMj0iICsgZG5zU2VydmVyc1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoaXNEbnNPayhkbnNTZXJ2ZXJzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKQEAgLTQ0NCw3ICs0NDEsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIGxvZygiRGF0YUNvbm5lY3Rpb24gc2V0dXAgcmVzdWx0PSciICsgcmVzdWx0ICsgIicgb24gY2lkPSIgKyBjaWQpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBsb2coIkRhdGFDb25uZWN0aW9uIHNldHVwIHJlc3VsdD0nIiArIHJlc3VsdCArICInIG9uIGNpZD0iICsgY2lkKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gU2V0dXBSZXN1bHQuU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGxvZygiaW50ZXJmYWNlPSIgKyBpbnRlcmZhY2VOYW1lICsgIiBpcEFkZHJlc3M9IiArIGlwQWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGdhdGV3YXk9IiArIGdhdGV3YXlBZGRyZXNzICsgIiBETlMxPSIgKyBkbnNTZXJ2ZXJzWzBdCisgICAgICAgICAgICAgICAgICAgICAgICArICIgRE5TMj0iICsgZG5zU2VydmVyc1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCAzYjllNmNjLi4wNjgwN2M2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtMjYsNiArMjcsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTE4OCw3ICsxOTMsMTMgQEAKICAgICAvKiogQ0lEIG9mIGFjdGl2ZSBkYXRhIGNvbm5lY3Rpb24gKi8KICAgICBwcm90ZWN0ZWQgaW50IGNpZEFjdGl2ZTsKIAotICAgLyoqCisgICAgLyoqIGluZGljYXRpb24gb2Ygb3VyIGF2YWlsYWJpbGl0eSAocHJlY29uZGl0aW9ucyB0byB0cnlzZXR1cERhdGEgYXJlIG1ldCkgKiovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUF2YWlsYWJpbGl0eSA9IGZhbHNlOworCisgICAgLyoqIGFsbCBvdXIgbmV0d29yayBwcm9wZXJ0aWVzIChkbnMsIGdhdGV3YXksIGlwLCBldGMpICovCisgICAgcHJvdGVjdGVkIE5ldHdvcmtQcm9wZXJ0aWVzIG1OZXR3b3JrUHJvcGVydGllczsKKworICAgIC8qKgogICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGF0YUNvbm5lY3Rpb25UcmFja2VyKFBob25lQmFzZSBwaG9uZSkgewpAQCAtNDIxLDcgKzQzMiw5MyBAQAogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0U3RhdGUoU3RhdGUgcyk7CiAKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKGludCBpZCkgeworICAgIHByb3RlY3RlZCBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBpbnQgaWQgPSBhcG5UeXBlVG9JZChhcG5UeXBlKTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG1OZXR3b3JrUHJvcGVydGllczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGVsbCBhbGwgYWN0aXZlIGFwbnMgb2YgdGhlIGN1cnJlbnQgY29uZGl0aW9uCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgeworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW2lkXSkgeworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CisgICAgfQorCisgICAgLy8gYSBuZXcgQVBOIGhhcyBnb25lIGFjdGl2ZSBhbmQgbmVlZHMgdG8gc2VuZCBldmVudHMgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWRVcFRvQ3VycmVudChTdHJpbmcgcmVhc29uLCBpbnQgYXBuSWQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgY2FzZSBJTklUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaW5jZSB3ZSBub3JtYWxseSBkb24ndCBzZW5kIGluZm8gdG8gYSBkaXNjb25uZWN0ZWQgQVBOLCB3ZSBuZWVkIHRvIGRvIHRoaXMgc3BlY2lhbGx5CisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLy8gZGlzYWJsZWQgYXBuJ3Mgc3RpbGwgbmVlZCBhdmFpbC91bmF2YWlsIG5vdGlmaWNpYXRpb25zIC0gc2VuZCB0aGVtIG91dAorICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uLCBib29sZWFuIGF2YWlsYWJpbGl0eSkgeworICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSA9PSBhdmFpbGFiaWxpdHkpIHJldHVybjsKKyAgICAgICAgbUF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKKyAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IEFQTl9OVU1fVFlQRVM7IGlkKyspIHsKKyAgICAgICAgICAgIGlmICghaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQocmVhc29uLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBoYWQgYW4gYXZhaWxhYmlsaXR5IGNoYW5nZSAtIHRlbGwgdGhlIGxpc3RlbmVycworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoU3RyaW5nIHJlYXNvbikgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgZWl0aGVyIGp1c3QgdHVybmVkIGFsbCBvZmYgYmVjYXVzZSB3ZSBsb3N0IGF2YWlsYWJpbGl0eQorICAgICAgICAvLyBvciBhbGwgd2VyZSBvZmYgYW5kIGNvdWxkIG5vdyBnbyBvbiwgc28gb25seSBoYXZlIG9mZiBhcG5zIHRvIHdvcnJ5IGFib3V0CisgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGlzRGF0YVBvc3NpYmxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90CisgICAgICogcG9zc2libGUgYXJlCisgICAgICogPHVsPgorICAgICAqIDxsaT5EYXRhIGlzIGRpc2FsbG93ZWQgKHJvYW1pbmcsIHBvd2VyIHN0YXRlLCB2b2ljZSBjYWxsLCBldGMpLjwvbGk+CisgICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KKyAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKCkgeworICAgICAgICBib29sZWFuIHBvc3NpYmxlID0gKGlzRGF0YUFsbG93ZWQoKSAmJgorICAgICAgICAgICAgIShnZXREYXRhRW5hYmxlZCgpICYmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQgfHwgc3RhdGUgPT0gU3RhdGUuSURMRSkpKTsKKyAgICAgICAgaWYgKCFwb3NzaWJsZSAmJiBEQkcgJiYgaXNEYXRhQWxsb3dlZCgpKSB7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IHBvc3NpYmxlLiAgTm8gY292ZXJhZ2U6IGRhdGFTdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc3NpYmxlOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzQXBuVHlwZUVuYWJsZWQoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGlzQXBuSWRFbmFibGVkKGFwblR5cGVUb0lkKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBcG5JZEVuYWJsZWQoaW50IGlkKSB7CiAgICAgICAgIGlmIChpZCAhPSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIGRhdGFFbmFibGVkW2lkXTsKICAgICAgICAgfQpAQCAtNDQ0LDIyICs1NDEsMjEgQEAKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiK3R5cGUrIiksIGlzQXBuVHlwZUFjdGl2ZSA9ICIKLSAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIgYW5kIHN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImVuYWJsZUFwblR5cGUoIiArIHR5cGUgKyAiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgorICAgICAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIsIGlzQXBuSWRFbmFibGVkID0iICsgaXNBcG5JZEVuYWJsZWQoaWQpICsKKyAgICAgICAgICAgICAgICAgICAgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc0FwblR5cGVBdmFpbGFibGUodHlwZSkpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJ0eXBlIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwogICAgICAgICB9CiAKLSAgICAgICAgLy8ganVzdCBiZWNhdXNlIGl0J3MgYWN0aXZlIGRvZXNuJ3QgbWVhbiB3ZSBoYWQgaXQgZXhwbGljaXRseSByZXF1ZXN0ZWQgYmVmb3JlCi0gICAgICAgIC8vIChhIGJyb2FkIGRlZmF1bHQgbWF5IGhhbmRsZSBtYW55IHR5cGVzKS4gIG1ha2Ugc3VyZSB3ZSBtYXJrIGl0IGVuYWJsZWQKLSAgICAgICAgLy8gc28gaWYgdGhlIGRlZmF1bHQgaXMgZGlzYWJsZWQgd2Uga2VlcCB0aGUgY29ubmVjdGlvbiBmb3Igb3RoZXJzCi0gICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwotCi0gICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUodHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JTklUSU5HKSByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgIH0KQEAgLTQ3OCw3ICs1NzQsNyBAQAogICAgICAgICBpZiAoaWQgPT0gQVBOX0lOVkFMSURfSUQpIHsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzRW5hYmxlZChpZCkpIHsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgewogICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0pIHsKQEAgLTQ5NSw5ICs1OTEsMTAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChpbnQgaWQsIGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIgKwotICAgICAgICAgICAgICAgIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOwotCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkYXRhRW5hYmxlZFtpZF0gKyAiIGFuZCBlbmFibGVkQ291bnQgPSAiICsgZW5hYmxlZENvdW50KTsKKyAgICAgICAgfQogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfRU5BQkxFX05FV19BUE4pOwogICAgICAgICBtc2cuYXJnMSA9IGlkOwogICAgICAgICBtc2cuYXJnMiA9IChlbmFibGUgPyBFTkFCTEVEIDogRElTQUJMRUQpOwpAQCAtNTA3LDkgKzYwNCw4IEBACiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG9uRW5hYmxlQXBuKGludCBhcG5JZCwgaW50IGVuYWJsZWQpIHsKICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkVWRU5UX0FQTl9FTkFCTEVfUkVRVUVTVCAiICsgYXBuSWQgKyAiLCAiICsgZW5hYmxlZCk7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArCi0gICAgICAgICAgICAgICAgICAgICIsIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQgKwotICAgICAgICAgICAgICAgICAgICAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiBkYXRhRW5hYmxlZCA9ICIgKyBkYXRhRW5hYmxlZFthcG5JZF0gKyAiLCBlbmFibGVkQ291bnQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgZW5hYmxlZENvdW50ICsgIiwgaXNBcG5UeXBlQWN0aXZlID0gIiArIGlzQXBuVHlwZUFjdGl2ZShhcG5JZFRvVHlwZShhcG5JZCkpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlZCA9PSBFTkFCTEVEKSB7CiAgICAgICAgICAgICBpZiAoIWRhdGFFbmFibGVkW2FwbklkXSkgewpAQCAtNTIwLDYgKzYxNiw4IEBACiAgICAgICAgICAgICBpZiAoIWlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewogICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRBcG5UeXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFBob25lLlJFQVNPTl9BUE5fU1dJVENIRUQsIGFwbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRpc2FibGUKQEAgLTUyOCw4ICs2MjYsMTcgQEAKICAgICAgICAgICAgICAgICBlbmFibGVkQ291bnQtLTsKICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZENvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0gPT0gdHJ1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIGRpc2Nvbm5lY3QgbXNnIG1hbnVhbGx5LCBzaW5jZSB0aGUgbm9ybWFsIHJvdXRlIHdvbnQgc2VuZAorICAgICAgICAgICAgICAgIC8vIGl0IChpdCdzIG5vdCBlbmFibGVkKQorICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVELCBhcG5JZCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIGFuIHVnbHkgd2F5IHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29ubiAtIHNob3VsZCBiZSBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGEgcmVhbCBjb250ZW50aW9uIG1hbmFnZXIgYW5kIHBvbGljeSB0aGF0IGRpc2Nvbm5lY3RzIHRoZSBsb3dlciBwcmkKKyAgICAgICAgICAgICAgICAgICAgLy8gc3R1ZmYgYXMgZW5hYmxlIHJlcXVlc3RzIGNvbWUgaW4gYW5kIHBvcHMgdGhlbSBiYWNrIG9uIGFzIHdlIGRpc2FibGUgYmFjaworICAgICAgICAgICAgICAgICAgICAvLyBkb3duIHRvIHRoZSBsb3dlciBwcmkgc3R1ZmYKICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwogICAgICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3NCw5ICs2ODEsNDcgQEAKICAgICAgICAgICAgICAgICBvblRyeVNldHVwRGF0YShQaG9uZS5SRUFTT05fREFUQV9FTkFCTEVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBOZXR3b3JrUHJvcGVydGllcyBtYWtlTmV0d29ya1Byb3BlcnRpZXMoRGF0YUNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShjb25uZWN0aW9uLmdldEludGVyZmFjZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU29ja2V0RXhjZXB0aW9uIGNyZWF0aW5nIE5ldHdvcmtJbnRlcmZhY2U6ICIgKyBlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk5QRSB0cnlpbmcgdG8gbWFrZU5ldHdvcmtQcm9wZXJ0aWVzOiAiICsgZSk7CisgICAgICAgIH0KIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvcGVydGllcy5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShjb25uZWN0aW9uLmdldElwQWRkcmVzcygpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBzZXR0aW5nIElwQWRkcmVzczogIiArIGUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gc2V0dGluZyBJcEFkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGNvbm5lY3Rpb24uZ2V0R2F0ZXdheUFkZHJlc3MoKSkpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93bkhvc3RFeGNlcHRpb24gc2V0dGluZyBHYXRld2F5QWRkcmVzczogIiArIGUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gc2V0dGluZyBHYXRld2F5QWRkcmVzczogIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGRuc1N0cmluZ3MgPSBjb25uZWN0aW9uLmdldERuc1NlcnZlcnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGRuc1N0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU3RyaW5nc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93bkhvc3RFeGNlcHRpb24gc2V0dGluZyBEbnNBZGRyZXNzOiAiICsgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWN1cml0eUV4Y2VwdGlvbiBzZXR0aW5nIERuc0FkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIC0gc2V0IFByb3h5IGluZm8KKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQppbmRleCA0ZGE0YjZhLi4zODJjMTlmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CkBAIC05MiwxNSArOTMsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyB1c2UgYXBuVHlwZSBhcyB0aGUga2V5IHRvIHdoaWNoIGNvbm5lY3Rpb24gd2UncmUgdGFsa2luZyBhYm91dC4KKyAgICAgICAgLy8gcGFzcyBhcG5UeXBlIGJhY2sgdXAgdG8gZmV0Y2ggcGFydGljdWxhciBmb3IgdGhpcyBvbmUuCiAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldHdvcmtQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIG5ldHdvcmtQcm9wZXJ0aWVzID0gc2VuZGVyLmdldE5ldHdvcmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSwgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG5UeXBlcygpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0SW50ZXJmYWNlTmFtZShudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgYXBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya1Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICgodGVsZXBob255IT1udWxsKSA/IHRlbGVwaG9ueS5nZXROZXR3b3JrVHlwZSgpIDoKICAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTikpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKQEAgLTEwOCw5ICsxMjYsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKaW5kZXggZWJkZDIyMC4uNzVlYTExNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKQEAgLTE2LDE0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNoYXJhY3RlciBzZXQgbWFwcGluZyBiZXR3ZWVuCi0gKiB0aGUgR1NNIFNNUyA3LWJpdCBhbHBoYWJldCBzcGVjaWZlZCBpbiBUUyAyMy4wMzggNi4yLjEKKyAqIHRoZSBHU00gU01TIDctYml0IGFscGhhYmV0IHNwZWNpZmllZCBpbiBUUyAyMy4wMzggNi4yLjEKICAqIGFuZCBVVEYtMTYKICAqCiAgKiB7QGhpZGV9CkBAIC0xNzEsNyArMTcwLDcgQEAKICAgICAgKiBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1IHNlcHRldHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdGV4dCBzdHJpbmcgdG8gZW5jb2RlLgotICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRlaW5nIGxlbmd0aCBieXRlKSB0aGF0IHByZWNlZGVzCisgICAgICogQHBhcmFtIGhlYWRlciBPcHRpb25hbCBoZWFkZXIgKGluY2x1ZGluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcwogICAgICAqIHRoZSBlbmNvZGVkIGRhdGEsIHBhZGRlZCB0byBzZXB0ZXQgYm91bmRhcnkuCiAgICAgICogQHJldHVybiBCeXRlIGFycmF5IGNvbnRhaW5pbmcgaGVhZGVyIGFuZCBlbmNvZGVkIGRhdGEuCiAgICAgICovCkBAIC0yMDQsNyArMjAzLDcgQEAKICAgICAgKiB0aGUgcGFja2VkIHNlcHRldHMuIFRoZSByZXR1cm5lZCBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1CiAgICAgICogc2VwdGV0cy4KICAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmRjb2RlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgc3RyaW5nIHRvIGVuY29kZQogICAgICAqIEB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIGlmIFN0cmluZyBpcyB0b28gbGFyZ2UgdG8gZW5jb2RlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gc3RyaW5nVG9Hc203Qml0UGFja2VkKFN0cmluZyBkYXRhKQpAQCAtMjIzLDcgKzIyMiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgdGV4dCB0byBjb252ZXJ0IHRvIHNlcHRldHMKICAgICAgKiBAcGFyYW0gc3RhcnRpbmdTZXB0ZXRPZmZzZXQgdGhlIG51bWJlciBvZiBwYWRkaW5nIHNlcHRldHMgdG8gcHV0IGJlZm9yZQotICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBhcnJheQorICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gdGhyb3dFeGNlcHRpb24gSWYgdHJ1ZSwgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBvbiBpbnZhbGlkIGNoYXIuCiAgICAgICogICBJZiBmYWxzZSwgcmVwbGFjZXMgdW5lbmNvZGFibGUgY2hhciB3aXRoIEdTTSBhbHBoYWJldCBzcGFjZSBjaGFyLgogICAgICAqCkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3BpcmF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKKyAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3ByaWF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBiaXRPZmZzZXQgdGhlIGJpdCBvZmZzZXQgdGhhdCB0aGUgc2VwdGV0IHNob3VsZCBiZSBwYWNrZWQgYXQKICAgICAgKiAgICAgICAgICAgICAgICAgIChzZXB0ZXQgaW5kZXggKiA3KQpAQCAtMzIwLDcgKzMxOSw3IEBACiAKICAgICAgICAgICAgICAgICBnc21WYWwgPSAoMHg3ZiAmIChwZHVbb2Zmc2V0ICsgYnl0ZU9mZnNldF0gPj4gc2hpZnQpKTsKIAotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kcnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZGFyeQogICAgICAgICAgICAgICAgIGlmIChzaGlmdCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1zYiBiaXRzIHRvIDAKICAgICAgICAgICAgICAgICAgICAgZ3NtVmFsICY9IDB4N2YgPj4gKHNoaWZ0IC0gMSk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAppbmRleCAyMzI4NzE3Li43YTE1ODdiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKQEAgLTIzOSw5ICsyMzksMTEgQEAKICAgICBTdHJpbmcgZ2V0Q2RtYUVyaVRleHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBzZXJ2aWNlIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogT25seSByZWxldmFudCBvbiBzb21lIHRlY2hub2xvZ2llcywgb3RoZXJzIHdpbGwgYWx3YXlzCisgICAgICogcmV0dXJuIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKIAogICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB1bnJlYWQgY291bnQgb2Ygdm9pY2VtYWlscwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCmluZGV4IDViZjhlNTguLmY3YjcwZWUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGg7CkBAIC0zMiw3ICszMyw4IEBACiAgICAgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoYm9vbGVhbiBjZmkpOwogICAgIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KGludCBzdGF0ZSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBpbiBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSk7Ci0gICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKTsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBpbiBOZXR3b3JrUHJvcGVydGllcyBuZXR3b3JrUHJvcGVydGllcywKKyAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSk7CisgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAgICAgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oaW4gQnVuZGxlIGNlbGxMb2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCA4YTVhNmFlLi41ZmVmNmRlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdFBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtOTQsNyArOTQsNyBAQAogICAgICAqICB0aGUgY3VycmVudCBkZWZhdWx0IFNNU0MKICAgICAgKiBAcGFyYW0gdGV4dCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgpAQCAtMTQwLDcgKzE0MCw3IEBACiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX05VTExfUERVPC9jb2RlPi4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCmluZGV4IDk1N2VkZGQuLjAwNWFlMzcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCkBAIC0yNjcsOSArMjY3LDExIEBACiAKIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgU3RyaW5nIGhleGlkZWNpbWFsIGNoYXJhY3RlcnMKKyAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzLgogICAgICAqCi0gICAgICogbnVsbCByZXR1cm5zIG51bGwKKyAgICAgKiBAcGFyYW0gYnl0ZXMgYW4gYXJyYXkgb2YgYnl0ZXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBieXRlcyBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYnl0ZXNUb0hleFN0cmluZyhieXRlW10gYnl0ZXMpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKaW5kZXggYjczYzJmNy4uOWIwYWEzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKQEAgLTIzLDM0NiArMjMsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhlIHRhYmxlIGJlbG93IGlzIGJ1aWx0IGZyb20gdHdvIHJlc291cmNlczoKLSAqCi0gKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCi0gKiAgIGlkZW50aWZpY2F0aW9uIHBsYW4gZm9yIG1vYmlsZSB0ZXJtaW5hbHMgYW5kIG1vYmlsZSB1c2VycyIKLSAqICAgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGFuIGFubmV4IHRvIHRoZSBJVFUgb3BlcmF0aW9uYWwgYnVsbGV0aW4KLSAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCi0gKgotICogMikgVGhlIElTTyAzMTY2IGNvdW50cnkgY29kZXMgbGlzdCwgYXZhaWxhYmxlIGhlcmU6Ci0gKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAotICoKLSAqIFRoaXMgdGFibGUgd2FzIHZlcmlmaWVkICgyOCBBdWcgMjAwOSkgYWdhaW5zdAotICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX21vYmlsZV9jb3VudHJ5X2NvZGVzIHdpdGggdGhlCi0gKiBvbmx5IHVucmVzb2x2ZWQgZGlzY3JlcGFuY3kgYmVpbmcgdGhhdCB0aGlzIGxpc3QgaGFzIGFuIGV4dHJhIGVudHJ5Ci0gKiAoNDYxKSBmb3IgQ2hpbmEuCi0gKgotICogVE9ETzogQ29tcGxldGUgdGhlIG1hcHBpbmdzIGZvciB0aW1lem9uZXMgYW5kIGxhbmd1YWdlL2xvY2FsZSBjb2Rlcy4KLSAqCi0gKiBUaGUgYWN0dWFsIHRhYmxlIGRhdGEgdXNlZCBpbiB0aGUgSmF2YSBjb2RlIGlzIGdlbmVyYXRlZCBmcm9tIHRoZQotICogYmVsb3cgUHl0aG9uIGNvZGUgZm9yIGVmZmljaWVuY3kuICBUaGUgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQgdG8KLSAqIGJlIHN0YXRpYywgYnV0IGlmIGNoYW5nZXMgYXJlIHJlcXVpcmVkLCB0aGUgdGFibGUgaW4gdGhlIHB5dGhvbgotICogY29kZSBjYW4gYmUgbW9kaWZpZWQgYW5kIHRoZSB0cmFpbGluZyBjb2RlIHJ1biB0byByZS1nZW5lcmF0ZSB0aGUKLSAqIHRhYmxlcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IEphdmEuCi0KLW1jY190YWJsZSA9IFsKLSAgKDIwMiwgJ2dyJywgMiwgJ0dyZWVjZScpLAotICAoMjA0LCAnbmwnLCAyLCAnRXVyb3BlL0Ftc3RlcmRhbScsICdubCcsIDEzLCAnTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKScpLAotICAoMjA2LCAnYmUnLCAyLCAnQmVsZ2l1bScpLAotICAoMjA4LCAnZnInLCAyLCAnRXVyb3BlL1BhcmlzJywgJ2ZyJywgJ0ZyYW5jZScpLAotICAoMjEyLCAnbWMnLCAyLCAnTW9uYWNvIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTMsICdhZCcsIDIsICdBbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTQsICdlcycsIDIsICdFdXJvcGUvTWFkcmlkJywgJ2VzJywgJ1NwYWluJyksCi0gICgyMTYsICdodScsIDIsICdIdW5nYXJ5IChSZXB1YmxpYyBvZiknKSwKLSAgKDIxOCwgJ2JhJywgMiwgJ0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEnKSwKLSAgKDIxOSwgJ2hyJywgMiwgJ0Nyb2F0aWEgKFJlcHVibGljIG9mKScpLAotICAoMjIwLCAncnMnLCAyLCAnU2VyYmlhIGFuZCBNb250ZW5lZ3JvJyksCi0gICgyMjIsICdpdCcsIDIsICdFdXJvcGUvUm9tZScsICdpdCcsICdJdGFseScpLAotICAoMjI1LCAndmEnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnVmF0aWNhbiBDaXR5IFN0YXRlJyksCi0gICgyMjYsICdybycsIDIsICdSb21hbmlhJyksCi0gICgyMjgsICdjaCcsIDIsICdFdXJvcGUvWnVyaWNoJywgJ2RlJywgJ1N3aXR6ZXJsYW5kIChDb25mZWRlcmF0aW9uIG9mKScpLAotICAoMjMwLCAnY3onLCAyLCAnRXVyb3BlL1ByYWd1ZScsICdjcycsIDEzLCAnQ3plY2ggUmVwdWJsaWMnKSwKLSAgKDIzMSwgJ3NrJywgMiwgJ1Nsb3ZhayBSZXB1YmxpYycpLAotICAoMjMyLCAnYXQnLCAyLCAnRXVyb3BlL1ZpZW5uYScsICdkZScsIDEzLCAnQXVzdHJpYScpLAotICAoMjM0LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM1LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM4LCAnZGsnLCAyLCAnRGVubWFyaycpLAotICAoMjQwLCAnc2UnLCAyLCAnU3dlZGVuJyksCi0gICgyNDIsICdubycsIDIsICdOb3J3YXknKSwKLSAgKDI0NCwgJ2ZpJywgMiwgJ0ZpbmxhbmQnKSwKLSAgKDI0NiwgJ2x0JywgMiwgJ0xpdGh1YW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNDcsICdsdicsIDIsICdMYXR2aWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ4LCAnZWUnLCAyLCAnRXN0b25pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNTAsICdydScsIDIsICdSdXNzaWFuIEZlZGVyYXRpb24nKSwKLSAgKDI1NSwgJ3VhJywgMiwgJ1VrcmFpbmUnKSwKLSAgKDI1NywgJ2J5JywgMiwgJ0JlbGFydXMgKFJlcHVibGljIG9mKScpLAotICAoMjU5LCAnbWQnLCAyLCAnTW9sZG92YSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjAsICdwbCcsIDIsICdFdXJvcGUvV2Fyc2F3JywgJ1BvbGFuZCAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjIsICdkZScsIDIsICdFdXJvcGUvQmVybGluJywgJ2RlJywgMTMsICdHZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoMjY2LCAnZ2knLCAyLCAnR2licmFsdGFyJyksCi0gICgyNjgsICdwdCcsIDIsICdQb3J0dWdhbCcpLAotICAoMjcwLCAnbHUnLCAyLCAnTHV4ZW1ib3VyZycpLAotICAoMjcyLCAnaWUnLCAyLCAnRXVyb3BlL0R1YmxpbicsICdlbicsICdJcmVsYW5kJyksCi0gICgyNzQsICdpcycsIDIsICdJY2VsYW5kJyksCi0gICgyNzYsICdhbCcsIDIsICdBbGJhbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI3OCwgJ210JywgMiwgJ01hbHRhJyksCi0gICgyODAsICdjeScsIDIsICdDeXBydXMgKFJlcHVibGljIG9mKScpLAotICAoMjgyLCAnZ2UnLCAyLCAnR2VvcmdpYScpLAotICAoMjgzLCAnYW0nLCAyLCAnQXJtZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODQsICdiZycsIDIsICdCdWxnYXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODYsICd0cicsIDIsICdUdXJrZXknKSwKLSAgKDI4OCwgJ2ZvJywgMiwgJ0Zhcm9lIElzbGFuZHMnKSwKLSAgKDI4OSwgJ2dlJywgMiwgJ0Fia2hhemlhIChHZW9yZ2lhKScpLAotICAoMjkwLCAnZ2wnLCAyLCAnR3JlZW5sYW5kIChEZW5tYXJrKScpLAotICAoMjkyLCAnc20nLCAyLCAnU2FuIE1hcmlubyAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTMsICdzbCcsIDIsICdTbG92ZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTQsICdtaycsIDIsICdUaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYScpLAotICAoMjk1LCAnbGknLCAyLCAnTGllY2h0ZW5zdGVpbiAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjk3LCAnbWUnLCAyLCAnTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpJyksCi0gICgzMDIsICdjYScsIDMsICcnLCAnJywgMTEsICdDYW5hZGEnKSwKLSAgKDMwOCwgJ3BtJywgMiwgJ1NhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24gKENvbGxlY3Rpdml0IHRlcnJpdG9yaWFsZSBkZSBsYSBScHVibGlxdWUgZnJhbmFpc2UpJyksCi0gICgzMTAsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzExLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMiwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTMsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE0LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTYsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzMwLCAncHInLCAyLCAnUHVlcnRvIFJpY28nKSwKLSAgKDMzMiwgJ3ZpJywgMiwgJ1VuaXRlZCBTdGF0ZXMgVmlyZ2luIElzbGFuZHMnKSwKLSAgKDMzNCwgJ214JywgMywgJ01leGljbycpLAotICAoMzM4LCAnam0nLCAzLCAnSmFtYWljYScpLAotICAoMzQwLCAnZ3AnLCAyLCAnR3VhZGVsb3VwZSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICgzNDIsICdiYicsIDMsICdCYXJiYWRvcycpLAotICAoMzQ0LCAnYWcnLCAzLCAnQW50aWd1YSBhbmQgQmFyYnVkYScpLAotICAoMzQ2LCAna3knLCAzLCAnQ2F5bWFuIElzbGFuZHMnKSwKLSAgKDM0OCwgJ3ZnJywgMywgJ0JyaXRpc2ggVmlyZ2luIElzbGFuZHMnKSwKLSAgKDM1MCwgJ2JtJywgMiwgJ0Jlcm11ZGEnKSwKLSAgKDM1MiwgJ2dkJywgMiwgJ0dyZW5hZGEnKSwKLSAgKDM1NCwgJ21zJywgMiwgJ01vbnRzZXJyYXQnKSwKLSAgKDM1NiwgJ2tuJywgMiwgJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycpLAotICAoMzU4LCAnbGMnLCAyLCAnU2FpbnQgTHVjaWEnKSwKLSAgKDM2MCwgJ3ZjJywgMiwgJ1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzJyksCi0gICgzNjIsICdubCcsIDIsICdOZXRoZXJsYW5kcyBBbnRpbGxlcycpLAotICAoMzYzLCAnYXcnLCAyLCAnQXJ1YmEnKSwKLSAgKDM2NCwgJ2JzJywgMiwgJ0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICgzNjUsICdhaScsIDMsICdBbmd1aWxsYScpLAotICAoMzY2LCAnZG0nLCAyLCAnRG9taW5pY2EgKENvbW1vbndlYWx0aCBvZiknKSwKLSAgKDM2OCwgJ2N1JywgMiwgJ0N1YmEnKSwKLSAgKDM3MCwgJ2RvJywgMiwgJ0RvbWluaWNhbiBSZXB1YmxpYycpLAotICAoMzcyLCAnaHQnLCAyLCAnSGFpdGkgKFJlcHVibGljIG9mKScpLAotICAoMzc0LCAndHQnLCAyLCAnVHJpbmlkYWQgYW5kIFRvYmFnbycpLAotICAoMzc2LCAndGMnLCAyLCAnVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzJyksCi0gICg0MDAsICdheicsIDIsICdBemVyYmFpamFuaSBSZXB1YmxpYycpLAotICAoNDAxLCAna3onLCAyLCAnS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDIsICdidCcsIDIsICdCaHV0YW4gKEtpbmdkb20gb2YpJyksCi0gICg0MDQsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDUsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MTAsICdwaycsIDIsICdQYWtpc3RhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDQxMiwgJ2FmJywgMiwgJ0FmZ2hhbmlzdGFuJyksCi0gICg0MTMsICdsaycsIDIsICdTcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKScpLAotICAoNDE0LCAnbW0nLCAyLCAnTXlhbm1hciAoVW5pb24gb2YpJyksCi0gICg0MTUsICdsYicsIDIsICdMZWJhbm9uJyksCi0gICg0MTYsICdqbycsIDIsICdKb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKScpLAotICAoNDE3LCAnc3knLCAyLCAnU3lyaWFuIEFyYWIgUmVwdWJsaWMnKSwKLSAgKDQxOCwgJ2lxJywgMiwgJ0lyYXEgKFJlcHVibGljIG9mKScpLAotICAoNDE5LCAna3cnLCAyLCAnS3V3YWl0IChTdGF0ZSBvZiknKSwKLSAgKDQyMCwgJ3NhJywgMiwgJ1NhdWRpIEFyYWJpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQyMSwgJ3llJywgMiwgJ1llbWVuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQyMiwgJ29tJywgMiwgJ09tYW4gKFN1bHRhbmF0ZSBvZiknKSwKLSAgKDQyMywgJ3BzJywgMiwgJ1BhbGVzdGluZScpLAotICAoNDI0LCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQyNSwgJ2lsJywgMiwgJ0lzcmFlbCAoU3RhdGUgb2YpJyksCi0gICg0MjYsICdiaCcsIDIsICdCYWhyYWluIChLaW5nZG9tIG9mKScpLAotICAoNDI3LCAncWEnLCAyLCAnUWF0YXIgKFN0YXRlIG9mKScpLAotICAoNDI4LCAnbW4nLCAyLCAnTW9uZ29saWEnKSwKLSAgKDQyOSwgJ25wJywgMiwgJ05lcGFsJyksCi0gICg0MzAsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDMxLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMiwgJ2lyJywgMiwgJ0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MzQsICd1eicsIDIsICdVemJla2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNiwgJ3RqJywgMiwgJ1RhamlraXN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDM3LCAna2cnLCAyLCAnS3lyZ3l6IFJlcHVibGljJyksCi0gICg0MzgsICd0bScsIDIsICdUdXJrbWVuaXN0YW4nKSwKLSAgKDQ0MCwgJ2pwJywgMiwgJ0FzaWEvVG9reW8nLCAnamEnLCAxNCwgJ0phcGFuJyksCi0gICg0NDEsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDUwLCAna3InLCAyLCAnS29yZWEgKFJlcHVibGljIG9mKScpLAotICAoNDUyLCAndm4nLCAyLCAnVmlldCBOYW0gKFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQ1NCwgJ2hrJywgMiwgJyJIb25nIEtvbmcsIENoaW5hIicpLAotICAoNDU1LCAnbW8nLCAyLCAnIk1hY2FvLCBDaGluYSInKSwKLSAgKDQ1NiwgJ2toJywgMiwgJ0NhbWJvZGlhIChLaW5nZG9tIG9mKScpLAotICAoNDU3LCAnbGEnLCAyLCAiTGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMiKSwKLSAgKDQ2MCwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDYxLCAnY24nLCAyLCAiQXNpYS9CZWlqaW5nIiwgJ3poJywgMTMsICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NjYsICd0dycsIDIsICJUYWl3YW4gKFJlcHVibGljIG9mIENoaW5hKSIpLAotICAoNDY3LCAna3AnLCAyLCAiRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiBLb3JlYSIpLAotICAoNDcwLCAnYmQnLCAyLCAiQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NzIsICdtdicsIDIsICdNYWxkaXZlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg1MDIsICdteScsIDIsICdNYWxheXNpYScpLAotICAoNTA1LCAnYXUnLCAyLCAnQXVzdHJhbGlhL1N5ZG5leScsICdlbicsIDExLCAnQXVzdHJhbGlhJyksCi0gICg1MTAsICdpZCcsIDIsICdJbmRvbmVzaWEgKFJlcHVibGljIG9mKScpLAotICAoNTE0LCAndGwnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZScpLAotICAoNTE1LCAncGgnLCAyLCAnUGhpbGlwcGluZXMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDUyMCwgJ3RoJywgMiwgJ1RoYWlsYW5kJyksCi0gICg1MjUsICdzZycsIDIsICdBc2lhL1NpbmdhcG9yZScsICdlbicsIDExLCAnU2luZ2Fwb3JlIChSZXB1YmxpYyBvZiknKSwKLSAgKDUyOCwgJ2JuJywgMiwgJ0JydW5laSBEYXJ1c3NhbGFtJyksCi0gICg1MzAsICdueicsIDIsICdQYWNpZmljL0F1Y2tsYW5kJywgJ2VuJywgJ05ldyBaZWFsYW5kJyksCi0gICg1MzQsICdtcCcsIDIsICdOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICg1MzUsICdndScsIDIsICdHdWFtJyksCi0gICg1MzYsICducicsIDIsICdOYXVydSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MzcsICdwZycsIDIsICdQYXB1YSBOZXcgR3VpbmVhJyksCi0gICg1MzksICd0bycsIDIsICdUb25nYSAoS2luZ2RvbSBvZiknKSwKLSAgKDU0MCwgJ3NiJywgMiwgJ1NvbG9tb24gSXNsYW5kcycpLAotICAoNTQxLCAndnUnLCAyLCAnVmFudWF0dSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDIsICdmaicsIDIsICdGaWppIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0MywgJ3dmJywgMiwgIldhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDQsICdhcycsIDIsICdBbWVyaWNhbiBTYW1vYScpLAotICAoNTQ1LCAna2knLCAyLCAnS2lyaWJhdGkgKFJlcHVibGljIG9mKScpLAotICAoNTQ2LCAnbmMnLCAyLCAiTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ3LCAncGYnLCAyLCAiRnJlbmNoIFBvbHluZXNpYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ4LCAnY2snLCAyLCAnQ29vayBJc2xhbmRzJyksCi0gICg1NDksICd3cycsIDIsICdTYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpJyksCi0gICg1NTAsICdmbScsIDIsICdNaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKScpLAotICAoNTUxLCAnbWgnLCAyLCAnTWFyc2hhbGwgSXNsYW5kcyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNTUyLCAncHcnLCAyLCAnUGFsYXUgKFJlcHVibGljIG9mKScpLAotICAoNjAyLCAnZWcnLCAyLCAnRWd5cHQgKEFyYWIgUmVwdWJsaWMgb2YpJyksCi0gICg2MDMsICdkeicsIDIsICJBbGdlcmlhIChQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIG9mKSIpLAotICAoNjA0LCAnbWEnLCAyLCAnTW9yb2NjbyAoS2luZ2RvbSBvZiknKSwKLSAgKDYwNSwgJ3RuJywgMiwgJ1R1bmlzaWEnKSwKLSAgKDYwNiwgJ2x5JywgMiwgIkxpYnlhIChTb2NpYWxpc3QgUGVvcGxlJ3MgTGlieWFuIEFyYWIgSmFtYWhpcml5YSkiKSwKLSAgKDYwNywgJ2dtJywgMiwgJ0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjA4LCAnc24nLCAyLCAnU2VuZWdhbCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MDksICdtcicsIDIsICdNYXVyaXRhbmlhIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNjEwLCAnbWwnLCAyLCAnTWFsaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTEsICdnbicsIDIsICdHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjEyLCAnY2knLCAyLCAiQ3RlIGQnSXZvaXJlIChSZXB1YmxpYyBvZikiKSwKLSAgKDYxMywgJ2JmJywgMiwgJ0J1cmtpbmEgRmFzbycpLAotICAoNjE0LCAnbmUnLCAyLCAnTmlnZXIgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYxNSwgJ3RnJywgMiwgJ1RvZ29sZXNlIFJlcHVibGljJyksCi0gICg2MTYsICdiaicsIDIsICdCZW5pbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTcsICdtdScsIDIsICdNYXVyaXRpdXMgKFJlcHVibGljIG9mKScpLAotICAoNjE4LCAnbHInLCAyLCAnTGliZXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTksICdzbCcsIDIsICdTaWVycmEgTGVvbmUnKSwKLSAgKDYyMCwgJ2doJywgMiwgJ0doYW5hJyksCi0gICg2MjEsICduZycsIDIsICdOaWdlcmlhIChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoNjIyLCAndGQnLCAyLCAnQ2hhZCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjMsICdjZicsIDIsICdDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnKSwKLSAgKDYyNCwgJ2NtJywgMiwgJ0NhbWVyb29uIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNSwgJ2N2JywgMiwgJ0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKScpLAotICAoNjI2LCAnc3QnLCAyLCAnU2FvIFRvbWUgYW5kIFByaW5jaXBlIChEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjI3LCAnZ3EnLCAyLCAnRXF1YXRvcmlhbCBHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjI4LCAnZ2EnLCAyLCAnR2Fib25lc2UgUmVwdWJsaWMnKSwKLSAgKDYyOSwgJ2NnJywgMiwgJ0NvbmdvIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MzAsICdjZycsIDIsICdEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbycpLAotICAoNjMxLCAnYW8nLCAyLCAnQW5nb2xhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMiwgJ2d3JywgMiwgJ0d1aW5lYS1CaXNzYXUgKFJlcHVibGljIG9mKScpLAotICAoNjMzLCAnc2MnLCAyLCAnU2V5Y2hlbGxlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzQsICdzZCcsIDIsICdTdWRhbiAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjM1LCAncncnLCAyLCAnUndhbmRhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzNiwgJ2V0JywgMiwgJ0V0aGlvcGlhIChGZWRlcmFsIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MzcsICdzbycsIDIsICdTb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYycpLAotICAoNjM4LCAnZGonLCAyLCAnRGppYm91dGkgKFJlcHVibGljIG9mKScpLAotICAoNjM5LCAna2UnLCAyLCAnS2VueWEgKFJlcHVibGljIG9mKScpLAotICAoNjQwLCAndHonLCAyLCAnVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZiknKSwKLSAgKDY0MSwgJ3VnJywgMiwgJ1VnYW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDIsICdiaScsIDIsICdCdXJ1bmRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MywgJ216JywgMiwgJ01vemFtYmlxdWUgKFJlcHVibGljIG9mKScpLAotICAoNjQ1LCAnem0nLCAyLCAnWmFtYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NiwgJ21nJywgMiwgJ01hZGFnYXNjYXIgKFJlcHVibGljIG9mKScpLAotICAoNjQ3LCAncmUnLCAyLCAnUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg2NDgsICd6dycsIDIsICdaaW1iYWJ3ZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDksICduYScsIDIsICdOYW1pYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MCwgJ213JywgMiwgJ01hbGF3aScpLAotICAoNjUxLCAnbHMnLCAyLCAnTGVzb3RobyAoS2luZ2RvbSBvZiknKSwKLSAgKDY1MiwgJ2J3JywgMiwgJ0JvdHN3YW5hIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MywgJ3N6JywgMiwgJ1N3YXppbGFuZCAoS2luZ2RvbSBvZiknKSwKLSAgKDY1NCwgJ2ttJywgMiwgJ0NvbW9yb3MgKFVuaW9uIG9mIHRoZSknKSwKLSAgKDY1NSwgJ3phJywgMiwgJ0FmcmljYS9Kb2hhbm5lc2J1cmcnLCAnZW4nLCAnU291dGggQWZyaWNhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1NywgJ2VyJywgMiwgJ0VyaXRyZWEnKSwKLSAgKDcwMiwgJ2J6JywgMiwgJ0JlbGl6ZScpLAotICAoNzA0LCAnZ3QnLCAyLCAnR3VhdGVtYWxhIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwNiwgJ3N2JywgMiwgJ0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwOCwgJ2huJywgMywgJ0hvbmR1cmFzIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxMCwgJ25pJywgMiwgJ05pY2FyYWd1YScpLAotICAoNzEyLCAnY3InLCAyLCAnQ29zdGEgUmljYScpLAotICAoNzE0LCAncGEnLCAyLCAnUGFuYW1hIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxNiwgJ3BlJywgMiwgJ1BlcnUnKSwKLSAgKDcyMiwgJ2FyJywgMywgJ0FyZ2VudGluZSBSZXB1YmxpYycpLAotICAoNzI0LCAnYnInLCAyLCAnQnJhemlsIChGZWRlcmF0aXZlIFJlcHVibGljIG9mKScpLAotICAoNzMwLCAnY2wnLCAyLCAnQ2hpbGUnKSwKLSAgKDczMiwgJ2NvJywgMywgJ0NvbG9tYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczNCwgJ3ZlJywgMiwgJ1ZlbmV6dWVsYSAoQm9saXZhcmlhbiBSZXB1YmxpYyBvZiknKSwKLSAgKDczNiwgJ2JvJywgMiwgJ0JvbGl2aWEgKFJlcHVibGljIG9mKScpLAotICAoNzM4LCAnZ3knLCAyLCAnR3V5YW5hJyksCi0gICg3NDAsICdlYycsIDIsICdFY3VhZG9yJyksCi0gICg3NDIsICdnZicsIDIsICdGcmVuY2ggR3VpYW5hIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDc0NCwgJ3B5JywgMiwgJ1BhcmFndWF5IChSZXB1YmxpYyBvZiknKSwKLSAgKDc0NiwgJ3NyJywgMiwgJ1N1cmluYW1lIChSZXB1YmxpYyBvZiknKSwKLSAgKDc0OCwgJ3V5JywgMiwgJ1VydWd1YXkgKEVhc3Rlcm4gUmVwdWJsaWMgb2YpJyksCi0gICg3NTAsICdmaycsIDIsICdGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyknKV0KLQotZ2V0X21jYyA9IGxhbWJkYSBlbHQ6IGVsdFswXQotZ2V0X2lzbyA9IGxhbWJkYSBlbHQ6IGVsdFsxXQotZ2V0X3NkID0gbGFtYmRhIGVsdDogZWx0WzJdCi1nZXRfdHogPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDQgYW5kIGVsdFszXSBvciAnJwotZ2V0X2xhbmcgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDUgYW5kIGVsdFs0XSBvciAnJwotZ2V0X3dpZmkgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDYgYW5kIGVsdFs1XSBvciAwCi0KLW1jY19jb2RlcyA9IFsnMHglMDR4JyAlIGdldF9tY2MoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLXR6X3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfdHooZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi1sYW5nX3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfbGFuZyhlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlKSkKLQotZGVmIG1rX2luZF9jb2RlKGVsdCk6Ci0gIGlzbyA9IGdldF9pc28oZWx0KQotICBpc29fY29kZSA9ICgob3JkKGlzb1swXSkgPDwgOCkgfCBvcmQoaXNvWzFdKSkgJiAweEZGRkYgIyAxNiBiaXRzCi0gIHdpZmkgPSBnZXRfd2lmaShlbHQpICYgMHgwMDBGICAgICAgICAgICAgICAgICAgICAgICAgICAjICA0IGJpdHMKLSAgc2QgPSBnZXRfc2QoZWx0KSAmIDB4MDAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIDIgYml0cwotICB0el9pbmQgPSB0el9zZXQuaW5kZXgoZ2V0X3R6KGVsdCkpICYgMHgwMDFGICAgICAgICAgICAgIyAgNSBiaXRzCi0gIGxhbmdfaW5kID0gbGFuZ19zZXQuaW5kZXgoZ2V0X2xhbmcoZWx0KSkgJiAweDAwMEYgICAgICAjICA0IGJpdHMKLSAgcmV0dXJuIChpc29fY29kZSA8PCAxNikgfCAod2lmaSA8PCAxMSkgfCAoc2QgPDwgOSkgfCAodHpfaW5kIDw8IDQpIHwgbGFuZ19pbmQKLQotaW5kX2NvZGVzID0gWycweCUwOHgnICUgbWtfaW5kX2NvZGUoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLQotZGVmIGZtdF9saXN0KHRpdGxlLCBsLCBiYXRjaF9zeik6Ci0gIHNsID0gW10KLSAgZm9yIGkgaW4gcmFuZ2UobGVuKGwpIC8gYmF0Y2hfc3ogKyAobGVuKGwpICUgYmF0Y2hfc3ogYW5kIDEgb3IgMCkpOgotICAgIGogPSBpICogYmF0Y2hfc3oKLSAgICBzbC5hcHBlbmQoKCcgJyAqIDgpICsgJywgJy5qb2luKGxbajpqICsgYmF0Y2hfc3pdKSkKLSAgcmV0dXJuICcgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgJXMgPSB7XG4nICUgdGl0bGUgKyAnLFxuJy5qb2luKHNsKSArICdcbiAgICB9O1xuJwotCi1kZWYgZG9fYXV0b2dlbl9jb21tZW50KGV4dHJhX2Rlc2M9W10pOgotICBwcmludCAnICAgIC8nICsgJyoqXG4gICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKScKLSAgZm9yIGxpbmUgaW4gZXh0cmFfZGVzYzoKLSAgICBwcmludCAnICAgICogJXMnICUgbGluZQotICBwcmludCAnICAgIConICsgJy8nCi0KLWRvX2F1dG9nZW5fY29tbWVudCgpCi1wcmludCBmbXRfbGlzdCgnU3RyaW5nW10gVFpfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIHR6X3NldF0sIDEpCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIExBTkdfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIGxhbmdfc2V0XSwgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZScsCi0gICAgICAgICAgICAgICAgICAgICdvZiBhIGdpdmVuIE1DQyBjb2RlIGlzIHRoZSBpbmRleCBvZiBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCcsCi0gICAgICAgICAgICAgICAgICAgICd0aGF0IE1DQyBpbiB0aGUgSU5EX0NPREVTIHRhYmxlLiddKQotcHJpbnQgZm10X2xpc3QoJ3Nob3J0W10gTUNDX0NPREVTJywgbWNjX2NvZGVzLCAxMCkKLWRvX2F1dG9nZW5fY29tbWVudChbJ1RoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBpc28gY291bnRyeSBjb2RlIDE2IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgICh1bnVzZWQpICAgICAgICAgIDEgYml0JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIHNtYWxsZWQgZGlnaXQgICAgIDIgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCB0aW1lem9uZSAgNSBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMnXSkKLXByaW50IGZtdF9saXN0KCdpbnRbXSBJTkRfQ09ERVMnLCBpbmRfY29kZXMsIDYpCi0KLWRlZiBwYXJzZV9pbmRfY29kZShpbmQpOgotICBtY2MgPSBldmFsKG1jY19jb2Rlc1tpbmRdKQotICBjb2RlID0gZXZhbChpbmRfY29kZXNbaW5kXSkKLSAgaXNvX2xzYiA9IGludCgoY29kZSA+PiAxNikgJiAweDAwRkYpCi0gIGlzb19tc2IgPSBpbnQoKGNvZGUgPj4gMjQpICYgMHgwMEZGKQotICBpc28gPSAnJXMlcycgJSAoY2hyKGlzb19tc2IpLCBjaHIoaXNvX2xzYikpCi0gIHdpZmkgPSBpbnQoKGNvZGUgPj4gMTEpICYgMHgwMDBGKQotICBzZCA9IGludCgoY29kZSA+PiA5KSAmIDB4MDAwMykKLSAgdHpfaW5kID0gKGNvZGUgPj4gNCkgJiAweDAwMUYKLSAgbGFuZ19pbmQgPSAoY29kZSA+PiAwKSAmIDB4MDAwRgotICByZXR1cm4gKG1jYywgaXNvLCBzZCwgdHpfc2V0W3R6X2luZF0sIGxhbmdfc2V0W2xhbmdfaW5kXSwgd2lmaSkKLQotZm10X3N0ciA9ICdtY2MgPSAlcywgaXNvID0gJXMsIHNkID0gJXMsIHR6ID0gJXMsIGxhbmcgPSAlcywgd2lmaSA9ICVzJwotb3JpZ190YWJsZSA9IFtmbXRfc3RyICUgKGdldF9tY2MoZWx0KSwgZ2V0X2lzbyhlbHQpLCBnZXRfc2QoZWx0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdHooZWx0KSwgZ2V0X2xhbmcoZWx0KSwgZ2V0X3dpZmkoZWx0KSkKLSAgICAgICAgICAgICAgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi1kZXJpdmVkX3RhYmxlID0gW2ZtdF9zdHIgJSBwYXJzZV9pbmRfY29kZShpKSBmb3IgaSBpbiByYW5nZShsZW4oaW5kX2NvZGVzKSldCi1mb3IgaSBpbiByYW5nZShsZW4ob3JpZ190YWJsZSkpOgotICBpZiBvcmlnX3RhYmxlW2ldID09IGRlcml2ZWRfdGFibGVbaV06IGNvbnRpbnVlCi0gIHByaW50ICdNSVNNQVRDSCBFUlJPUiA6ICcsIG9yaWdfdGFibGVbaV0sICIgIT0gIiwgZGVyaXZlZF90YWJsZVtpXQotCi0qLworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVzOwogCiAvKioKICAqIE1vYmlsZSBDb3VudHJ5IENvZGUKQEAgLTM3MSwyMDAgKzM4LDE1MyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTWNjVGFibGUKIHsKLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRaX1NUUklOR1MgPSB7Ci0gICAgICAgICIiLAotICAgICAgICAiQWZyaWNhL0pvaGFubmVzYnVyZyIsCi0gICAgICAgICJBc2lhL0JlaWppbmciLAotICAgICAgICAiQXNpYS9TaW5nYXBvcmUiLAotICAgICAgICAiQXNpYS9Ub2t5byIsCi0gICAgICAgICJBdXN0cmFsaWEvU3lkbmV5IiwKLSAgICAgICAgIkV1cm9wZS9BbXN0ZXJkYW0iLAotICAgICAgICAiRXVyb3BlL0JlcmxpbiIsCi0gICAgICAgICJFdXJvcGUvRHVibGluIiwKLSAgICAgICAgIkV1cm9wZS9Mb25kb24iLAotICAgICAgICAiRXVyb3BlL01hZHJpZCIsCi0gICAgICAgICJFdXJvcGUvUGFyaXMiLAotICAgICAgICAiRXVyb3BlL1ByYWd1ZSIsCi0gICAgICAgICJFdXJvcGUvUm9tZSIsCi0gICAgICAgICJFdXJvcGUvVmllbm5hIiwKLSAgICAgICAgIkV1cm9wZS9XYXJzYXciLAotICAgICAgICAiRXVyb3BlL1p1cmljaCIsCi0gICAgICAgICJQYWNpZmljL0F1Y2tsYW5kIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsICJjcyIsICJkZSIsICJlbiIsICJlcyIsICJmciIsICJpdCIsICJqYSIsICJubCIsICJ6aCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZQotICAgICAqIG9mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICogdGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydFtdIE1DQ19DT0RFUyA9IHsKLSAgICAgICAgMHgwMGNhLCAweDAwY2MsIDB4MDBjZSwgMHgwMGQwLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDgsIDB4MDBkYSwgMHgwMGRiLAotICAgICAgICAweDAwZGMsIDB4MDBkZSwgMHgwMGUxLCAweDAwZTIsIDB4MDBlNCwgMHgwMGU2LCAweDAwZTcsIDB4MDBlOCwgMHgwMGVhLCAweDAwZWIsCi0gICAgICAgIDB4MDBlZSwgMHgwMGYwLCAweDAwZjIsIDB4MDBmNCwgMHgwMGY2LCAweDAwZjcsIDB4MDBmOCwgMHgwMGZhLCAweDAwZmYsIDB4MDEwMSwKLSAgICAgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNiwgMHgwMTBhLCAweDAxMGMsIDB4MDEwZSwgMHgwMTEwLCAweDAxMTIsIDB4MDExNCwgMHgwMTE2LAotICAgICAgICAweDAxMTgsIDB4MDExYSwgMHgwMTFiLCAweDAxMWMsIDB4MDExZSwgMHgwMTIwLCAweDAxMjEsIDB4MDEyMiwgMHgwMTI0LCAweDAxMjUsCi0gICAgICAgIDB4MDEyNiwgMHgwMTI3LCAweDAxMjksIDB4MDEyZSwgMHgwMTM0LCAweDAxMzYsIDB4MDEzNywgMHgwMTM4LCAweDAxMzksIDB4MDEzYSwKLSAgICAgICAgMHgwMTNiLCAweDAxM2MsIDB4MDE0YSwgMHgwMTRjLCAweDAxNGUsIDB4MDE1MiwgMHgwMTU0LCAweDAxNTYsIDB4MDE1OCwgMHgwMTVhLAotICAgICAgICAweDAxNWMsIDB4MDE1ZSwgMHgwMTYwLCAweDAxNjIsIDB4MDE2NCwgMHgwMTY2LCAweDAxNjgsIDB4MDE2YSwgMHgwMTZiLCAweDAxNmMsCi0gICAgICAgIDB4MDE2ZCwgMHgwMTZlLCAweDAxNzAsIDB4MDE3MiwgMHgwMTc0LCAweDAxNzYsIDB4MDE3OCwgMHgwMTkwLCAweDAxOTEsIDB4MDE5MiwKLSAgICAgICAgMHgwMTk0LCAweDAxOTUsIDB4MDE5YSwgMHgwMTljLCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLCAweDAxYTAsIDB4MDFhMSwgMHgwMWEyLAotICAgICAgICAweDAxYTMsIDB4MDFhNCwgMHgwMWE1LCAweDAxYTYsIDB4MDFhNywgMHgwMWE4LCAweDAxYTksIDB4MDFhYSwgMHgwMWFiLCAweDAxYWMsCi0gICAgICAgIDB4MDFhZCwgMHgwMWFlLCAweDAxYWYsIDB4MDFiMCwgMHgwMWIyLCAweDAxYjQsIDB4MDFiNSwgMHgwMWI2LCAweDAxYjgsIDB4MDFiOSwKLSAgICAgICAgMHgwMWMyLCAweDAxYzQsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOSwgMHgwMWNjLCAweDAxY2QsIDB4MDFkMiwgMHgwMWQzLAotICAgICAgICAweDAxZDYsIDB4MDFkOCwgMHgwMWY2LCAweDAxZjksIDB4MDFmZSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwOCwgMHgwMjBkLCAweDAyMTAsCi0gICAgICAgIDB4MDIxMiwgMHgwMjE2LCAweDAyMTcsIDB4MDIxOCwgMHgwMjE5LCAweDAyMWIsIDB4MDIxYywgMHgwMjFkLCAweDAyMWUsIDB4MDIxZiwKLSAgICAgICAgMHgwMjIwLCAweDAyMjEsIDB4MDIyMiwgMHgwMjIzLCAweDAyMjQsIDB4MDIyNSwgMHgwMjI2LCAweDAyMjcsIDB4MDIyOCwgMHgwMjVhLAotICAgICAgICAweDAyNWIsIDB4MDI1YywgMHgwMjVkLCAweDAyNWUsIDB4MDI1ZiwgMHgwMjYwLCAweDAyNjEsIDB4MDI2MiwgMHgwMjYzLCAweDAyNjQsCi0gICAgICAgIDB4MDI2NSwgMHgwMjY2LCAweDAyNjcsIDB4MDI2OCwgMHgwMjY5LCAweDAyNmEsIDB4MDI2YiwgMHgwMjZjLCAweDAyNmQsIDB4MDI2ZSwKLSAgICAgICAgMHgwMjZmLCAweDAyNzAsIDB4MDI3MSwgMHgwMjcyLCAweDAyNzMsIDB4MDI3NCwgMHgwMjc1LCAweDAyNzYsIDB4MDI3NywgMHgwMjc4LAotICAgICAgICAweDAyNzksIDB4MDI3YSwgMHgwMjdiLCAweDAyN2MsIDB4MDI3ZCwgMHgwMjdlLCAweDAyN2YsIDB4MDI4MCwgMHgwMjgxLCAweDAyODIsCi0gICAgICAgIDB4MDI4MywgMHgwMjg1LCAweDAyODYsIDB4MDI4NywgMHgwMjg4LCAweDAyODksIDB4MDI4YSwgMHgwMjhiLCAweDAyOGMsIDB4MDI4ZCwKLSAgICAgICAgMHgwMjhlLCAweDAyOGYsIDB4MDI5MSwgMHgwMmJlLCAweDAyYzAsIDB4MDJjMiwgMHgwMmM0LCAweDAyYzYsIDB4MDJjOCwgMHgwMmNhLAotICAgICAgICAweDAyY2MsIDB4MDJkMiwgMHgwMmQ0LCAweDAyZGEsIDB4MDJkYywgMHgwMmRlLCAweDAyZTAsIDB4MDJlMiwgMHgwMmU0LCAweDAyZTYsCi0gICAgICAgIDB4MDJlOCwgMHgwMmVhLCAweDAyZWMsIDB4MDJlZQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6Ci0gICAgICogICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cwotICAgICAqICAgICAodW51c2VkKSAgICAgICAgICAxIGJpdAotICAgICAqICAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMKLSAgICAgKiAgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cwotICAgICAqICAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBJTkRfQ09ERVMgPSB7Ci0gICAgICAgIDB4Njc3MjA0MDAsIDB4NmU2YzZjNjgsIDB4NjI2NTA0MDAsIDB4NjY3MjA0YjUsIDB4NmQ2MzA0MDAsIDB4NjE2NDA0MDAsCi0gICAgICAgIDB4NjU3MzA0YTQsIDB4Njg3NTA0MDAsIDB4NjI2MTA0MDAsIDB4Njg3MjA0MDAsIDB4NzI3MzA0MDAsIDB4Njk3NDA0ZDYsCi0gICAgICAgIDB4NzY2MTA0ZDYsIDB4NzI2ZjA0MDAsIDB4NjM2ODA1MDIsIDB4NjM3YTZjYzEsIDB4NzM2YjA0MDAsIDB4NjE3NDZjZTIsCi0gICAgICAgIDB4Njc2MjZjOTMsIDB4Njc2MjZjOTMsIDB4NjQ2YjA0MDAsIDB4NzM2NTA0MDAsIDB4NmU2ZjA0MDAsIDB4NjY2OTA0MDAsCi0gICAgICAgIDB4NmM3NDA0MDAsIDB4NmM3NjA0MDAsIDB4NjU2NTA0MDAsIDB4NzI3NTA0MDAsIDB4NzU2MTA0MDAsIDB4NjI3OTA0MDAsCi0gICAgICAgIDB4NmQ2NDA0MDAsIDB4NzA2YzA0ZjAsIDB4NjQ2NTZjNzIsIDB4Njc2OTA0MDAsIDB4NzA3NDA0MDAsIDB4NmM3NTA0MDAsCi0gICAgICAgIDB4Njk2NTA0ODMsIDB4Njk3MzA0MDAsIDB4NjE2YzA0MDAsIDB4NmQ3NDA0MDAsIDB4NjM3OTA0MDAsIDB4Njc2NTA0MDAsCi0gICAgICAgIDB4NjE2ZDA0MDAsIDB4NjI2NzA0MDAsIDB4NzQ3MjA0MDAsIDB4NjY2ZjA0MDAsIDB4Njc2NTA0MDAsIDB4Njc2YzA0MDAsCi0gICAgICAgIDB4NzM2ZDA0MDAsIDB4NzM2YzA0MDAsIDB4NmQ2YjA0MDAsIDB4NmM2OTA0MDAsIDB4NmQ2NTA0MDAsIDB4NjM2MTVlMDAsCi0gICAgICAgIDB4NzA2ZDA0MDAsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsCi0gICAgICAgIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzA3MjA0MDAsIDB4NzY2OTA0MDAsIDB4NmQ3ODA2MDAsIDB4NmE2ZDA2MDAsCi0gICAgICAgIDB4Njc3MDA0MDAsIDB4NjI2MjA2MDAsIDB4NjE2NzA2MDAsIDB4NmI3OTA2MDAsIDB4NzY2NzA2MDAsIDB4NjI2ZDA0MDAsCi0gICAgICAgIDB4Njc2NDA0MDAsIDB4NmQ3MzA0MDAsIDB4NmI2ZTA0MDAsIDB4NmM2MzA0MDAsIDB4NzY2MzA0MDAsIDB4NmU2YzA0MDAsCi0gICAgICAgIDB4NjE3NzA0MDAsIDB4NjI3MzA0MDAsIDB4NjE2OTA2MDAsIDB4NjQ2ZDA0MDAsIDB4NjM3NTA0MDAsIDB4NjQ2ZjA0MDAsCi0gICAgICAgIDB4Njg3NDA0MDAsIDB4NzQ3NDA0MDAsIDB4NzQ2MzA0MDAsIDB4NjE3YTA0MDAsIDB4NmI3YTA0MDAsIDB4NjI3NDA0MDAsCi0gICAgICAgIDB4Njk2ZTA0MDAsIDB4Njk2ZTA0MDAsIDB4NzA2YjA0MDAsIDB4NjE2NjA0MDAsIDB4NmM2YjA0MDAsIDB4NmQ2ZDA0MDAsCi0gICAgICAgIDB4NmM2MjA0MDAsIDB4NmE2ZjA0MDAsIDB4NzM3OTA0MDAsIDB4Njk3MTA0MDAsIDB4NmI3NzA0MDAsIDB4NzM2MTA0MDAsCi0gICAgICAgIDB4Nzk2NTA0MDAsIDB4NmY2ZDA0MDAsIDB4NzA3MzA0MDAsIDB4NjE2NTA0MDAsIDB4Njk2YzA0MDAsIDB4NjI2ODA0MDAsCi0gICAgICAgIDB4NzE2MTA0MDAsIDB4NmQ2ZTA0MDAsIDB4NmU3MDA0MDAsIDB4NjE2NTA0MDAsIDB4NjE2NTA0MDAsIDB4Njk3MjA0MDAsCi0gICAgICAgIDB4NzU3YTA0MDAsIDB4NzQ2YTA0MDAsIDB4NmI2NzA0MDAsIDB4NzQ2ZDA0MDAsIDB4NmE3MDc0NDcsIDB4NmE3MDc0NDcsCi0gICAgICAgIDB4NmI3MjA0MDAsIDB4NzY2ZTA0MDAsIDB4Njg2YjA0MDAsIDB4NmQ2ZjA0MDAsIDB4NmI2ODA0MDAsIDB4NmM2MTA0MDAsCi0gICAgICAgIDB4NjM2ZTZjMjksIDB4NjM2ZTZjMjksIDB4NzQ3NzA0MDAsIDB4NmI3MDA0MDAsIDB4NjI2NDA0MDAsIDB4NmQ3NjA0MDAsCi0gICAgICAgIDB4NmQ3OTA0MDAsIDB4NjE3NTVjNTMsIDB4Njk2NDA0MDAsIDB4NzQ2YzA0MDAsIDB4NzA2ODA0MDAsIDB4NzQ2ODA0MDAsCi0gICAgICAgIDB4NzM2NzVjMzMsIDB4NjI2ZTA0MDAsIDB4NmU3YTA1MTMsIDB4NmQ3MDA0MDAsIDB4Njc3NTA0MDAsIDB4NmU3MjA0MDAsCi0gICAgICAgIDB4NzA2NzA0MDAsIDB4NzQ2ZjA0MDAsIDB4NzM2MjA0MDAsIDB4NzY3NTA0MDAsIDB4NjY2YTA0MDAsIDB4Nzc2NjA0MDAsCi0gICAgICAgIDB4NjE3MzA0MDAsIDB4NmI2OTA0MDAsIDB4NmU2MzA0MDAsIDB4NzA2NjA0MDAsIDB4NjM2YjA0MDAsIDB4Nzc3MzA0MDAsCi0gICAgICAgIDB4NjY2ZDA0MDAsIDB4NmQ2ODA0MDAsIDB4NzA3NzA0MDAsIDB4NjU2NzA0MDAsIDB4NjQ3YTA0MDAsIDB4NmQ2MTA0MDAsCi0gICAgICAgIDB4NzQ2ZTA0MDAsIDB4NmM3OTA0MDAsIDB4Njc2ZDA0MDAsIDB4NzM2ZTA0MDAsIDB4NmQ3MjA0MDAsIDB4NmQ2YzA0MDAsCi0gICAgICAgIDB4Njc2ZTA0MDAsIDB4NjM2OTA0MDAsIDB4NjI2NjA0MDAsIDB4NmU2NTA0MDAsIDB4NzQ2NzA0MDAsIDB4NjI2YTA0MDAsCi0gICAgICAgIDB4NmQ3NTA0MDAsIDB4NmM3MjA0MDAsIDB4NzM2YzA0MDAsIDB4Njc2ODA0MDAsIDB4NmU2NzA0MDAsIDB4NzQ2NDA0MDAsCi0gICAgICAgIDB4NjM2NjA0MDAsIDB4NjM2ZDA0MDAsIDB4NjM3NjA0MDAsIDB4NzM3NDA0MDAsIDB4Njc3MTA0MDAsIDB4Njc2MTA0MDAsCi0gICAgICAgIDB4NjM2NzA0MDAsIDB4NjM2NzA0MDAsIDB4NjE2ZjA0MDAsIDB4Njc3NzA0MDAsIDB4NzM2MzA0MDAsIDB4NzM2NDA0MDAsCi0gICAgICAgIDB4NzI3NzA0MDAsIDB4NjU3NDA0MDAsIDB4NzM2ZjA0MDAsIDB4NjQ2YTA0MDAsIDB4NmI2NTA0MDAsIDB4NzQ3YTA0MDAsCi0gICAgICAgIDB4NzU2NzA0MDAsIDB4NjI2OTA0MDAsIDB4NmQ3YTA0MDAsIDB4N2E2ZDA0MDAsIDB4NmQ2NzA0MDAsIDB4NzI2NTA0MDAsCi0gICAgICAgIDB4N2E3NzA0MDAsIDB4NmU2MTA0MDAsIDB4NmQ3NzA0MDAsIDB4NmM3MzA0MDAsIDB4NjI3NzA0MDAsIDB4NzM3YTA0MDAsCi0gICAgICAgIDB4NmI2ZDA0MDAsIDB4N2E2MTA0MTMsIDB4NjU3MjA0MDAsIDB4NjI3YTA0MDAsIDB4Njc3NDA0MDAsIDB4NzM3NjA0MDAsCi0gICAgICAgIDB4Njg2ZTA2MDAsIDB4NmU2OTA0MDAsIDB4NjM3MjA0MDAsIDB4NzA2MTA0MDAsIDB4NzA2NTA0MDAsIDB4NjE3MjA2MDAsCi0gICAgICAgIDB4NjI3MjA0MDAsIDB4NjM2YzA0MDAsIDB4NjM2ZjA2MDAsIDB4NzY2NTA0MDAsIDB4NjI2ZjA0MDAsIDB4Njc3OTA0MDAsCi0gICAgICAgIDB4NjU2MzA0MDAsIDB4Njc2NjA0MDAsIDB4NzA3OTA0MDAsIDB4NzM3MjA0MDAsIDB4NzU3OTA0MDAsIDB4NjY2YjA0MDAKLSAgICB9OwotCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1jY1RhYmxlIjsKIAorICAgIHN0YXRpYyBBcnJheUxpc3Q8TWNjRW50cnk+IHRhYmxlOworCisgICAgc3RhdGljIGNsYXNzIE1jY0VudHJ5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxNY2NFbnRyeT4KKyAgICB7CisgICAgICAgIGludCBtY2M7CisgICAgICAgIFN0cmluZyBpc287CisgICAgICAgIGludCBzbWFsbGVzdERpZ2l0c01uYzsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlOworICAgICAgICBpbnQgd2lmaUNoYW5uZWxzOworCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQykgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBsYW5ndWFnZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSwgaW50IHdpZmlDaGFubmVscykgeworICAgICAgICAgICAgdGhpcy5tY2MgPSBtbmM7CisgICAgICAgICAgICB0aGlzLmlzbyA9IGlzbzsKKyAgICAgICAgICAgIHRoaXMuc21hbGxlc3REaWdpdHNNbmMgPSBzbWFsbGVzdERpZ2l0c01DQzsKKyAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgICAgIHRoaXMud2lmaUNoYW5uZWxzID0gd2lmaUNoYW5uZWxzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhNY2NFbnRyeSBvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWNjIC0gby5tY2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNY2NFbnRyeQorICAgIGVudHJ5Rm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgTWNjRW50cnkgbTsKKworICAgICAgICBtID0gbmV3IE1jY0VudHJ5KG1jYywgbnVsbCwgMCk7CisKKyAgICAgICAgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2godGFibGUsIG0pOworCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRAotICAgICAqIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQgZm9yIHRoZSBnaXZlbiBNQ0MuCisgICAgICogQHBhcmFtIG1jYyBNb2JpbGUgQ291bnRyeSBDb2RlCisgICAgICogQHJldHVybiBkZWZhdWx0IFRpbWVab25lIElELCBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VGltZVpvbmVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5pc28gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlOworICAgICAgICAgICAgaWYgKGVudHJ5Lmxhbmd1YWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkubGFuZ3VhZ2UsIGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSB0eiA9IFRpbWVab25lcy5mb3JMb2NhbGUobG9jYWxlKTsKKyAgICAgICAgICAgIGlmICh0ei5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdHpbMF07CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgdHpJbmQgPSAoaW5kQ29kZSA+Pj4gNCkgJiAweDAwMUY7Ci0gICAgICAgIFN0cmluZyB0eiA9IFRaX1NUUklOR1NbdHpJbmRdOwotICAgICAgICBpZiAodHogPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ejsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIHR3by1jaGFyYWN0ZXIKLSAgICAgKiBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIHR3by1jaGFyYWN0ZXIgY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuaXNvOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgYnl0ZVtdIGlzbyA9IHsoYnl0ZSkoKGluZENvZGUgPj4+IDI0KSAmIDB4MDBGRiksIChieXRlKSgoaW5kQ29kZSA+Pj4gMTYpICYgMHgwMEZGKX07Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlzbyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gMi0zIGNoYXJhY3RlcgotICAgICAqIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gMi0zIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExhbmd1YWdlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkubGFuZ3VhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgbGFuZ0luZCA9IGluZENvZGUgJiAweDAwMEY7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gTEFOR19TVFJJTkdTW2xhbmdJbmRdOwotICAgICAgICBpZiAobGFuZyA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgZmllbGQuICBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgTSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbWFsbGVzdERpZ2l0c01uYzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBzbURpZyA9IChpbmRDb2RlID4+PiA5KSAmIDB4MDAwMzsKLSAgICAgICAgcmV0dXJuIHNtRGlnOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIG51bWJlciBvZiB3aWZpCiAgICAgICogY2hhbm5lbHMgYWxsb3dlZCBpbiB0aGF0IGNvdW50cnkuICBSZXR1cm5zIDAgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LndpZmlDaGFubmVsczsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB3aWZpID0gKGluZENvZGUgPj4+IDExKSAmIDB4MDAwRjsKLSAgICAgICAgcmV0dXJuIHdpZmk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTYsNCArMjc2LDI2MiBAQAogICAgICAgICAgICAgd00uc2V0TnVtQWxsb3dlZENoYW5uZWxzKHdpZmlDaGFubmVscywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICB0YWJsZSA9IG5ldyBBcnJheUxpc3Q8TWNjRW50cnk+KDI0MCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCisgICAgICAgICAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgorICAgICAgICAgKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCisgICAgICAgICAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgorICAgICAgICAgKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHRhYmxlIGhhcyBub3QgYmVlbiB2ZXJpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICovCisKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDIsImdyIiwyKSk7CS8vR3JlZWNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA0LCJubCIsMiwibmwiLDEzKSk7CS8vTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNiwiYmUiLDIpKTsJLy9CZWxnaXVtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA4LCJmciIsMiwiZnIiKSk7CS8vRnJhbmNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEyLCJtYyIsMikpOwkvL01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMywiYWQiLDIpKTsJLy9BbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE0LCJlcyIsMiwiZXMiKSk7CS8vU3BhaW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTYsImh1IiwyKSk7CS8vSHVuZ2FyeSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE4LCJiYSIsMikpOwkvL0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTksImhyIiwyKSk7CS8vQ3JvYXRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIwLCJycyIsMikpOwkvL1NlcmJpYSBhbmQgTW9udGVuZWdybworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMiwiaXQiLDIsIml0IikpOwkvL0l0YWx5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI1LCJ2YSIsMiwiaXQiKSk7CS8vVmF0aWNhbiBDaXR5IFN0YXRlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI2LCJybyIsMikpOwkvL1JvbWFuaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjgsImNoIiwyLCJkZSIpKTsJLy9Td2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzAsImN6IiwyLCJjcyIsMTMpKTsJLy9DemVjaCBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMSwic2siLDIpKTsJLy9TbG92YWsgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzIsImF0IiwyLCJkZSIsMTMpKTsJLy9BdXN0cmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM0LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNSwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzgsImRrIiwyKSk7CS8vRGVubWFyaworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0MCwic2UiLDIpKTsJLy9Td2VkZW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDIsIm5vIiwyKSk7CS8vTm9yd2F5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ0LCJmaSIsMikpOwkvL0ZpbmxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDYsImx0IiwyKSk7CS8vTGl0aHVhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDcsImx2IiwyKSk7CS8vTGF0dmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDgsImVlIiwyKSk7CS8vRXN0b25pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjUwLCJydSIsMikpOwkvL1J1c3NpYW4gRmVkZXJhdGlvbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NSwidWEiLDIpKTsJLy9Va3JhaW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU3LCJieSIsMikpOwkvL0JlbGFydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1OSwibWQiLDIpKTsJLy9Nb2xkb3ZhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjAsInBsIiwyKSk7CS8vUG9sYW5kIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjIsImRlIiwyLCJkZSIsMTMpKTsJLy9HZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2NiwiZ2kiLDIpKTsJLy9HaWJyYWx0YXIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjgsInB0IiwyKSk7CS8vUG9ydHVnYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzAsImx1IiwyKSk7CS8vTHV4ZW1ib3VyZworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MiwiaWUiLDIsImVuIikpOwkvL0lyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzQsImlzIiwyKSk7CS8vSWNlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NiwiYWwiLDIpKTsJLy9BbGJhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzgsIm10IiwyKSk7CS8vTWFsdGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODAsImN5IiwyKSk7CS8vQ3lwcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODIsImdlIiwyKSk7CS8vR2VvcmdpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MywiYW0iLDIpKTsJLy9Bcm1lbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODQsImJnIiwyKSk7CS8vQnVsZ2FyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NiwidHIiLDIpKTsJLy9UdXJrZXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODgsImZvIiwyKSk7CS8vRmFyb2UgSXNsYW5kcworICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg5LCJnZSIsMikpOyAgICAvL0Fia2hhemlhIChHZW9yZ2lhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5MCwiZ2wiLDIpKTsJLy9HcmVlbmxhbmQgKERlbm1hcmspCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkyLCJzbSIsMikpOwkvL1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Mywic2wiLDIpKTsJLy9TbG92ZW5pYSAoUmVwdWJsaWMgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTQsIm1rIiwyKSk7ICAgLy9UaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NSwibGkiLDIpKTsJLy9MaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTcsIm1lIiwyKSk7ICAgIC8vTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzAyLCJjYSIsMywiIiwxMSkpOwkvL0NhbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwOCwicG0iLDIpKTsJLy9TYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMywidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMCwicHIiLDIpKTsJLy9QdWVydG8gUmljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMiwidmkiLDIpKTsJLy9Vbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM0LCJteCIsMykpOwkvL01leGljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzOCwiam0iLDMpKTsJLy9KYW1haWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQwLCJncCIsMikpOwkvL0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MiwiYmIiLDMpKTsJLy9CYXJiYWRvcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0NCwiYWciLDMpKTsJLy9BbnRpZ3VhIGFuZCBCYXJidWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ2LCJreSIsMykpOwkvL0NheW1hbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ4LCJ2ZyIsMykpOwkvL0JyaXRpc2ggVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTAsImJtIiwyKSk7CS8vQmVybXVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MiwiZ2QiLDIpKTsJLy9HcmVuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU0LCJtcyIsMikpOwkvL01vbnRzZXJyYXQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTYsImtuIiwyKSk7CS8vU2FpbnQgS2l0dHMgYW5kIE5ldmlzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU4LCJsYyIsMikpOwkvL1NhaW50IEx1Y2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYwLCJ2YyIsMikpOwkvL1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYyLCJubCIsMikpOwkvL05ldGhlcmxhbmRzIEFudGlsbGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYzLCJhdyIsMikpOwkvL0FydWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY0LCJicyIsMikpOwkvL0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY1LCJhaSIsMykpOwkvL0FuZ3VpbGxhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY2LCJkbSIsMikpOwkvL0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY4LCJjdSIsMikpOwkvL0N1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzAsImRvIiwyKSk7CS8vRG9taW5pY2FuIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcyLCJodCIsMikpOwkvL0hhaXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzQsInR0IiwyKSk7CS8vVHJpbmlkYWQgYW5kIFRvYmFnbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NiwidGMiLDIpKTsJLy9UdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDAsImF6IiwyKSk7CS8vQXplcmJhaWphbmkgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDEsImt6IiwyKSk7CS8vS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAyLCJidCIsMikpOwkvL0JodXRhbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDQsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNSwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEwLCJwayIsMikpOwkvL1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMiwiYWYiLDIpKTsJLy9BZmdoYW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMywibGsiLDIpKTsJLy9TcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNCwibW0iLDIpKTsJLy9NeWFubWFyIChVbmlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTUsImxiIiwyKSk7CS8vTGViYW5vbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNiwiam8iLDIpKTsJLy9Kb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNywic3kiLDIpKTsJLy9TeXJpYW4gQXJhYiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOCwiaXEiLDIpKTsJLy9JcmFxIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTksImt3IiwyKSk7CS8vS3V3YWl0IChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjAsInNhIiwyKSk7CS8vU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMSwieWUiLDIpKTsJLy9ZZW1lbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIyLCJvbSIsMikpOwkvL09tYW4gKFN1bHRhbmF0ZSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMywicHMiLDIpKTsgICAgLy9QYWxlc3RpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjQsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjUsImlsIiwyKSk7CS8vSXNyYWVsIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjYsImJoIiwyKSk7CS8vQmFocmFpbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjcsInFhIiwyKSk7CS8vUWF0YXIgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOCwibW4iLDIpKTsJLy9Nb25nb2xpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOSwibnAiLDIpKTsJLy9OZXBhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMSwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMiwiaXIiLDIpKTsJLy9JcmFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNCwidXoiLDIpKTsJLy9VemJla2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzYsInRqIiwyKSk7CS8vVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM3LCJrZyIsMikpOwkvL0t5cmd5eiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzOCwidG0iLDIpKTsJLy9UdXJrbWVuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDAsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MSwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDUwLCJrciIsMiwia28iLDEzKSk7CS8vS29yZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Miwidm4iLDIpKTsJLy9WaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NCwiaGsiLDIpKTsJLy8iSG9uZyBLb25nLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTUsIm1vIiwyKSk7CS8vIk1hY2FvLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTYsImtoIiwyKSk7CS8vQ2FtYm9kaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU3LCJsYSIsMikpOwkvL0xhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYwLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MSwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjYsInR3IiwyKSk7CS8vIlRhaXdhbiwgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY3LCJrcCIsMikpOwkvL0RlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzAsImJkIiwyKSk7CS8vQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcyLCJtdiIsMikpOwkvL01hbGRpdmVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDIsIm15IiwyKSk7CS8vTWFsYXlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDUsImF1IiwyLCJlbiIsMTEpKTsJLy9BdXN0cmFsaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTAsImlkIiwyKSk7CS8vSW5kb25lc2lhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTQsInRsIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNSwicGgiLDIpKTsJLy9QaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyMCwidGgiLDIpKTsJLy9UaGFpbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyNSwic2ciLDIsImVuIiwxMSkpOwkvL1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI4LCJibiIsMikpOwkvL0JydW5laSBEYXJ1c3NhbGFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTMwLCJueiIsMiwgImVuIikpOwkvL05ldyBaZWFsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM0LCJtcCIsMikpOwkvL05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzUsImd1IiwyKSk7CS8vR3VhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNiwibnIiLDIpKTsJLy9OYXVydSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM3LCJwZyIsMikpOwkvL1BhcHVhIE5ldyBHdWluZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzksInRvIiwyKSk7CS8vVG9uZ2EgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQwLCJzYiIsMikpOwkvL1NvbG9tb24gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MSwidnUiLDIpKTsJLy9WYW51YXR1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDIsImZqIiwyKSk7CS8vRmlqaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQzLCJ3ZiIsMikpOwkvL1dhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ0LCJhcyIsMikpOwkvL0FtZXJpY2FuIFNhbW9hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ1LCJraSIsMikpOwkvL0tpcmliYXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDYsIm5jIiwyKSk7CS8vTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NywicGYiLDIpKTsJLy9GcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ4LCJjayIsMikpOwkvL0Nvb2sgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OSwid3MiLDIpKTsJLy9TYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUwLCJmbSIsMikpOwkvL01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUxLCJtaCIsMikpOwkvL01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTIsInB3IiwyKSk7CS8vUGFsYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMiwiZWciLDIpKTsJLy9FZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDMsImR6IiwyKSk7CS8vQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDQsIm1hIiwyKSk7CS8vTW9yb2NjbyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDUsInRuIiwyKSk7CS8vVHVuaXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNiwibHkiLDIpKTsJLy9MaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA3LCJnbSIsMikpOwkvL0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOCwic24iLDIpKTsJLy9TZW5lZ2FsIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDksIm1yIiwyKSk7CS8vTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTAsIm1sIiwyKSk7CS8vTWFsaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjExLCJnbiIsMikpOwkvL0d1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEyLCJjaSIsMikpOwkvL0N0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEzLCJiZiIsMikpOwkvL0J1cmtpbmEgRmFzbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNCwibmUiLDIpKTsJLy9OaWdlciAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNSwidGciLDIpKTsJLy9Ub2dvbGVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNiwiYmoiLDIpKTsJLy9CZW5pbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE3LCJtdSIsMikpOwkvL01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE4LCJsciIsMikpOwkvL0xpYmVyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOSwic2wiLDIpKTsJLy9TaWVycmEgTGVvbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjAsImdoIiwyKSk7CS8vR2hhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjEsIm5nIiwyKSk7CS8vTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjIsInRkIiwyKSk7CS8vQ2hhZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIzLCJjZiIsMikpOwkvL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNCwiY20iLDIpKTsJLy9DYW1lcm9vbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI1LCJjdiIsMikpOwkvL0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNiwic3QiLDIpKTsJLy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI3LCJncSIsMikpOwkvL0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjgsImdhIiwyKSk7CS8vR2Fib25lc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjksImNnIiwyKSk7CS8vQ29uZ28gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzAsImNnIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzEsImFvIiwyKSk7CS8vQW5nb2xhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzIsImd3IiwyKSk7CS8vR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMzLCJzYyIsMikpOwkvL1NleWNoZWxsZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNCwic2QiLDIpKTsJLy9TdWRhbiAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNSwicnciLDIpKTsJLy9Sd2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNiwiZXQiLDIpKTsJLy9FdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNywic28iLDIpKTsJLy9Tb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOCwiZGoiLDIpKTsJLy9Eamlib3V0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM5LCJrZSIsMikpOwkvL0tlbnlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDAsInR6IiwyKSk7CS8vVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDEsInVnIiwyKSk7CS8vVWdhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDIsImJpIiwyKSk7CS8vQnVydW5kaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQzLCJteiIsMikpOwkvL01vemFtYmlxdWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NSwiem0iLDIpKTsJLy9aYW1iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NiwibWciLDIpKTsJLy9NYWRhZ2FzY2FyIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDcsInJlIiwyKSk7CS8vUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ4LCJ6dyIsMikpOwkvL1ppbWJhYndlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDksIm5hIiwyKSk7CS8vTmFtaWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUwLCJtdyIsMikpOwkvL01hbGF3aQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MSwibHMiLDIpKTsJLy9MZXNvdGhvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MiwiYnciLDIpKTsJLy9Cb3Rzd2FuYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUzLCJzeiIsMikpOwkvL1N3YXppbGFuZCAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTQsImttIiwyKSk7CS8vQ29tb3JvcyAoVW5pb24gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NSwiemEiLDIsImVuIikpOwkvL1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU3LCJlciIsMikpOwkvL0VyaXRyZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDIsImJ6IiwyKSk7CS8vQmVsaXplCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA0LCJndCIsMikpOwkvL0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA2LCJzdiIsMikpOwkvL0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDgsImhuIiwzKSk7CS8vSG9uZHVyYXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMCwibmkiLDIpKTsJLy9OaWNhcmFndWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTIsImNyIiwyKSk7CS8vQ29zdGEgUmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNCwicGEiLDIpKTsJLy9QYW5hbWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNiwicGUiLDIpKTsJLy9QZXJ1CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzIyLCJhciIsMykpOwkvL0FyZ2VudGluZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyNCwiYnIiLDIpKTsJLy9CcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMwLCJjbCIsMikpOwkvL0NoaWxlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMyLCJjbyIsMykpOwkvL0NvbG9tYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzQsInZlIiwyKSk7CS8vVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNiwiYm8iLDIpKTsJLy9Cb2xpdmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzgsImd5IiwyKSk7CS8vR3V5YW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQwLCJlYyIsMikpOwkvL0VjdWFkb3IKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDIsImdmIiwyKSk7CS8vRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ0LCJweSIsMikpOwkvL1BhcmFndWF5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDYsInNyIiwyKSk7CS8vU3VyaW5hbWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0OCwidXkiLDIpKTsJLy9VcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc1MCwiZmsiLDIpKTsJLy9GYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcykKKyAgICAgICAgLy90YWJsZS5hZGQobmV3IE1jY0VudHJ5KDkwMSwiIiwyKSk7CS8vIkludGVybmF0aW9uYWwgTW9iaWxlLCBzaGFyZWQgY29kZSIKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IDIzMzI1ZjYuLjc2OWIyZmM4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwpAQCAtOTksOCArMTAwLDkgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FX05BTUVfS0VZID0gInBob25lTmFtZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9LRVkgPSAicmVhc29uIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0NIQU5HRV9SRUFTT05fS0VZID0gInJlYXNvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9UWVBFU19LRVkgPSAiYXBuVHlwZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9UWVBFX0tFWSA9ICJhcG5UeXBlIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX0tFWSA9ICJhcG4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9ORVRXT1JLX1BST1BFUlRJRVNfS0VZID0gImRhdGFQcm9wZXJ0aWVzIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRkFDRV9OQU1FX0tFWSA9ICJpZmFjZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSA9ICJuZXR3b3JrVW52YWlsYWJsZSI7CkBAIC0yNDEsMTMgKzI0MywyMSBAQAogICAgIENlbGxMb2NhdGlvbiBnZXRDZWxsTG9jYXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKLSAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICogR2V0IHRoZSBjdXJyZW50IGZvciB0aGUgZGVmYXVsdCBhcG4gRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgICAgICogZXhpc3RzIGF0IHRoaXMgaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCiAgICAgICovCiAgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKTsKIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKKyAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KKyAgICAgKiBAcGFyYW0gYXBuVHlwZSBzcGVjaWZ5IGZvciB3aGljaCBhcG4gdG8gZ2V0IGNvbm5lY3Rpb24gc3RhdGUgaW5mby4KKyAgICAgKi8KKyAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YUFjdGl2aXR5U3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKICAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXJ9IGluc3RlYWQuCkBAIC0zMTEsNiArMzIxLDExIEBACiAgICAgU3RyaW5nIGdldEFjdGl2ZUFwbigpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBOZXR3b3JrUHJvcGVydGllcyBmb3IgdGhlIG5hbWVkIGFwbiBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgY3VycmVudCBzaWduYWwgc3RyZW5ndGguIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYXZhaWxhYmxlIG9uIHRoaXMKICAgICAgKiBpbnRlcmZhY2UuIFVzZSA8Y29kZT5QaG9uZVN0YXRlTm90aWZpZXI8L2NvZGU+IG9yIGFuIGVxdWl2YWxlbnQuCiAgICAgICogQW4gQVNVIGlzIDAtMzEgb3IgLTEgaWYgdW5rbm93biAoZm9yIEdTTSwgZEJtID0gLTExMyAtIDIgKiBhc3UpLgpAQCAtMTUzMyw2ICsxNTQ4LDExIEBACiAgICAgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisKKyAgICAvKioKICAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIENETUEgY2FsbCB3YWl0aW5nIGNvbWVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCmluZGV4IDc0NjAxZTYuLmU1OTY4YTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC03MzcsOCArNzM4LDEzIEBACiAgICAgICAgIG1Ob3RpZmllci5ub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQodGhpcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQaG9uZU5hbWUoKTsKQEAgLTgyNCw5ICs4MzAsMTkgQEAKICAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJ1bnJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5Iik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIG51bWJlciBpcyBhbiBPVEFTUCBudW1iZXIuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLwogICAgIHB1YmxpYyAgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKSB7Ci0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsYXNzIENETUFQaG9uZS4gTm90IGltcGxlbWVudGVkIGluIEdTTVBob25lLgotICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoImlzT3RhU3BOdW1iZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtOTQwLDYgKzk1NiwxMCBAQAogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEFjdGl2ZUFwblR5cGVzKCk7CiAgICAgfQogCisgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0TmV0d29ya1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3RpdmVBcG4oKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuU3RyaW5nKCk7CiAgICAgfQpAQCAtOTUyLDYgKzk3MiwxMCBAQAogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmRpc2FibGVBcG5UeXBlKHR5cGUpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgeworICAgICAgICByZXR1cm4gKChtRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgJiYgKG1EYXRhQ29ubmVjdGlvbi5pc0RhdGFQb3NzaWJsZSgpKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogc2ltdWxhdGVEYXRhQ29ubmVjdGlvbgogICAgICAqCkBAIC05ODAsNyArMTAwNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtRGF0YUNvbm5lY3Rpb24uc2V0U3RhdGUoZGNTdGF0ZSk7Ci0gICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMjYsNCArMTA1MCw4IEBACiAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgIiArIG5hbWUgKyAiKCkgaW4gUGhvbmVCYXNlIHNob3VsZCBub3QgYmUgIiArCiAgICAgICAgICAgICAgICAgImNhbGxlZCwgQ0RNQVBob25lIGluYWN0aXZlLiIpOwogICAgIH0KKworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDb25uZWN0aW9uU3RhdGUoQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggZTk2ZWVhZS4uNjkxMjcxZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCkBAIC0zMyw5ICszMywxMiBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcik7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKTsKKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcik7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCmluZGV4IGUxNTExZTYuLmQ4NDg1OWMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtMTcyLDcgKzE3MywxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhQWN0aXZpdHlTdGF0ZSBnZXREYXRhQWN0aXZpdHlTdGF0ZSgpIHsKQEAgLTIwNyw2ICsyMTIsMTAgQEAKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG5UeXBlcygpOwogICAgIH0KIAorICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldE5ldHdvcmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZlQXBuKCkgewogICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEFjdGl2ZUFwbigpOwogICAgIH0KQEAgLTc2NCw2ICs3NzMsMTAgQEAKICAgICAgICAgbUFjdGl2ZVBob25lLmV4aXRFbWVyZ2VuY3lDYWxsYmFja01vZGUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKXsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKXsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc090YVNwTnVtYmVyKGRpYWxTdHIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQppbmRleCA1NjlhYzVjLi4xYTBkZDg5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCkBAIC0yODUsOSArMjg1LDggQEAKICAgICAgICAgfQogCiAKLSAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVtZW50YXRpb24KLQotICAgICAgICBwdWJsaWMgdm9pZAorICAgICAgICAvLyoqKioqIEhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkCiAgICAgICAgIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIFJJTFJlcXVlc3QgcnIgPSAoUklMUmVxdWVzdCkobXNnLm9iaik7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJlcSA9IG51bGw7CkBAIC03ODAsNyArNzc5LDcgQEAKICAgICAgICAgc2VuZChycik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQKKyAgICBARGVwcmVjYXRlZCBwdWJsaWMgdm9pZAogICAgIGdldFBEUENvbnRleHRMaXN0KE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIGdldERhdGFDYWxsTGlzdChyZXN1bHQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGNhNTI2YTUuLjllMTdlYjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMTQzLDcgKzE0Myw3IEBACiAKICAgICBwcml2YXRlIFNtc0NvdW50ZXIgbUNvdW50ZXI7CiAKLSAgICBwcml2YXRlIEFycmF5TGlzdCBtU1RyYWNrZXJzID0gbmV3IEFycmF5TGlzdChNT19NU0dfUVVFVUVfTElNSVQpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFNtc1RyYWNrZXI+IG1TVHJhY2tlcnMgPSBuZXcgQXJyYXlMaXN0PFNtc1RyYWNrZXI+KE1PX01TR19RVUVVRV9MSU1JVCk7CiAKICAgICAvKiogV2FrZSBsb2NrIHRvIGVuc3VyZSBkZXZpY2Ugc3RheXMgYXdha2Ugd2hpbGUgZGlzcGF0Y2hpbmcgdGhlIFNNUyBpbnRlbnQuICovCiAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrOwpAQCAtMjY1LDYgKzI2NSw3IEBACiAgICAgICAgIG1DbS51bnJlZ2lzdGVyRm9yT24odGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlNNU0Rpc3BhdGNoZXIgZmluYWxpemVkIik7CiAgICAgfQpAQCAtMzQ1LDcgKzM0Niw3IEBACiAgICAgICAgICAgICBtc2cub2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtU1RyYWNrZXJzLmlzRW1wdHkoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSAoU21zVHJhY2tlciltU1RyYWNrZXJzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IG1TVHJhY2tlcnMucmVtb3ZlKDApOwogICAgICAgICAgICAgICAgICAgICBzVHJhY2tlci5tU2VudEludGVudC5zZW5kKFJFU1VMVF9FUlJPUl9MSU1JVF9FWENFRURFRCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZmFpbGVkIHRvIHNlbmQgYmFjayBSRVNVTFRfRVJST1JfTElNSVRfRVhDRUVERUQiKTsKQEAgLTM1OCw3ICszNTksNyBAQAogCiAgICAgICAgIGNhc2UgRVZFTlRfU0VORF9DT05GSVJNRURfU01TOgogICAgICAgICAgICAgaWYgKG1TVHJhY2tlcnMuaXNFbXB0eSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IChTbXNUcmFja2VyKW1TVHJhY2tlcnMucmVtb3ZlKG1TVHJhY2tlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IG1TVHJhY2tlcnMucmVtb3ZlKG1TVHJhY2tlcnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwYXJ0VHJhY2tlcihzVHJhY2tlcikpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE11bHRpcGFydFNtcyhzVHJhY2tlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM3Miw3ICszNzMsNyBAQAogICAgICAgICAgICAgaWYgKG1TVHJhY2tlcnMuaXNFbXB0eSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXRlc3Qgb25lLgogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSAoU21zVHJhY2tlciltU1RyYWNrZXJzLnJlbW92ZShtU1RyYWNrZXJzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICBTbXNUcmFja2VyIHNUcmFja2VyID0gbVNUcmFja2Vycy5yZW1vdmUobVNUcmFja2Vycy5zaXplKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgc1RyYWNrZXIubVNlbnRJbnRlbnQuc2VuZChSRVNVTFRfRVJST1JfTElNSVRfRVhDRUVERUQpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGVkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCB0byBzZW5kIGJhY2sgUkVTVUxUX0VSUk9SX0xJTUlUX0VYQ0VFREVEIik7CkBAIC02NzksNyArNjgwLDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdFBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC02ODksNyArNjkwLDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC03MDYsNyArNzA3LDcgQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTc0Miw3ICs3NDMsNyBAQAogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpAQCAtNzU4LDE3ICs3NTksMTcgQEAKICAgICAgKiBTZW5kIGEgU01TCiAgICAgICoKICAgICAgKiBAcGFyYW0gc21zYyB0aGUgU01TQyB0byBzZW5kIHRoZSBtZXNzYWdlIHRocm91Z2gsIG9yIE5VTEwgZm9yIHRoZQotICAgICAqICBkZWZhdHVsdCBTTVNDCisgICAgICogIGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSBwZHUgdGhlIHJhdyBQRFUgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+SW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczoKICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX05VTExfUERVPC9jb2RlPi4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+SW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtOTM3LDE0ICs5MzgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk1Myw3ICs5NTQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2lwUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDgxZTE1MWUuLjEyMjlkMTQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CkBAIC05NCwxNSArOTUsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyB1c2UgYXBuVHlwZSBhcyB0aGUga2V5IHRvIHdoaWNoIGNvbm5lY3Rpb24gd2UncmUgdGFsa2luZyBhYm91dC4KKyAgICAgICAgLy8gcGFzcyBhcG5UeXBlIGJhY2sgdXAgdG8gZmV0Y2ggcGFydGljdWxhciBmb3IgdGhpcyBvbmUuCiAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldHdvcmtQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIG5ldHdvcmtQcm9wZXJ0aWVzID0gc2VuZGVyLmdldE5ldHdvcmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSwgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG5UeXBlcygpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0SW50ZXJmYWNlTmFtZShudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgYXBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya1Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICgodGVsZXBob255IT1udWxsKSA/IHRlbGVwaG9ueS5nZXROZXR3b3JrVHlwZSgpIDoKICAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTikpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKQEAgLTExMCw5ICsxMjgsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IDI3ZWFlMjIuLjBjM2M1MzQgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MDksMTQgKzUwOSw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MDcsNyArNTk5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjE5LDYgKzYxMSw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODcyLDI2ICs4NjYsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTg1LDYgKzExNTksMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi44YTNhZjNiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC01Myw2ICs1Myw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJldHJ5TWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKIAoraW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zMDUsOSArMzA2LDQwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJiBtTWFzdGVyRGF0YUVuYWJsZWQ7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IHBzU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgIWdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKHBzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKKyAgICAgICAgICAgICAgICAocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZIHx8CisgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8CisgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSkgJiYKKyAgICAgICAgICAgICAgICAhcm9hbWluZyAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlICYmCisgICAgICAgICAgICAgICAgIW1QZW5kaW5nUmVzdGFydFJhZGlvICYmCisgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAocHNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBwc1N0YXRlPSAiICsgcHNTdGF0ZTsKKyAgICAgICAgICAgIGlmIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICE9IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gcmFkaW9TdGF0ZT0gIiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKyAiIC0gUlVJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBjb25jdXJyZW50Vm9pY2VBbmREYXRhIG5vdCBhbGxvd2VkIGFuZCBzdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9hbWluZykgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgaWYgKG1QZW5kaW5nUmVzdGFydFJhZGlvKSByZWFzb24gKz0gIiAtIG1QZW5kaW5nUmVzdGFydFJhZGlvPSB0cnVlIjsKKyAgICAgICAgICAgIGlmIChtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKSByZWFzb24gKz0gIiAtIG5lZWRzIFByb3Zpc2lvbmluZyI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CkBAIC0zMTcsNyArMzQ5LDggQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHRydWUpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMyNywzNiArMzYwLDEzIEBACiAgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkKLSAgICAgICAgICAgICAgICAmJiAoKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgPT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkKLSAgICAgICAgICAgICAgICAmJiAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgKQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlCi0gICAgICAgICAgICAgICAgJiYgIW1QZW5kaW5nUmVzdGFydFJhZGlvCi0gICAgICAgICAgICAgICAgJiYgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOwotCisgICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgeworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQUyBzdGF0ZT0iICsgcHNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgcmFkaW8gc3RhdGU9IiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJ1aW09IiArIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgY29uY3VycmVudFZvaWNlJkRhdGE9IiArIG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHJvYW1pbmcgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgUGVuZGluZ1Jlc3RhcnRSYWRpbz0iICsgbVBlbmRpbmdSZXN0YXJ0UmFkaW8gKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQgKwotICAgICAgICAgICAgICAgICAgICAiIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZz0iICsgbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zODIsNiArMzkyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkRJU0NPTk5FQ1RJTkcpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CiAKICAgICAgICAgYm9vbGVhbiBub3RpZmljYXRpb25EZWZlcnJlZCA9IGZhbHNlOwogICAgICAgICBmb3IgKERhdGFDb25uZWN0aW9uIGNvbm4gOiBkYXRhQ29ubmVjdGlvbkxpc3QpIHsKQEAgLTQ0MCwxMyArNDUxLDEzIEBACiAgICAgICAgIGNvbm4uY29ubmVjdChtc2csIG1BY3RpdmVBcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICB9CkBAIC02MjIsMTIgKzYzMywxMyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU5vRGF0YShGYWlsQ2F1c2UgbGFzdEZhaWxDYXVzZUNvZGUpIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRkFJTEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC02ODcsMTEgKzY5OSwxMyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CiAKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKKwogICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgbnVsbCk7CiAgICAgICAgIH0KQEAgLTcyMyw2ICs3MzcsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMgPSBtYWtlTmV0d29ya1Byb3BlcnRpZXMobUFjdGl2ZURhdGFDb25uZWN0aW9uKTsKKwogICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBzZXR1cAogICAgICAgICAgICAgbm90aWZ5RGVmYXVsdERhdGEocmVhc29uKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTc2Miw3ICs3NzgsNyBAQAogICAgICAgICAgICAgb25SZXN0YXJ0UmFkaW8oKTsKICAgICAgICAgfQogCi0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgdHJ5U2V0dXBEYXRhKHJlYXNvbik7CkBAIC03ODksNyArODA1LDggQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvblZvaWNlQ2FsbFN0YXJ0ZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgJiYgIW1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODAwLDExICs4MTcsMTIgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOworICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYW4gc2xhdGUgYWZ0ZXIgY2FsbCBlbmQuCiAgICAgICAgICAgICAgICAgcmVzZXRQb2xsU3RhdHMoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgICAgICAgICAgLy8gaW4gY2FzZSBkYXRhIHNldHVwIHdhcyBhdHRlbXB0ZWQgd2hlbiB3ZSB3ZXJlIG9uIGEgdm9pY2UgY2FsbApAQCAtODM4LDcgKzg1Niw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG9uQ2RtYURhdGFEZXRhY2hlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbihmYWxzZSwgUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBlZDkzYWVhLi4xYjA4YWVkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKQEAgLTUxLDcgKzUxLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS5sYW5nLkJvb2xlYW47CiAKIAogZmluYWwgY2xhc3MgQ2RtYVNNU0Rpc3BhdGNoZXIgZXh0ZW5kcyBTTVNEaXNwYXRjaGVyIHsKQEAgLTc1LDYgKzc0LDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTdGF0dXNSZXBvcnQgaXMgYSBzcGVjaWFsIEdTTSBmdW5jdGlvbiwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBDRE1BISIpOwogICAgIH0KQEAgLTk3LDYgKzk3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTE3Niw3ICsxNzcsNyBAQAogICAgICAgICAgKiBUT0RPKGNsZWFudXApOiBXaHkgYXJlIHdlIHVzaW5nIGEgZ2V0dGVyIG1ldGhvZCBmb3IgdGhpcwogICAgICAgICAgKiAoYW5kIGZvciBzbyBtYW55IG90aGVyIHNtcyBmaWVsZHMpPyAgVHJpdmlhbCBnZXR0ZXJzIGFuZAogICAgICAgICAgKiBzZXR0ZXJzIGxpa2UgdGhpcyBhcmUgZGlyZWN0IHZpb2xhdGlvbnMgb2YgdGhlIHN0eWxlIGd1aWRlLgotICAgICAgICAgKiBJZiB0aGUgcHVycG9zZSBpcyB0byBwcm90ZWN0IGFnYWlzdCB3cml0ZXMgKGJ5IG5vdAorICAgICAgICAgKiBJZiB0aGUgcHVycG9zZSBpcyB0byBwcm90ZWN0IGFnYWluc3Qgd3JpdGVzIChieSBub3QKICAgICAgICAgICogcHJvdmlkaW5nIGEgc2V0dGVyKSB0aGVuIGFueSBwcm90ZWN0aW9uIGlzIGlsbHVzb3J5IChhbmQKICAgICAgICAgICogaGVuY2UgYmFkKSBmb3IgY2FzZXMgd2hlcmUgdGhlIHZhbHVlcyBhcmUgbm90IHByaW1pdGl2ZXMsCiAgICAgICAgICAqIHN1Y2ggYXMgdGhpcyBjYWxsIGZvciB0aGUgaGVhZGVyLiAgU2luY2UgdGhpcyBpcyBhbiBpc3N1ZQpAQCAtMzQwLDYgKzM0MSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNDgsNiArMzUwLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNTYsNiArMzU5LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zNjQsNyArMzY4LDcgQEAKICAgICAgICAgICogVE9ETyhjbGVhbnVwKTogVGhlcmUgaXMgbm8gcmVhbCBjb2RlIGRpZmZlcmVuY2UgYmV0d2VlbgogICAgICAgICAgKiB0aGlzIGFuZCB0aGUgR1NNIHZlcnNpb24sIGFuZCBoZW5jZSBpdCBzaG91bGQgYmUgbW92ZWQgdG8KICAgICAgICAgICogdGhlIGJhc2UgY2xhc3Mgb3IgY29uc29saWRhdGVkIHNvbWVob3csIHByb3ZpZGVkIGNhbGxpbmcKLSAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXRwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgorICAgICAgICAgKiB0aGUgcHJvcGVyIHN1Ym1pdCBwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgogICAgICAgICAgKi8KIAogICAgICAgICBpbnQgcmVmTnVtYmVyID0gZ2V0TmV4dENvbmNhdGVuYXRlZFJlZigpICYgMHgwMEZGOwpAQCAtNDM3LDggKzQ0MSw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTQ0OSwxMSArNDU0LDEzIEBACiAgICAgfQogCiAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRPRE86IENkbWFTTVNEaXNwYXRjaGVyLnNlbmRNdWx0aXBhcnRTbXMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogCkBAIC00NzQsMTYgKzQ4MSwxOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdEFjdGl2YXRpb24oKGFjdGl2YXRlID09IDApLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLmdldENkbWFCcm9hZGNhc3RDb25maWcocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDJjYWQ2Y2MuLjVkNGRjNTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTExOSw3ICsxMTE5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkIHx8IGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IGNmY2ZkOTguLmE5ZGYzNzUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNjcsOCArNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zICA9IChMaXN0PFNtc1Jhd0RhdGE+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbXMgPSBidWlsZFZhbGlkUmF3RGF0YSgoQXJyYXlMaXN0PGJ5dGVbXT4pIGFyLnJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERCRykgbG9nKCJDYW5ub3QgbG9hZCBTbXMgcmVjb3JkcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU21zICE9IG51bGwpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKaW5kZXggYjUwNTAyYy4uNjVkODdmNSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpAQCAtMTgsMTEgKzE4LDggQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKQEAgLTMzLDcgKzMwLDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTU4LDcgKzU0LDcgQEAKIC8qKgogICogVE9ETyhjbGVhbnVwKTogaW50ZXJuYWxseSByZXR1cm5pbmcgbnVsbCBpbiBtYW55IHBsYWNlcyBtYWtlcwogICogZGVidWdnaW5nIHZlcnkgaGFyZCAoYW1vbmcgbWFueSBvdGhlciByZWFzb25zKSBhbmQgc2hvdWxkIGJlIG1hZGUKLSAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGVjcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKKyAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGNlcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKICAqIHJldHVybnMgc2hvdWxkIG9ubHkgb2NjdXIgYXQgdGhlIHZlcnkgb3V0c2lkZSBvZiB0aGUgbW9kdWxlL2NsYXNzCiAgKiBzY29wZS4KICAqLwpAQCAtMjg3LDcgKzI4Myw3IEBACiAgICAgICogQHBhcmFtIGRlc3RBZGRyICAgICAgICAgICAgICBBZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgcGF5bG9hZC4KICAgICAgKiBAcGFyYW0gc3RhdHVzUmVwb3J0UmVxdWVzdGVkIEluZGljYXRlcyB3aGV0aGVyIGEgcmVwb3J0IGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBoZWFkZXJEYXRhICAgICAgICAgICAgQXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIFVzZXIgRGF0YSBIZWFkZXIsIHByZWNlZGVkCisgICAgICogQHBhcmFtIHNtc0hlYWRlciAgICAgICAgICAgICBBcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgVXNlciBEYXRhIEhlYWRlciwgcHJlY2VkZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBFbGVtZW50IElkZW50aWZpZXJzLgogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgpAQCAtMzU1LDcgKzM1MSw3IEBACiAgICAgICogR2V0IGFuIFNNUy1TVUJNSVQgUERVIGZvciBhIGRhdGEgbWVzc2FnZSB0byBhIGRlc3RpbmF0aW9uIGFkZHJlc3MgJmFtcDsgcG9ydAogICAgICAqCiAgICAgICogQHBhcmFtIGRlc3RBZGRyIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXNlckRhcmEgdGhlIGRhdGEgZm9yIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIHVzZXJEYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBzdGF0dXNSZXBvcnRSZXF1ZXN0ZWQgSW5kaWNhdGVzIHdoZXRoZXIgYSByZXBvcnQgaXMgcmVxdWVzdGVkIGZvciB0aGlzIG1lc3NhZ2UuCiAgICAgICogQHJldHVybiBhIDxjb2RlPlN1Ym1pdFBkdTwvY29kZT4gY29udGFpbmluZyB0aGUgZW5jb2RlZCBTQwogICAgICAqICAgICAgICAgYWRkcmVzcywgaWYgYXBwbGljYWJsZSwgYW5kIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCkBAIC02MTQsNyArNjEwLDcgQEAKICAgICAgKiBpbmNyZW1lbnRpbmcgd2l0aGluIHRoZSByYW5nZSAxLi42NTUzNSByZW1lbWJlcmluZyB0aGUgc3RhdGUKICAgICAgKiB2aWEgYSBwZXJzaXN0ZW50IHN5c3RlbSBwcm9wZXJ0eS4gIChTZWUgQy5TMDAxNS1CLCB2Mi4wLAogICAgICAqIDQuMy4xLjUpIFNpbmNlIHRoaXMgcm91dGluZSBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NlZCB2aWEgdmlhCi0gICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkc2FmZSwgaXQgaGFzIGJlZW4KKyAgICAgKiBiaW5kZXItY2FsbCwgYW5kIGhlbmNlIHNob3VsZCBiZSB0aHJlYWQtc2FmZSwgaXQgaGFzIGJlZW4KICAgICAgKiBzeW5jaHJvbml6ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGludCBnZXROZXh0TWVzc2FnZUlkKCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKaW5kZXggYzcwMzJhYy4uZTlmZWE1NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIApAQCAtMzAsMTAgKzI5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZU91dHB1dFN0cmVhbTsKIApAQCAtNDUsMTMgKzQyLDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiU01TIjsKIAogICAgIC8qKgotICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJbmRlbnRpZmllcnMKKyAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSWRlbnRpZmllcnMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIuMCwgdGFibGUgNC41LTEpCiAgICAgICogTk9URTogQ29tbWVudGVkIHN1YnBhcmFtZXRlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSICAgICAgICAgICAgICAgPSAweDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREUgICAgICAgICAgICAgICAgPSAweDAyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgPSAweDAyOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9DRU5URVJfVElNRV9TVEFNUCAgICAgICAgPSAweDAzOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX0FCU09MVVRFICAgICAgICAgPSAweDA0OwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX1JFTEFUSVZFICAgICAgICAgPSAweDA1OwpAQCAtNDA1LDcgKzQwMiw3IEBACiAgICAgLyoqCiAgICAgICogQ2FsY3VsYXRlIHRoZSBtZXNzYWdlIHRleHQgZW5jb2RpbmcgbGVuZ3RoLCBmcmFnbWVudGF0aW9uLCBhbmQgb3RoZXIgZGV0YWlscy4KICAgICAgKgotICAgICAqIEBwYXJhbSBmb3JjZSBpZ25vcmUgKGJ1dCBzdGlsbCBjb3VudCkgaWxsZWdhbCBjaGFyYWN0ZXJzIGlmIHRydWUKKyAgICAgKiBAcGFyYW0gZm9yY2U3Qml0RW5jb2RpbmcgaWdub3JlIChidXQgc3RpbGwgY291bnQpIGlsbGVnYWwgY2hhcmFjdGVycyBpZiB0cnVlCiAgICAgICogQHJldHVybiBzZXB0ZXQgY291bnQsIG9yIC0xIG9uIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRleHRFbmNvZGluZ0RldGFpbHMgY2FsY1RleHRFbmNvZGluZ0RldGFpbHMoQ2hhclNlcXVlbmNlIG1zZywKQEAgLTY5NSw3ICs2OTIsNyBAQAogICAgIC8qCiAgICAgICogVE9ETyhjbGVhbnVwKTogQ2RtYVNtc0FkZHJlc3MgZW5jb2Rpbmcgc2hvdWxkIG1ha2UgdXNlIG9mCiAgICAgICogQ2RtYVNtc0FkZHJlc3MucGFyc2UgcHJvdmlkZWQgdGhhdCBEVE1GIGVuY29kaW5nIGlzIHVuaWZpZWQsCi0gICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDRiaXQgdnMgOGJpdCBpcyByZXNvbHZlZC4KKyAgICAgKiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gNC1iaXQgdnMuIDgtYml0IGlzIHJlc29sdmVkLgogICAgICAqLwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGVDZG1hU21zQWRkcmVzcyhDZG1hU21zQWRkcmVzcyBhZGRyKSB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uIHsKQEAgLTgwMiw5ICs3OTksOSBAQAogICAgICAqIENyZWF0ZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIGZvciBCZWFyZXJEYXRhIG9iamVjdC4KICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCi0gICAgICogQHBhcmFtIGJlYXJlckRhdGEgYW4gaW5zdGFuY2Ugb2YgQmVhcmVyRGF0YS4KKyAgICAgKiBAcGFyYW0gYkRhdGEgYW4gaW5zdGFuY2Ugb2YgQmVhcmVyRGF0YS4KICAgICAgKgotICAgICAqIEByZXR1cm4gZGF0YSBieXRhIGFycmF5IG9mIHJhdyBlbmNvZGVkIFNNUyBiZWFyZXIgZGF0YS4KKyAgICAgKiBAcmV0dXJuIGRhdGEgYnl0ZSBhcnJheSBvZiByYXcgZW5jb2RlZCBTTVMgYmVhcmVyIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKEJlYXJlckRhdGEgYkRhdGEpIHsKICAgICAgICAgYkRhdGEuaGFzVXNlckRhdGFIZWFkZXIgPSAoKGJEYXRhLnVzZXJEYXRhICE9IG51bGwpICYmCkBAIC05MTQsNyArOTExLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXRmMTYoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwogICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKICAgICAgICAgdHJ5IHsKQEAgLTk2MCw3ICs5NTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGU3Yml0R3NtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgb2Zmc2V0Qml0cyA9IG9mZnNldCAqIDg7CiAgICAgICAgIGludCBvZmZzZXRTZXB0ZXRzID0gKG9mZnNldEJpdHMgKyA2KSAvIDc7CiAgICAgICAgIG51bUZpZWxkcyAtPSBvZmZzZXRTZXB0ZXRzOwpAQCAtMTU1Myw3ICsxNTUwLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfREFUQToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJEYXRhKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREU6CisgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREU6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyUmVzcG9uc2VDb2RlKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fUkVQTFlfT1BUSU9OOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQppbmRleCAwZGNhY2MxLi5hNjczMjdhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXM7CiAKIAotcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BleworcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BlIHsKICAgICAvKioKICAgICAgKiBNZXNzYWdlIFR5cGVzCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIgMy40LjEpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKaW5kZXggNjlhN2E1Ny4uMmFlNWEzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgIHJldHVybiBtUGVuZGluZ01NSXM7CiAgICAgfQogCi0gICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBEYXRhU3RhdGUgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKIAogICAgICAgICBpZiAobVNTVCA9PSBudWxsKSB7CkBAIC0zMDQsNiArMzA0LDggQEAKICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG91dCBvZiBzZXJ2aWNlLCBvcGVuIFRDUCBzb2NrZXRzIG1heSBzdGlsbCB3b3JrCiAgICAgICAgICAgICAvLyBidXQgbm8gZGF0YSB3aWxsIGZsb3cKICAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0aW9uLmlzQXBuVHlwZUVuYWJsZWQoYXBuVHlwZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSB7IC8qIG1TU1QuZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICovCiAgICAgICAgICAgICBzd2l0Y2ggKG1EYXRhQ29ubmVjdGlvbi5nZXRTdGF0ZSgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBGQUlMRUQ6CkBAIC00MDUsOCArNDA3LDggQEAKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCi0gICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uKTsKKyAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCkBAIC0xMDk1LDI3ICsxMDk3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSByb2FtaW5nIGlzIGRpc2FsbG93ZWQgYW5kIHdlIGFyZSByb2FtaW5nLjwvbGk+Ci0gICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KLSAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgewotICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHkgY2hlY2tzIGlmIGFueSBHUFJTIGNvbm5lY3Rpb24gaXMgYWN0aXZlLiBTaG91bGQgaXQgb25seQotICAgICAgICAvLyBjaGVjayBmb3IgImRlZmF1bHQiPwotICAgICAgICBib29sZWFuIG5vRGF0YSA9IG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhRW5hYmxlZCgpICYmCi0gICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gU2ltQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcwogICAgICAqIHJlZ2lzdHJhbnRzIHRoYXQgaXQgaXMgY29tcGxldGUuCiAgICAgICogQHBhcmFtIG1taSBNTUkgdGhhdCBpcyBkb25lCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCBmNmQ0NDkxLi5jNzZkYTgwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTMwLDYgKzMwLDggQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5UcmFmZmljU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CkBAIC01OCw2ICs2MCw5IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uLkZhaWxDYXVzZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTM4OCwxMiArMzkzLDYgQEAKICAgICAgICAgcmV0dXJuIHBkcHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCi0gICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkOwotICAgIH0KLQogICAgIC8vKioqKioqIENhbGxlZCBmcm9tIFNlcnZpY2VTdGF0ZVRyYWNrZXIKICAgICAvKioKICAgICAgKiBJbnZva2VkIHdoZW4gU2VydmljZVN0YXRlVHJhY2tlciBvYnNlcnZlcyBhIHRyYW5zaXRpb24gZnJvbSBHUFJTCkBAIC00MDUsMTMgKzQwNCwxMyBAQAogICAgICAgICAgKiB3aGVuIEdQUlMgZGV0YWNoZXMsIGJ1dCB3ZSBzaG91bGQgc3RvcCB0aGUgbmV0d29yayBwb2xsaW5nLgogICAgICAgICAgKi8KICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvbkdwcnNBdHRhY2hlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CkBAIC00MjEsNiArNDIwLDM1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAoKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpICYmCisgICAgICAgICAgICAgICAgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSAmJgorICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICghcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCisgICAgICAgICAgICAgICAgIW1Jc1BzUmVzdHJpY3RlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlKTsKKyAgICAgICAgaWYgKCFhbGxvd2VkICYmIERCRykgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOworICAgICAgICAgICAgaWYgKGdwcnNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBncHJzPSAiICsgZ3Byc1N0YXRlOworICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSByZWFzb24gKz0gIiAtIFNJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFBob25lU3RhdGU9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc1BzUmVzdHJpY3RlZCkgcmVhc29uICs9ICIgLSBtSXNQc1Jlc3RyaWN0ZWQ9IHRydWUiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBhbGxvd2VkIGR1ZSB0byIgKyByZWFzb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coIioqKnRyeVNldHVwRGF0YSBkdWUgdG8gIiArIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCkBAIC00MzAsNyArNDU4LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIihmaXg/KSBXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC00MzksMTkgKzQ2NywxNSBAQAogICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKIAotICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpCi0gICAgICAgICAgICAgICAgJiYgKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpCi0gICAgICAgICAgICAgICAgJiYgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKQotICAgICAgICAgICAgICAgICYmIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmICFtSXNQc1Jlc3RyaWN0ZWQKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkUG93ZXJTdGF0ZSApIHsKKyAgICAgICAgaWYgKCgoc3RhdGUgPT0gU3RhdGUuSURMRSkgfHwgKHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSkgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgewogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgICAgIHdhaXRpbmdBcG5zID0gYnVpbGRXYWl0aW5nQXBucygpOwogICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nQXBucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJObyBBUE4gZm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKEdzbURhdGFDb25uZWN0aW9uLkZhaWxDYXVzZS5NSVNTSU5HX1VOS05PV05fQVBOKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbG9nICgiQ3JlYXRlIGZyb20gYWxsQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcoYWxsQXBucykpOwpAQCAtNDYxLDIyICs0ODUsMTEgQEAKICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICBsb2cgKCJTZXR1cCB3YWl0bmdBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyh3YWl0aW5nQXBucykpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBncHJzU3RhdGU9IiArIGdwcnNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgc2ltPSIgKyBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBVTVRTPSIgKyBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgaXNEYXRhQWxsb3dlZD0iICsgaXNEYXRhQWxsb3dlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhT25Sb2FtaW5nRW5hYmxlPSIgKyBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwcyByZXN0cmljdGVkPSIgKyBtSXNQc1Jlc3RyaWN0ZWQgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCk7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC01OTUsNyArNjA4LDcgQEAKICAgICAgICAgcGRwLmNvbm5lY3QobXNnLCBhcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTc0Niw3ICs3NTksNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwogICAgICAgICAvLyByZXNldCByZWNvbm5lY3QgdGltZXIKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwpAQCAtNzU2LDcgKzc2OSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coImdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb246IHJlYXNvbj0iICsgcmVhc29uKTsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgIH0KIApAQCAtOTk4LDcgKzEwMTEsNyBAQAogICAgICAgICAgICAgaWYgKCFtUmV0cnlNZ3IuaXNSZXRyeU5lZWRlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSByZXRyaWVzIG9uIGEgc2Vjb25kYXJ5IEFQTiBhdHRlbXB0LCB0ZWxsIHRoZSB3b3JsZCBhbmQgcmV2ZXJ0LgotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDkxLDcgKzExMDQsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CkBAIC0xMTI1LDYgKzExMzgsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gbWFrZU5ldHdvcmtQcm9wZXJ0aWVzKG1BY3RpdmVQZHApOworCisgICAgICAgICAgICBBcG5TZXR0aW5nIGFwbiA9IG1BY3RpdmVQZHAuZ2V0QXBuKCk7CisgICAgICAgICAgICBpZiAoYXBuLnByb3h5ICE9IG51bGwgJiYgYXBuLnByb3h5Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHkgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFwbi5wcm94eSkpOworICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRQb3J0KEludGVnZXIucGFyc2VJbnQoYXBuLnBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShwcm94eSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93bkhvc3RFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlY3VyaXR5RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXM6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXMgKCIgKyBhcG4ucG9ydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgiZ3NtLmRlZmF1bHRwZHBjb250ZXh0LmFjdGl2ZSIsICJ0cnVlIik7CkBAIC0xMTU4LDcgKzExOTAsNyBAQAogICAgICAgICAgICAgaWYgKGNhdXNlLmlzUGVybWFuZW50RmFpbCgpKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKGNhdXNlKTsKICAgICAgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRBcG5UeXBlLmVxdWFscyhQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTExODgsNyArMTIyMCw3IEBACiAgICAgICAgICAgIHJlYXNvbiA9IChTdHJpbmcpIGFyLnVzZXJPYmo7CiAgICAgICAgIH0KICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTEyMTksNyArMTI1MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICEgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIyNyw3ICsxMjU5LDcgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBkNzIwNTE2Li5mMDlmZjA2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIFN0cmluZyBwZHVTdHJpbmcgPSAoU3RyaW5nKSBhci5yZXN1bHQ7CiAgICAgICAgIFNtc01lc3NhZ2Ugc21zID0gU21zTWVzc2FnZS5uZXdGcm9tQ0RTKHBkdVN0cmluZyk7CkBAIC04NSw2ICs4Niw3IEBACiAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMTUyLDYgKzE1NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjAsNiArMTYzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjgsNiArMTcyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MsIFN0cmluZyBzY0FkZHJlc3MsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzA3LDggKzMxMiw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTMyMywxMiArMzI5LDEzIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdHJhY2tlciBob2xkcyB0aGUgbXVsdGlwYXJ0IFNtcyB0cmFja2VyIHJlYWR5IHRvIGJlIHNlbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50czsKIAotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoImRlc3RpbmF0aW9uIik7CiAgICAgICAgIFN0cmluZyBzY0FkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJzY2FkZHJlc3MiKTsKQEAgLTM0Myw2ICszNTAsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKICAgICAgICAgaWYgKG1DbSAhPSBudWxsKSB7CkBAIC0zNTEsNiArMzU5LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM1OCw2ICszNjcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM2NSw2ICszNzUsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkICB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggOTBlY2JkNy4uYjYzOWVlYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTEwMTgsNyArMTAxOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBkbyB3ZSByZWFsbHkgd2FudCB0aGlzPworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDIwMjhjYTQuLmYwMDBkNzkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC04Niw2ICs4Niw3IEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CkBAIC0xOTEsNiArMTkyLDcgQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCmluZGV4IDRmZDYyZmIuLjI3OGUxYmEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtNDUsNyArNDQsNyBAQAogICogQSBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgbWVzc2FnZS4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2V7CitwdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKIAogICAgIHByaXZhdGUgTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzczsKQEAgLTMxMSw3ICszMTAsNyBAQAogICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyJ3MgU0lNIGNhcmQuIFlvdSBjYW4gdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHlvdXJzZWxmCiAgICAgICAgICAgICAvLyAob24gYSBwaG9uZSB3aXRoIHRoaXMgY2hhbmdlKSBhbmQgdGhleSdsbCBlbmQgdXAgb24gdGhlIFNJTSBjYXJkLgogICAgICAgICAgICAgYm8ud3JpdGUoMHgwMCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vYXNzdW1lIFVDUy0yCisgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZSBVQ1MtMgogICAgICAgICAgICAgaWYgKCgweGZmICYgdXNlckRhdGFbMF0pID4gTUFYX1VTRVJfREFUQV9CWVRFUykgewogICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgdG9vIGxvbmcKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM3Nyw3ICszNzYsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhdCB0aGUKICAgICAgKiAgICAgICAgZGVzdGluYXRpb24KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0IGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgogICAgICAqICAgICAgICAgUmV0dXJucyBudWxsIG9uIGVuY29kZSBlcnJvci4KQEAgLTQ4Miw3ICs0ODEsNyBAQAogICAgICAgICByZXR1cm4gYm87CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKICAgICAgICAgYnl0ZSBwZHVbXTsKICAgICAgICAgaW50IGN1cjsKICAgICAgICAgU21zSGVhZGVyIHVzZXJEYXRhSGVhZGVyOwpAQCAtNDkwLDEwICs0ODksNiBAQAogICAgICAgICBpbnQgbVVzZXJEYXRhU2VwdGV0UGFkZGluZzsKICAgICAgICAgaW50IG1Vc2VyRGF0YVNpemU7CiAKLSAgICAgICAgUGR1UGFyc2VyKFN0cmluZyBzKSB7Ci0gICAgICAgICAgICB0aGlzKEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMocykpOwotICAgICAgICB9Ci0KICAgICAgICAgUGR1UGFyc2VyKGJ5dGVbXSBwZHUpIHsKICAgICAgICAgICAgIHRoaXMucGR1ID0gcGR1OwogICAgICAgICAgICAgY3VyID0gMDsKQEAgLTU0NSw3ICs1NDAsNyBAQAogICAgICAgICAgICAgR3NtU21zQWRkcmVzcyByZXQ7CiAKICAgICAgICAgICAgIC8vICJUaGUgQWRkcmVzcy1MZW5ndGggZmllbGQgaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaSBvY3RldCBjb250YWluaW5nIG9ubHkKKyAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWktb2N0ZXQgY29udGFpbmluZyBvbmx5CiAgICAgICAgICAgICAvLyBmaWxsIGJpdHMuIgogICAgICAgICAgICAgLy8gVGhlIFRPQSBmaWVsZCBpcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGlzCiAgICAgICAgICAgICBpbnQgYWRkcmVzc0xlbmd0aCA9IHBkdVtjdXJdICYgMHhmZjsKQEAgLTU3Myw3ICs1NjgsNyBAQAogICAgICAgICAgICAgaW50IHNlY29uZCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbY3VyKytdKTsKIAogICAgICAgICAgICAgLy8gRm9yIHRoZSB0aW1lem9uZSwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZQotICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQorICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKICAgICAgICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAogICAgICAgICAgICAgLy8gd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCkKIApAQCAtNjMyLDcgKzYyNyw3IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBIZXJlIHdlIGp1c3QgY3JlYXRlIHRoZSB1c2VyIGRhdGEgbGVuZ3RoIHRvIGJlIHRoZSByZW1haW5kZXIgb2YKICAgICAgICAgICAgICAgICAgKiB0aGUgcGR1IG1pbnVzIHRoZSB1c2VyIGRhdGEgaGVhZGVyLCBzaW5jZSB1c2VyRGF0YUxlbmd0aCBtZWFucwotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcGV0cy4KKyAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXB0ZXRzLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGJ1ZmZlckxlbiA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjcxLDEwICs2NjYsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMuCiAgICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cwogICAgICAgICAgKi8KICAgICAgICAgaW50IGdldFVzZXJEYXRhU2VwdGV0UGFkZGluZygpIHsKQEAgLTY5NCw3ICs2ODksNyBAQAogICAgICAgICBYWFggTm90IHN1cmUgd2hhdCB0aGlzIG9uZSBpcyBzdXBwb3NlZCB0byBiZSBkb2luZywgYW5kIG5vIG9uZSBpcyB1c2luZwogICAgICAgICBpdC4KICAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhR1NNOGJpdCgpIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHB1ZDoiICsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHBkdToiICsKICAgICAgICAgICAgIC8vIEhleER1bXAuZHVtcEhleFN0cmluZyhwZHUsIGN1ciwgcGR1Lmxlbmd0aCAtIGN1cikpOwogICAgICAgICAgICAgaW50IGNvdW50ID0gcGR1W2N1cisrXSAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IHBkdVtjdXIrK107CkBAIC04MjUsMTEgKzgyMCwxMyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcm90b2NvbElkZW50aWZpZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm90b2NvbElkZW50aWZpZXI7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2UoKSB7CiAgICAgICAgIHJldHVybiAocHJvdG9jb2xJZGVudGlmaWVyICYgMHhjMCkgPT0gMHg0MAogICAgICAgICAgICAgICAgICYmIChwcm90b2NvbElkZW50aWZpZXIgJiAweDNmKSA+IDAKQEAgLTgzNywxMiArODM0LDE0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NwaHNNd2lNZXNzYWdlKCkgewogICAgICAgICByZXR1cm4gKChHc21TbXNBZGRyZXNzKSBvcmlnaW5hdGluZ0FkZHJlc3MpLmlzQ3Boc1ZvaWNlTWVzc2FnZUNsZWFyKCkKICAgICAgICAgICAgICAgICB8fCAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlU2V0KCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSUNsZWFyTWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODUzLDYgKzg1Miw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSVNldE1lc3NhZ2UoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiAobXdpU2Vuc2UgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODYzLDYgKzg2Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc013aURvbnRTdG9yZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIG13aURvbnRTdG9yZSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04ODIsMzEgKzg4MywzNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2U7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGx5UGF0aFByZXNlbnQoKSB7CiAgICAgICAgIHJldHVybiByZXBseVBhdGhQcmVzZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRTIDI3LjAwNSAzLjEsIDxwZHU+IGRlZmluaXRpb24gIkluIHRoZSBjYXNlIG9mIFNNUzogM0dQUCBUUyAyNC4wMTEgWzZdCisgICAgICogVFMgMjcuMDA1IDMuMSwgJmx0O3BkdSZndDsgZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KICAgICAgKiBTQyBhZGRyZXNzIGZvbGxvd2VkIGJ5IDNHUFAgVFMgMjMuMDQwIFszXSBUUERVIGluIGhleGFkZWNpbWFsIGZvcm1hdDoKICAgICAgKiBNRS9UQSBjb252ZXJ0cyBlYWNoIG9jdGV0IG9mIFRQIGRhdGEgdW5pdCBpbnRvIHR3byBJUkEgY2hhcmFjdGVyIGxvbmcKLSAgICAgKiBoZXhhZCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KKyAgICAgKiBoZXggbnVtYmVyIChlLmcuIG9jdGV0IHdpdGggaW50ZWdlciB2YWx1ZSA0MiBpcyBwcmVzZW50ZWQgdG8gVEUgYXMgdHdvCiAgICAgICogY2hhcmFjdGVycyAyQSAoSVJBIDUwIGFuZCA2NSkpIiAuLi5pbiB0aGUgY2FzZSBvZiBjZWxsIGJyb2FkY2FzdCwKICAgICAgKiBzb21ldGhpbmcgZWxzZS4uLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwYXJzZVBkdShieXRlW10gcGR1KSB7CiAgICAgICAgIG1QZHUgPSBwZHU7Ci0gICAgICAgIC8vIExvZy5kKExPR19UQUcsICJyYXcgc21zIG1lc2FnZToiKTsKKyAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzc2FnZToiKTsKICAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgcyk7CiAKICAgICAgICAgUGR1UGFyc2VyIHAgPSBuZXcgUGR1UGFyc2VyKHBkdSk7CkBAIC0xMTYwLDYgKzExNjQsNyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZUNsYXNzIGdldE1lc3NhZ2VDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2VDbGFzczsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKaW5kZXggYjY0MjU0MS4uNDFmM2IyMyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVCYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCmluZGV4IGQ0OGY5NGEuLmFkMDViODIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKQEAgLTIzNiwxMSArMjM2LDkgQEAKICAgICAgICAgcmV0dXJuIENvbm5lY3Rpb24uUFJFU0VOVEFUSU9OX0FMTE9XRUQ7CiAgICAgfQogCi0gICAgLyoKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewogICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgICovCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKaW5kZXggYTk0NTE4Zi4uYjM1ODE0YyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQpAQCAtNTgsNyArNTgsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVByb3h5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKQEAgLTk4LDYgKzk3LDE0IEBACiAgICAgICAgIC8vICAgICAgICBuZXcgSW50ZWdlcihQaG9uZS5QSE9ORV9UWVBFX0dTTSkudG9TdHJpbmcoKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2lwUGhvbmUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIFNpcFBob25lIHRoYXQgPSAoU2lwUGhvbmUpIG87CisgICAgICAgIHJldHVybiBtUHJvZmlsZS5nZXRVcmlTdHJpbmcoKS5lcXVhbHModGhhdC5tUHJvZmlsZS5nZXRVcmlTdHJpbmcoKSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiBtUHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwogICAgIH0KQEAgLTE2NywxMCArMTc0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcsIFVVU0luZm8gdXVzaW5mbykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwotICAgIH0KLQogICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKFNpcFBob25lLmNsYXNzKSB7CiAgICAgICAgICAgICByZXR1cm4gZGlhbEludGVybmFsKGRpYWxTdHJpbmcpOwpAQCAtNzE3LDEwICs3MjAsNiBAQAogICAgICAgICAgICAgKi8KICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBDYWxsLlN0YXRlIGdldENhbGxTdGF0ZUZyb20oU2lwQXVkaW9DYWxsIHNpcEF1ZGlvQ2FsbCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKaW5kZXggMzZkNjVkYi4uNzIxYjhhZiAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTY1LDcgKzY2LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVQcm94eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwotLy9pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMDIsMTMgKzEwMywxMSBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IENhbGwgZ2V0UmluZ2luZ0NhbGwoKTsKIAotICAgIC8qCiAgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNJbmZvKQogICAgICAgICAgICAgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGlnbm9yZSBVVVNJbmZvCiAgICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwogICAgIH0KLSAgICAqLwogCiAgICAgdm9pZCBtaWdyYXRlRnJvbShTaXBQaG9uZUJhc2UgZnJvbSkgewogICAgICAgICBtaWdyYXRlKG1SaW5nYmFja1JlZ2lzdHJhbnRzLCBmcm9tLm1SaW5nYmFja1JlZ2lzdHJhbnRzKTsKQEAgLTUzOCw2ICs1MzcsMTggQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBTSVAuIik7CiAgICAgfQogCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV0d29ya1Byb3BlcnRpZXMgZ2V0TmV0d29ya1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHZvaWQgdXBkYXRlUGhvbmVTdGF0ZSgpIHsKICAgICAgICAgU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUZhY3RvcnkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVGYWN0b3J5LmphdmEKaW5kZXggNjExZTNlYS4uYTFiZGQyZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUZhY3RvcnkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lRmFjdG9yeS5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgICAgICBTaXBQcm9maWxlIHByb2ZpbGUgPSBuZXcgU2lwUHJvZmlsZS5CdWlsZGVyKHNpcFVyaSkuYnVpbGQoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgU2lwUGhvbmUoY29udGV4dCwgcGhvbmVOb3RpZmllciwgcHJvZmlsZSk7CiAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KCJTaXBQaG9uZUZhY3RvcnkiLCAibWFrZVBob25lIiwgZSk7CisgICAgICAgICAgICBMb2cudygiU2lwUGhvbmVQcm94eSIsICJzZXRQaG9uZSIsIGUpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTI5NjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lUHJveHkuamF2YQpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnNpcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS4qOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBhZnRlciBpbnRlZ3JhdGluZyB3aXRoIENhbGxNYW5hZ2VyLgorICogKFRPRE8pCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgU2lwUGhvbmVQcm94eSBpbXBsZW1lbnRzIFBob25lIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJQSE9ORSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTaXBQaG9uZVByb3h5IHNQaG9uZVByb3h5ID0gbmV3IFNpcFBob25lUHJveHkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU2lwUGhvbmVQcm94eSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHNQaG9uZVByb3h5OworICAgIH0KKworICAgIHByaXZhdGUgU2lwUGhvbmUgbUFjdGl2ZVBob25lOworICAgIHByaXZhdGUgQ2FsbFByb3h5IG1SaW5naW5nQ2FsbCA9IG5ldyBDYWxsUHJveHkoKTsKKyAgICBwcml2YXRlIENhbGxQcm94eSBtRm9yZWdyb3VuZENhbGwgPSBuZXcgQ2FsbFByb3h5KCk7CisgICAgcHJpdmF0ZSBDYWxsUHJveHkgbUJhY2tncm91bmRDYWxsID0gbmV3IENhbGxQcm94eSgpOworCisgICAgcHJpdmF0ZSBTaXBQaG9uZVByb3h5KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uTmV3Q2FsbChPYmplY3QgY2FsbCkgeworICAgICAgICBpZiAobUFjdGl2ZVBob25lLmNhblRha2UoY2FsbCkpIHsKKyAgICAgICAgICAgIExvZy52KCJTaXBQaG9uZVByb3h5IiwgIm9uTmV3Q2FsbCgpOiBjYWxsIHRha2VuOiAiICsgY2FsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudigiU2lwUGhvbmVQcm94eSIsICJvbk5ld0NhbGwoKTogY2FsbCBkcm9wcGVkOiAiICsgY2FsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGhvbmUoU2lwUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgaWYgKHBob25lID09IG51bGwpIHJldHVybjsKKyAgICAgICAgaWYgKG1BY3RpdmVQaG9uZSAhPSBudWxsKSBwaG9uZS5taWdyYXRlRnJvbShtQWN0aXZlUGhvbmUpOworICAgICAgICBtQWN0aXZlUGhvbmUgPSBwaG9uZTsKKyAgICAgICAgbUZvcmVncm91bmRDYWxsLnNldFRhcmdldChwaG9uZS5nZXRGb3JlZ3JvdW5kQ2FsbCgpKTsKKyAgICAgICAgbUJhY2tncm91bmRDYWxsLnNldFRhcmdldChwaG9uZS5nZXRCYWNrZ3JvdW5kQ2FsbCgpKTsKKyAgICAgICAgbVJpbmdpbmdDYWxsLnNldFRhcmdldChwaG9uZS5nZXRSaW5naW5nQ2FsbCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENhbGwgZ2V0Rm9yZWdyb3VuZENhbGwoKSB7CisgICAgICAgIHJldHVybiBtRm9yZWdyb3VuZENhbGw7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDYWxsIGdldEJhY2tncm91bmRDYWxsKCkgeworICAgICAgICByZXR1cm4gbUJhY2tncm91bmRDYWxsOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2FsbCBnZXRSaW5naW5nQ2FsbCgpIHsKKyAgICAgICAgcmV0dXJuIG1SaW5naW5nQ2FsbDsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2aWNlU3RhdGUgZ2V0U2VydmljZVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFNlcnZpY2VTdGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDZWxsTG9jYXRpb24gZ2V0Q2VsbExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldENlbGxMb2NhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlRG5zQ2hlY2soYm9vbGVhbiBiKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5kaXNhYmxlRG5zQ2hlY2soYik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEbnNDaGVja0Rpc2FibGVkKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzRG5zQ2hlY2tEaXNhYmxlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRTdGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmVOYW1lKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFBob25lTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGhvbmVUeXBlKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFBob25lVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3RpdmVBcG5UeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG5UeXBlcygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZlQXBuKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEFjdGl2ZUFwbigpOworICAgIH0KKworICAgIHB1YmxpYyBTaWduYWxTdHJlbmd0aCBnZXRTaWduYWxTdHJlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRTaWduYWxTdHJlbmd0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yVW5rbm93bkNvbm5lY3Rpb24oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JVbmtub3duQ29ubmVjdGlvbihoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JVbmtub3duQ29ubmVjdGlvbihIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JVbmtub3duQ29ubmVjdGlvbihoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoaCwgd2hhdCwgb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoSGFuZGxlciBoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JOZXdSaW5naW5nQ29ubmVjdGlvbihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvck5ld1JpbmdpbmdDb25uZWN0aW9uKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck5ld1JpbmdpbmdDb25uZWN0aW9uKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvck5ld1JpbmdpbmdDb25uZWN0aW9uKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9ySW5jb21pbmdSaW5nKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9ySW5jb21pbmdSaW5nKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckluY29taW5nUmluZyhIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JJbmNvbWluZ1JpbmcoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JEaXNjb25uZWN0KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yRGlzY29ubmVjdChoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JEaXNjb25uZWN0KEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvckRpc2Nvbm5lY3QoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JNbWlJbml0aWF0ZShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvck1taUluaXRpYXRlKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck1taUluaXRpYXRlKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvck1taUluaXRpYXRlKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTW1pQ29tcGxldGUoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZShoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZShIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZShoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgTW1pQ29kZT4gZ2V0UGVuZGluZ01taUNvZGVzKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFBlbmRpbmdNbWlDb2RlcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRVc3NkUmVzcG9uc2UoU3RyaW5nIHVzc2RNZXNzZ2UpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnNlbmRVc3NkUmVzcG9uc2UodXNzZE1lc3NnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTZXJ2aWNlU3RhdGVDaGFuZ2VkKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yU2VydmljZVN0YXRlQ2hhbmdlZChoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTZXJ2aWNlU3RhdGVDaGFuZ2VkKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclNlcnZpY2VTdGF0ZUNoYW5nZWQoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTdXBwU2VydmljZU5vdGlmaWNhdGlvbihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvclN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VGYWlsZWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZChoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZChIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZChoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckluQ2FsbFZvaWNlUHJpdmFjeU9uKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPbihoLHdoYXQsb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9ySW5DYWxsVm9pY2VQcml2YWN5T24oSGFuZGxlciBoKXsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPbihoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckluQ2FsbFZvaWNlUHJpdmFjeU9mZihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9ySW5DYWxsVm9pY2VQcml2YWN5T2ZmKGgsd2hhdCxvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPZmYoSGFuZGxlciBoKXsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPZmYoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDZG1hT3RhU3RhdHVzQ2hhbmdlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yQ2RtYU90YVN0YXR1c0NoYW5nZShoLHdoYXQsb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ2RtYU90YVN0YXR1c0NoYW5nZShIYW5kbGVyIGgpIHsKKyAgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yQ2RtYU90YVN0YXR1c0NoYW5nZShoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeShoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHkoSGFuZGxlciBoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5KGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yRWNtVGltZXJSZXNldChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvckVjbVRpbWVyUmVzZXQoaCx3aGF0LG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckVjbVRpbWVyUmVzZXQoSGFuZGxlciBoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yRWNtVGltZXJSZXNldChoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclJpbmdiYWNrVG9uZShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvclJpbmdiYWNrVG9uZShoLHdoYXQsb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yUmluZ2JhY2tUb25lKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclJpbmdiYWNrVG9uZShoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclJlc2VuZEluY2FsbE11dGUoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JSZXNlbmRJbmNhbGxNdXRlKGgsd2hhdCxvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JSZXNlbmRJbmNhbGxNdXRlKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclJlc2VuZEluY2FsbE11dGUoaCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWNjUmVjb3Jkc0xvYWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJY2NSZWNvcmRzTG9hZGVkKCk7CisgICAgfQorCisgICAgcHVibGljIEljY0NhcmQgZ2V0SWNjQ2FyZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJY2NDYXJkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbCgpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24geworICAgICAgICBtQWN0aXZlUGhvbmUuYWNjZXB0Q2FsbCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwoKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlamVjdENhbGwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hIb2xkaW5nQW5kQWN0aXZlKCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zd2l0Y2hIb2xkaW5nQW5kQWN0aXZlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuQ29uZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5jYW5Db25mZXJlbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29uZmVyZW5jZSgpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24geworICAgICAgICBtQWN0aXZlUGhvbmUuY29uZmVyZW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZUVuaGFuY2VkVm9pY2VQcml2YWN5KGJvb2xlYW4gZW5hYmxlLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLmVuYWJsZUVuaGFuY2VkVm9pY2VQcml2YWN5KGVuYWJsZSwgb25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0RW5oYW5jZWRWb2ljZVByaXZhY3koTWVzc2FnZSBvbkNvbXBsZXRlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5nZXRFbmhhbmNlZFZvaWNlUHJpdmFjeShvbkNvbXBsZXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5UcmFuc2ZlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5jYW5UcmFuc2ZlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5leHBsaWNpdENhbGxUcmFuc2ZlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyRGlzY29ubmVjdGVkKCkgeworICAgICAgICBtQWN0aXZlUGhvbmUuY2xlYXJEaXNjb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5kaWFsKGRpYWxTdHJpbmcpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVBpbk1taShTdHJpbmcgZGlhbFN0cmluZykgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmhhbmRsZVBpbk1taShkaWFsU3RyaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVJbkNhbGxNbWlDb21tYW5kcyhTdHJpbmcgY29tbWFuZCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaGFuZGxlSW5DYWxsTW1pQ29tbWFuZHMoY29tbWFuZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZER0bWYoY2hhciBjKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZW5kRHRtZihjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydER0bWYoY2hhciBjKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zdGFydER0bWYoYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcER0bWYoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zdG9wRHRtZigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJhZGlvUG93ZXIoYm9vbGVhbiBwb3dlcikgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0UmFkaW9Qb3dlcihwb3dlcik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWVzc2FnZVdhaXRpbmdJbmRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TWVzc2FnZVdhaXRpbmdJbmRpY2F0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluZTFOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TGluZTFOdW1iZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENkbWFNaW4oKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0Q2RtYU1pbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTWluSW5mb1JlYWR5KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzTWluSW5mb1JlYWR5KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDZG1hUHJsVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRDZG1hUHJsVmVyc2lvbigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluZTFBbHBoYVRhZygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRMaW5lMUFscGhhVGFnKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluZTFOdW1iZXIoU3RyaW5nIGFscGhhVGFnLCBTdHJpbmcgbnVtYmVyLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnNldExpbmUxTnVtYmVyKGFscGhhVGFnLCBudW1iZXIsIG9uQ29tcGxldGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vm9pY2VNYWlsTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgIH0KKworICAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgaW50IGdldFZvaWNlTWVzc2FnZUNvdW50KCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0Vm9pY2VNZXNzYWdlQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZvaWNlTWFpbEFscGhhVGFnKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFZvaWNlTWFpbEFscGhhVGFnKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Vm9pY2VNYWlsTnVtYmVyKFN0cmluZyBhbHBoYVRhZyxTdHJpbmcgdm9pY2VNYWlsTnVtYmVyLAorICAgICAgICAgICAgTWVzc2FnZSBvbkNvbXBsZXRlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZXRWb2ljZU1haWxOdW1iZXIoYWxwaGFUYWcsIHZvaWNlTWFpbE51bWJlciwgb25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0Q2FsbEZvcndhcmRpbmdPcHRpb24oaW50IGNvbW1hbmRJbnRlcmZhY2VDRlJlYXNvbiwKKyAgICAgICAgICAgIE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuZ2V0Q2FsbEZvcndhcmRpbmdPcHRpb24oY29tbWFuZEludGVyZmFjZUNGUmVhc29uLAorICAgICAgICAgICAgICAgIG9uQ29tcGxldGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxGb3J3YXJkaW5nT3B0aW9uKGludCBjb21tYW5kSW50ZXJmYWNlQ0ZSZWFzb24sCisgICAgICAgICAgICBpbnQgY29tbWFuZEludGVyZmFjZUNGQWN0aW9uLCBTdHJpbmcgZGlhbGluZ051bWJlciwKKyAgICAgICAgICAgIGludCB0aW1lclNlY29uZHMsIE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0Q2FsbEZvcndhcmRpbmdPcHRpb24oY29tbWFuZEludGVyZmFjZUNGUmVhc29uLAorICAgICAgICAgICAgY29tbWFuZEludGVyZmFjZUNGQWN0aW9uLCBkaWFsaW5nTnVtYmVyLCB0aW1lclNlY29uZHMsIG9uQ29tcGxldGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldE91dGdvaW5nQ2FsbGVySWREaXNwbGF5KE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuZ2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkob25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkoaW50IGNvbW1hbmRJbnRlcmZhY2VDTElSTW9kZSwKKyAgICAgICAgICAgIE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkoY29tbWFuZEludGVyZmFjZUNMSVJNb2RlLAorICAgICAgICAgICAgICAgIG9uQ29tcGxldGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldENhbGxXYWl0aW5nKE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuZ2V0Q2FsbFdhaXRpbmcob25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbFdhaXRpbmcoYm9vbGVhbiBlbmFibGUsIE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0Q2FsbFdhaXRpbmcoZW5hYmxlLCBvbkNvbXBsZXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRBdmFpbGFibGVOZXR3b3JrcyhNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5nZXRBdmFpbGFibGVOZXR3b3JrcyhyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVBdXRvbWF0aWMoTWVzc2FnZSByZXNwb25zZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVBdXRvbWF0aWMocmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdE5ldHdvcmtNYW51YWxseShOZXR3b3JrSW5mbyBuZXR3b3JrLCBNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZWxlY3ROZXR3b3JrTWFudWFsbHkobmV0d29yaywgcmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKGludCBuZXR3b3JrVHlwZSwgTWVzc2FnZSByZXNwb25zZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0UHJlZmVycmVkTmV0d29ya1R5cGUobmV0d29ya1R5cGUsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRQcmVmZXJyZWROZXR3b3JrVHlwZShNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5nZXRQcmVmZXJyZWROZXR3b3JrVHlwZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0TmVpZ2hib3JpbmdDaWRzKE1lc3NhZ2UgcmVzcG9uc2UpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLmdldE5laWdoYm9yaW5nQ2lkcyhyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25Qb3N0RGlhbENoYXJhY3RlcihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZXRPblBvc3REaWFsQ2hhcmFjdGVyKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TXV0ZShib29sZWFuIG11dGVkKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZXRNdXRlKG11dGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdXRlKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldE11dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0UmF3KGJ5dGVbXSBkYXRhLCBNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5pbnZva2VPZW1SaWxSZXF1ZXN0UmF3KGRhdGEsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0U3RyaW5ncyhTdHJpbmdbXSBzdHJpbmdzLCBNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5pbnZva2VPZW1SaWxSZXF1ZXN0U3RyaW5ncyhzdHJpbmdzLCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0RGF0YUNhbGxMaXN0KE1lc3NhZ2UgcmVzcG9uc2UpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLmdldERhdGFDYWxsTGlzdChyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RGF0YUNvbm5lY3Rpb24+IGdldEN1cnJlbnREYXRhQ29ubmVjdGlvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0Q3VycmVudERhdGFDb25uZWN0aW9uTGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VMb2NhdGlvbigpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVwZGF0ZVNlcnZpY2VMb2NhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZUxvY2F0aW9uVXBkYXRlcygpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLmVuYWJsZUxvY2F0aW9uVXBkYXRlcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVMb2NhdGlvblVwZGF0ZXMoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5kaXNhYmxlTG9jYXRpb25VcGRhdGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pdFRlc3RNb2RlKGJvb2xlYW4gZikgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0VW5pdFRlc3RNb2RlKGYpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFVuaXRUZXN0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRVbml0VGVzdE1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYW5kTW9kZShpbnQgYmFuZE1vZGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnNldEJhbmRNb2RlKGJhbmRNb2RlLCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcXVlcnlBdmFpbGFibGVCYW5kTW9kZShNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5xdWVyeUF2YWlsYWJsZUJhbmRNb2RlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREYXRhUm9hbWluZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YVJvYW1pbmdFbmFibGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVJvYW1pbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZXREYXRhUm9hbWluZ0VuYWJsZWQoZW5hYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBxdWVyeUNkbWFSb2FtaW5nUHJlZmVyZW5jZShNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5xdWVyeUNkbWFSb2FtaW5nUHJlZmVyZW5jZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2RtYVJvYW1pbmdQcmVmZXJlbmNlKGludCBjZG1hUm9hbWluZ1R5cGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnNldENkbWFSb2FtaW5nUHJlZmVyZW5jZShjZG1hUm9hbWluZ1R5cGUsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZG1hU3Vic2NyaXB0aW9uKGludCBjZG1hU3Vic2NyaXB0aW9uVHlwZSwgTWVzc2FnZSByZXNwb25zZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0Q2RtYVN1YnNjcmlwdGlvbihjZG1hU3Vic2NyaXB0aW9uVHlwZSwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyBTaW11bGF0ZWRSYWRpb0NvbnRyb2wgZ2V0U2ltdWxhdGVkUmFkaW9Db250cm9sKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldFNpbXVsYXRlZFJhZGlvQ29udHJvbCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZURhdGFDb25uZWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZW5hYmxlRGF0YUNvbm5lY3Rpdml0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVEYXRhQ29ubmVjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmRpc2FibGVEYXRhQ29ubmVjdGl2aXR5KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBlbmFibGVBcG5UeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZW5hYmxlQXBuVHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRpc2FibGVBcG5UeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZGlzYWJsZUFwblR5cGUodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc0RhdGFDb25uZWN0aXZpdHlFbmFibGVkKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SXBBZGRyZXNzKGFwblR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEdhdGV3YXkoYXBuVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlSWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGV2aWNlSWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERldmljZVN2bigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREZXZpY2VTdm4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnNjcmliZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRTdWJzY3JpYmVySWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEljY1NlcmlhbE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJY2NTZXJpYWxOdW1iZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVzbigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRFc24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1laWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TWVpZCgpOworICAgIH0KKworICAgIHB1YmxpYyBQaG9uZVN1YkluZm8gZ2V0UGhvbmVTdWJJbmZvKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0UGhvbmVTdWJJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIEljY1Ntc0ludGVyZmFjZU1hbmFnZXIgZ2V0SWNjU21zSW50ZXJmYWNlTWFuYWdlcigpeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEljY1Ntc0ludGVyZmFjZU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlciBnZXRJY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRUWU1vZGUoaW50IHR0eU1vZGUsIE1lc3NhZ2Ugb25Db21wbGV0ZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0VFRZTW9kZSh0dHlNb2RlLCBvbkNvbXBsZXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBxdWVyeVRUWU1vZGUoTWVzc2FnZSBvbkNvbXBsZXRlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5xdWVyeVRUWU1vZGUob25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgeworICAgICAgICBtQWN0aXZlUGhvbmUuYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGFjdGl2YXRlLCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5nZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5zZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KCkgeworICAgICAgICAgbUFjdGl2ZVBob25lLm5vdGlmeURhdGFBY3Rpdml0eSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldFNtc2NBZGRyZXNzKE1lc3NhZ2UgcmVzdWx0KSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5nZXRTbXNjQWRkcmVzcyhyZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNtc2NBZGRyZXNzKFN0cmluZyBhZGRyZXNzLCBNZXNzYWdlIHJlc3VsdCkgeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0U21zY0FkZHJlc3MoYWRkcmVzcywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENkbWFFcmlJY29uSW5kZXgoKSB7CisgICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldENkbWFFcmlJY29uSW5kZXgoKTsKKyAgICB9CisKKyAgICAgcHVibGljIFN0cmluZyBnZXRDZG1hRXJpVGV4dCgpIHsKKyAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0Q2RtYUVyaVRleHQoKTsKKyAgICAgfQorCisgICAgcHVibGljIGludCBnZXRDZG1hRXJpSWNvbk1vZGUoKSB7CisgICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldENkbWFFcmlJY29uTW9kZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRCdXJzdER0bWYoU3RyaW5nIGR0bWZTdHJpbmcsIGludCBvbiwgaW50IG9mZiwgTWVzc2FnZSBvbkNvbXBsZXRlKXsKKyAgICAgICAgbUFjdGl2ZVBob25lLnNlbmRCdXJzdER0bWYoZHRtZlN0cmluZywgb24sIG9mZiwgb25Db21wbGV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpeworICAgICAgICBtQWN0aXZlUGhvbmUuZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzT3RhU3BOdW1iZXIoZGlhbFN0cik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDYWxsV2FpdGluZyhIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yQ2FsbFdhaXRpbmcoaCx3aGF0LG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNhbGxXYWl0aW5nKEhhbmRsZXIgaCl7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yQ2FsbFdhaXRpbmcoaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTaWduYWxJbmZvKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yU2lnbmFsSW5mbyhoLHdoYXQsb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU2lnbmFsSW5mbyhIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JTaWduYWxJbmZvKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yRGlzcGxheUluZm8oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JEaXNwbGF5SW5mbyhoLHdoYXQsb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yRGlzcGxheUluZm8oSGFuZGxlciBoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yRGlzcGxheUluZm8oaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JOdW1iZXJJbmZvKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yTnVtYmVySW5mbyhoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JOdW1iZXJJbmZvKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvck51bWJlckluZm8oaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JSZWRpcmVjdGVkTnVtYmVySW5mbyhIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS5yZWdpc3RlckZvclJlZGlyZWN0ZWROdW1iZXJJbmZvKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclJlZGlyZWN0ZWROdW1iZXJJbmZvKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclJlZGlyZWN0ZWROdW1iZXJJbmZvKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTGluZUNvbnRyb2xJbmZvKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnJlZ2lzdGVyRm9yTGluZUNvbnRyb2xJbmZvKCBoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JMaW5lQ29udHJvbEluZm8oSGFuZGxlciBoKSB7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnJlZ2lzdGVyRm9yTGluZUNvbnRyb2xJbmZvKGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9UNTNDbGlybEluZm8oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb1Q1M0NsaXJsSW5mbyhoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JUNTNDbGlySW5mbyhIYW5kbGVyIGgpIHsKKyAgICAgICAgbUFjdGl2ZVBob25lLnVucmVnaXN0ZXJGb3JUNTNDbGlySW5mbyhoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclQ1M0F1ZGlvQ29udHJvbEluZm8oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtQWN0aXZlUGhvbmUucmVnaXN0ZXJGb3JUNTNBdWRpb0NvbnRyb2xJbmZvKCBoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JUNTNBdWRpb0NvbnRyb2xJbmZvKEhhbmRsZXIgaCkgeworICAgICAgICBtQWN0aXZlUGhvbmUudW5yZWdpc3RlckZvclQ1M0F1ZGlvQ29udHJvbEluZm8oaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopeworICAgICAgICBtQWN0aXZlUGhvbmUuc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlKGgsd2hhdCxvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlKEhhbmRsZXIgaCl7CisgICAgICAgIG1BY3RpdmVQaG9uZS51bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZShoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c0luZm8pCisgICAgICAgICAgICB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5kaWFsKGRpYWxTdHJpbmcsIHV1c0luZm8pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya1Byb3BlcnRpZXMgZ2V0TmV0d29ya1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXROZXR3b3JrUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQppbmRleCBhMTIwZjUyLi5mZGNmNzhkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdDsKIAotCiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CkBAIC0yNyw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ2FsbFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxGYWlsQ2F1c2U7CkBAIC0zMzUsNyArMzMzLDcgQEAKIAogICAgIC8qKgogICAgICAqIChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCB3aWxsIGJlIGFuIEludGVnZXIgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcml2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCisgICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcnZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKICAgICAgKgogICAgICAqIEBwYXJhbSBmYWNpbGl0eSBvbmUgb2YgQ0JfRkFDSUxUWV8qCiAgICAgICogQHBhcmFtIHBpbiBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTQ0MSw3ICs0MzksNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERyaXZlckNhbGwKICAgICAgKiAgICAgIFRoZSBhci5yZXN1bHQgTGlzdCBpcyBzb3J0ZWQgYnkgRHJpdmVyQ2FsbC5pbmRleAogICAgICAqLwpAQCAtNDY4LDcgKzQ2Niw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBjb250YWlucyBhIExpc3Qgb2YgRGF0YUNhbGxTdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldERhdGFDYWxsTGlzdChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNDc5LDcgKzQ3Nyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqIENMSVJfREVGQVVMVCAgICAgPT0gb24gInVzZSBzdWJzY3JpcHRpb24gZGVmYXVsdCB2YWx1ZSIKQEAgLTQ5Niw3ICs0OTQsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC01MTMsNyArNTExLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNU0kgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNU0koTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUyNCw3ICs1MjIsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSSBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1FSShNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTM1LDcgKzUzMyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTUVJU1Ygb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUlTVihNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTQ3LDcgKzU0NSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqICAzR1BQIDIyLjAzMCA2LjUuNQpAQCAtNTcyLDcgKzU3MCw3IEBACiAgICAgICogICJSZWxlYXNlcyBhbGwgaGVsZCBjYWxscyBvciBzZXRzIFVzZXIgRGV0ZXJtaW5lZCBVc2VyIEJ1c3kgKFVEVUIpCiAgICAgICogICBmb3IgYSB3YWl0aW5nIGNhbGwuIgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZ3VwV2FpdGluZ09yQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU5Myw3ICs1OTEsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cEZvcmVncm91bmRSZXN1bWVCYWNrZ3JvdW5kIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjE0LDcgKzYxMiw3IEBACiAgICAgICogIHRoZSBvdGhlciAoaGVsZCBvciB3YWl0aW5nKSBjYWxsLiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYzNCw3ICs2MzIsNyBAQAogICAgICAqICJBZGRzIGEgaGVsZCBjYWxsIHRvIHRoZSBjb252ZXJzYXRpb24iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbmZlcmVuY2UgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02NTQsNyArNjUyLDcgQEAKICAgICAgKiAiQ29ubmVjdHMgdGhlIHR3byBjYWxscyBhbmQgZGlzY29ubmVjdHMgdGhlIHN1YnNjcmliZXIgZnJvbSBib3RoIGNhbGxzIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleHBsaWNpdENhbGxUcmFuc2ZlciAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTY5MCw3ICs2ODgsNyBAQAogICAgIC8qKgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhY2NlcHRDYWxsIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNzA4LDcgKzcwNiw3IEBACiAgICAgLyoqCiAgICAgICogIGFsc28ga25vd24gYXMgVURVQgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVqZWN0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTc4NSw3ICs3ODMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBpcyBjYWxsYmFjayBtZXNzYWdlCiAgICAgICogICAgICAgICgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgIGlzIGFuIGludFtdIHdpdGggZXZlcnkKLSAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2aWFsYWJsZSBCTV8qX0JBTkQKKyAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2YWlsYWJsZSBCTV8qX0JBTkQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWVyeUF2YWlsYWJsZUJhbmRNb2RlIChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBpbnQgcmV0W10gPSBuZXcgaW50IFs0XTsKQEAgLTg0NCw3ICs4NDIsNiBAQAogICAgICAgICByZXRbMTFdID0gbnVsbDsKICAgICAgICAgcmV0WzEyXSA9IG51bGw7CiAgICAgICAgIHJldFsxM10gPSBudWxsOwotICAgICAgICByZXRbMTRdID0gbnVsbDsKIAogICAgICAgICByZXN1bHRTdWNjZXNzKHJlc3VsdCwgcmV0KTsKICAgICB9CkBAIC04OTUsNyArODkyLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTA0LDcgKzkwMSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MTMsNyArOTEwLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcER0bWYoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkyMiw3ICs5MTksNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kQnVyc3REdG1mKFN0cmluZyBkdG1mU3RyaW5nLCBpbnQgb24sIGludCBvZmYsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05NTcsNiArOTU0LDcgQEAKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXNwb25zZSk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXN1bHQpOwogICAgIH0KQEAgLTk2OCw5ICs5NjYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURhdGFDYWxsKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZShpbnQgbmV0d29ya1R5cGUgLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtMTA0Nyw3ICsxMDQzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIFNpbUlvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKworTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBmcmFtZXdvcmsKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKworTE9DQUxfTU9EVUxFIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEgYi90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmYzMjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZ0hlYWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbEN0cmxDbWRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kczsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ29udGFpbiBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gY29udHJvbCBNb2NrIFJJTC4gQmVmb3JlIHVzaW5nIHRoZXNlIGNvbW1hbmRzIHRoZSBkZXZpY2VzCisgKiBuZWVkcyB0byBiZSBzZXQgd2l0aCBNb2NrIFJJTC4gUmVmZXIgdG8gaGFyZHdhcmUvcmlsL21vY2tyaWwvUkVBRE1FLnR4dCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUmlsQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUklMQ29udHJvbGxlciI7CisgICAgcHJpdmF0ZSBSaWxDaGFubmVsIG1SaWxDaGFubmVsID0gbnVsbDsKKyAgICBwcml2YXRlIE1zZyBtTWVzc2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY2hhbm5lbCBhZnRlciB0aGUgY29tbXVuaWNhdGlvbiBpcyBkb25lLgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDaGFubmVsKCkgeworICAgICAgICBtUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgY29tbWFuZHMgYW5kIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICAgKiBAcGFyYW0gY21kIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gdG9rZW4gZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBwYkRhdGEgZm9yIE1zZyBkYXRhCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbW1hbmQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIGl0IGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRDdHJsQ29tbWFuZChpbnQgY21kLCBsb25nIHRva2VuLCBpbnQgc3RhdHVzLCBNZXNzYWdlTWljcm8gcGJEYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNc2cuc2VuZChtUmlsQ2hhbm5lbCwgY21kLCB0b2tlbiwgc3RhdHVzLCBwYkRhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIGNvbW1hbmQgOiAlZCBmYWlsZWQ6ICIgKyBlLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbnRyb2wgcmVzcG9uc2UKKyAgICAgKiBAcmV0dXJuIE1zZyBpZiByZXNwb25zZSBpcyByZWNlaXZlZCwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1zZyBnZXRDdHJsUmVzcG9uc2UoKSB7CisgICAgICAgIE1zZyByZXNwb25zZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IE1zZy5yZWN2KG1SaWxDaGFubmVsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVjZWl2ZSByZXNwb25zZSBmb3IgZ2V0UmFkaW9TdGF0ZSgpIGVycm9yOiAiICsgZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhZGlvIHN0YXRlIGlmIGl0IGlzIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJuIC0xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpZiAoIXNlbmRDdHJsQ29tbWFuZChSaWxDdHJsQ21kcy5DVFJMX0NNRF9HRVRfUkFESU9fU1RBVEUsIDAsIDAsIG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgTXNnIHJlc3BvbnNlID0gZ2V0Q3RybFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJmYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UucHJpbnRIZWFkZXIoVEFHKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcmVzcCA9CisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworICAgICAgICBpbnQgc3RhdGUgPSByZXNwLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPj0gUmlsQ21kcy5SQURJT1NUQVRFX09GRikgJiYgKHN0YXRlIDw9IFJpbENtZHMuUkFESU9TVEFURV9OVl9SRUFEWSkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMWQwZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlbGVwaG9ueU1vY2tSaWxUZXN0cworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Y0NGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bGFiZWw9IlRlbGVwaG9ueU1vY2tSaWxUZXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGVsZXBob255TW9ja1JpbFRlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1Rlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0IHJ1bm5lciBmb3IgVGVsZXBob255IFRlc3RzIFVzaW5nIE1vY2sgUklMIgorICAgIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlZTczOAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsLk1vY2tSaWxDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuZnVuY3Rpb25hbC5TaW1wbGVUZXN0VXNpbmdNb2NrUmlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHJ1bm5lciBmb3IgdGVsZXBob255IHRlc3RzIHRoYXQgdXNpbmcgTW9jayBSSUwKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIjsKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIgbUNvbnRyb2xsZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5jbGFzcyk7CisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29udHJvbGxlciA9IG5ldyBNb2NrUmlsQ29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSgiQ3JlYXRlIE1vY2sgUklsIENvbnRyb2xsZXIgZmFpbGVkIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobUNvbnRyb2xsZXIpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgaWYgKG1Db250cm9sbGVyICE9IG51bGwpCisgICAgICAgICAgICBtQ29udHJvbGxlci5jbG9zZUNoYW5uZWwoKTsKKyAgICAgICAgc3VwZXIuZmluaXNoKHJlc3VsdENvZGUsIHJlc3VsdHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzAwMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5mdW5jdGlvbmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbENvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuVGVsZXBob255TW9ja1Rlc3RSdW5uZXI7CisKKy8qKgorICogQSBzaW1wbGUgdGVzdCB0aGF0IHVzaW5nIE1vY2sgUklMIENvbnRyb2xsZXIKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVRlc3RVc2luZ01vY2tSaWwgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTaW1wbGVUZXN0VXNpbmdNb2NrUmlsIjsKKyAgICBwcml2YXRlIE1vY2tSaWxDb250cm9sbGVyIG1Nb2NrUmlsQ3RybCA9IG51bGw7CisgICAgcHJpdmF0ZSBUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciBtUnVubmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVJ1bm5lciA9IChUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbU1vY2tSaWxDdHJsID0gbVJ1bm5lci5tQ29udHJvbGxlcjsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtTW9ja1JpbEN0cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCByYWRpbyBzdGF0ZSBvZiBSSUwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmFkaW9TdGF0ZSgpIHsKKyAgICAgICAgaW50IHN0YXRlID0gbU1vY2tSaWxDdHJsLmdldFJhZGlvU3RhdGUoKTsKKyAgICAgICAgTG9nLnYoVEFHLCAidGVzdEdldFJhZGlvU3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGUgPj0gMCAmJiBzdGF0ZSA8PSA5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ1ZTI2NWEuLjk4ZTQ0MDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCkBAIC01LDYgKzUsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKwogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1RlbGVwaG9ueVRlc3RzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZhOTc0MjMuLmJhMWQ5NTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMiw2ICszMiwxMyBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgVGVsZXBob255IFRlc3RzIj4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBSdW5uZXIgZm9yIE1vY2sgUmlsIFRlc3RzIgorICAgIC8+CisKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OWI4MS4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyVXRpbHNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICAgICAgICAgLy9UT0RPIHRoaXMgaXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBhbHRob3VnaCB0aGUgYWJvdmUKLSAgICAgICAgICAgICAgICAvL3Jlc3VsdCBoYXMgYmVlbiByZXR1cm5lZCBzaW5jZSBjaGFuZ2UgMzE3NzYKLSAgICAgICAgICAgICAgICAvLyIqKjIxKiorMTcwMDU1NTQxNDEjIgotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIsMTIzNCIpKTsKLQotICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJ5dGVbXSBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYlJldC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiUmV0WzBdLCA3KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2kgLSAxXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIjcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiUmV0LCAwLCBiUmV0Lmxlbmd0aCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJCOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QTE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxKjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgIjEyMyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxMjMiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2gobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5zdHJpbmdGcm9tU3RyaW5nQW5kVE9BKG51bGwsIDEpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKisxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIys0NDc5NjYxNjQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjICgrNDQpIDc5IDY2MTYgNDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiwxMjM0IikpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsMTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCw7TiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxLTIuMzQgLDtOIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIGlzIG9kZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIiIsICIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjE4MDA1NTUwOTExIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICI1NTU1IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiMTgwMDU1NTU1NTU1IikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMTExNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMSA5OTkgNzAwNTU1NDE0MSIsICIrMSA3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDEgNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDExIDcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwODU4ODIzMDAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwIDIwNyA3OTIgMzQ5MCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLyoqKioqIEZJWE1FJ3MgKioqKioqLwotICAgICAgICAvLwotICAgICAgICAvLyBNTUkgaGVhZGVyIHNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgLy8gSXQncyB0b28gYmFkIHRoaXMgaXMgZmFsc2UKLSAgICAgICAgLy8gKzQ0ICgwKSAyMDcgNzkyIDM0OTAgaXMgbm90IGEgZGlhbGFibGUgbnVtYmVyCi0gICAgICAgIC8vIGJ1dCBpdCBpcyBjb21tb25seSBob3cgRXVyb3BlYW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbgotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiKzQ0ICgwKSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIGphcGFuZXNlIGludGVybmF0aW9uYWwgcHJlZml4LCBmb3IgZXhhbXBsZSwgbWVzc2VzIHVzIHVwCi0gICAgICAgIC8vIEJ1dCB3aG8gdXNlcyBhIEdTTSBwaG9uZSBpbiBKYXBhbj8KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMCA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIEF1c3RyYWxpYW4gb25lIG1lc3NlcyB1cyB1cCB0b28KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwMTEgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBSdXNzaWFuIHRydW5rIHByZWZpeCBtZXNzZXMgdXMgdXAsIGFzIGRvZXMgY3VycmVudAotICAgICAgICAvLyBSdXNzaWFuIGFyZWEgY29kZXMgKHdoaWNoIGJlaW4gd2l0aCAwKQotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzcoMDk1KTkxMDA3NjYiLCAiOCgwOTUpOTEwMDc2NiIpKTsKLQotICAgICAgICAvLyA0NDQgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlLCBidXQKLSAgICAgICAgLy8gbWF0Y2hJbnRsUHJlZml4QW5kQ0MgZG9lc250IGtub3cgdGhpcwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSBTTVMgc2hvcnQgY29kZQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNDA0LTA0IiwgIjQwNDA0IikpOwotICAgIH0KLQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NhbGxlcklESW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFucEZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMSIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMC01NTUxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI0NjY0NSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NjY0NSIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2NC00MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC1HT09HLTQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDBHT09HNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2Ni00NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtNDY2LTQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwNDY2NDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDLURFRi1HSEktSktMLU1OTy1QUVJTLVRVVi1XWFlaIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMtZGVmLWdoaS1qa2wtbW5vLXBxcnMtdHV2LXd4eXoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgMjIyLTMzMzQiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIoODAwKSBBQkMtREVGRyIpKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBydW4gdGhpcyB0ZXN0LCB0aGUgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHdpdGggbmV0d29yawotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTIzNDU2NzAwMDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzIzNDU2NzAwMDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTExODc1NzY3ODAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzExODc1NzY3ODAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7MDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7Kzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1OTcwMDA7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1OTcwMDA7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIis7LDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrOyw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3KzU3OS03MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3KzU3OS03MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiLDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzs4NDc1Nzk3MDAwLCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI7Ozg0NzU3OTcwMDAsLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrdGhpcytpcyR3ZWlyZDssKyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIit0aGlzK2lzJHdlaXJkOywrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjaGVja3MgZm9yIHRoZSBWb2ljZU1haWwgbnVtYmVyLgotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE51bWJlck5vdEVxdWFsVG9Wb2ljZU1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCJ0ZWw6OTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIC8vIFRoaXMgdGVzdCBmYWlscyBvbiBhIGRldmljZSB3aXRob3V0IGEgc2ltIGNhcmQKLSAgICAgICAgLypUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyID0KLSAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgbVZvaWNlTWFpbE51bWJlciA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWb2ljZU1haWxOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG1Wb2ljZU1haWxOdW1iZXIpKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworCisgICAgcHVibGljIFJpbENoYW5uZWwgbU1vY2tSaWxDaGFubmVsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgbG9nKCJnZXRBbGxUZXN0cyBFIik7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrUmlsVGVzdC5jbGFzcyk7CisgICAgICAgIGxvZygiZ2V0QWxsVGVzdHMgWCIpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKKyAgICAgICAgbG9nKCJnZXRMb2FkZXIgRVgiKTsKKyAgICAgICAgcmV0dXJuIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBsb2coIm9uQ3JlYXRlIEUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIm9uQ3JlYXRlIFgiKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gSSd2ZSBub3Qgc2VlbiB0aGlzIGNhbGxlZAorICAgICAgICBsb2coIm9uRGVzdHJveSBFWCIpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHRocmVhZCBpcyBzdGFydGVkLgorICAgICAgICAvLyBBdCB0aGUgbW9tZW50IHdlIGRvbid0IG5lZWQgdGhlIHRocmVhZCBzbyByZXR1cm4KKyAgICAgICAgLy8gd2hpY2ggd2lsbCBzaHV0IGRvd24gdGhpcyB1bnVzZWQgdGhyZWFkLgorICAgICAgICBsb2coIm9uU3RhcnQgRVgiKTsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY29tcGxldGUgc28gSSBhc2sgdGhlIG1Nb2NrUmlsQ2hhbm5lbCB0byBxdWl0LgorICAgICAgICBsb2coImZpbmlzaCBFIik7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBsb2coImZpbmlzaCBYIik7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy5lKCJUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKaW5kZXggM2E5YzUxMS4uYTZiOWEyYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgLy8gJ0AnIG1hcHMgdG8gY2hhciAwCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBHc21BbHBoYWJldC5jaGFyVG9Hc20oJ0AnKSk7CiAKLSAgICAgICAgLy8gYGEgKGEgd2l0aCBncmF2ZSBhY2NlbnQpIG1hcHMgdG8gbGFzdCBHU00gY2hhcmF0ZXIKKyAgICAgICAgLy8gYGEgKGEgd2l0aCBncmF2ZSBhY2NlbnQpIG1hcHMgdG8gbGFzdCBHU00gY2hhcmFjdGVyCiAgICAgICAgIGFzc2VydEVxdWFscygweDdmLCBHc21BbHBoYWJldC5jaGFyVG9Hc20oJ1x1MDBlMCcpKTsKIAogICAgICAgICAvLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCmluZGV4IDMxMDNmYzEuLjIxNWM2Y2UgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKQEAgLTI0LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCiBwdWJsaWMgY2xhc3MgR3NtU21zVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBAU21hbGxUZXN0CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCmluZGV4IDJkNjk3N2MuLjdlYjNkZjggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRpbWVab25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkV1cm9wZS9QYXJpcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIwOCksICJFQ1QiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMzIpLCAiRXVyb3BlL1ZpZW5uYSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDY1NSksICJBZnJpY2EvSm9oYW5uZXNidXJnIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNDQwKSwgIkFzaWEvVG9reW8iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjFjNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKKyAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgorICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOworCisgICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQorICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoaXMgaXMgb2RkCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOworCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCisgICAgICAgIC8vCisgICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQorICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKKyAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKKyAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7CisKKyAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50CisgICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOworCisgICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAorICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7CisgICAgfQorCisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKKworICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKKworICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOworICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOworICAgIH0KKworICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAorICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOworICAgICAgICAqLworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyVG9FMTY0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI2NTAgMjkxMDAwMCIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTgwMDQ2NjQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiODAwLUdPT0ctMTE0IiwgInVzIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjEyMzQ1NjciLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgNDY2LTQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiODAwLUdPT0ctMTE0IiwgInVzIikpOworCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI2NTAgMjkxMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjEyLDMjNCo1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI4MDAtR09PRy0xMTQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNTczYwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJXYXRjaGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbXVsdGlDaGFycyA9ICI2NTAxMjM0NSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQxID0gIig2NTApIDEyMy00NSI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICAvLyBBcHBlbmQgbW9yZSB0aGFuIG9uZSBjaGFycworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIDAsIG11bHRpQ2hhcnMubGVuZ3RoKCkpOworICAgICAgICBudW1iZXIuYXBwZW5kKG11bHRpQ2hhcnMpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDAsIDAsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdHRlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdHRlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgICAgIC8vIEFwcGVuZCBvbmUgY2hhcnMKKyAgICAgICAgZmluYWwgY2hhciBhcHBlbmRDaGFyID0gJzYnOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkMiA9ICIoNjUwKSAxMjMtNDU2IjsKKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCksIDAsIDEpOworICAgICAgICBudW1iZXIuYXBwZW5kKGFwcGVuZENoYXIpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIGxlbiwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdHRlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdHRlZDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUxhc3RDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiNjUwMTIzNDU2NzgiOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0MSA9ICIoNjUwKSAxMjMtNDU2NyI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGNoYXIuCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbGVuIC0gMSwgMSwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUobGVuIC0gMSwgbGVuKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCkgLSAxLCAxLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0MSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0MS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICAgICAgLy8gUmVtb3ZlIGxhc3QgNSBjaGFycworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0MiA9ICIoNjUwKSAxMjMiOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSAtIDQsIDQsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKG51bWJlci5sZW5ndGgoKSAtIDUsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpLCA0LCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0MiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Mi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0Q2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG9uZSBjaGFyCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgNCwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoNCwgIjEiKTsgLy8gKDY1MDEpIDIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDEKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDQsIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoNywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBJbnNlcnQgbXVsdGlwbGUgY2hhcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9ICIoNjUwKSAxNDUtNjcyMyI7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgNywgMCwgNCk7CisgICAgICAgIG51bWJlci5pbnNlcnQoNywgIjQ1NjciKTsgLy8gY2hhbmdlIHRvICg2NTApIDE0NTY3MjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDExKTsgLy8gdGhlIGN1cnNvciBpcyBhdCB0aGUgcmlnaHQgb2YgJzcnLgorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNywgMCwgNCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBiZSBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzcnCisgICAgICAgIGFzc2VydEVxdWFscygxMiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcEZvcm1hdHRpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIDQiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gQXBwZW5kIHNwYWNlCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIiA0Iik7IC8vICg2NTAxKSAyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gRGVsZXRlIGEgJyknCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSIoNjUwIDEyMyI7CisgICAgICAgIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgNCwgMSwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUoNCwgNSk7IC8vICg2NTAxIDIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgMQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNCwgMSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIEluc2VydCBhIGh5cGhlbgorICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQzID0iKDY1MCkgMTItMyI7CisgICAgICAgIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOCwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoOCwgIi0iKTsgLy8gKDY1MCkgMTItMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgOSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAtCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA4LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQzLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnLScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3RhcnRGb3JtYXR0aW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyA0IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEFwcGVuZCBzcGFjZQorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICIgNCIpOyAvLyAoNjUwKSAxMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc0JworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IHN0cmluZywgYW5kIHN0YXJ0IGZvcm1hdHRpbmcgYWdhaW4uCisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgbGVuLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZSgwLCBsZW4pOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgMCwgbGVuLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSAiKDY1MCkgMTIzLTQiOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiNCIpOyAvLyAoNjUwKSAxMjM0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzQnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRDaGFuZ2VkQnlPdGhlclRleHRXYXRjaGVyKCkgeworICAgICAgICBmaW5hbCBUZXh0V2F0Y2hlciBjbGVhbnVwVGV4dFdhdGNoZXIgPSBuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICBzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiIjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgNSwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoNSwgIjQiKTsgLy8gKDY1MDQpIDEyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA1LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLnNldFNwYW4oY2xlYW51cFRleHRXYXRjaGVyLCAwLCBudW1iZXIubGVuZ3RoKCksIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRleHRXYXRjaGVyIGdldFRleHRXYXRjaGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCJVUyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQyNzc5NWIuLjhjYjA1Y2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKKwogLyoqCiAgKiBTdHViIGNsYXNzIHVzZWQgZm9yIHVuaXQgdGVzdHMKICAqLwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKFBob25lIHNlbmRlcikgewogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNpZ25hbFN0cmVuZ3RoKFBob25lIHNlbmRlcikgewogICAgIH0KIApAQCAtNDIsMTAgKzQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcikgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQppbmRleCBiOTY3NDNhLi40ODU1NDJiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCkBAIC0xOCwyNyArMTgsMjEgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVzdFBob25lTm90aWZpZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01UZXN0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TdXBwU2VydmljZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTAzYjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2c7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDdHJsQ21kczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMuVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbjsKKworLy8gVGVzdCBzdWl0ZSBmb3IgdGVzdCByaWwKK3B1YmxpYyBjbGFzcyBNb2NrUmlsVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1vY2tSaWxUZXN0IjsKKworICAgIFJpbENoYW5uZWwgbU1vY2tSaWxDaGFubmVsOworICAgIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyIG1SdW5uZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtUnVubmVyID0gKFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtTW9ja1JpbENoYW5uZWwgPSBtUnVubmVyLm1Nb2NrUmlsQ2hhbm5lbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBMb2cudihUQUcsIHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcHJvdG9idWYgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uCisgICAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90b2J1ZlNlckRlcygpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdFByb3RvYnVmU2VyZGVzIEUiKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSBycyA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSgpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHJzLnN0YXRlID09IDAgd2FzICVkIiwgcnMuZ2V0U3RhdGUoKSksCisgICAgICAgICAgICAgICAgcnMuZ2V0U3RhdGUoKSA9PSAwKTsKKyAgICAgICAgcnMuc2V0U3RhdGUoMSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgcnMuc3RhdGUgPT0gMSB3YXMgJWQiLCBycy5nZXRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICBycy5nZXRTdGF0ZSgpID09IDEpOworCisgICAgICAgIGJ5dGVbXSByc19zZXIgPSBycy50b0J5dGVBcnJheSgpOworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByc05ldyA9IFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlLnBhcnNlRnJvbShyc19zZXIpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHJzTmV3LnN0YXRlID09IDEgd2FzICVkIiwgcnMuZ2V0U3RhdGUoKSksCisgICAgICAgICAgICAgICAgcnMuZ2V0U3RhdGUoKSA9PSAxKTsKKworICAgICAgICBsb2coInRlc3RQcm90b2J1ZlNlcmRlcyBYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBlY2hvIGNvbW1hbmQgd29ya3MgdXNpbmcgd3JpdGVNc2cgJiByZWFkTXNnCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVjaG9Nc2coKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RFY2hvTXNnIEUiKTsKKworICAgICAgICBNc2dIZWFkZXIgbWggPSBuZXcgTXNnSGVhZGVyKCk7CisgICAgICAgIG1oLnNldENtZCgwKTsKKyAgICAgICAgbWguc2V0VG9rZW4oMSk7CisgICAgICAgIG1oLnNldFN0YXR1cygyKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgzKTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpMyk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTQpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSk1KTsKKyAgICAgICAgTXNnLnNlbmQobU1vY2tSaWxDaGFubmVsLCBtaCwgZGF0YSk7CisKKyAgICAgICAgTXNnIHJlc3BNc2cgPSBNc2cucmVjdihtTW9ja1JpbENoYW5uZWwpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5oZWFkZXIuY21kID09IDAgd2FzICVkIixyZXNwTXNnLmdldENtZCgpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldENtZCgpID09IDApOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5oZWFkZXIudG9rZW4gPT0gMSB3YXMgJWQiLHJlc3BNc2cuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXRUb2tlbigpID09IDEpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5oZWFkZXIuc3RhdHVzID09IDIgd2FzICVkIiwgcmVzcE1zZy5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXRTdGF0dXMoKSA9PSAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVswXSA9PSAzIHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgwKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDApID09IDMpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzFdID09IDQgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDEpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMSkgPT0gNCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMl0gPT0gNSB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMikpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgyKSA9PSA1KTsKKworICAgICAgICBsb2coInRlc3RFY2hvTXNnIFgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGdldCBhcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBcygpIHsKKyAgICAgICAgbG9nKCJ0ZXN0R2V0QXMgRSIpOworCisgICAgICAgIC8vIFVzZSBhIG1lc3NhZ2UgaGVhZGVyIGFzIHRoZSBwcm90b2J1ZiBkYXRhIGNvbnRlbnQKKyAgICAgICAgTXNnSGVhZGVyIG1oID0gbmV3IE1zZ0hlYWRlcigpOworICAgICAgICBtaC5zZXRDbWQoMTIzNDUpOworICAgICAgICBtaC5zZXRUb2tlbig5ODc2KTsKKyAgICAgICAgbWguc2V0U3RhdHVzKDc2NTQpOworICAgICAgICBtaC5zZXRMZW5ndGhEYXRhKDQzMjEpOworICAgICAgICBieXRlW10gZGF0YSA9IG1oLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIE1zZ0hlYWRlciBtaFJlc3VsdCA9IE1zZy5nZXRBcyhNc2dIZWFkZXIuY2xhc3MsIGRhdGEpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEyMzQ1IHdhcyAlZCIsIG1oUmVzdWx0LmdldENtZCgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRDbWQoKSA9PSAxMjM0NSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgdG9rZW4gPT0gOTg3NiB3YXMgJWQiLCBtaFJlc3VsdC5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSA3NjU0IHdhcyAlZCIsIG1oUmVzdWx0LmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRTdGF0dXMoKSA9PSA3NjU0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBsZW5ndGhEYXRhID09IDQzMjEgd2FzICVkIiwgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkgPT0gNDMyMSk7CisKKyAgICAgICAgTXNnIG1zZyA9IE1zZy5vYnRhaW4oKTsKKyAgICAgICAgbXNnLnNldERhdGEoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKworICAgICAgICBtaFJlc3VsdCA9IG1zZy5nZXREYXRhQXMoTXNnSGVhZGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxMjM0NSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0Q21kKCkgPT0gMTIzNDUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHRva2VuID09IDk4NzYgd2FzICVkIiwgbWhSZXN1bHQuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gNzY1NCB3YXMgJWQiLCBtaFJlc3VsdC5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0U3RhdHVzKCkgPT0gNzY1NCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbGVuZ3RoRGF0YSA9PSA0MzIxIHdhcyAlZCIsIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpID09IDQzMjEpOworCisgICAgICAgIGxvZygidGVzdEdldEFzIFgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmFkaW9TdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdEdldFJhZGlvU3RhdGUgRSIpOworCisgICAgICAgIE1zZy5zZW5kKG1Nb2NrUmlsQ2hhbm5lbCwgMSwgOTg3NiwgMCwgbnVsbCk7CisKKyAgICAgICAgTXNnIHJlc3AgPSBNc2cucmVjdihtTW9ja1JpbENoYW5uZWwpOworICAgICAgICAvL3Jlc3AucHJpbnRIZWFkZXIoInRlc3RHZXRSYWRpb1N0YXRlIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMSB3YXMgJWQiLCByZXNwLmdldENtZCgpKSwKKyAgICAgICAgICAgICAgICByZXNwLmdldENtZCgpID09IDEpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHRva2VuID09IDk4NzYgd2FzICVkIiwgcmVzcC5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICByZXNwLmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDAgd2FzICVkIiwgcmVzcC5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRTdGF0dXMoKSA9PSAwKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByc3AgPSByZXNwLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisKKyAgICAgICAgaW50IHN0YXRlID0gcnNwLmdldFN0YXRlKCk7CisgICAgICAgIGxvZygidGVzdEdldFJhZGlvU3RhdGUgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBSYWRpb1N0YXRlID49IDAgJiYgUmFkaW9TdGF0ZSA8PSA5IHdhcyAlZCIsIHN0YXRlKSwKKyAgICAgICAgICAgICAgICAoKHN0YXRlID49IDApICYmIChzdGF0ZSA8PSA5KSkpOworCisgICAgICAgIGxvZygidGVzdEdldFJhZGlvU3RhdGUgWCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU2NTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CisKKy8qKgorICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdGVzdGluZyB7QGxpbmsgTG9hZGVyfXMuIFRoaXMgdGVzdCBjYXNlCisgKiBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gc3luY2hyb25vdXNseSBnZXQgdGhlIHJlc3VsdCBmcm9tIGEgTG9hZGVyIG1ha2luZworICogaXQgZWFzeSB0byBhc3NlcnQgdGhhdCB0aGUgTG9hZGVyIHJldHVybnMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAqLworcHVibGljIGNsYXNzIExvYWRlclRlc3RDYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBGb3JjZSBjbGFzcyBsb2FkaW5nIG9mIEFzeW5jVGFzayBvbiB0aGUgbWFpbiB0aHJlYWQgc28gdGhhdCBpdCdzIGhhbmRsZXJzIGFyZSB0aWVkIHRvCisgICAgICAgIC8vIHRoZSBtYWluIHRocmVhZCBhbmQgcmVzcG9uc2VzIGZyb20gdGhlIHdvcmtlciB0aHJlYWQgZ2V0IGRlbGl2ZXJlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICAgIC8vIFRoZSB0ZXN0cyBhcmUgcnVuIG9uIGFub3RoZXIgdGhyZWFkLCBhbGxvd2luZyB0aGVtIHRvIGJsb2NrIHdhaXRpbmcgb24gYSByZXNwb25zZSBmcm9tCisgICAgICAgIC8vIHRoZSBjb2RlIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkLiBUaGUgbWFpbiB0aHJlYWQgY2FuJ3QgYmxvY2sgc2luY2UgdGhlIEF5c25jVGFzaworICAgICAgICAvLyByZXN1bHRzIGNvbWUgaW4gdmlhIHRoZSBldmVudCBsb29wLgorICAgICAgICBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZ3MpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoVm9pZCByZXN1bHQpIHt9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIExvYWRlciBzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQuIFRoZSBsb2FkZXIgd2lsbAorICAgICAqIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIGFuZCBkZXN0cm95ZWQgYnkgdGhpcyBtZXRob2Qgc28gaXQgY2Fubm90IGJlIHJldXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIGxvYWRlciB0byBydW4gc3luY2hyb25vdXNseQorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBmcm9tIHRoZSBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseShmaW5hbCBMb2FkZXI8VD4gbG9hZGVyKSB7CisgICAgICAgIC8vIFRoZSB0ZXN0IHRocmVhZCBibG9ja3Mgb24gdGhpcyBxdWV1ZSB1bnRpbCB0aGUgbG9hZGVyIHB1dHMgaXQncyByZXN1bHQgaW4KKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+IHF1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxUPigxKTsKKworICAgICAgICAvLyBUaGlzIGNhbGxiYWNrIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgYW5kIHVuYmxvY2tzIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAvLyB3aGVuIGl0IHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZSBibG9ja2luZyBxdWV1ZQorICAgICAgICBmaW5hbCBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPFQ+IGxpc3RlbmVyID0gbmV3IE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxUPiBjb21wbGV0ZWRMb2FkZXIsIFQgZGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFNodXQgdGhlIGxvYWRlciBkb3duCisgICAgICAgICAgICAgICAgY29tcGxldGVkTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuZGVzdHJveSgpOworCisgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHJlc3VsdCwgdW5ibG9ja2luZyB0aGUgdGVzdCB0aHJlYWQKKyAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgb2YgdGhlIHByb2Nlc3Mgc2luY2UgQXN5bmNUYXNrCisgICAgICAgIC8vIGlzIGRvY3VtZW50ZWQgYXMgbmVlZGluZyB0byBydW4gb24gdGhlIG1haW4gdGhyZWFkIGFuZCBtYW55IExvYWRlcnMgdXNlCisgICAgICAgIC8vIEFzeW5jVGFzaworICAgICAgICBmaW5hbCBIYW5kbGVyIG1haW5UaHJlYWRIYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoMCwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBBc2sgdGhlIG1haW4gdGhyZWFkIHRvIHN0YXJ0IHRoZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgICAgbWFpblRocmVhZEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZSgwKTsKKworICAgICAgICAvLyBCbG9jayBvbiB0aGUgcXVldWUgd2FpdGluZyBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCB0byBiZSBpbnNlcnRlZAorICAgICAgICBUIHJlc3VsdDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcXVldWUudGFrZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ3YWl0aW5nIHRocmVhZCBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCmluZGV4IGUxMTcyY2YuLjc0Y2ViZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCkBAIC03Myw2ICs3MywxOCBAQAogICAgICAgICBtUmVzb2x2ZXIuYWRkUHJvdmlkZXIobVByb3ZpZGVyQXV0aG9yaXR5LCBnZXRQcm92aWRlcigpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKwogICAgIHB1YmxpYyBNb2NrQ29udGVudFJlc29sdmVyIGdldE1vY2tDb250ZW50UmVzb2x2ZXIoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCmluZGV4IDFmYjU1MzguLjY0ZDExYzUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKQEAgLTE0MSw2ICsxNDEsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHtAbGluayBNb2NrQ29udGVudFJlc29sdmVyfSBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBZb3UKICAgICAgKiBtdXN0IHVzZSB0aGUgbWV0aG9kcyBvZiB0aGlzIHJlc29sdmVyIHRvIGFjY2VzcyB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQppbmRleCA5NzNiOWYyLi5lZWUzYWQ3IDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE0OCw2ICsxNDksMTcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGludGVybmFsTmFtZSA9IHJlbmFtZWRGaWxlTmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFtRGF0YWJhc2VOYW1lcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgbURhdGFiYXNlTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgbUZpbGVDb250ZXh0LmRlbGV0ZURhdGFiYXNlKGludGVybmFsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShpbnRlcm5hbE5hbWUsIG1vZGUsIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CiAgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5yZW1vdmUobmFtZSk7CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAzZmQ3MWM4Li5iNjNmZjNkIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEyNyw2ICsxMjcsMTYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICB9CiAKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJsLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KICAgICB9CiAgICAgcHJpdmF0ZSBmaW5hbCBJbnZlcnNpb25JQ29udGVudFByb3ZpZGVyIG1JQ29udGVudFByb3ZpZGVyID0gbmV3IEludmVyc2lvbklDb250ZW50UHJvdmlkZXIoKTsKIApAQCAtMjIyLDYgKzIzMiwxNCBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIGNhbGwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgSUNvbnRlbnRQcm92aWRlciB3aGljaCBjYWxscyBiYWNrIHNhbWUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgogICAgICAqIEJ5IG92ZXJyaWRpbmcgdGhpcyBjbGFzcywgd2UgYXZvaWQgdGhlIG1lY2hhbmlzbSBoaWRkZW4gYmVoaW5kIENvbnRlbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQppbmRleCBmZmQ3NTdjLi5jMzFjOWNjIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xODQsNiArMTg1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBmaWxlLCBpbnQgbW9kZSwKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldERhdGFiYXNlUGF0aChTdHJpbmcgbmFtZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQppbmRleCA5YjFjMGVmLi5iYWExNTBhIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKQEAgLTE3OCwzNiArMTc4LDExIEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoQ29udGVudFJlc29sdmVyIGNyLCBVcmkgdXJpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CkBAIC0yMTcsNDggKzE5Miw3IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMGJlNWJlYS4uMTgzYmU0MSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0xMDIsNCArMTAzLDEzIEBACiAgICAgcHVibGljIElCaW5kZXIgYXNCaW5kZXIoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKaW5kZXggZGY2ZGE3MC4uYTJiOTRmZiAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKQEAgLTQ2LDYgKzQ2LDggQEAKICAqLwogcHVibGljIGNsYXNzIFRlc3RHcm91cGluZyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0R3JvdXBpbmciOworCiAgICAgU29ydGVkU2V0PENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IHRlc3RDYXNlQ2xhc3NlczsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBTT1JUX0JZX1NJTVBMRV9OQU1FCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwYWNrYWdlTmFtZXMpIHsKICAgICAgICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gYWRkZWRDbGFzc2VzID0gdGVzdENhc2VDbGFzc2VzSW5QYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChhZGRlZENsYXNzZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoIlRlc3RHcm91cGluZyIsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBQYWNrYWdlOiAnIiArIHBhY2thZ2VOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICArICInIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBoYXMgbm8gdGVzdHMiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRlc3RDYXNlQ2xhc3Nlcy5hZGRBbGwoYWRkZWRDbGFzc2VzKTsKQEAgLTIzNCw2ICsyMzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKExPR19UQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0Q2FzZSBjbGFzcyAlcyBpcyBtaXNzaW5nIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycyAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIgLSBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGFDbGFzcy5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ3N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgVGVzdEdyb3VwaW5nfQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgVGVzdEdyb3VwaW5nIG1Hcm91cGluZzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Hcm91cGluZyA9IG5ldyBUZXN0R3JvdXBpbmcoVGVzdEdyb3VwaW5nLlNPUlRfQllfU0lNUExFX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgVGVzdENhc2VzIHdpdGggbm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZSBub3QgbG9hZGVkLgorICAgICAqIFJlbGllcyBvbiBmaXh0dXJlIGNsYXNzZXMgaW4gYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXN0c19ub1B1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgICAgICBtR3JvdXBpbmcuYWRkUGFja2FnZXNSZWN1cnNpdmUoImFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3IiKTsKKyAgICAgICAgTGlzdDxUZXN0TWV0aG9kPiB0ZXN0cyA9IG1Hcm91cGluZy5nZXRUZXN0cygpOworICAgICAgICAvLyBvbmx5IHRoZSBQdWJsaWNDb25zdHJ1Y3RvclRlc3QncyB0ZXN0IG1ldGhvZCBzaG91bGQgYmUgcHJlc2VudAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0UHVibGljQ29uc3RydWN0b3IiLCB0ZXN0cy5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkwOWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEge0BsaW5rIFRlc3RDYXNlfSB3aGljaCBzaG91bGQgbm90IGJlIGxvYWRlZCBzaW5jZSBpdCBoYXMgbm9uLXB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCBubyBhcmdzLgorICovCitwdWJsaWMgY2xhc3MgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIGZvbywgU3RyaW5nIGZvbzIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UnVuKCkgeworICAgICAgICBmYWlsKCJtZXRob2QgaW4gTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlMjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHB1YmxpYyBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLgorICovCitwdWJsaWMgY2xhc3MgUHVibGljQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAppbmRleCBhMDU4ZDRhLi4wMzczNjdlIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC02NSw3ICs2NSw3IEBACiBwdWJsaWM6CiAgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQogICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKIAogICAgIE5QUCBpbnN0KCkgY29uc3QgeyByZXR1cm4gbV9pbnN0OyB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCmluZGV4IDJlZmYzOTQuLjkxZjFiM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgYnJvd3Nlci0+bWVtZnJlZShiZWdpbk1lbSk7CiB9CiAKLWludDE2IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewogCiAgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOiB7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCmluZGV4IDg4YjdjOWQuLjA0M2JlODUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCkBAIC0zMiw3ICszMiw3IEBACiBwdWJsaWM6CiAgICAgRXZlbnRQbHVnaW4oTlBQIGluc3QpOwogICAgIHZpcnR1YWwgfkV2ZW50UGx1Z2luKCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKaW5kZXggNDAyYTdlMi4uNTExMTgwYyAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcApAQCAtMzQsMTkgKzM0LDE5IEBACiBOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CiAjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwogTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CiBOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKIE5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwogTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAoraW50MzJfdCAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMl90ICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLAogICAgICAgICB2b2lkKiBidWZmZXIpOwogdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwogdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOworaW50MTZfdCAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKIHZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAogICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKIE5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIHJldHVybiAiYXBwbGljYXRpb24veC1icm93c2VydGVzdHBsdWdpbjpidHA6QW5kcm9pZCBCcm93c2VyIFRlc3QgUGx1Z2luIjsKIH0KIAotTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2X3QgbW9kZSwgaW50MTZfdCBhcmdjLAogICAgICAgICAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCiB7CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpCitOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2X3QqIHN0eXBlKQogewogICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwpAQCAtMTk5LDEyICsxOTksMTIgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLWludDMyIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKK2ludDMyX3QgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQogewogICAgIHJldHVybiAwOwogfQogCi1pbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQoraW50MzJfdCBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sIHZvaWQqIGJ1ZmZlcikKIHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTIxNyw3ICsyMTcsNyBAQAogewogfQogCi1pbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK2ludDE2X3QgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCiB7CiAgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CiAgICAgY29uc3QgQU5QRXZlbnQqIGV2dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQU5QRXZlbnQqPihldmVudCk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CmluZGV4IGI2ZTdiZjMuLmNlYWM1ZDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgIyBDb3VudCBjcmFzaGVkIHRlc3RzLgogICBjcmFzaGVkX3Rlc3RzID0gW10KIAotICB0aW1lb3V0X21zID0gJzMwMDAwJworICB0aW1lb3V0X21zID0gJzE1MDAwJwogICBpZiBvcHRpb25zLnRpbWVfb3V0X21zOgogICAgIHRpbWVvdXRfbXMgPSBvcHRpb25zLnRpbWVfb3V0X21zCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDU3ODBjNDMuLjc0MGY1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQpAQCAtNzQsNiArNzQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0MjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDQ0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDQ2OwogICAgIAogICAgIENhbGxiYWNrUHJveHkoRXZlbnRTZW5kZXIgZXZlbnRTZW5kZXIsIAogICAgICAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIgbGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKQEAgLTE3NSw3ICsxNzcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfVEVYVDoKLSAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7Ci0gICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9URVhULCBlbmFibGVQaXhlbFRlc3RzID8gMSA6IDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKQEAgLTQ5MiwxMCArNTEwLDIyIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04sIGFsbG93ID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgdGhlIFRlc3RTaGVsbEFjdGl2aXR5CisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1ZFUlJJREVfUFJFRkVSRU5DRSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dFN0cmluZygia2V5Iiwga2V5KTsKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uOWY1ODBhMyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03Myw0MyArNzMsNzMgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4Ci0gICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0xNC5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk1CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0yOS5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk2CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy04Lmh0bWwiIC8vIGhhbmdzIHRoZSBsYXlvdXQgdGVzdHMKKyAgICAgICAgLy8gaHR0cDovL2IvaXNzdWU/aWQ9Mjg4OTU5OAogICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCBmaWxsSWdub3JlUmVzdWx0TGlzdCgpIHsKLSAgICAgICAgLy8gVGhpcyBmaXJzdCBibG9jayBvZiB0ZXN0cyBhcmUgZm9yIEhUTUw1IGZlYXR1cmVzLCBmb3Igd2hpY2ggQW5kcm9pZAorICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgZmVhdHVyZXMgZm9yIHdoaWNoIEFuZHJvaWQKICAgICAgICAgLy8gc2hvdWxkIHBhc3MgYWxsIHRlc3RzLiBUaGV5IGFyZSBza2lwcGVkIG9ubHkgdGVtcG9yYXJpbHkuCiAgICAgICAgIC8vIFRPRE86IEZpeCB0aGVzZSBmYWlsaW5nIHRlc3RzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoaXMgbGlzdC4KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL2Jhc2ljLW11bHRpLXRvdWNoLWV2ZW50cy5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC90b3VjaC10YXJnZXQuaHRtbCIpOyAvLyBSZXF1aXJlcyBtdWx0aS10b3VjaAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9lbXB0eS1tYW5pZmVzdC5odG1sIik7IC8vIGZsYWt5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZhbGxiYWNrLmh0bWwiKTsgLy8gaHR0cDovL2IvaXNzdWU/aWQ9MjcxMzAwNAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9mb3JlaWduLWlmcmFtZS1tYWluLmh0bWwiKTsgLy8gZmxha3kgLSBza2lwcyBzdGF0ZXMKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvbWFuaWZlc3Qtd2l0aC1lbXB0eS1maWxlLmh0bWwiKTsgLy8gZmxha3kKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2hhc2gtY2hhbmdlLXdpdGgteGhyLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9vcGVuLWRhdGFiYXNlLWNyZWF0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCiAKLSAgICAgICAgLy8gV2lsbCBhbHdheXMgZmFpbAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3N2Zy9sZXZlbDMveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gdW5zdXBwb3J0ZWQgZmVhdHVyZXMuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC90b3VjaC1jb29yZHMtaW4tem9vbS1hbmQtc2Nyb2xsLmh0bWwiKTsgLy8gUmVxdWlyZXMgZXZlbnRTZW5kZXIuem9vbVBhZ2VJbigpLHpvb21QYWdlT3V0KCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9ldmVudHNvdXJjZS93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy94bWxodHRwcmVxdWVzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL2xvY2Fsc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL3Nlc3Npb25zdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2luZGV4ZWRkYiIpOyAvLyBpbmRleGVkZGIgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLXJlYWRvbmx5Lmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJ3ZWJzb2NrZXQvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKIAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gbWlzc2luZyBleHBlY3RlZCByZXN1bHRzCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvY2Fub25pY2FsZm9ybTA4LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvY2Fub25pY2FsZm9ybTA5LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZG9jdW1lbnRnZXRpbnB1dGVuY29kaW5nMDMueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9lbnRpdHlnZXRpbnB1dGVuY29kaW5nMDIueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9lbnRpdHlnZXR4bWx2ZXJzaW9uMDIueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA1LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwNy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDkueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTEwLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxMS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTUueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE3LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxOC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVsb29rdXBuYW1lc3BhY2V1cmkwMS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVsb29rdXBwcmVmaXgxOS54aHRtbCIpOworCiAgICAgICAgIC8vIFRPRE86IFRoZXNlIG5lZWQgdG8gYmUgdHJpYWdlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9jc3MvY2FzZS10cmFuc2Zvcm0uaHRtbCIpOyAvLyB3aWxsIG5vdCBmaXggIzYxOTcwNwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vRWxlbWVudC9vZmZzZXRMZWZ0LW9mZnNldFRvcC1ib2R5LXF1aXJrLmh0bWwiKTsgLy8gZGlmZmVyZW50IHNjcmVlbiBzaXplIHJlc3VsdCBpbiBleHRyYSBzcGFjZXMgaW4gQXBwbGUgY29tcGFyZWQgdG8gdXMKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy9QbHVnLWlucy5odG1sIik7IC8vIG5lZWQgdGVzdCBwbHVnaW4KLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctcHJvcGVydGllcy5odG1sIik7IC8vIHhzbHQgYW5kIHhwYXRoIGVsZW1lbnRzIG1pc3NpbmcgZnJvbSBwcm9wZXJ0eSBsaXN0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXNjcmVlbi1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcGl4ZWwgZGVwdGgKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3cteHktcHJvcGVydGllcy5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vYXR0cmlidXRlLW5hbWVzcGFjZXMtZ2V0LXNldC5odG1sIik7IC8vIGh0dHA6Ly9iLzczMzIyOQotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2MtOS5odG1sIik7IC8vIHJlcXVpcmVzIHhwYXRoIHN1cHBvcnQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2dsb2JhbC1jb25zdHJ1Y3RvcnMuaHRtbCIpOyAvLyByZXF1aXJlcyB4c2x0IGFuZCB4cGF0aCBzdXBwb3J0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9vYmplY3QtZW1iZWQtcGx1Z2luLXNjcmlwdGluZy5odG1sIik7IC8vIGR5bmFtaWMgcGx1Z2lucyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS90YWJpbmRleC1jbGFtcC5odG1sIik7IC8vIHRoZXJlIGlzIGV4dHJhIHNwYWNpbmcgaW4gdGhlIGZpbGUgZHVlIHRvIG11bHRpcGxlIGlucHV0IGJveGVzIGZpdHRpbmcgb24gb25lIGxpbmUgb24gQXBwbGUsIG91cnMgYXJlIHdyYXBwZWQuIFNwYWNlIGF0IGxpbmUgZW5kcyBhcmUgc3RyaXBwZWQuCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy9hbmNob3ItaW1hZ2Utc2Nyb2xsZWQteC15Lmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCkBAIC0xNzIsOCArMjAyLDYgQEAKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvcmVwbGFjZWQvaW1hZ2UtbWFwLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3RleHQvcGxhaW4tdGV4dC1saW5lLWJyZWFrcy5odG1sIik7IC8vIGV4dHJhIHNwYWNpbmcgYmVjYXVzZSBpRnJhbWVzIHJlbmRlcmVkIG5leHQgdG8gZWFjaCBvdGhlciBvbiBBcHBsZQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgicHJvZmlsZXIiKTsgLy8gcHJvZmlsZXIgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3ZnIik7IC8vIHN2ZyBpcyBub3Qgc3VwcG9ydGVkCi0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCmluZGV4IDZjZmNlNDEuLjVkMzRlMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQpAQCAtNDksOCArNDksMTMgQEAKICAgICAgICAgLy9ubyBjcmVhdGlvbiBvZiBpbnN0YW5jZXMKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAogICAgICAgICAgICAgU3RyaW5nIGRpciwgYm9vbGVhbiBpZ25vcmVSZXN1bHRzSW5EaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIExvZy52KExPR1RBRywgIlNlYXJjaGluZyB0ZXN0cyB1bmRlciAiICsgZGlyKTsKIAogICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShkaXIpOwpAQCAtNjgsNyArNzMsNyBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgdGVzdCBkaXJlY3RvcnksIHdlIGRvbid0IHJlY3Vyc2UgaW50byBpdC4KICAgICAgICAgICAgICAgICBpZiAoIUZpbGVGaWx0ZXIuaXNOb25UZXN0RGlyKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY3Vyc2luZyBvbiAiICsgcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdENvdW50ICs9IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzksNyArODQsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmh0bWwiKSB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKSkKKyAgICAgICAgICAgIGlmICgocy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaHRtbCIpCisgICAgICAgICAgICAgICAgICAgIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpCisgICAgICAgICAgICAgICAgICAgIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhodG1sIikpCiAgICAgICAgICAgICAgICAgICAgICYmICFzLmVuZHNXaXRoKCJURU1QTEFURS5odG1sIikpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZWNvcmRpbmcgIiArIHMpOwogICAgICAgICAgICAgICAgIGJvcy53cml0ZShzLmdldEJ5dGVzKCkpOwpAQCAtODgsOCArOTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCgiIElHTk9SRV9SRVNVTFQiKS5nZXRCeXRlcygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCdcbicpOworICAgICAgICAgICAgICAgIHRlc3RDb3VudCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRlc3RTdGF0dXMoU3RyaW5nIHN0YXR1c0ZpbGUsIFN0cmluZyBzKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCmluZGV4IDkyMzYzNDUuLjliZTJmMWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCkBAIC0xOCwyOSArMTgsMzAgQEAKIAogcHVibGljIGludGVyZmFjZSBMYXlvdXRUZXN0Q29udHJvbGxlciB7CiAKLQlwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCk7Ci0JcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpOwotCXB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKTsKLQkKLQkvLyBGb3JjZSBhIHJlZHJhdyBvZiB0aGUgcGFnZQotCXB1YmxpYyB2b2lkIGRpc3BsYXkoKTsKLQkvLyBVc2VkIHdpdGggcGl4ZWwgZHVtcHMgb2YgY29udGVudAotCXB1YmxpYyB2b2lkIHRlc3RSZXBhaW50KCk7Ci0JCi0JLy8gSWYgdGhlIHBhZ2UgdGl0bGUgY2hhbmdlcywgYWRkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb3V0cHV0LgotCXB1YmxpYyB2b2lkIGR1bXBUaXRsZUNoYW5nZXMoKTsKLQlwdWJsaWMgdm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KCk7Ci0JcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKTsKLQlwdWJsaWMgdm9pZCBkdW1wRWRpdGluZ0NhbGxiYWNrcygpOwotCQotCS8vIFNob3cvSGlkZSB3aW5kb3cgZm9yIHdpbmRvdy5vbkJsdXIoKSB0ZXN0aW5nCi0JcHVibGljIHZvaWQgc2V0V2luZG93SXNLZXkoYm9vbGVhbiBiKTsKLQkvLyBNYWMgZnVuY3Rpb24sIHVzZWQgdG8gZGlzYWJsZSBldmVudHMgZ29pbmcgdG8gdGhlIHdpbmRvdwotCXB1YmxpYyB2b2lkIHNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoYm9vbGVhbiBiKTsKLQkKLQlwdWJsaWMgdm9pZCBkdW1wU2VsZWN0aW9uUmVjdCgpOwotCQotCS8vIGludmFsaWRhdGUgYW5kIGRyYXcgb25lIGxpbmUgYXQgYSB0aW1lIG9mIHRoZSB3ZWIgdmlldy4KKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0cyk7CisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKTsKKworICAgIC8vIEZvcmNlIGEgcmVkcmF3IG9mIHRoZSBwYWdlCisgICAgcHVibGljIHZvaWQgZGlzcGxheSgpOworICAgIC8vIFVzZWQgd2l0aCBwaXhlbCBkdW1wcyBvZiBjb250ZW50CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGFpbnQoKTsKKworICAgIC8vIElmIHRoZSBwYWdlIHRpdGxlIGNoYW5nZXMsIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KKyAgICBwdWJsaWMgdm9pZCBkdW1wVGl0bGVDaGFuZ2VzKCk7CisgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpOworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKCk7CisgICAgcHVibGljIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoKTsKKworICAgIC8vIFNob3cvSGlkZSB3aW5kb3cgZm9yIHdpbmRvdy5vbkJsdXIoKSB0ZXN0aW5nCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93SXNLZXkoYm9vbGVhbiBiKTsKKyAgICAvLyBNYWMgZnVuY3Rpb24sIHVzZWQgdG8gZGlzYWJsZSBldmVudHMgZ29pbmcgdG8gdGhlIHdpbmRvdworICAgIHB1YmxpYyB2b2lkIHNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoYm9vbGVhbiBiKTsKKworICAgIHB1YmxpYyB2b2lkIGR1bXBTZWxlY3Rpb25SZWN0KCk7CisKKyAgICAvLyBpbnZhbGlkYXRlIGFuZCBkcmF3IG9uZSBsaW5lIGF0IGEgdGltZSBvZiB0aGUgd2ViIHZpZXcuCiAgICAgcHVibGljIHZvaWQgcmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5KCk7CiAgICAgCiAgICAgLy8gSGlzdG9yeSB0ZXN0aW5nIGZ1bmN0aW9ucwpAQCAtNjcsNCArNjgsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdyk7CiAKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7CisKKyAgICAvLyBGb3IgWFNTQXVkaXRvciB0ZXN0cworICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZyk7CisKKyAgICAvLyBGb3IgRGV2aWNlT3JpZW50YXRpb24gdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCmluZGV4IDljY2Y1NDkuLjEzMmYxN2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQpAQCAtMjAsOSArMjAsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5BZGJVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZpY2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTU4LDE4ICsxNTYsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBtSnNFbmdpbmU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RQYXRoUHJlZml4OwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisgICAgcHJpdmF0ZSBpbnQgbVRlc3RDb3VudDsKKyAgICBwcml2YXRlIGludCBtUmVzdW1lSW5kZXg7CiAKICAgICBwdWJsaWMgTGF5b3V0VGVzdHNBdXRvVGVzdCgpIHsKLSAgICAgIHN1cGVyKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSIsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBsYXlvdXQgdGVzdCB0bwotICAgIC8vIEFtIHN0YXR1cyBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSBhIHNjcmlwdC4KLSAgICBwcml2YXRlIHZvaWQgcGFzc09yRmFpbENhbGxiYWNrKFN0cmluZyBmaWxlLCBib29sZWFuIHJlc3VsdCkgewotICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3QgPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICBidW5kbGUucHV0Qm9vbGVhbihmaWxlLCByZXN1bHQpOwotICAgICAgaW5zdC5zZW5kU3RhdHVzKDAsIGJ1bmRsZSk7CisgICAgICBzdXBlcihUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdldFRlc3RMaXN0KCkgewpAQCAtMTkwLDYgKzE4MSw3IEBACiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIHRlc3QgbGlzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KKyAgICAgICAgbVRlc3RDb3VudCA9IG1UZXN0TGlzdC5zaXplKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3VtZVRlc3RMaXN0KCkgewpAQCAtMjAwLDYgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1UZXN0TGlzdC5lbGVtZW50QXQoaSkuZXF1YWxzKGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihtVGVzdExpc3Quc3ViTGlzdChpKzEsIG1UZXN0TGlzdC5zaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RMaXN0SWdub3JlUmVzdWx0ID0gbmV3IFZlY3RvcjxCb29sZWFuPihtVGVzdExpc3RJZ25vcmVSZXN1bHQuc3ViTGlzdChpKzEsIG1UZXN0TGlzdElnbm9yZVJlc3VsdC5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlc3VtZUluZGV4ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzMiwxNCArMjI1LDIyIEBACiAgICAgICAgIC8vIFRoZSBnZW5lcmljIHJlc3VsdCBpcyBhdCA8cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICAvLyBGaXJzdCB0cnkgdGhlIEFuZHJvaWQtc3BlY2lmaWMgcmVzdWx0IGF0CiAgICAgICAgIC8vIHBsYXRmb3JtL2FuZHJvaWQtPGpzLWVuZ2luZT4vPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKKyAgICAgICAgLy8gdGhlbgorICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CiAgICAgICAgIGludCBwb3MgPSB0ZXN0Lmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgIGlmIChwb3MgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU3RyaW5nIGdlbmVyaWNFeHBlY3RlZFJlc3VsdCA9IHRlc3Quc3Vic3RyaW5nKDAsIHBvcykgKyAiLWV4cGVjdGVkLnR4dCI7CiAgICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQtIiArIG1Kc0VuZ2luZSArICIvIjsKLSAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULCBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBpZiAoZi5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQ7CisgICAgICAgIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIgPSAicGxhdGZvcm0vYW5kcm9pZC8iOworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPSBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULAorICAgICAgICAgICAgICAgIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CisgICAgICAgIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOwogICAgICAgICByZXR1cm4gZi5leGlzdHMoKSA/IGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA6IGdlbmVyaWNFeHBlY3RlZFJlc3VsdDsKICAgICB9CiAKQEAgLTMwMCw3ICszMDEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0KSB7CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0LCBpbnQgdGVzdE51bWJlcikgewogICAgICAgICBhY3Rpdml0eS5zZXRDYWxsYmFjayhuZXcgVGVzdFNoZWxsQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKExheW91dFRlc3RzQXV0b1Rlc3QudGhpcykgewpAQCAtMzM2LDYgKzMzNyw5IEBACiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgRnNVdGlscy5nZXRUZXN0VXJsKHRlc3QpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlJFU1VMVF9GSUxFLCByZXN1bHRGaWxlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRJTUVPVVRfSU5fTUlMTElTLCB0aW1lb3V0KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIG1UZXN0Q291bnQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgdGVzdE51bWJlcik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5TVE9QX09OX1JFRl9FUlJPUiwgdHJ1ZSk7CiAgICAgICAgIGFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKIAogICAgICAgICAvLyBXYWl0IHVudGlsIGRvbmUuCkBAIC0zNzUsOCArMzc5LDggQEAKICAgICAgICAgLy8gUmVhZCBzZXR0aW5ncwogICAgICAgICBtVGVzdFBhdGhQcmVmaXggPSAobmV3IEZpbGUoTEFZT1VUX1RFU1RTX1JPT1QgKyBydW5uZXIubVRlc3RQYXRoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIG1SZWJhc2VsaW5lUmVzdWx0cyA9IHJ1bm5lci5tUmViYXNlbGluZTsKLSAgICAgICAgLy8gSlNDIGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgotICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAianNjIiA6IHJ1bm5lci5tSnNFbmdpbmU7CisgICAgICAgIC8vIFY4IGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgorICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAidjgiIDogcnVubmVyLm1Kc0VuZ2luZTsKIAogICAgICAgICBpbnQgdGltZW91dCA9IHJ1bm5lci5tVGltZW91dEluTWlsbGlzOwogICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7CkBAIC0zOTMsNyArMzk3LDcgQEAKICAgICAgICAgICAgIHJlc3VtZVRlc3RMaXN0KCk7CiAKICAgICAgICAgVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQpOworICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5FWFRfUkVQUik7CiAKICAgICAgICAgLy8gUnVuIHRlc3RzLgogICAgICAgICBpbnQgYWRkciA9IC0xOwpAQCAtNDEwLDcgKzQxNCw5IEBACiAgICAgICAgICAgICBib29sZWFuIGlnbm9yZVJlc3VsdCA9IG1UZXN0TGlzdElnbm9yZVJlc3VsdC5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBGc1V0aWxzLnVwZGF0ZVRlc3RTdGF0dXMoVEVTVF9TVEFUVVNfRklMRSwgcyk7CiAgICAgICAgICAgICAvLyBSdW4gdGVzdHMKLSAgICAgICAgICAgIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKGFjdGl2aXR5LCBzLCBydW5uZXIubVRpbWVvdXRJbk1pbGxpcywgaWdub3JlUmVzdWx0KTsKKyAgICAgICAgICAgIC8vIGkgaXMgMCBiYXNlZCwgYnV0IHRlc3QgY291bnQgaXMgMSBiYXNlZCBzbyBhZGQgMSB0byBpIGhlcmUuCisgICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgaSArIDEgKyBtUmVzdW1lSW5kZXgpOwogICAgICAgICB9CiAKICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsICIjRE9ORSIpOwpAQCAtNDM1LDcgKzQ0MSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgZ2V0VGVzdFBhdGgoKSwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKaW5kZXggOWM0YjU3MjU2Li4wYjAwZDY1IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKQEAgLTUzLDI5ICs1MywzOCBAQAogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgImZpbGU6Ly8iICsgZmlsZW5hbWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgMSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAxKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShTdHJpbmcgcGF0aCwgYm9vbGVhbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0TGlzdChwYXRoKTsKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlVJX0FVVE9fVEVTVCwgTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCB0ZXN0Q291bnQpOworICAgICAgICAvLyBUZXN0U2hlbGxBY3Rpdml0eSB3aWxsIHByb2Nlc3MgdGhpcyBpbnRlbnQgb25jZSBhbmQgaW5jcmVtZW50IHRoZSB0ZXN0IGluZGV4CisgICAgICAgIC8vIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdCB0ZXN0LCBzbyBwYXNzIDAgaGVyZSB0byBhbGxvdyBmb3IgdGhhdC4KKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIDApOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdExpc3QoU3RyaW5nIHBhdGgpIHsKKyAgICBwcml2YXRlIGludCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBwYXRoLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICB0ZXN0Q291bnQgPSBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseSgKKyAgICAgICAgICAgICAgICAgICAgYm9zLCBwYXRoLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCiAgICAgICAgICAgICBib3MuZmx1c2goKTsKICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkVycm9yIHdoZW4gY3JlYXRpbmcgdGVzdCBsaXN0OiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KKyAgICAgICByZXR1cm4gdGVzdENvdW50OwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQppbmRleCA3NDc1NzE5Li5kYjA3NmRhIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQpAQCAtMzUsNiArMzUsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOwogaW1wb3J0IGFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5Kc1Byb21wdFJlc3VsdDsKQEAgLTk5LDYgKzEwMSw4IEBACiAgICAgICAgIExvZy52KExPR1RBRywgIm1lc3NhZ2Ugc2VudCB0byBXZWJWaWV3IHRvIGR1bXAgdGV4dC4iKTsKICAgICAgICAgc3dpdGNoIChtRHVtcERhdGFUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIERVTVBfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcxID0gbUR1bXBUb3BGcmFtZUFzVGV4dCA/IDEgOiAwOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFyZzIgPSBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuZG9jdW1lbnRBc1RleHQoY2FsbGJhY2spOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFWFRfUkVQUjoKQEAgLTExNyw2ICsxMjEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MpOwogCiAgICAgICAgIExpbmVhckxheW91dCBjb250ZW50VmlldyA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CiAgICAgICAgIGNvbnRlbnRWaWV3LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CkBAIC0xNDUsNiArMTUwLDkgQEAKICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtV2ViVmlldy51c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE1OSw2ICsxNjcsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gaW50ZW50LmdldEludEV4dHJhKFRPVEFMX1RFU1RfQ09VTlQsIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIG1DdXJyZW50VGVzdE51bWJlciA9IGludGVudC5nZXRJbnRFeHRyYShDVVJSRU5UX1RFU1RfTlVNQkVSLCBtQ3VycmVudFRlc3ROdW1iZXIpOworCiAgICAgICAgIG1UZXN0VXJsID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFRFU1RfVVJMKTsKICAgICAgICAgaWYgKG1UZXN0VXJsID09IG51bGwpIHsKICAgICAgICAgICAgIG1VaUF1dG9UZXN0UGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShVSV9BVVRPX1RFU1QpOwpAQCAtMTcyLDYgKzE4MywxMSBAQAogICAgICAgICBtVGltZW91dEluTWlsbGlzID0gaW50ZW50LmdldEludEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAwKTsKICAgICAgICAgbUdldERyYXd0aW1lID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShHRVRfRFJBV19USU1FLCBmYWxzZSk7CiAgICAgICAgIG1TYXZlSW1hZ2VQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFNBVkVfSU1BR0UpOworICAgICAgICBtU3RvcE9uUmVmRXJyb3IgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFNUT1BfT05fUkVGX0VSUk9SLCBmYWxzZSk7CisgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCltQ3VycmVudFRlc3ROdW1iZXIgLyBtVG90YWxUZXN0Q291bnQ7CisgICAgICAgIGludCBwcm9ncmVzcyA9IChpbnQpKHJhdGlvICogV2luZG93LlBST0dSRVNTX0VORCk7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVJbnQoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MsIHByb2dyZXNzKTsKIAogICAgICAgICBMb2cudihMT0dUQUcsICIgIExvYWRpbmcgIiArIG1UZXN0VXJsKTsKICAgICAgICAgbVdlYlZpZXcubG9hZFVybChtVGVzdFVybCk7CkBAIC0yMzcsNiArMjUzLDcgQEAKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh1cmwpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsICsrbUN1cnJlbnRUZXN0TnVtYmVyKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAxMDAwMCk7CiAgICAgICAgIGV4ZWN1dGVJbnRlbnQoaW50ZW50KTsKICAgICB9CkBAIC0zMjksMTQgKzM0NiwyOSBAQAogCiAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgICAgLy8gTGF5b3V0VGVzdENvbnRyb2xsZXIgRnVuY3Rpb25zCi0gICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0cykgeworICAgICAgICAvLyBBZGRlZCBhZnRlciB3ZWJraXQgdXBkYXRlIHRvIHI2Mzg1OS4gU2VlIHRyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvNjM3MzAuCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdHMgPT0gdHJ1ZSkgbm90IGltcGxlbWVudGVkIG9uIEFuZHJvaWQhIik7CisgICAgICAgIH0KKwogICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBUb3BGcmFtZUFzVGV4dCA9IHRydWU7CiAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQXNUZXh0IGNhbGxlZDogIit1cmwpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IHRydWU7CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQ2hpbGRGcmFtZXNBc1RleHQgY2FsbGVkOiAiK3VybCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgewogICAgICAgICBtV2FpdFVudGlsRG9uZSA9IHRydWU7CiAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKQEAgLTM0OCw3ICszODAsOSBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJub3RpZnlEb25lIGNhbGxlZDogIiArIHVybCk7CiAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgewogICAgICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DaHJvbWVDbGllbnQub25Qcm9ncmVzc0NoYW5nZWQobVdlYlZpZXcsIDEwMSk7CisgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRXZWJLaXREYXRhICYmICFtVGltZWRPdXQgJiYgIWZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00NjMsNiArNDk3LDEyIEBACiAgICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb24gPSBhbGxvdzsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1XZWJWaWV3LnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgbG9vayB1cCB0aGUgY29ycmVjdCBXZWJWaWV3IGZvciB0aGUgZnJhbWUgd2hpY2gKICAgICAgICAgLy8gY2FsbGVkIHRoZSBsYXlvdXRUZXN0Q29udHJvbGxlciBtZXRob2QuIEN1cnJlbnRseSwgd2UganVzdCB1c2UgdGhlCkBAIC00NzMsNiArNTEzLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZCAoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3Q2xpZW50IG1WaWV3Q2xpZW50ID0gbmV3IFdlYlZpZXdDbGllbnQoKXsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewpAQCAtNDkwLDExICs1MzQsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZHJhd1BhZ2VUb0ZpbGUobVNhdmVJbWFnZVBhdGggKyAiLyIgKyBuYW1lICsgIi5wbmciLCBtV2ViVmlldyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBDYWxsaW5nIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSd2ZSBtZXQgYWxsIHRoZSBjb25kaXRpb25zIGZvciBjb21wbGV0aW5nCi0gICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LiBPdGhlcndpc2Ugd2UgYXNrIFdlYkNvcmUgdG8KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3ZWJraXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IGFscmVhZHkgdGltZWQgb3V0OiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CiAgICAgICAgIH0KIApAQCAtNTM2LDQ0ICs1OTksOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQgbUNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgewotCi0gICAgICAgICAgICAvLyBub3RpZnlEb25lIGNhbGxzIHRoaXMgd2l0aCAxMDElLiBXZSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoaXMgZmxhZyBpZiB0aGlzCi0gICAgICAgICAgICAvLyBpcyB0aGUgcmVhbCBjYWxsIGZyb20gV2ViQ29yZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA9PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdpdGggdGhlIGZsYWcgdXBkYXRlZCwgd2UgY2FuIG5vdyBwcm9jZWVkIGFzIG5vcm1hbCB3aGV0aGVyIHRoZSBwcm9ncmVzcyB1cGRhdGUgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBXZWJDb3JlIG9yIG5vdGlmeURvbmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlIGFyZSByZWFkeSB0byBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgYW5kIGRvIHNvIGlmIHdlIGFyZS4KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtVGltZWRPdXQgJiYgIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkZpbmlzaGVkOiAiKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiVGltZWQgb3V0IGJlZm9yZSBmaW5pc2hpbmc6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYWl0VW50aWxEb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJXYWl0aW5nIGZvciBub3RpZnlEb25lOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVxdWVzdGVkIHdlYmtpdCBkYXRhIHJlYWR5OiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoV2ViVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IDMwKQotICAgICAgICAgICAgICAgIHRpdGxlID0gIi4uLiIrdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpLTMwKTsKLSAgICAgICAgICAgIHNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQgKyAiOiAiKyB0aXRsZSk7CiAgICAgICAgICAgICBpZiAobUR1bXBUaXRsZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCgiVElUTEUgQ0hBTkdFRDogIik7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQodGl0bGUpOwpAQCAtNjc2LDE1ICs3MDMsMjggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbnNvbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIiArIGNvbnNvbGVNZXNzYWdlLmxpbmVOdW1iZXIoKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iOwogICAgICAgICAgICAgaWYgKG1Db25zb2xlTWVzc2FnZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29uc29sZU1lc3NhZ2UgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaW5lTnVtYmVyICsiOiAiKyBtZXNzYWdlICsiXG4iOwotICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQoY29uc29sZU1lc3NhZ2UpOwotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiK2NvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKG1zZyk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIgKyBtc2cpOworICAgICAgICAgICAgLy8gdGhlIHJhdGlvbmFsZSBoZXJlIGlzIHRoYXQgaWYgdGhlcmUncyBhbiBlcnJvciBvZiBlaXRoZXIgdHlwZSwgYW5kIHRoZSB0ZXN0IHdhcworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIm5vdGlmeURvbmUiIHNpZ25hbCB0byBmaW5pc2gsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nCisgICAgICAgICAgICAvLyBhbnltb3JlIGJlY2F1c2UgdGhlIEpTIGV4ZWN1dGlvbiBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYXQgdGhpcyBwb2ludCBhbmQgYQorICAgICAgICAgICAgLy8gIm5vdGlmeURvbmUiIHdpbGwgbmV2ZXIgY29tZSBvdXQgc28gaXQncyBqdXN0IHdhc3RpbmcgdGltZSB0aWxsIHRpbWVvdXQga2lja3MgaW4KKyAgICAgICAgICAgIGlmICgobXNnLmNvbnRhaW5zKCJVbmNhdWdodCBSZWZlcmVuY2VFcnJvcjoiKSB8fCBtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFR5cGVFcnJvcjoiKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhaXRVbnRpbERvbmUgJiYgbVN0b3BPblJlZkVycm9yKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGVybWluYXRpbmcgdGVzdCBjYXNlIG9uIHVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yIG9yIFR5cGVFcnJvci4iKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzIzLDEzICs3NjMsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ld1dpbmRvd1dlYlZpZXcgZXh0ZW5kcyBXZWJWaWV3IHsKICAgICAgICAgcHVibGljIE5ld1dpbmRvd1dlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzSWZhY2VzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcyk7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcywgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGVzdFN0YXR1cygpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IG1EZWZhdWx0RHVtcERhdGFUeXBlOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gZmFsc2U7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIG1EdW1wVGl0bGVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgIG1SZXF1ZXN0ZWRXZWJLaXREYXRhID0gZmFsc2U7CkBAIC03MzksMTAgKzc4MSwxMCBAQAogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaFBvaW50cygpOwogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaE1ldGFTdGF0ZSgpOwogICAgICAgICBtUGFnZUZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBmYWxzZTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBudWxsOworICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3MobVdlYlZpZXcpOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZ1tdIGdldERyYXdXZWJWaWV3VGltZShXZWJWaWV3IHZpZXcsIGludCBjb3VudCkgewpAQCAtNzc5LDcgKzgyMSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVUb05leHRUZXN0KCkgewotICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OworICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cFdlYlZpZXdGb3JMYXlvdXRUZXN0cyhXZWJWaWV3IHdlYnZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgewpAQCAtNzg3LDYgKzgyOSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKHdlYnZpZXcpOworCisgICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOworICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOworICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFdlYlNldHRpbmdzKFdlYlZpZXcgd2VidmlldykgewogICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IHdlYnZpZXcuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwpAQCAtNzk5LDE1ICs4NTQsNyBAQAogICAgICAgICBzZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLDApLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKLSAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKLSAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldwotICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQotICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgotICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAotICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgotICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgICAgICBzZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OwpAQCAtODI0LDYgKzg3MSw5IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNhdmVJbWFnZVBhdGg7CiAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBtVGVzdExpc3RSZWFkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZXREcmF3dGltZTsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtYmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcE9uUmVmRXJyb3I7CiAKICAgICAvLyBTdGF0ZXMKICAgICBwcml2YXRlIGJvb2xlYW4gbVRpbWVkT3V0OwpAQCAtODMzLDYgKzg4Myw4IEBACiAgICAgLy8gTGF5b3V0IHRlc3QgY29udHJvbGxlciB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbUR1bXBEYXRhVHlwZTsKICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRGVmYXVsdER1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5FWFRfUkVQUjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUb3BGcmFtZUFzVGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRVbnRpbERvbmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVGl0bGVDaGFuZ2VzOwogICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1UaXRsZUNoYW5nZXM7CkBAIC04NDYsNyArODk4LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtUGFnZUZpbmlzaGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX1NUUiA9ICIqKlRlc3QgdGltZW91dCI7CiAKQEAgLTg2MSw2ICs5MTIsOSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQVVUT19URVNUID0gIlVpQXV0b1Rlc3QiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0RSQVdfVElNRSA9ICJHZXREcmF3VGltZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lNQUdFID0gIlNhdmVJbWFnZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUT1RBTF9URVNUX0NPVU5UID0gIlRlc3RDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1RFU1RfTlVNQkVSID0gIlRlc3ROdW1iZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUF9PTl9SRUZfRVJST1IgPSAiU3RvcE9uUmVmZXJlbmNlRXJyb3IiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFXX1JVTlMgPSA1OwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV19USU1FX0xPRyA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkYmI0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBkaWZmX21hdGNoX3BhdGNoCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBEdW1wUmVuZGVyVHJlZTIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBjNGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudWkuRGlyTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSAyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siIGlzIHRoZXJlIHNvIHdlIG9ubHkgaGF2ZSBhIG9uZSBpbnN0YW5jZQorICAgICAgICAgICAgIG9mIHRoaXMgYWN0aXZpdHkuIEhvd2V2ZXIsIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGV4YWN0bHkgbGlrZSBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgYmVjYXVzZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBhcHBsaWNhdGlvbiBzdWdnZXN0CisgICAgICAgICAgICAgdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0YXNrIGZvciBhbGwgMyBhY3Rpdml0aWVzLiBXZSBkb24ndCB1bmRlcnN0YW5kCisgICAgICAgICAgICAgaG93IGV4YWN0bHkgaXQgYWxsIHdvcmtzLCBidXQgYXQgdGhlIG1vbWVudCBpdCB3b3JrcyBqdXN0IGZpbmUuCisgICAgICAgICAgICAgSXQgY2FuIGxlYWQgdG8gc29tZSB3ZWlyZCBiZWhhdmlvdXIgaW4gdGhlIGZ1dHVyZS4gLS0+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UZXN0c0xpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzJyBsaXN0IGFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF5b3V0VGVzdHNFeGVjdXRvciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cycgZXhlY3V0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpleGVjdXRvciI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJNYW5hZ2VyU2VydmljZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cyBzY3JpcHQgcnVubmVyIiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NEQ0FSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+Cis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNkOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsNjUgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wZW5zIGh0bWwgZGV0YWlscyBpbiB0aGUgZGVmYXVsdCBicm93c2VyLgorCisgIFVzYWdlOgorICAgIHJ1bl9sYXlvdXRfdGVzdHMucHkgUEFUSAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgd2ViYnJvd3NlcgoraW1wb3J0IHRlbXBmaWxlCisKKyNUT0RPOiBUaGVzZSBzaG91bGQgbm90IGJlIGhhcmRjb2RlZAorUkVTVUxUU19BQlNPTFVURV9QQVRIID0gIi9zZGNhcmQvYW5kcm9pZC9MYXlvdXRUZXN0cy1yZXN1bHRzLyIKK0RFVEFJTFNfSFRNTCA9ICJkZXRhaWxzLmh0bWwiCitTVU1NQVJZX1RYVCA9ICJzdW1tYXJ5LnR4dCIKKworZGVmIG1haW4oKToKKyAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgcGF0aCA9IHN5cy5hcmd2WzFdCisgIGVsc2U6CisgICAgcGF0aCA9ICIiCisKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorCisgIHRtcGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorCisgICMgUnVuIHRoZSB0ZXN0cyBpbiBwYXRoCisgIGNtZCA9ICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAiCisgIGNtZCArPSAiLWUgY2xhc3MgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU3RhcnRlciNzdGFydExheW91dFRlc3RzICIKKyAgY21kICs9ICItZSBwYXRoIFwiIiArIHBhdGggKyAiXCIgIgorICBjbWQgKz0iLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJhZGIgcHVsbCAiICsgUkVTVUxUU19BQlNPTFVURV9QQVRIICsgU1VNTUFSWV9UWFQgKyAiICIgKyBzdW1tYXJ5X3R4dF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gImFkYiBwdWxsICIgKyBSRVNVTFRTX0FCU09MVVRFX1BBVEggKyBERVRBSUxTX0hUTUwgKyAiICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGgKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKCkKKworICAjIFByaW50IHN1bW1hcnkgdG8gY29uc29sZQorICBsb2dnaW5nLmluZm8oIkFsbCBkb25lLlxuIikKKyAgY21kID0gImNhdCAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGgKKyAgb3Muc3lzdGVtKGNtZCkKKyAgbG9nZ2luZy5pbmZvKCIiKQorCisgICMgT3BlbiB0aGUgYnJvd3NlciB3aXRoIHN1bW1hcnkKKyAgd2ViYnJvd3Nlci5vcGVuKGRldGFpbHNfaHRtbF90bXBfcGF0aCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2ZjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTc4YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4MHB4IgorICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNXB4IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjBweCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQxZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4OTMwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnQgYSByZXN1bHQgb2YgdGhlIHRlc3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdCdzCisgKiByYXcgZGF0YSBhbmQgZ2VuZXJhdGluZyBpdHMgb3duIGRpZmYgaW4gSFRNTCBmb3JtYXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QWJzdHJhY3RSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSB7CisgICAgICAgIFBBU1MoIlBhc3NlZCIpLAorICAgICAgICBGQUlMX1JFU1VMVF9ESUZGRVJTKCJSZXN1bHQgZGlmZmVycyIpLAorICAgICAgICBGQUlMX05PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIEZBSUxfVElNRURfT1VUKCJUaW1lZCBvdXQiKSwKKyAgICAgICAgRkFJTF9DUkFTSEVEKCJDcmFzaGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgICAgIHByaXZhdGUgUmVzdWx0Q29kZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFic3RyYWN0UmVzdWx0IGFub3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcpIHsKKyAgICAgICAgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgcmVzdWx0IG9iamVjdCBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgZnJvbSB0aGUgd2VidmlldworICAgICAqIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBmb3JtYXQgdGhhdCBzdWl0cyBpdHNlbGYgYmVzdHMuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KKyAgICAgKiBUaGUgbWVzc2FnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaXMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gaXRzIHRhcmdldAorICAgICAqIHdoZW4gdGhlIHJlc3VsdCBmaW5pc2hlcyBvYnRhaW5pbmcgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJ2aWV3CisgICAgICogQHBhcmFtIHJlc3VsdE9idGFpbmVkTXNnCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIGltYWdlIGRhdGEgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgZGlzay4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogPHA+IFNvbWUgdGVzdHMgd2lsbCBub3QgcHJvdmlkZSBkYXRhIChsaWtlIHRleHQgdGVzdHMpCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICByZXN1bHRzIGltYWdlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIHRleHQgZGF0YS4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgcmVzdWx0cyB0ZXh0IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvZGUgb2YgdGhpcyByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgY29kZSBvZiB0aGlzIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRlc3RUeXBlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHRoYXQgcHJlc2VudHMgYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIGEgcmVzdWx0IGFuZAorICAgICAqIHRoZSBleHBlY3RlZCByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIHBpZWNlIG9mIEhUTUwgY29kZSB3aXRoIGEgdmlzdWFsIGRpZmYgYmV0d2VlbiB0aGUgcmVzdWx0IGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaWZmQXNIdG1sKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVuZGxlIGdldEJ1bmRsZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2E2MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgc3RvcmVzIGNvbnNvbGVzIG1lc3NhZ2VzLCBkYXRhYmFzZSBjYWxsYmFja3MsIGFsZXJ0IG1lc3NhZ2VzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsVGV4dE91dHB1dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRkaXRpb25hbFRleHRPdXRwdXQiOworCisgICAgLyoqCisgICAgICogT3JkZXJpbmcgb2YgZW51bXMgaXMgaW1wb3J0YW50IGFzIGl0IGRldGVybWluZXMgb3JkZXJpbmcgb2YgdGhlIHRvU3RyaW5nIG1ldGhvZCEKKyAgICAgKiBTdHJpbmdCdWlsZGVycyB3aWxsIGJlIHByaW50ZWQgaW4gdGhlIG9yZGVyIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIGFwcGVhciBoZXJlLgorICAgICAqLworICAgIHByaXZhdGUgZW51bSBPdXRwdXRUeXBlIHsKKyAgICAgICAgSlNfRElBTE9HLAorICAgICAgICBFWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFLAorICAgICAgICBDT05TT0xFX01FU1NBR0U7CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlcltdIG1PdXRwdXRzID0gbmV3IFN0cmluZ0J1aWxkZXJbT3V0cHV0VHlwZS52YWx1ZXMoKS5sZW5ndGhdOworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUgb3V0cHV0VHlwZSkgeworICAgICAgICBpbnQgaW5kZXggPSBvdXRwdXRUeXBlLm9yZGluYWwoKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzW2luZGV4XSA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0cHV0c1tpbmRleF0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtT3V0cHV0c1tpbmRleF07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kRXhjZWVkZWREYlF1b3RhTWVzc2FnZShTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5FWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFKTsKKworICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSAiIjsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgaW50IHBvcnQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgICAgICAgICAgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgICAgIGhvc3QgPSB1cmwuZ2V0SG9zdCgpOworICAgICAgICAgICAgaWYgKHVybC5nZXRQb3J0KCkgPiAtMSkgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1cmwuZ2V0UG9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OmFwcGVuZERhdGFiYXNlQ2FsbGJhY2siLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJVSSBERUxFR0FURSBEQVRBQkFTRSBDQUxMQkFDSzogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQoImV4Y2VlZGVkRGF0YWJhc2VRdW90YUZvclNlY3VyaXR5T3JpZ2luOnsiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChwcm90b2NvbCArICIsICIgKyBob3N0ICsgIiwgIiArIHBvcnQgKyAifSAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZGF0YWJhc2U6IiArIGRhdGFiYXNlSWRlbnRpZmllciArICJcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5DT05TT0xFX01FU1NBR0UpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiICsgY29uc29sZU1lc3NhZ2UubGluZU51bWJlcigpKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiOiAiICsgY29uc29sZU1lc3NhZ2UubWVzc2FnZSgpICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNBbGVydChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUuSlNfRElBTE9HKTsKKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJBTEVSVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNDb25maXJtKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTkZJUk06ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZEpzUHJvbXB0KFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlBST01QVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIiwgZGVmYXVsdCB0ZXh0OiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChkZWZhdWx0VmFsdWUpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3V0cHV0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1PdXRwdXRzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzkzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDcmFzaGVkRHVtbXlSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFJlc3VsdCB7CisgICAgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICBwdWJsaWMgQ3Jhc2hlZER1bW15UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworICAgICAgICAvKiogVE9ETzogICovCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlmZkFzSHRtbCgpIHsKKyAgICAgICAgLyoqIFRPRE86IFByb2JhYmx5IHNob3cgYXQgbGVhc3QgZXhwZWN0ZWQgcmVzdWx0cyAqLworICAgICAgICByZXR1cm4gIk9vb3BzLCBJIGNyYXNoZWQuLi4iOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0Q29kZSBnZXRSZXN1bHRDb2RlKCkgeworICAgICAgICByZXR1cm4gUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2NiYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IHRvIG1vY2sgdmFyaW91cyB0b3VjaCBldmVudHMsCisgKiBtb3VzZSBhY3Rpb25zIGFuZCBrZXkgcHJlc3Nlcy4KKyAqCisgKiBUaGUgbWV0aG9kcyBoZXJlIGp1c3QgY2FsbCBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb24gRXZlbnRTZW5kZXJJbXBsCisgKiB0aGF0IGNvbnRhaW5zIHRoZSBsb2dpYyBvZiBob3cgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVyIHsKKyAgICBFdmVudFNlbmRlckltcGwgbUV2ZW50U2VuZGVySW1wbCA9IG5ldyBFdmVudFNlbmRlckltcGwoKTsKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnJlc2V0KHdlYlZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoZG9tTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGRvbU5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmtleURvd24oY2hhcmFjdGVyLCB3aXRoTW9kaWZpZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlEb3duKFN0cmluZyBjaGFyYWN0ZXIpIHsKKyAgICAgICAga2V5RG93bihjaGFyYWN0ZXIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5sZWFwRm9yd2FyZChtaWxsaXNlY29uZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VDbGljaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZURvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZU1vdmVUbyh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlVXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoU3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUb3VjaFBvaW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmFkZFRvdWNoUG9pbnQoeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVG91Y2hQb2ludChpbnQgaWQsIGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnVwZGF0ZVRvdWNoUG9pbnQoaWQsIHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5zZXRUb3VjaE1vZGlmaWVyKG1vZGlmaWVyLCBlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hNb3ZlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwucmVsZWFzZVRvdWNoUG9pbnQoaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRW5kKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hDYW5jZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNsZWFyVG91Y2hQb2ludHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNhbmNlbFRvdWNoUG9pbnQoaWQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgRXZlbnRTZW5kZXIKKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVySW1wbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRXZlbnRTZW5kZXJJbXBsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRU5BQkxFX0RPTV9VSV9FVkVOVF9MT0dHSU5HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTEVBUF9GT1JXQVJEID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfS0VZX0RPV04gPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9ET1dOID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX1VQID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX0NMSUNLID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX01PVkVfVE8gPSA3OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BRERfVE9VQ0hfUE9JTlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfU1RBUlQgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1RPVUNIX1BPSU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9NT1ZFID0gMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DTEVBUl9UT1VDSF9QT0lOVFMgPSAxMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX0NBTkNFTCA9IDEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCA9IDE0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfRU5EID0gMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVE9VQ0hfTU9ESUZJRVIgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCA9IDE3OworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb3VjaFBvaW50IHsKKyAgICAgICAgV2ViVmlldyBtV2ViVmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVg7CisgICAgICAgIHByaXZhdGUgaW50IG1ZOworICAgICAgICBwcml2YXRlIGxvbmcgbURvd25UaW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxsZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgVG91Y2hQb2ludChXZWJWaWV3IHdlYlZpZXcsIGludCB4LCBpbnQgeSkgeworICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICAgICAgbVggPSBzY2FsZVgoeCk7CisgICAgICAgICAgICBtWSA9IHNjYWxlWSh5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vdmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Nb3ZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IG5ld1gsIGludCBuZXdZKSB7CisgICAgICAgICAgICBtWCA9IHNjYWxlWChuZXdYKTsKKyAgICAgICAgICAgIG1ZID0gc2NhbGVZKG5ld1kpOworICAgICAgICAgICAgbU1vdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0SGFzTW92ZWQoKSB7CisgICAgICAgICAgICBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldERvd25UaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Eb3duVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvd25UaW1lKGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgICAgIG1Eb3duVGltZSA9IGRvd25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWxlYXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsZWFzZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgbVJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYW5jZWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgICAgICBtQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWChpbnQgeCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHggKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWShpbnQgeSkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHkgKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUb3VjaFBvaW50PiBtVG91Y2hQb2ludHM7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoTWV0YVN0YXRlOworICAgIHByaXZhdGUgaW50IG1Nb3VzZVg7CisgICAgcHJpdmF0ZSBpbnQgbU1vdXNlWTsKKworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHByaXZhdGUgSGFuZGxlciBtRXZlbnRTZW5kZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRvdWNoUG9pbnQ7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlOworICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTEVBUF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfS0VZX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlciA9IGJ1bmRsZS5nZXRTdHJpbmcoImNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3aXRoTW9kaWZpZXJzIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhNb2RpZmllcnMgIT0gbnVsbCAmJiB3aXRoTW9kaWZpZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aE1vZGlmaWVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyVG9LZXlDb2RlKHdpdGhNb2RpZmllcnNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclRvS2V5Q29kZShjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyoqIE1PVVNFICovCisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9ET1dOOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfVVA6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9DTElDSzoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX01PVkVfVE86CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIGludCB5ID0gbXNnLmFyZzI7CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA+IG1Nb3VzZVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPCBtTW91c2VYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbU1vdXNlWCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVkgPSB5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBUT1VDSCAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmFkZChuZXcgVG91Y2hQb2ludChtV2ViVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgbXNnLmFyZzIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19BRERfVE9VQ0hfUE9JTlQiLCAiQWRkZWQgbW9yZSB0aGFuIG9uZSB0b3VjaCBwb2ludCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludC5zZXREb3duVGltZShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBidW5kbGUuZ2V0SW50KCJpZCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpNU0dfVVBEQVRFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQoaWQpLm1vdmUoYnVuZGxlLmdldEludCgieCIpLCBidW5kbGUuZ2V0SW50KCJ5IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX01PVkU6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaFBvaW50Lmhhc01vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSk7CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQucmVzZXRIYXNNb3ZlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfQ0FOQ0VMOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFBvaW50LmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0VORDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBnZXRUb3VjaFBvaW50cygpLmdldCgwKTsKKworICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fVVApOworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hQb2ludC5pc1JlbGVhc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkucmVtb3ZlKDApOworICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfVE9VQ0hfTU9ESUZJRVI6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGlmaWVyID0gYnVuZGxlLmdldFN0cmluZygibW9kaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gYnVuZGxlLmdldEJvb2xlYW4oImVuYWJsZWQiKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgiYWx0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX0FMVF9PTjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2hpZnQiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU0hJRlRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImN0cmwiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU1lNX09OOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSB8PSBtYXNrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTWV0YVN0YXRlICY9IH5tYXNrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DTEVBUl9UT1VDSF9QT0lOVFM6CisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCByZXNldChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtVG91Y2hQb2ludHMgPSBudWxsOworICAgICAgICBtVG91Y2hNZXRhU3RhdGUgPSAwOworICAgICAgICBtTW91c2VYID0gMDsKKyAgICAgICAgbU1vdXNlWSA9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0VOQUJMRV9ET01fVUlfRVZFTlRfTE9HR0lORyk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChpbnQgZG9tTm9kZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVCk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0xFQVBfRk9SV0FSRCk7CisgICAgICAgIG1zZy5hcmcxID0gbWlsbGlzZWNvbmRzOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyLCBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImNoYXJhY3RlciIsIGNoYXJhY3Rlcik7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheSgid2l0aE1vZGlmaWVycyIsIHdpdGhNb2RpZmllcnMpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0tFWV9ET1dOLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBNT1VTRSAqLworCisgICAgcHVibGljIHZvaWQgbW91c2VEb3duKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0RPV04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfVVApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfQ0xJQ0spOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZVRvKGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX01PVVNFX01PVkVfVE8sIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBUT1VDSCAqLworCisgICAgcHVibGljIHZvaWQgYWRkVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BRERfVE9VQ0hfUE9JTlQsIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoU3RhcnQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfU1RBUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgiaWQiLCBpZCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoIngiLCB4KTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgieSIsIHkpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9UT1VDSF9QT0lOVCwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfTU9WRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9DQU5DRUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEVuZCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9FTkQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibW9kaWZpZXIiLCBtb2RpZmllcik7CisgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJlbmFibGVkIiwgZW5hYmxlZCk7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX1RPVUNIX01PRElGSUVSLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVG91Y2hQb2ludHMoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VG91Y2hQb2ludD4gZ2V0VG91Y2hQb2ludHMoKSB7CisgICAgICAgIGlmIChtVG91Y2hQb2ludHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoUG9pbnRzID0gbmV3IExpbmtlZExpc3Q8VG91Y2hQb2ludD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtVG91Y2hQb2ludHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUb3VjaEV2ZW50KFRvdWNoUG9pbnQgdG91Y2hQb2ludCwgaW50IGFjdGlvbikgeworICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9CisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKHRvdWNoUG9pbnQuZ2V0RG93blRpbWUoKSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgYWN0aW9uLCB0b3VjaFBvaW50LmdldFgoKSwgdG91Y2hQb2ludC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVLZXlFdmVudChpbnQgYWN0aW9uLCBpbnQga2V5Q29kZSkgeworICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChhY3Rpb24sIGtleUNvZGUpOworICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzdW1lcyBsb3dlcmNhc2UgY2hhcnMsIGNhc2UgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSBjYWxsaW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGFyVG9LZXlDb2RlKGNoYXIgYykgeworICAgICAgICAvLyBoYW5kbGUgbnVtYmVycworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBjIC0gJzAnOworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfMCArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBjaGFyYWN0ZXJzCisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IGMgLSAnYSc7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlcnMKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TVEFSOworCisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9QT1VORDsKKworICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQ09NTUE7CisKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1BFUklPRDsKKworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1RBQjsKKworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1BBQ0U7CisKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjsKKworICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgY2FzZSAweDdGOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0RFTDsKKworICAgICAgICAgICAgY2FzZSAnfic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfR1JBVkU7CisKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX01JTlVTOworCisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FUVVBTFM7CisKKyAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0xFRlRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUklHSFRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0JBQ0tTTEFTSDsKKworICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0VNSUNPTE9OOworCisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQVBPU1RST1BIRTsKKworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0xBU0g7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbW9kaWZpZXJUb0tleUNvZGUoU3RyaW5nIG1vZGlmaWVyKSB7CisgICAgICAgIGlmIChtb2RpZmllci5lcXVhbHMoImN0cmxLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQUxUX0xFRlQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuZXF1YWxzKCJzaGlmdEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmVxdWFscygiYWx0S2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NZTTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgyZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRmlsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgdXRpbGl0eSB0byBmaWx0ZXIgb3V0IHNvbWUgZmlsZXMvZGlyZWN0b3JpZXMgZnJvbSB0aGUgdmlld3MgYW5kIHRlc3RzIHRoYXQgcnVuLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRmlsZUZpbHRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEggPQorICAgICAgICAgICAgInBsYXRmb3JtL2FuZHJvaWQvdGVzdF9leHBlY3RhdGlvbnMudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TS0lQID0gIlNLSVAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9JR05PUkVfUkVTVUxUID0gIklHTk9SRV9SRVNVTFQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TTE9XID0gIlNMT1ciOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtU2tpcExpc3QgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtSWdub3JlUmVzdWx0TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290RGlyUGF0aDsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKFN0cmluZyByb290RGlyUGF0aCkgeworICAgICAgICAvKiogSXQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhIHRyYWlsaW5nIHNsYXNoICovCisgICAgICAgIHRoaXMubVJvb3REaXJQYXRoID0gcm9vdERpclBhdGg7CisKKyAgICAgICAgcmVsb2FkQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIEZpbGUgdHh0X2V4cCA9IG5ldyBGaWxlKG1Sb290RGlyUGF0aCwgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEgpOworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodHh0X2V4cCkpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIFN0cmluZyBlbnRyeTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b2tlbnM7CisgICAgICAgICAgICBCb29sZWFuIHNraXBwZWQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIFJlbW92ZSB0aGUgY29tbWVudCBhbmQgdHJpbSAqLworICAgICAgICAgICAgICAgIGVudHJ5ID0gbGluZS5zcGxpdCgiLy8iLCAyKVswXS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlIGludG8gcGF0aCBwYXJ0IGFuZCB0aGUgcmVzdCAqLworICAgICAgICAgICAgICAgIHBhcnRzID0gZW50cnkuc3BsaXQoIlxccyIsIDIpOworCisgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgLyoqIFNwbGl0IG9uIHdoaXRlc3BhY2UgKi8KKyAgICAgICAgICAgICAgICB0b2tlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocGFydHNbMV0uc3BsaXQoIlxccyIsIDApKSk7CisKKyAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgIHNraXBwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX1NLSVApKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ta2lwTGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fSUdOT1JFX1JFU1VMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlnbm9yZVJlc3VsdExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNsb3dMaXN0LmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsICJGaWxlIG5vdCBmb3VuZDogIiArIHR4dF9leHAuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLCAiSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBzdXBwb3NlZCB0byBiZSBza2lwcGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCBpcyBzdXBwb3NlZCB0byBiZSBza2lwcGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTa2lwKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtU2tpcExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCByZXN1bHQgaXMgc3VwcG9zZWQgdG8gYmUgaWdub3JlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlUmVzKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtSWdub3JlUmVzdWx0TGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRlc3QgaXMgc2xvdyBhbmQgc2hvdWxkIGhhdmUgdGltZW91dCBpbmNyZWFzZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IGlzIHNsb3cgYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgaW5jcmVhc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2xvdyhTdHJpbmcgdGVzdFBhdGgpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJlZml4IDogZ2V0UHJlZml4ZXModGVzdFBhdGgpKSB7CisgICAgICAgICAgICBpZiAobVNsb3dMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYXRoIHByZWZpeGVzIG9mIHRoZSBnaXZlbiBwYXRoLgorICAgICAqCisgICAgICogPHA+CisgICAgICogZS5nLiB0aGlzL2lzL2EvcGF0aCByZXR1cm5zIHRoZSBsaXN0OiB0aGlzIHRoaXMvaXMgdGhpcy9pcy9hIHRoaXMvaXMvYS9wYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHBhdGggcHJlZml4ZXMgb2YgdGhlIGdpdmVuIHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFByZWZpeGVzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICBMaXN0PFN0cmluZz4gcHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oOCk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJlZml4ZXMuYWRkKGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfSB3aGlsZSAoZmlsZSAhPSBudWxsKTsKKworICAgICAgICByZXR1cm4gcHJlZml4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBkaXJlY3RvcnkgbWF5IGNvbnRhaW4gdGVzdHMgb3IgY29udGFpbnMganVzdCBoZWxwZXIgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyTmFtZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIHRoZSBkaXJlY3RvcnkgbWF5IGNvbnRhaW4gdGVzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RGlyKFN0cmluZyBkaXJOYW1lKSB7CisgICAgICAgIHJldHVybiAoIWRpck5hbWUuZXF1YWxzKCJzY3JpcHQtdGVzdHMiKQorICAgICAgICAgICAgICAgICYmICFkaXJOYW1lLmVxdWFscygicmVzb3VyY2VzIikgJiYgIWRpck5hbWUuc3RhcnRzV2l0aCgiLiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGZpbGUgaXMgYSB0ZXN0LgorICAgICAqIEN1cnJlbnRseSB3ZSBydW4gLmh0bWwgYW5kIC54aHRtbCB0ZXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0TmFtZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIHRoZSBmaWxlIGlzIGEgdGVzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rlc3RGaWxlKFN0cmluZyB0ZXN0TmFtZSkgeworICAgICAgICByZXR1cm4gdGVzdE5hbWUuZW5kc1dpdGgoIi5odG1sIikgfHwgdGVzdE5hbWUuZW5kc1dpdGgoIi54aHRtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlUGF0aAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyByb290IGRpcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBmaWxlUGF0aCkgeworICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShtUm9vdERpclBhdGgpOworICAgICAgICByZXR1cm4gZmlsZVBhdGgucmVwbGFjZUZpcnN0KHJvb3REaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHRlc3RzIHJvb3QgZGlyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRBYnNvbHV0ZUZpbGUoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobVJvb3REaXJQYXRoLCByZWxhdGl2ZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJvc2x1dGVQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEFic29sdXRlRmlsZShyZWxhdGl2ZVBhdGgpLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBwYXRoIGNvbnRhaW5zIGV4dGVuc2lvbiAoZS5nIC5mb28gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSkgdGhlbiBpdCBjaGFuZ2VzCisgICAgICogdGhpcyAoLmZvbykgaW50byBuZXdFbmRpbmcgKHNvIGl0IGhhcyB0byBjb250YWluIHRoZSBkb3QgaWYgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdCkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcGF0aCBkb2Vzbid0IGNvbnRhaW4gYW4gZXh0ZW5zaW9uLCBpdCBhZGRzIHRoZSBlbmRpbmcgdG8gdGhlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCisgICAgICogQHBhcmFtIG5ld0VuZGluZworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgbmV3IHBhdGgsIGNvbnRhaW5pbmcgdGhlIG5ld0V4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldFBhdGhFbmRpbmcoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIG5ld0VuZGluZykgeworICAgICAgICBpbnQgZG90UG9zID0gcmVsYXRpdmVQYXRoLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChkb3RQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggKyBuZXdFbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnN1YnN0cmluZygwLCBkb3RQb3MpICsgbmV3RW5kaW5nOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYzE4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZzVXRpbHMuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGc1V0aWxzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZzVXRpbHMiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRGF0YVRvU3RvcmFnZShGaWxlIGZpbGUsIGJ5dGVbXSBieXRlcywgYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OndyaXRlRGF0YVRvU3RvcmFnZSIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcgKyAiOjp3cml0ZURhdGFUb1N0b3JhZ2UiLCAiRmlsZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUsIGFwcGVuZCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OndyaXRlRGF0YVRvU3RvcmFnZSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWREYXRhRnJvbVN0b3JhZ2UoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlYWREYXRhRnJvbVN0b3JhZ2UiLCAiRmlsZSBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBmaXMucmVhZChieXRlcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcgKyAiOjpyZWFkRGF0YUZyb21TdG9yYWdlIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iubm90aWZ5RG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgICAgIGR1bXBBc1RleHQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJBbGxEYXRhYmFzZXMoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpjbGVhckFsbERhdGFiYXNlcyIsICJjYWxsZWQiKTsKKyAgICAgICAgV2ViU3RvcmFnZS5nZXRJbnN0YW5jZSgpLmRlbGV0ZUFsbERhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0Q2FuT3BlbldpbmRvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGFiYXNlUXVvdGEobG9uZyBxdW90YSkgeworICAgICAgICAvKiogVE9ETzogUmVzZXQgdGhpcyBiZWZvcmUgZXZlcnkgdGVzdCEgKi8KKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldERhdGFiYXNlUXVvdGEiLCAiY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91YmxlIGFjY3VyYWN5KSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbiIsICJsYXRpdHVkZTogIiArIGxhdGl0dWRlICsKKyAgICAgICAgICAgICAgICAiIGxvbmdpdHVkZTogIiArIGxvbmdpdHVkZSArICIgYWNjdXJhY3k6ICIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldE1vY2tHZW9sb2NhdGlvbkVycm9yIiwgImNvZGU6ICIgKyBjb2RlICsgIiBtZXNzYWdlOiAiICsgbWVzc2FnZSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldEVycm9yKGNvZGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLCBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0c0V4ZWN1dG9yLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0c0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNDkyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDU4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTdG9yYWdlLlF1b3RhVXBkYXRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGFjdGl2aXR5IGV4ZWN1dGVzIHRoZSB0ZXN0LiBJdCBjb250YWlucyBXZWJWaWV3IGFuZCBsb2dpYyBvZiBMYXlvdXRUZXN0Q29udHJvbGxlcgorICogZnVuY3Rpb25zLiBJdCBydW5zIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBhbmQgc2VuZHMgdGhlIHJlc3VsdHMgb2YgcnVubmluZyB0aGUgdGVzdAorICogdG8gTWFuYWdlclNlcnZpY2UuIFRoZSByZWFzb24gd2h5IGlzIHRvIGhhbmRsZSBjcmFzaGluZyAodGVzdCB0aGF0IGNyYXNoZXMgYnJpbmdzIGRvd24KKyAqIHdob2xlIHByb2Nlc3Mgd2l0aCBpdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRUZXN0c0V4ZWN1dG9yIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBlbnVtIEN1cnJlbnRTdGF0ZSB7CisgICAgICAgIElETEUsCisgICAgICAgIFJFTkRFUklOR19QQUdFLAorICAgICAgICBXQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVCwKKyAgICAgICAgT0JUQUlOSU5HX1JFU1VMVDsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmdTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRSB8fAorICAgICAgICAgICAgICAgICAgICB0aGlzID09IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVFNfUk9PVF9ESVJfUEFUSCA9CisgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJhbmRyb2lkIiArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJMYXlvdXRUZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJMYXlvdXRUZXN0RXhlY3V0b3IiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVFNfTElTVCA9ICJUZXN0c0xpc3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfSU5ERVggPSAiVGVzdEluZGV4IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX1RJTUVEX09VVCA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FX09VVF9NUyA9IDE1ICogMTAwMDsKKworICAgIC8qKiBBIGxpc3Qgb2YgdGVzdHMgdGhhdCByZW1haW4gdG8gcnVuIHNpbmNlIGxhc3QgY3Jhc2ggKi8KKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGVzdHNMaXN0OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIG51bWJlciBvZiBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiBJdCBpcyAwLWJhc2VkIGFuZCBkb2Vzbid0IHJlc2V0IGFmdGVyCisgICAgICogdGhlIGNyYXNoLiBJbml0aWFsIGluZGV4IGlzIHBhc3NlZCB0byBMYXlvdXRUZXN0c0V4ZWN1dGVyIGluIHRoZSBpbnRlbnQgdGhhdCBzdGFydHMKKyAgICAgKiBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQ3VycmVudFRlc3RJbmRleDsKKworICAgIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1biwgZG9lc24ndCByZXNldCBhZnRlciBjcmFzaCAqLworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKworICAgIHByaXZhdGUgV2ViVmlldyBtQ3VycmVudFdlYlZpZXc7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50VGVzdFVyaTsKKyAgICBwcml2YXRlIEN1cnJlbnRTdGF0ZSBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLklETEU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUN1cnJlbnRUZXN0VGltZWRPdXQ7CisgICAgcHJpdmF0ZSBBYnN0cmFjdFJlc3VsdCBtQ3VycmVudFJlc3VsdDsKKyAgICBwcml2YXRlIEFkZGl0aW9uYWxUZXh0T3V0cHV0IG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQ7CisKKyAgICBwcml2YXRlIExheW91dFRlc3RDb250cm9sbGVyIG1MYXlvdXRUZXN0Q29udHJvbGxlciA9IG5ldyBMYXlvdXRUZXN0Q29udHJvbGxlcih0aGlzKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNhbk9wZW5XaW5kb3dzOworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOworCisgICAgcHJpdmF0ZSBFdmVudFNlbmRlciBtRXZlbnRTZW5kZXIgPSBuZXcgRXZlbnRTZW5kZXIoKTsKKworICAgIHByaXZhdGUgV2FrZUxvY2sgbVNjcmVlbkRpbUxvY2s7CisKKyAgICAvKiogQ09NTVVOSUNBVElPTiBXSVRIIE1hbmFnZXJTZXJ2aWNlICovCisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXI7CisKKyAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgc3RhcnRUZXN0cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1SZXN1bHRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX1RJTUVEX09VVDoKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0VGltZWRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogV0VCVklFVyBDT05GSUdVUkFUSU9OICovCisKKyAgICBwcml2YXRlIFdlYlZpZXdDbGllbnQgbVdlYlZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgLyoqIFNvbWUgdGVzdHMgZmlyZSB1cCBtYW55IHBhZ2UgbG9hZHMsIHdlIGRvbid0IHdhbnQgdG8gZGV0ZWN0IHRoZW0gKi8KKyAgICAgICAgICAgIGlmICghdXJsLmVxdWFscyhtQ3VycmVudFRlc3RVcmkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0UpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgV2ViQ2hyb21lQ2xpZW50IG1XZWJDaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeGNlZWRlZERhdGFiYXNlUXVvdGEoU3RyaW5nIHVybCwgU3RyaW5nIGRhdGFiYXNlSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRRdW90YSwgbG9uZyBlc3RpbWF0ZWRTaXplLCBsb25nIHRvdGFsVXNlZFF1b3RhLAorICAgICAgICAgICAgICAgIFF1b3RhVXBkYXRlciBxdW90YVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGlzIHNob3VsZCBiZSByZWNvcmRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IHJlc3VsdCAqLworICAgICAgICAgICAgLyoqIFRPRE86IFRoZSBxdW90YSBzaG91bGQgYWxzbyBwcm9iYWJseSBiZSByZXNldCBzb21laG93IGZvciBldmVyeSB0ZXN0PyAqLworICAgICAgICAgICAgaWYgKG1EdW1wRGF0YWJhc2VDYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdW90YVVwZGF0ZXIudXBkYXRlUXVvdGEoY3VycmVudFF1b3RhICsgNSAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkpzQWxlcnQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0FsZXJ0KG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNDb25maXJtKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCwgU3RyaW5nIG1lc3NhZ2UsIEpzUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNDb25maXJtKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNQcm9tcHQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICBKc1Byb21wdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzUHJvbXB0KG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVXaW5kb3coV2ViVmlldyB2aWV3LCBib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSwKKyAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3VsdE1zZykgeworICAgICAgICAgICAgV2ViVmlldy5XZWJWaWV3VHJhbnNwb3J0IHRyYW5zcG9ydCA9IChXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQpcmVzdWx0TXNnLm9iajsKKyAgICAgICAgICAgIC8qKiBCeSBkZWZhdWx0IHdpbmRvd3MgY2Fubm90IGJlIG9wZW5lZCwgc28ganVzdCBzZW5kIG51bGwgYmFjay4gKi8KKyAgICAgICAgICAgIFdlYlZpZXcgbmV3V2luZG93V2ViVmlldyA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtQ2FuT3BlbldpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBXZSBuZXZlciBkaXNwbGF5IHRoZSBuZXcgd2luZG93LCBqdXN0IGNyZWF0ZSB0aGUgdmlldyBhbmQgYWxsb3cgaXQncyBjb250ZW50IHRvCisgICAgICAgICAgICAgICAgICogZXhlY3V0ZSBhbmQgYmUgcmVjb3JkZWQgYnkgdGhlIGV4ZWN1dG9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5ld1dpbmRvd1dlYlZpZXcgPSBuZXcgV2ViVmlldyhMYXlvdXRUZXN0c0V4ZWN1dG9yLnRoaXMpOworICAgICAgICAgICAgICAgIHNldHVwV2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNwb3J0LnNldFdlYlZpZXcobmV3V2luZG93V2ViVmlldyk7CisgICAgICAgICAgICByZXN1bHRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KFN0cmluZyBvcmlnaW4sIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobVNldEdlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxlZCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogSU1QTEVNRU5UQVRJT04gKi8KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcyk7CisgICAgICAgIHNldHVwV2ViVmlldyhtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIG1FdmVudFNlbmRlci5yZXNldChtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG1DdXJyZW50V2ViVmlldyk7CisgICAgICAgIGlmIChwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlc2V0IiwgInByZXZpb3VzV2ViVmlldyAhPSBudWxsIik7CisgICAgICAgICAgICBwcmV2aW91c1dlYlZpZXcuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtTGF5b3V0VGVzdENvbnRyb2xsZXIsICJsYXlvdXRUZXN0Q29udHJvbGxlciIpOworICAgICAgICB3ZWJWaWV3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2UobUV2ZW50U2VuZGVyLCAiZXZlbnRTZW5kZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAgKiB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAgKiBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAgKiBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAgKiB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgd2ViVmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKworICAgICAgICBXZWJTZXR0aW5ncyB3ZWJWaWV3U2V0dGluZ3MgPSB3ZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVNYXhTaXplKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFN1cHBvcnRNdWx0aXBsZVdpbmRvd3ModHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRMYXlvdXRBbGdvcml0aG0oV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLCAwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtQ3VycmVudFdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGVzdHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfRklSU1RfVEVTVCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiZmlyc3RUZXN0IiwgbVRlc3RzTGlzdC5nZXQoMCkpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoImluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJ2aWNlTXNnLnNldERhdGEoYnVuZGxlKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnN0YXJ0VGVzdHMiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5OZXh0VGVzdCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLklETEUgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBpZiAobVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG9uQWxsVGVzdHNGaW5pc2hlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoID0gbVRlc3RzTGlzdC5yZW1vdmUoMCk7CisgICAgICAgIExvZy5kKExPR19UQUcgKyAiOjpydW5OZXh0VGVzdCIsICJTdGFydDogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiKSIpOworICAgICAgICBtQ3VycmVudFRlc3RVcmkgPQorICAgICAgICAgICAgICAgIFVyaS5mcm9tRmlsZShuZXcgRmlsZShURVNUU19ST09UX0RJUl9QQVRILCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpKS50b1N0cmluZygpOworCisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgLyoqIFN0YXJ0IHRpbWUtb3V0IGNvdW50ZG93biBhbmQgdGhlIHRlc3QgKi8KKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRTsKKyAgICAgICAgbVJlc3VsdEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX1RFU1RfVElNRURfT1VULCBERUZBVUxUX1RJTUVfT1VUX01TKTsKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LmxvYWRVcmwobUN1cnJlbnRUZXN0VXJpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25UZXN0VGltZWRPdXQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlLmlzUnVubmluZ1N0YXRlKCkgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBtQ3VycmVudFRlc3RUaW1lZE91dCA9IHRydWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoaWxlIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdGhhdCB0aGUgdGVzdCB0aW1lcyBvdXQgYmVjYXVzZQorICAgICAgICAgKiBvZiB3ZWJ2aWV3IGJlY29taW5nIHVucmVzcG9uc2l2ZSwgaXQgaXMgdmVyeSB1bmxpa2VseS4gVGhlcmVmb3JlIGl0J3MKKyAgICAgICAgICogYXNzdW1lZCB0aGF0IG9idGFpbmluZyByZXN1bHRzICh0aGF0IGNhbGxzIHZhcmlvdXMgd2VidmlldyBtZXRob2RzKQorICAgICAgICAgKiB3aWxsIG5vdCBpdHNlbGYgaGFuZy4KKyAgICAgICAgICovCisgICAgICAgIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblRlc3RGaW5pc2hlZCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzRnJvbVdlYlZpZXcoKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB0aGUgcmVzdWx0IGhhcyBub3QgYmVlbiBzZXQgYnkgdGhlIHRpbWUgdGhlIHRlc3QgZmluaXNoZXMgd2UgY3JlYXRlCisgICAgICAgICAqIGEgZGVmYXVsdCB0eXBlIG9mIHJlc3VsdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtQ3VycmVudFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAvKiogVE9ETzogRGVmYXVsdCB0eXBlIHNob3VsZCBiZSBSZW5kZXJUcmVlUmVzdWx0LiBXZSBkb24ndCBzdXBwb3J0IGl0IG5vdy4gKi8KKyAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuT0JUQUlOSU5HX1JFU1VMVDsKKworICAgICAgICBtQ3VycmVudFJlc3VsdC5vYnRhaW5BY3R1YWxSZXN1bHRzKG1DdXJyZW50V2ViVmlldywKKyAgICAgICAgICAgICAgICBtUmVzdWx0SGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuT0JUQUlOSU5HX1JFU1VMVAorICAgICAgICAgICAgICAgIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5JRExFOworCisgICAgICAgIG1SZXN1bHRIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19URVNUX1RJTUVEX09VVCk7CisgICAgICAgIHJlcG9ydFJlc3VsdFRvU2VydmljZSgpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCsrOworICAgICAgICB1cGRhdGVQcm9ncmVzc0JhcigpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBvcnRSZXN1bHRUb1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0LnNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFMpOworCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbUN1cnJlbnRSZXN1bHQuZ2V0QnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KCJ0ZXN0SW5kZXgiLCBtQ3VycmVudFRlc3RJbmRleCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUZXN0VGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJyZXN1bHRDb2RlIiwgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX1RJTUVEX09VVC5uYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm5leHRUZXN0IiwgbVRlc3RzTGlzdC5nZXQoMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJ2aWNlTXNnLnNldERhdGEoYnVuZGxlKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnJlcG9ydFJlc3VsdFRvU2VydmljZSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9ncmVzc0JhcigpIHsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZUludChXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUywKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRlc3RJbmRleCAqIFdpbmRvdy5QUk9HUkVTU19FTkQgLyBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBzZXRUaXRsZShtQ3VycmVudFRlc3RJbmRleCAqIDEwMCAvIG1Ub3RhbFRlc3RDb3VudCArICIlICIgKworICAgICAgICAgICAgICAgICIoIiArIG1DdXJyZW50VGVzdEluZGV4ICsgIi8iICsgbVRvdGFsVGVzdENvdW50ICsgIikiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BbGxUZXN0c0ZpbmlzaGVkKCkgeworICAgICAgICBtU2NyZWVuRGltTG9jay5yZWxlYXNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG51bGwsIE1hbmFnZXJTZXJ2aWNlLk1TR19BTExfVEVTVFNfRklOSVNIRUQpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6b25BbGxUZXN0c0ZpbmlzaGVkIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOworICAgIH0KKworICAgIHByaXZhdGUgQWRkaXRpb25hbFRleHRPdXRwdXQgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkgeworICAgICAgICBpZiAobUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID0gbmV3IEFkZGl0aW9uYWxUZXh0T3V0cHV0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQ7CisgICAgfQorCisgICAgLyoqIExBWU9VVCBURVNUIENPTlRST0xMRVIgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfV0FJVF9VTlRJTF9ET05FID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PVElGWV9ET05FID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfQVNfVEVYVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19EVU1QX0NISUxEX0ZSQU1FU19BU19URVhUID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9DQU5fT1BFTl9XSU5ET1dTID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9HRU9MT0NBVElPTl9QUkVNSVNTSU9OID0gNjsKKworICAgIEhhbmRsZXIgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfV0FJVF9VTlRJTF9ET05FOgorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX05PVElGWV9ET05FOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uVGVzdEZpbmlzaGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19EVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG5ldyBUZXh0UmVzdWx0KG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUN1cnJlbnRSZXN1bHQgaW5zdGFuY2VvZiBUZXh0UmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibUN1cnJlbnRSZXN1bHQgaW5zdGFuY2VvZiIgKyBtQ3VycmVudFJlc3VsdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIC8qKiBJZiBkdW1wQXNUZXh0IHdhcyBub3QgY2FsbGVkIHdlIGFzc3VtZSB0aGF0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgICgoVGV4dFJlc3VsdCltQ3VycmVudFJlc3VsdCkuc2V0RHVtcENoaWxkRnJhbWVzQXNUZXh0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9DQU5fT1BFTl9XSU5ET1dTOgorICAgICAgICAgICAgICAgICAgICBtQ2FuT3BlbldpbmRvd3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTOgorICAgICAgICAgICAgICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfR0VPTE9DQVRJT05fUFJFTUlTU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgbVNldEdlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb24gPSBtc2cuYXJnMSA9PSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpoYW5kbGVNZXNzYWdlIiwgIk1lc3NhZ2UgY29kZSBkb2VzIG5vdCBleGlzdDogIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TGF5b3V0VGVzdENvbnRyb2xsZXIoKSB7CisgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gZmFsc2U7CisgICAgICAgIG1TZXRHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjp3YWl0VW50aWxEb25lIiwgImNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1dBSVRfVU5USUxfRE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Om5vdGlmeURvbmUiLCAiY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTk9USUZZX0RPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OmR1bXBBc1RleHQoIiArIGVuYWJsZVBpeGVsVGVzdCArICIpIiwgImNhbGxlZCIpOworICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpkdW1wQXNUZXh0IiwgImVuYWJsZVBpeGVsVGVzdCBub3QgaW1wbGVtZW50ZWQsIHN3aXRjaGluZyB0byBmYWxzZSIpOworICAgICAgICB9CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9BU19URVhUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpkdW1wQ2hpbGRGcmFtZXNBc1RleHQiLCAiY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpzZXRDYW5PcGVuV2luZG93cyIsICJjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6ZHVtcERhdGFiYXNlQ2FsbGJhY2tzOiIsICJjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbiIsICJjYWxsZWQiKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9HRU9MT0NBVElPTl9QUkVNSVNTSU9OKTsKKyAgICAgICAgbXNnLmFyZzEgPSBhbGxvdyA/IDEgOiAwOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBtQ3VycmVudFdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzNkZDdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgc2VydmljZSB0aGF0IGhhbmRsZXMgbWFuYWdpbmcgdGhlIHJlc3VsdHMgb2YgdGVzdHMsIGluZm9ybWluZyBvZiBjcmFzaGVzLCBnZW5lcmF0aW5nCisgKiBzdW1tYXJpZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNYW5hZ2VyU2VydmljZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfQ1JBU0hFRCA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1JBU0hfVElNRU9VVF9NUyA9IDIwICogMTAwMDsKKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVFNfUk9PVF9ESVJfUEFUSCA9CisgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJhbmRyb2lkIiArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJMYXlvdXRUZXN0cyI7CisKKyAgICAvKiogVE9ETzogbWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVFNfUk9PVF9ESVJfUEFUSCA9CisgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJhbmRyb2lkIiArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJMYXlvdXRUZXN0cy1yZXN1bHRzIjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKKyAgICB7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCJwbGF0Zm9ybSIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgImFuZHJvaWQtdjgiICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgicGxhdGZvcm0iICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJhbmRyb2lkIiArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoIiIpOworICAgIH0KKworICAgIC8qKiBUT0RPOiBNYWtlIHRoZXNlIHNldHRpbmdzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVTVUxUX0VYVEVOU0lPTiA9ICJ0eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OID0gInBuZyI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19BTExfVEVTVFNfRklOSVNIRUQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUlNUX1RFU1QgPSAyOworCisgICAgLyoqCisgICAgICogVGhpcyBoYW5kbGVyIGlzIHB1cmVseSBmb3IgSVBDLiBJdCBpcyB1c2VkIHRvIGNyZWF0ZSBtTWVzc2VuZ2VyCisgICAgICogdGhhdCBnZW5lcmF0ZXMgYSBiaW5kZXIgcmV0dXJuZWQgaW4gb25CaW5kIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhbmRsZXIgbUluY29taW5nSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZJUlNUX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgIG1TdW1tYXJpemVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBtc2cuZ2V0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoImZpcnN0VGVzdCIpLCBidW5kbGUuZ2V0SW50KCJpbmRleCIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHICsgIi5tSW5jb21pbmdIYW5kbGVyIiwgbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpKTsKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQobXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUxMX1RFU1RTX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5zdW1tYXJpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWFuYWdlclNlcnZpY2UudGhpcywgVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fU0hVVERPV04pOworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBNZXNzZW5nZXIgbU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobUluY29taW5nSGFuZGxlcik7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUNyYXNoTWVzc2FnZXNIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX1RFU1RfQ1JBU0hFRCkgeworICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEZpbGVGaWx0ZXIgbUZpbGVGaWx0ZXI7CisgICAgcHJpdmF0ZSBTdW1tYXJpemVyIG1TdW1tYXJpemVyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRseVJ1bm5pbmdUZXN0OworICAgIHByaXZhdGUgaW50IG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CisKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcihURVNUU19ST09UX0RJUl9QQVRIKTsKKyAgICAgICAgbVN1bW1hcml6ZXIgPSBuZXcgU3VtbWFyaXplcihtRmlsZUZpbHRlciwgUkVTVUxUU19ST09UX0RJUl9QQVRIKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKKyAgICAgICAgcmV0dXJuIFNUQVJUX1NUSUNLWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQ3Jhc2hNZXNzYWdlc0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1RFU1RfQ1JBU0hFRCk7CisgICAgICAgIGVuc3VyZU5leHRUZXN0U2V0dXAoYnVuZGxlLmdldFN0cmluZygibmV4dFRlc3QiKSwgYnVuZGxlLmdldEludCgidGVzdEluZGV4IikgKyAxKTsKKworICAgICAgICBBYnN0cmFjdFJlc3VsdCByZXN1bHRzID0KKyAgICAgICAgICAgICAgICBBYnN0cmFjdFJlc3VsdC5UZXN0VHlwZS52YWx1ZU9mKGJ1bmRsZS5nZXRTdHJpbmcoInR5cGUiKSkuY3JlYXRlUmVzdWx0KGJ1bmRsZSk7CisKKyAgICAgICAgaGFuZGxlUmVzdWx0cyhyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTmV4dFRlc3RTZXR1cChTdHJpbmcgbmV4dFRlc3QsIGludCBpbmRleCkgeworICAgICAgICBpZiAobmV4dFRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRseVJ1bm5pbmdUZXN0ID0gbmV4dFRlc3Q7CisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ID0gaW5kZXg7CisgICAgICAgIG1DcmFzaE1lc3NhZ2VzSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfVEVTVF9DUkFTSEVELCBDUkFTSF9USU1FT1VUX01TKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNlbmRzIGFuIGludGVudCB0byBUZXN0c0xpc3RBY3Rpdml0eSB0byByZXN0YXJ0IExheW91dFRlc3RzRXhlY3V0b3IuCisgICAgICogVGhlIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGZsb3cgaXMgaW4gdGhlIGNvbW1lbnQgb2Ygb25OZXdJbnRlbnQKKyAgICAgKiBtZXRob2QgaW4gVGVzdHNMaXN0QWN0aXZpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdENyYXNoZWQoKSB7CisgICAgICAgIGhhbmRsZVJlc3VsdHMobmV3IENyYXNoZWREdW1teVJlc3VsdChtQ3VycmVudGx5UnVubmluZ1Rlc3QpKTsKKworICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6b25UZXN0Q3Jhc2hlZCIsIG1DdXJyZW50bHlSdW5uaW5nVGVzdCArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXggKyAiKSIpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JFQk9PVCk7CisgICAgICAgIC8qKiBUaGlzIGZsYWcgaXMgbmVlZGVkIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgaW50ZW50IGZyb20gdGhlIHNlcnZpY2UgKi8KKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJjcmFzaGVkVGVzdEluZGV4IiwgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXgpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc3VsdHMoQWJzdHJhY3RSZXN1bHQgcmVzdWx0cykgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZFRleHRSZXN1bHQoZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KHJlbGF0aXZlUGF0aCkpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkSW1hZ2VSZXN1bHQoZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChyZWxhdGl2ZVBhdGgpKTsKKworICAgICAgICBkdW1wQWN0dWFsVGV4dFJlc3VsdChyZXN1bHRzKTsKKyAgICAgICAgZHVtcEFjdHVhbEltYWdlUmVzdWx0KHJlc3VsdHMpOworCisgICAgICAgIG1TdW1tYXJpemVyLmFwcGVuZFRlc3QocmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3R1YWxUZXh0UmVzdWx0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgdGVzdFBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIFN0cmluZyBhY3R1YWxUZXh0UmVzdWx0ID0gcmVzdWx0LmdldEFjdHVhbFRleHRSZXN1bHQoKTsKKyAgICAgICAgaWYgKGFjdHVhbFRleHRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdFBhdGggPSBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcodGVzdFBhdGgsICItYWN0dWFsLiIgKyBURVhUX1JFU1VMVF9FWFRFTlNJT04pOworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShSRVNVTFRTX1JPT1RfRElSX1BBVEgsIHJlc3VsdFBhdGgpLAorICAgICAgICAgICAgICAgIGFjdHVhbFRleHRSZXN1bHQuZ2V0Qnl0ZXMoKSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wQWN0dWFsSW1hZ2VSZXN1bHQoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgYnl0ZVtdIGFjdHVhbEltYWdlUmVzdWx0ID0gcmVzdWx0LmdldEFjdHVhbEltYWdlUmVzdWx0KCk7CisgICAgICAgIGlmIChhY3R1YWxJbWFnZVJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyh0ZXN0UGF0aCwKKyAgICAgICAgICAgICAgICAiLWFjdHVhbC4iICsgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKFJFU1VMVFNfUk9PVF9ESVJfUEFUSCwgcmVzdWx0UGF0aCksCisgICAgICAgICAgICAgICAgYWN0dWFsSW1hZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBieXRlW10gcmVzdWx0ID0gZ2V0RXhwZWN0ZWRSZXN1bHQocmVsYXRpdmVQYXRoLCBURVhUX1JFU1VMVF9FWFRFTlNJT04pOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRFeHBlY3RlZFJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgZXh0ZW5zaW9uKSB7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFJlbGF0aXZlUGF0aCA9CisgICAgICAgICAgICAgICAgRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHJlbGF0aXZlUGF0aCwgIi1leHBlY3RlZC4iICsgZXh0ZW5zaW9uKTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICBMaXN0PFN0cmluZz4gbG9jYXRpb25zID0gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUzsKKworICAgICAgICBpbnQgc2l6ZSA9IEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgYnl0ZXMgPT0gbnVsbCAmJiBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBsb2NhdGlvbnMuZ2V0KGkpICsgb3JpZ2luYWxSZWxhdGl2ZVBhdGg7CisgICAgICAgICAgICBieXRlcyA9IEZzVXRpbHMucmVhZERhdGFGcm9tU3RvcmFnZShuZXcgRmlsZShURVNUU19ST09UX0RJUl9QQVRILCByZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvU3VtbWFyaXplci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvU3VtbWFyaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2VjYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGVzdHMgdGhhdCByYW4gYW5kIGNhbiBjcmVhdGUgSFRNTAorICogZmlsZXMgd2l0aCBzdW1tYXJpZXMgYW5kIGVhc3kgbmF2aWdhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFN1bW1hcml6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3VtbWFyaXplciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTID0KKyAgICAgICAgICAgICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+IiArCisgICAgICAgICAgICAiKiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXI6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMDt9IiArCisgICAgICAgICAgICAiYm9keSB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMTBweDt9IiArCisgICAgICAgICAgICAiaDEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDI0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7fSIgKworICAgICAgICAgICAgImgyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOjE4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMjBweCAwIDNweCAwO30iICsKKyAgICAgICAgICAgICJoMywgaDMgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDRweDt9IiArCisgICAgICAgICAgICAiaDMgYSBzcGFuLnBhdGggeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi50cmkgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGZsb2F0OiBsZWZ0OyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMjBweDt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi5zcXIgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjOGVlMTAwOyIgKworICAgICAgICAgICAgIiAgICAgICBmbG9hdDogbGVmdDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDIwcHg7fSIgKworICAgICAgICAgICAgImgzIGltZyB7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiA4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1yaWdodDogNHB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7fSIgKworICAgICAgICAgICAgImRpdi5kaWZmIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDEycHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjODg4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDBweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDEwMCU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDJweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIuaGVhZGVycyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZy1ib3R0b206IDNweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE1cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQubGluZV9jb3VudCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6I2FhYTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWluLXdpZHRoOjIwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDFweCAycHggMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmUgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAycHggMHB4IDJweCA0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogNDkuOCU7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmZvb3RlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDA7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyIHRkLnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMC40JX0iICsKKyAgICAgICAgICAgICJkaXYuc3BhY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOjRweDt9IiArCisgICAgICAgICAgICAic3Bhbi5lcWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO30iICsKKyAgICAgICAgICAgICJzcGFuLmRlbCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjg4ODg7IH0iICsKKyAgICAgICAgICAgICJzcGFuLmlucyB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4OGZmODg7IH0iICsKKyAgICAgICAgICAgICJzcGFuLmZhaWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogcmVkO30iICsKKyAgICAgICAgICAgICJzcGFuLnBhc3MgeyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogZ3JlZW47fSIgKworICAgICAgICAgICAgInNwYW4udGltZV9vdXQgeyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogb3JhbmdlO30iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6IDIwcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnN1bW1hcnkgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7fSIgKworICAgICAgICAgICAgInNwYW4ubGlzdEl0ZW0geyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDExcHg7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDNweDsiICsKKyAgICAgICAgICAgICIgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUy5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOGVlMTAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9SRVNVTFRfRElGRkVSUy5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9OT19FWFBFQ1RFRF9SRVNVTFQubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2E3MDBlNDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9USU1FRF9PVVQubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzY2IwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfQ1JBU0hFRC5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzMwMDAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi5ub0x0YyB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5NDQwMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLm5vRXZlbnRTZW5kZXIgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODE1NjAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAiPC9zdHlsZT4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVCA9CisgICAgICAgICAgICAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+IiArCisgICAgICAgICAgICAiICAgIGZ1bmN0aW9uIHRvZ2dsZURpc3BsYXkoaWQpIHsiICsKKyAgICAgICAgICAgICIgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IiArCisgICAgICAgICAgICAiICAgICAgICB0cmlhbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmkuJyArIGlkKTsiICsKKyAgICAgICAgICAgICIgICAgICAgIGlmIChlbGVtZW50LnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgdHJpYW5nbGUuaW5uZXJIVE1MID0gJyYjeDI1YmM7ICc7IiArCisgICAgICAgICAgICAiICAgICAgICB9IGVsc2UgeyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICB0cmlhbmdsZS5pbm5lckhUTUwgPSAnJiN4MjViNjsgJzsiICsKKyAgICAgICAgICAgICIgICAgICAgIH0iICsKKyAgICAgICAgICAgICIgICAgfSIgKworICAgICAgICAgICAgIjwvc2NyaXB0PiI7CisKKyAgICAvKiogVE9ETzogTWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9ERVRBSUxTX1JFTEFUSVZFX1BBVEggPSAiZGV0YWlscy5odG1sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX1NVTU1BUllfUkVMQVRJVkVfUEFUSCA9ICJzdW1tYXJ5LnR4dCI7CisKKyAgICBwcml2YXRlIGludCBtQ3Jhc2hlZFRlc3RzQ291bnQgPSAwOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUZhaWxlZE5vdElnbm9yZWRUZXN0cyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtSWdub3JlZFRlc3RzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUGFzc2VkTm90SWdub3JlZFRlc3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICBwcml2YXRlIEZpbGVGaWx0ZXIgbUZpbGVGaWx0ZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlc3VsdHNSb290RGlyUGF0aDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZVN0cmluZzsKKworICAgIHB1YmxpYyBTdW1tYXJpemVyKEZpbGVGaWx0ZXIgZmlsZUZpbHRlciwgU3RyaW5nIHJlc3VsdHNSb290RGlyUGF0aCkgeworICAgICAgICBtRmlsZUZpbHRlciA9IGZpbGVGaWx0ZXI7CisgICAgICAgIG1SZXN1bHRzUm9vdERpclBhdGggPSByZXN1bHRzUm9vdERpclBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVGVzdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKworICAgICAgICBpZiAocmVzdWx0LmdldFJlc3VsdENvZGUoKSA9PSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfQ1JBU0hFRCkgeworICAgICAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpbGVGaWx0ZXIuaXNJZ25vcmVSZXMocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgbUlnbm9yZWRUZXN0cy5hZGQocmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZ2V0UmVzdWx0Q29kZSgpID09IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUykgeworICAgICAgICAgICAgbVBhc3NlZE5vdElnbm9yZWRUZXN0cy5hZGQocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GYWlsZWROb3RJZ25vcmVkVGVzdHMuYWRkKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdW1tYXJpemUoKSB7CisgICAgICAgIGNyZWF0ZUh0bWxEZXRhaWxzKCk7CisgICAgICAgIGNyZWF0ZVR4dFN1bW1hcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICAgICAgbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5jbGVhcigpOworICAgICAgICBtSWdub3JlZFRlc3RzLmNsZWFyKCk7CisgICAgICAgIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuY2xlYXIoKTsKKyAgICAgICAgbVRpdGxlU3RyaW5nID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVHh0U3VtbWFyeSgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0eHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHR4dC5hcHBlbmQoZ2V0VGl0bGVTdHJpbmcoKSArICJcbiIpOworICAgICAgICBpZiAobUNyYXNoZWRUZXN0c0NvdW50ID4gMCkgeworICAgICAgICAgICAgdHh0LmFwcGVuZCgiQ1JBU0hFRCAodG90YWwgYW1vbmcgYWxsIHRlc3RzKTogIiArIG1DcmFzaGVkVGVzdHNDb3VudCArICJcbiIpOworICAgICAgICAgICAgdHh0LmFwcGVuZCgiLS0tLS0tLS0tLS0tLSIpOworICAgICAgICB9CisgICAgICAgIHR4dC5hcHBlbmQoIkZBSUxFRDogICIgKyBtRmFpbGVkTm90SWdub3JlZFRlc3RzLnNpemUoKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJJR05PUkVEOiAiICsgbUlnbm9yZWRUZXN0cy5zaXplKCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiUEFTU0VEOiAgIiArIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpICsgIlxuIik7CisKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUobVJlc3VsdHNSb290RGlyUGF0aCwgVFhUX1NVTU1BUllfUkVMQVRJVkVfUEFUSCksCisgICAgICAgICAgICAgICAgdHh0LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVIdG1sRGV0YWlscygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPGh0bWw+PGhlYWQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKENTUyk7CisgICAgICAgIGh0bWwuYXBwZW5kKFNDUklQVCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L2hlYWQ+PGJvZHk+Iik7CisKKyAgICAgICAgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKGh0bWwpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0V2l0aERpZmYoaHRtbCwgIkZhaWxlZCIsIG1GYWlsZWROb3RJZ25vcmVkVGVzdHMpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0V2l0aERpZmYoaHRtbCwgIklnbm9yZWQiLCBtSWdub3JlZFRlc3RzKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdE5vRGlmZihodG1sLCAiUGFzc2VkIiwgbVBhc3NlZE5vdElnbm9yZWRUZXN0cyk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvYm9keT48L2h0bWw+Iik7CisKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUobVJlc3VsdHNSb290RGlyUGF0aCwgSFRNTF9ERVRBSUxTX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIGh0bWwudG9TdHJpbmcoKS5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGl0bGVTdHJpbmcoKSB7CisgICAgICAgIGlmIChtVGl0bGVTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHRvdGFsID0gbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICBtUGFzc2VkTm90SWdub3JlZFRlc3RzLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVkVGVzdHMuc2l6ZSgpOworICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiKTsKKyAgICAgICAgICAgIG1UaXRsZVN0cmluZyA9ICIgLSB0b3RhbCBvZiAiICsgdG90YWwgKyAiIHRlc3RzIC0gIiArIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1UaXRsZVN0cmluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBodG1sLmFwcGVuZCgiPGgxPiIgKyBnZXRUaXRsZVN0cmluZygpICsgIjwvaDE+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInN1bW1hcnlcIj4iKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJDUkFTSEVEIiwgbUNyYXNoZWRUZXN0c0NvdW50KTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJGQUlMRUQiLCBtRmFpbGVkTm90SWdub3JlZFRlc3RzLnNpemUoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiSUdOT1JFRCIsIG1JZ25vcmVkVGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJQQVNTRUQiLCBtUGFzc2VkTm90SWdub3JlZFRlc3RzLnNpemUoKSk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdW1tYXJ5VGFibGVSb3coU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgY2FwdGlvbiwgaW50IHNpemUpIHsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0cj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIGNhcHRpb24gKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIHNpemUgKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdHI+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdHNMaXN0V2l0aERpZmYoU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgdGl0bGUsCisgICAgICAgICAgICBMaXN0PEFic3RyYWN0UmVzdWx0PiByZXN1bHRzTGlzdCkgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoOworICAgICAgICBTdHJpbmcgaWQgPSAiIjsKKyAgICAgICAgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZSByZXN1bHRDb2RlOworCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0c0xpc3QpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgyPiIgKyB0aXRsZSArICIgWyIgKyByZXN1bHRzTGlzdC5zaXplKCkgKyAiXTwvaDI+Iik7CisgICAgICAgIGZvciAoQWJzdHJhY3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgICAgIHJlc3VsdENvZGUgPSByZXN1bHQuZ2V0UmVzdWx0Q29kZSgpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIpOworCisgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJzcXJcIj4mI3gyNWEwOyA8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyByZWxhdGl2ZVBhdGggKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBUZWNobmljYWxseSwgdHdvIGRpZmZlcmVudCBwYXRocyBjb3VsZCBlbmQgdXAgYmVpbmcgdGhlIHNhbWUsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiAnOicgaXMgYSB2YWxpZCAgY2hhcmFjdGVyIGluIGEgcGF0aC4gSG93ZXZlciwgaXQgaXMgcHJvYmFibHkgbm90IGdvaW5nCisgICAgICAgICAgICAgICAgICogdG8gY2F1c2UgYW55IHByb2JsZW1zIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlkID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IsICI6Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIjXCIgb25DbGljaz1cInRvZ2dsZURpc3BsYXkoJyIgKyBpZCArICInKTsiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgicmV0dXJuIGZhbHNlO1wiPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInRyaVwiIGlkPVwidHJpLiIgKyBpZCArICJcIj4mI3gyNWI2OyA8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyByZWxhdGl2ZVBhdGggKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2E+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSAiICsgcmVzdWx0Q29kZS5uYW1lKCkgKyAiXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHRDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvc3Bhbj4iKTsKKworICAgICAgICAgICAgLyoqIERldGVjdCBtaXNzaW5nIExUQyBmdW5jdGlvbiAqLworICAgICAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gcmVzdWx0LmdldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiKSAmJgorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiaGFzIG5vIG1ldGhvZCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJMYXlvdXRUZXN0Q29udHJvbGxlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSBub0x0Y1wiPkxUQyBmdW5jdGlvbiBtaXNzaW5nPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoIkV2ZW50U2VuZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vRXZlbnRTZW5kZXJcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIkVTIGZ1bmN0aW9uIG1pc3Npbmc8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJkaWZmXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwiIiArIGlkICsgIlwiPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKHJlc3VsdC5nZXREaWZmQXNIdG1sKCkpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIG9uQ2xpY2s9XCJ0b2dnbGVEaXNwbGF5KCciICsgaWQgKyAiJyk7Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoInJldHVybiBmYWxzZTtcIj5IaWRlPC9hPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2Rpdj4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdHNMaXN0Tm9EaWZmKFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHNMaXN0KSB7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0c0xpc3QpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgyPlBhc3NlZCBbIiArIHJlc3VsdHNMaXN0LnNpemUoKSArICJdPC9oMj4iKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcmVzdWx0IDogcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJzcXJcIj4mI3gyNWEwOyA8L3NwYW4+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlc3VsdCArICI8L3NwYW4+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwic3BhY2VcIj48L2Rpdj4iKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTUxOTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydC5PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBbiBBY3Rpdml0eSB0aGF0IGdlbmVyYXRlcyBhIGxpc3Qgb2YgdGVzdHMgYW5kIHNlbmRzIHRoZSBpbnRlbnQgdG8KKyAqIExheW91dFRlc3RzRXhlY3V0ZXIgdG8gcnVuIHRoZW0uIEl0IGFsc28gcmVzdGFydHMgdGhlIExheW91dFRlc3RzRXhlY3V0ZXIKKyAqIGFmdGVyIGl0IGNyYXNoZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FID0gMDsKKworICAgIC8qKiBDb25zdGFudHMgZm9yIGFkZGluZyBleHRyYXMgdG8gYW4gaW50ZW50ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9QQVRIID0gIlRlc3RQYXRoIjsKKworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RzTGlzdCA9IChBcnJheUxpc3Q8U3RyaW5nPiltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBtVGVzdHNMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdGFydEV4ZWN1dG9yKDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3Q7CisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworCisgICAgcHJpdmF0ZSBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrOworICAgIHByaXZhdGUgYm9vbGVhbiBtRXZlcnl0aGluZ0ZpbmlzaGVkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKiBQcmVwYXJlIHRoZSBwcm9ncmVzcyBkaWFsb2cgKi8KKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKFRlc3RzTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0Q2FuY2VsYWJsZShmYWxzZSk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzc1N0eWxlKFByb2dyZXNzRGlhbG9nLlNUWUxFX1NQSU5ORVIpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoZ2V0VGV4dChSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfbXNnKSk7CisKKyAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKCFpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fUlVOKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1RFU1RfUEFUSCk7CisKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNob3coKTsKKyAgICAgICAgTWVzc2FnZSBkb25lTXNnID0gTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkUpOworCisgICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyk7CisgICAgICAgIHN0YXJ0U2VydmljZShzZXJ2aWNlSW50ZW50KTsKKworICAgICAgICBuZXcgVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkKHBhdGgsIGRvbmVNc2cpLnN0YXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JFQk9PVCkpIHsKKyAgICAgICAgICAgIG9uQ3Jhc2hJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fU0hVVERPV04pKSB7CisgICAgICAgICAgICBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBhbiBpbnRlbnQgdGhhdCBjb21lcyBmcm9tIE1hbmFnZVNlcnZpY2Ugd2hlbiBjcmFzaCBpcyBkZXRlY3RlZC4KKyAgICAgKiBUaGUgaW50ZW50IGNvbnRhaW5zIGFuIGluZGV4IGluIG1UZXN0c0xpc3Qgb2YgdGhlIHRlc3QgdGhhdCBjcmFzaGVkLiBUZXN0c0xpc3RBY3Rpdml0eQorICAgICAqIHJlc3RhcnRzIHRoZSBMYXlvdXRUZXN0c0V4ZWN1dG9yIGZyb20gdGhlIGZvbGxvd2luZyB0ZXN0IGluIG1UZXN0c0xpc3QsIGJ5IHNlbmRpbmcKKyAgICAgKiBhbiBpbnRlbnQgdG8gaXQuIFRoaXMgbmV3IGludGVudCBjb250YWlucyBhIGxpc3Qgb2YgcmVtYWluaW5nIHRlc3RzIHRvIHJ1biwKKyAgICAgKiB0b3RhbCBjb3VudCBvZiBhbGwgdGVzdHMsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHRlc3QgdG8gcnVuIGFmdGVyIHJlc3RhcnRpbmcuCisgICAgICogTGF5b3V0VGVzdEV4ZWN1dG9yIHJ1bnMgdGhlbiBhcyB1c3VhbCwgc2VuZGluZyByZXBvcnRzIHRvIE1hbmFnZXJTZXJ2aWNlLiBJZiBpdAorICAgICAqIGRldGVjdHMgdGhlIGNyYXNoIGl0IHNlbmRzIGEgbmV3IGludGVudCBhbmQgdGhlIGZsb3cgcmVwZWF0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb25DcmFzaEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGludCBuZXh0VGVzdFRvUnVuID0gaW50ZW50LmdldEludEV4dHJhKCJjcmFzaGVkVGVzdEluZGV4IiwgLTEpICsgMTsKKyAgICAgICAgaWYgKG5leHRUZXN0VG9SdW4gPiAwICYmIG5leHRUZXN0VG9SdW4gPD0gbVRvdGFsVGVzdENvdW50KSB7CisgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IobmV4dFRlc3RUb1J1bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2soT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAobUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRXZlcnl0aGluZ0ZpbmlzaGVkSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLyoqIFRPRE86IFNob3cgc29tZSBraW5kIG9mIHN1bW1hcnkgdG8gdGhlIHVzZXIgKi8KKyAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIGlmIChtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5vbkZpbmlzaGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIsIG1UZXN0c0xpc3QpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoInRvdGFsQ291bnQiLCBtVG90YWxUZXN0Q291bnQpOworCisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVRlc3RzTGlzdCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIpOworICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0b3RhbENvdW50Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogKFJlKXN0YXJ0cyB0aGUgZXhlY3V0ZXIgYWN0aXZpdHkgZnJvbSB0aGUgZ2l2ZW4gdGVzdCBudW1iZXIgKGluY2x1c2l2ZSwgMC1iYXNlZCkuCisgICAgICogVGhpcyBudW1iZXIgaXMgYW4gaW5kZXggaW4gbVRlc3RzTGlzdCwgbm90IHRoZSBzdWJsaXN0IHBhc3NlZCBpbiB0aGUgaW50ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0RnJvbQorICAgICAqICAgICAgdGVzdCBpbmRleCBpbiBtVGVzdHNMaXN0IHRvIHN0YXJ0IHRoZSB0ZXN0cyBmcm9tIChpbmNsdXNpdmUsIDAtYmFzZWQpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnRFeGVjdXRvcihpbnQgc3RhcnRGcm9tKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBMYXlvdXRUZXN0c0V4ZWN1dG9yLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisKKyAgICAgICAgaWYgKHN0YXJ0RnJvbSA8IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgaW50ZW50LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVFNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1UZXN0c0xpc3Quc3ViTGlzdChzdGFydEZyb20sIG1Ub3RhbFRlc3RDb3VudCkpKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RfSU5ERVgsIHN0YXJ0RnJvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlbnQucHV0U3RyaW5nQXJyYXlMaXN0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUU19MSVNULAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NWFmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSBUaHJlYWQgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIGxpc3RzIG9mIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RzTGlzdFByZWxvYWRlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQiOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMiOworCisgICAgLyoqIEEgbGlzdCBjb250YWluaW5nIHJlbGF0aXZlIHBhdGhzIG9mIHRlc3RzIHRvIHJ1biAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVRlc3RzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworCisgICAgLyoqCisgICAgICogQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgdGVzdHMgd2Ugd2FudCB0byBydW4gb3IgcGFydGljdWxhciB0ZXN0LgorICAgICAqIFVzZWQgdXAgdG8gYW5kIGluY2x1ZGluZyBwcmVsb2FkVGVzdHMoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHJpdmF0ZSBNZXNzYWdlIG1Eb25lTXNnOworCisgICAgLyoqCisgICAgICogVGhlIGdpdmVuIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqIEBwYXJhbSBkb25lTXNnCisgICAgICovCisgICAgcHVibGljIFRlc3RzTGlzdFByZWxvYWRlclRocmVhZChTdHJpbmcgcGF0aCwgTWVzc2FnZSBkb25lTXNnKSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoVEVTVFNfUk9PVF9ESVJfUEFUSCk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBwYXRoOworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAvKiogQ2hlY2sgaWYgdGhlIHBhdGggaXMgY29ycmVjdCAqLworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShURVNUU19ST09UX0RJUl9QQVRILCBtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6cnVuIiwgIlBhdGggZG9lcyBub3QgZXhpc3Q6ICIgKyBtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKiBQb3B1bGF0ZSB0aGUgdGVzdHMnIGxpc3QgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBwcmVsb2FkVGVzdHMobVJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QuYWRkKG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbURvbmVNc2cub2JqID0gbVRlc3RzTGlzdDsKKyAgICAgICAgbURvbmVNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYWxsIHRoZSB0ZXN0cyBmcm9tIHRoZSBnaXZlbiBmb2xkZXJzIGFuZCBhbGwgdGhlIHN1YmZvbGRlcnMKKyAgICAgKiBpbnRvIG1UZXN0c0xpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyUmVsYXRpdmVQYXRoCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZWxvYWRUZXN0cyhTdHJpbmcgZGlyUmVsYXRpdmVQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBmb2xkZXJzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9sZGVyc0xpc3QuYWRkKGRpclJlbGF0aXZlUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnREaXJSZWxhdGl2ZVBhdGg7CisgICAgICAgIFN0cmluZyBpdGVtTmFtZTsKKyAgICAgICAgRmlsZVtdIGl0ZW1zOworICAgICAgICB3aGlsZSAoIWZvbGRlcnNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY3VycmVudERpclJlbGF0aXZlUGF0aCA9IGZvbGRlcnNMaXN0LnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpdGVtcyA9IG5ldyBGaWxlKFRFU1RTX1JPT1RfRElSX1BBVEgsIGN1cnJlbnREaXJSZWxhdGl2ZVBhdGgpLmxpc3RGaWxlcygpOworICAgICAgICAgICAgZm9yIChGaWxlIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gaXRlbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gY3VycmVudERpclJlbGF0aXZlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbU5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpICYmIEZpbGVGaWx0ZXIuaXNUZXN0RGlyKGl0ZW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmb2xkZXJzTGlzdC5hZGQocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RmlsZShpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtRmlsZUZpbHRlci5pc1NraXAocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RzTGlzdC5hZGQocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbVN1bW1hcml6ZXIuYWRkU2tpcHBlZFRlc3QocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBTdW1tYXJpemVyIGlzIG5vdyBpbiBzZXJ2aWNlIC0gZmlndXJlIG91dCBob3cgdG8gc2VuZCB0aGUgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg2NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUFjdHVhbFJlc3VsdDsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworICAgIHByaXZhdGUgUmVzdWx0Q29kZSBtUmVzdWx0Q29kZTsKKyAgICBwcml2YXRlIE1lc3NhZ2UgbVJlc3VsdE9idGFpbmVkTXNnOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfRE9DVU1FTlRfQVNfVEVYVCkgeworICAgICAgICAgICAgICAgIG1BY3R1YWxSZXN1bHQgPSAoU3RyaW5nKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgbVJlc3VsdE9idGFpbmVkTXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREdW1wQ2hpbGRGcmFtZXNBc1RleHQoYm9vbGVhbiBkdW1wQ2hpbGRGcmFtZXNBc1RleHQpIHsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IGR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHJlY3JlYXRlIHRoZSBSZXN1bHQgd2hlbiByZWNlaXZlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUKKyAgICAgKiAgICAgIGJ1bmRsZSB3aXRoIGRhdGEgdXNlZCB0byByZWNyZWF0ZSB0aGUgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIFRleHRSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtRXhwZWN0ZWRSZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKCJleHBlY3RlZFRleHR1YWxSZXN1bHQiKTsKKyAgICAgICAgbUFjdHVhbFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImFjdHVhbFRleHR1YWxSZXN1bHQiKTsKKyAgICAgICAgc2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoYnVuZGxlLmdldFN0cmluZygiYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmciKSk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBidW5kbGUuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdENvZGUgPSBidW5kbGUuZ2V0U3RyaW5nKCJyZXN1bHRDb2RlIik7CisgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gUmVzdWx0Q29kZS52YWx1ZU9mKHJlc3VsdENvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgaWYgKG1SZXN1bHRDb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVzdWx0Q29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfTk9fRVhQRUNURURfUkVTVUxUOworICAgICAgICB9IGVsc2UgaWYgKCFtRXhwZWN0ZWRSZXN1bHQuZXF1YWxzKG1BY3R1YWxSZXN1bHQpKSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9SRVNVTFRfRElGRkVSUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1SZXN1bHRDb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpIHsKKyAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nID0gZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZysgbUFjdHVhbFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtQWN0dWFsUmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHQoYnl0ZVtdIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSB0byB0aGlzIHR5cGUgb2YgcmVzdWx0ICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICBtRXhwZWN0ZWRSZXN1bHQgPSBleHBlY3RlZFJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8dGFibGUgY2xhc3M9XCJ2aXN1YWxfZGlmZlwiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImhlYWRlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+RXhwZWN0ZWQgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+QWN0dWFsIHJlc3VsdDo8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsIHx8IG1BY3R1YWxSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgYXBwZW5kTnVsbHNIdG1sKGh0bWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwZW5kRGlmZkh0bWwoaHRtbCk7CisgICAgICAgIH0KKworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImZvb3RlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworCisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZERpZmZIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMgPQorICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoKCkuZGlmZl9tYWluKG1FeHBlY3RlZFJlc3VsdCwgbUFjdHVhbFJlc3VsdCk7CisKKyAgICAgICAgZGlmZnMgPSBWaXN1YWxEaWZmVXRpbHMuc3BsaXREaWZmc09uTmV3bGluZShkaWZmcyk7CisKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gZXhwZWN0ZWRMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBhY3R1YWxMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBhY3R1YWxMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhkaWZmcywgZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcyk7CisgICAgICAgIFZpc3VhbERpZmZVdGlscy5nZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKGRpZmZzLCBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpOworCisgICAgICAgIGh0bWwuYXBwZW5kKFZpc3VhbERpZmZVdGlscy5nZXRIdG1sKGV4cGVjdGVkTGluZU51bXMsIGV4cGVjdGVkTGluZXMsCisgICAgICAgICAgICAgICAgYWN0dWFsTGluZU51bXMsIGFjdHVhbExpbmVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZE51bGxzSHRtbChTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgLyoqIFRPRE86IENyZWF0ZSBhIHNlcGFyYXRlIHJvdyBmb3IgZWFjaCBsaW5lIG9mIG5vdCBudWxsIHJlc3VsdCAqLworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cInJlc3VsdHNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgIGlmIChtRXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIkV4cGVjdGVkIHJlc3VsdCB3YXMgTlVMTCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQobUV4cGVjdGVkUmVzdWx0LnJlcGxhY2UoIlxuIiwgIjxiciAvPiIpKTsKKyAgICAgICAgfQorICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICBpZiAobUFjdHVhbFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiQWN0dWFsIHJlc3VsdCB3YXMgTlVMTCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQobUFjdHVhbFJlc3VsdC5yZXBsYWNlKCJcbiIsICI8YnIgLz4iKSk7CisgICAgICAgIH0KKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RyPiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0VHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVGVzdFR5cGUuVEVYVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZykgeworICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cgPSByZXN1bHRPYnRhaW5lZE1zZzsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19ET0NVTUVOVF9BU19URVhUKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogYXJnMSAtIHNob3VsZCBkdW1wIHRvcCBmcmFtZSBhcyB0ZXh0CisgICAgICAgICAqIGFyZzIgLSBzaG91bGQgZHVtcCBjaGlsZCBmcmFtZXMgYXMgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgbXNnLmFyZzEgPSAxOworICAgICAgICBtc2cuYXJnMiA9IG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPyAxIDogMDsKKyAgICAgICAgd2Vidmlldy5kb2N1bWVudEFzVGV4dChtc2cpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJleHBlY3RlZFRleHR1YWxSZXN1bHQiLCBtRXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJhY3R1YWxUZXh0dWFsUmVzdWx0IiwgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmciLCBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVsYXRpdmVQYXRoIiwgbVJlbGF0aXZlUGF0aCk7CisgICAgICAgIGlmIChtUmVzdWx0Q29kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJyZXN1bHRDb2RlIiwgbVJlc3VsdENvZGUubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJ0eXBlIiwgZ2V0VHlwZSgpLm5hbWUoKSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Zpc3VhbERpZmZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgbmFtZS5mcmFzZXIubmVpbC5wbGFpbnRleHQuZGlmZl9tYXRjaF9wYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIGZvIFRleHRSZXN1bHQuZ2V0RGlmZkFzSHRtbCgpCisgKi8KK3B1YmxpYyBjbGFzcyBWaXN1YWxEaWZmVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPTlRfUFJJTlRfTElORV9OVU1CRVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIFByZXByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkaWZmcyBzbyB0aGF0IG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIG9ubHkgYXQgdGhlIGVuZCBvZgorICAgICAqIGRpZmYudGV4dAorICAgICAqCisgICAgICogQHBhcmFtIGRpZmZzCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTGlua2VkTGlzdCBvZiBkaWZmcyB3aGVyZSBuZXcgbGluZSBjaGFyYWN0ZXIgYXBwZWFycyBvbmx5IG9uIHRoZSBlbmQgb2YKKyAgICAgKiAgICAgIGRpZmYudGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IHNwbGl0RGlmZnNPbk5ld2xpbmUoCisgICAgICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMpIHsKKyAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IG5ld0RpZmZzID0gbmV3IExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPigpOworCisgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICBpbnQgbGVuZ3RoTWludXNPbmU7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgcGFydHMgPSBkaWZmLnRleHQuc3BsaXQoIlxuIiwgLTEpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKGRpZmYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGhNaW51c09uZSA9IHBhcnRzLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aE1pbnVzT25lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbaV0gKyAiXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcnRzW2xlbmd0aE1pbnVzT25lXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbbGVuZ3RoTWludXNPbmVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RGlmZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGRlbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJkZWxcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZGVsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtcy5hZGQoRE9OVF9QUklOVF9MSU5FX05VTUJFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW1zLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcykgeworICAgICAgICBTdHJpbmcgaW5zU3BhbiA9ICI8c3BhbiBjbGFzcz1cImluc1wiPiI7CisgICAgICAgIFN0cmluZyBlcWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZXFsXCI+IjsKKworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgc3dpdGNoIChkaWZmLm9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBpbnNTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1zLmFkZChET05UX1BSSU5UX0xJTkVfTlVNQkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFkZCgiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBlcWxTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaW5lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgb3IgYXBwZW5kIGEgbGluZSBmb3IgYSBnaXZlbiBkaWZmIGFuZCBhZGQgaXQgdG8gZ2l2ZW4gY29sbGVjdGlvbnMgaWYgbmVjZXNzYXJ5LgorICAgICAqIEl0IHB1dHMgZGlmZnMgaW4gSFRNTCBzcGFucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWZmCisgICAgICogQHBhcmFtIGxpbmVOdW1zCisgICAgICogQHBhcmFtIGxpbmVzCisgICAgICogQHBhcmFtIGxpbmUKKyAgICAgKiBAcGFyYW0gaQorICAgICAqIEBwYXJhbSBiZWdTcGFuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEaWZmKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmLCBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLAorICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzLCBTdHJpbmcgbGluZSwgaW50IGksIFN0cmluZyBiZWdTcGFuKSB7CisgICAgICAgIFN0cmluZyBlbmRTcGFuID0gIjwvc3Bhbj4iOworICAgICAgICBTdHJpbmcgYnIgPSAiJm5ic3A7IjsKKworICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICBsaW5lTnVtcy5hZGQoaSsrKTsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGluayBvZiBiZXR0ZXIgd2F5IHRvIHJlcGxhY2Ugc3R1ZmYgKi8KKyAgICAgICAgICAgIGxpbmUgKz0gYmVnU3BhbiArIGRpZmYudGV4dC5yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiKQorICAgICAgICAgICAgICAgICAgICArIGVuZFNwYW4gKyBicjsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmUgPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmUgKz0gYmVnU3BhbiArIGRpZmYudGV4dC5yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiKSArIGVuZFNwYW47CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdG1sKExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMxLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMxLAorICAgICAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtczIsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lczIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGxpbmVOdW07CisgICAgICAgIGludCBzaXplID0gbGluZXMxLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8dHIgY2xhc3M9XCJyZXN1bHRzXCI+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICAgICAgbGluZU51bSA9IGxpbmVOdW1zMS5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxpbmVOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZXMxLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgICAgICBsaW5lTnVtID0gbGluZU51bXMyLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpZiAobGluZU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lTnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lczIucmVtb3ZlRmlyc3QoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RyPiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQ0MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKKy8qKgorICogQ2FsbGJhY2sgdXNlZCB0byBpbmZvcm0gc2NyaXB0c3VwcG9ydC5TdGFydGVyIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBhbmQKKyAqIHdlIGNhbiBleGl0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayB7CisgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CisKKy8qKgorICogRXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHRvIGFsbG93IHRoZSBzY3JpcHQgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlIGFwcGxpY2F0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gYXJndW1lbnRzLmdldFN0cmluZygicGF0aCIpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdHNSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBtVGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYWU2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5UZXN0c0xpc3RBY3Rpdml0eTsKKworLyoqCisgKiBBIGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIHNjcmlwdCBydW5uaW5nIG9uIHRoZSBob3N0IG1hY2hpbmUgdG8KKyAqIHJ1biB0aGUgdGVzdHMuCisgKgorICogSXQgc3RhcnRzIGEgVGVzdHNMaXN0QWN0aXZpdHkgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgdGhlIHRlc3RzIGZpbmlzaCBleGVjdXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydGVyIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8VGVzdHNMaXN0QWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdGFydGVyIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIHB1YmxpYyBTdGFydGVyKCkgeworICAgICAgICBzdXBlcihUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYWRiIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgdGVzdHMuIEl0IGRvZXNuJ3QgcmV0dXJuCisgICAgICogdW50aWwgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBzbyB0aGF0IHRoZSBzY3JpcHQgY2FuIHdhaXQgZm9yIHRoZSBlbmQgaWYgaXQgbmVlZHMKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydExheW91dFRlc3RzKCkgeworICAgICAgICBTY3JpcHRUZXN0UnVubmVyIHJ1bm5lciA9IChTY3JpcHRUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcnVubmVyLmdldFRlc3RzUmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIiwgIlRlc3RzTGlzdEFjdGl2aXR5Iik7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzZXRBY3Rpdml0eUludGVudChpbnRlbnQpOworICAgICAgICBnZXRBY3Rpdml0eSgpLnJlZ2lzdGVyT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayhuZXcgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBzYWZlIHRvIGNhbGwgb24gYW55IHRocmVhZCAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU3RhcnRlci50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBTdGFydGVyLnRoaXMubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHdoaWxlICghbUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnN0YXJ0TGF5b3V0VGVzdHMiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvdWkvRGlyTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwZDdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIudWk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuRmlsZUZpbHRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuVGVzdHNMaXN0QWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gQWN0aXZpdHkgdGhhdCBhbGxvd3MgbmF2aWdhdGluZyB0aHJvdWdoIHRlc3RzIGZvbGRlcnMgYW5kIGNob29zaW5nIGZvbGRlcnMgb3IgdGVzdHMgdG8gcnVuLgorICovCitwdWJsaWMgY2xhc3MgRGlyTGlzdEFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkRpckxpc3RBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMiOworCisgICAgLyoqIFRPRE86IFRoaXMgaXMganVzdCBhIGd1ZXNzIC0gdGhpbmsgb2YgYSBiZXR0ZXIgd2F5IHRvIGFjaGlldmUgaXQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVBTl9USVRMRV9DSEFSX1NJWkUgPSAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMgPSAyMDA7CisKKyAgICAvKiogQ29kZSBmb3IgdGhlIGRpYWxvZywgdXNlZCBpbiBzaG93RGlhbG9nIGFuZCBvbkNyZWF0ZURpYWxvZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUFMT0dfUlVOX0FCT1JUX0RJUiA9IDA7CisKKyAgICAvKiogTWVzc2FnZXMgY29kZXMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xPQURFRF9JVEVNUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyA9IDE7CisKKyAgICAvKiogSW5pdGlhbGl6ZWQgbGF6aWx5IGJlZm9yZSBmaXJzdCBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7CisKKyAgICAvKiogVGhpcyBpcyBhIHJlbGF0aXZlIHBhdGghICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnREaXJQYXRoOworCisgICAgLyoqCisgICAgICogVE9ETzogVGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RhbnQsIGJ1dCByYXRoZXIgYmUgY29uZmlndXJhYmxlIGZyb20gc29tZXdoZXJlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1Sb290RGlyUGF0aCA9IFJPT1RfRElSX1BBVEg7CisKKyAgICBwcml2YXRlIEZpbGVGaWx0ZXIgbUZpbGVGaWx0ZXI7CisKKyAgICAvKioKKyAgICAgKiBBIHRocmVhZCByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBmcm9tIHNkIGNhcmQKKyAgICAgKiBhbmQgc2VuZGluZyB0aGVtIHZpYSBNZXNzYWdlIHRvIG1haW4gdGhyZWFkIHRoYXQgdGhlbiBsb2FkcyB0aGVtIGludG8KKyAgICAgKiBMaXN0VmlldworICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgTG9hZExpc3RJdGVtc1RocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKworICAgICAgICBwdWJsaWMgTG9hZExpc3RJdGVtc1RocmVhZChTdHJpbmcgcmVsYXRpdmVQYXRoLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19MT0FERURfSVRFTVMpOworICAgICAgICAgICAgbXNnLm9iaiA9IGdldERpckxpc3QobVJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyeSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBpbnNpZGUgTGlzdFZpZXcgYXMgYW4gaXRlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0SXRlbSBpbXBsZW1lbnRzIENvbXBhcmFibGU8TGlzdEl0ZW0+IHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEaXJlY3Rvcnk7CisKKyAgICAgICAgcHVibGljIExpc3RJdGVtKFN0cmluZyByZWxhdGl2ZVBhdGgsIGJvb2xlYW4gaXNEaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgICAgICAgICBtTmFtZSA9IG5ldyBGaWxlKHJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgbUlzRGlyZWN0b3J5ID0gaXNEaXJlY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNEaXJlY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExpc3RJdGVtIGFub3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBMaXN0SXRlbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmVxdWFscygoKExpc3RJdGVtKSBvKS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9tIGFkYXB0ZXIgdGhhdCBzZXRzIHRoZSBwcm9wZXIgaWNvbiBhbmQgbGFiZWwgaW4gdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXJMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxMaXN0SXRlbT4geworICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIExpc3RJdGVtW10gbUl0ZW1zOworCisgICAgICAgIHB1YmxpYyBEaXJMaXN0QWRhcHRlcihBY3Rpdml0eSBjb250ZXh0LCBMaXN0SXRlbVtdIGl0ZW1zKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5kaXJsaXN0X3JvdywgaXRlbXMpOworCisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtSXRlbXMgPSBpdGVtczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBtQ29udGV4dC5nZXRMYXlvdXRJbmZsYXRlcigpOworICAgICAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmRpcmxpc3Rfcm93LCBudWxsKTsKKworICAgICAgICAgICAgVGV4dFZpZXcgbGFiZWwgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5sYWJlbCk7CisgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KG1JdGVtc1twb3NpdGlvbl0uZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb24gPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7CisgICAgICAgICAgICBpZiAobUl0ZW1zW3Bvc2l0aW9uXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWNvbi5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuZm9sZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWNvbi5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUucnVudGVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcihST09UX0RJUl9QQVRIKTsKKyAgICAgICAgbUxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pIHBhcmVudC5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3dEaXIoaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFJ1biB0aGUgdGVzdCAqLworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoRGlyTGlzdEFjdGl2aXR5LnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0c0xpc3RBY3Rpdml0eS5FWFRSQV9URVNUX1BBVEgsIGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pIHBhcmVudC5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKDEpOworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0U3RyaW5nKCJuYW1lIiwgaXRlbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiLCBpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0RpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUiwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogTWF5YmUgc2hvdyBzb21lIGluZm8gYWJvdXQgYSB0ZXN0PyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvKiogQWxsIHRoZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGVzdCByb290IGRpciB3aGVyZSBwb3NzaWJsZSAqLworICAgICAgICBzaG93RGlyKCIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBpZiBvbmUgZXhpc3RzLiBEb2VzIG5vdCBhbGxvdyB0byBtb3ZlIGFib3ZlCisgICAgICogdGhlIHRlc3QgJ3Jvb3QnIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgeworICAgICAgICBGaWxlIGN1cnJlbnREaXJQYXJlbnQgPSBuZXcgRmlsZShtQ3VycmVudERpclBhdGgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKGN1cnJlbnREaXJQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2hvd0RpcihjdXJyZW50RGlyUGFyZW50LmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93RGlyKCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIHRoZSBhY3Rpdml0eSBmcm9tIHJlY3JlYXRpbmcgb24gY2hhbmdlIG9mIG9yaWVudGF0aW9uLiBUaGUgdGl0bGUgbmVlZHMgdG8KKyAgICAgKiBiZSByZWNhbGN1bGF0ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisKKyAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coaW50IGlkLCBmaW5hbCBCdW5kbGUgYXJncykgeworICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKKyAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgY2FzZSBESUFMT0dfUlVOX0FCT1JUX0RJUjoKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfdGl0bGVfcHJlZml4KSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldFN0cmluZygibmFtZSIpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENhbmNlbGFibGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiogUnVuIHRoZSB0ZXN0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzcyhEaXJMaXN0QWN0aXZpdHkudGhpcywgVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldFN0cmluZygicmVsYXRpdmVQYXRoIikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE5lZ2F0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX2Fib3J0X2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGRpYWxvZyA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgZGlhbG9nLnNldE9uQ2FuY2VsTGlzdGVuZXIobmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRpYWxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgY29udGVudHMgb2YgZGlyIGludG8gdGhlIGxpc3Qgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJQYXRoCisgICAgICogICAgICBkaXJlY3RvcnkgdG8gbG9hZCBpbnRvIGxpc3QgdmlldworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaG93RGlyKFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIG1DdXJyZW50RGlyUGF0aCA9IGRpclBhdGg7CisKKyAgICAgICAgLyoqIFNob3cgcHJvZ3Jlc3MgZGlhbG9nIHdpdGggYSBkZWxheSAqLworICAgICAgICBmaW5hbCBIYW5kbGVyIGRlbGF5ZWREaWFsb2dIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKERpckxpc3RBY3Rpdml0eS50aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzc1N0eWxlKFByb2dyZXNzRGlhbG9nLlNUWUxFX1NQSU5ORVIpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc190aXRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0TWVzc2FnZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc19tc2cpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgTWVzc2FnZSBtc2dTaG93RGlhbG9nID0gZGVsYXllZERpYWxvZ0hhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpOworICAgICAgICBkZWxheWVkRGlhbG9nSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnU2hvd0RpYWxvZywgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TKTsKKworICAgICAgICAvKiogRGVsZWdhdGUgbG9hZGluZyBjb250ZW50cyBmcm9tIFNEIGNhcmQgdG8gYSBuZXcgdGhyZWFkICovCisgICAgICAgIG5ldyBMb2FkTGlzdEl0ZW1zVGhyZWFkKG1DdXJyZW50RGlyUGF0aCwgbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX0xPQURFRF9JVEVNUykgeworICAgICAgICAgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgRGlyTGlzdEFkYXB0ZXIoRGlyTGlzdEFjdGl2aXR5LnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3RJdGVtW10pbXNnLm9iaikpOworICAgICAgICAgICAgICAgICAgICBkZWxheWVkRGlhbG9nSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpOworICAgICAgICAgICAgICAgICAgICBzZXRUaXRsZShzaG9ydGVuVGl0bGUobUN1cnJlbnREaXJQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBmaW5kIGEgbmVhdCB3YXkgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgZml0IGluIHRoZSB0aXRsZQorICAgICAqIGJhci4KKyAgICAgKiAqLworICAgIHByaXZhdGUgU3RyaW5nIHNob3J0ZW5UaXRsZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgaWYgKHRpdGxlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGVzdHMnIHJvb3QgZGlyOiI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNoYXJDb3VudCA9IG1MaXN0Vmlldy5nZXRXaWR0aCgpIC8gTUVBTl9USVRMRV9DSEFSX1NJWkU7CisKKyAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCgpID4gY2hhckNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gIi4uLiIgKyB0aXRsZS5zdWJzdHJpbmcodGl0bGUubGVuZ3RoKCkgLSBjaGFyQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcnJheSB3aXRoIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgICAgICogRmlyc3QgaXQgY29udGFpbnMgdGhlIHN1YmZvbGRlcnMsIHRoZW4gdGhlIGZpbGVzLiBCb3RoIHNvcnRlZAorICAgICAqIGFscGhhYmV0aWNhbGx5LgorICAgICAqCisgICAgICogVGhlIGRpclBhdGggaXMgcmVsYXRpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIGdldERpckxpc3QoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShtUm9vdERpclBhdGgsIGRpclBhdGgpOworCisgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpc3RJdGVtWzBdOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxMaXN0SXRlbT4gc3ViRGlycyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkZpbGVzID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlbT4oKTsKKworICAgICAgICBmb3IgKEZpbGUgaXRlbSA6IGRpci5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSAmJiBGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJEaXJzLmFkZChuZXcgTGlzdEl0ZW0obUZpbGVGaWx0ZXIuZ2V0UmVsYXRpdmVQYXRoKGl0ZW0pLCB0cnVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RmlsZShpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJGaWxlcy5hZGQobmV3IExpc3RJdGVtKG1GaWxlRmlsdGVyLmdldFJlbGF0aXZlUGF0aChpdGVtKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3ViRGlycyk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3ViRmlsZXMpOworCisgICAgICAgIC8qKiBDb25jYXRlbmF0ZSB0aGUgdHdvIGxpc3RzICovCisgICAgICAgIHN1YkRpcnMuYWRkQWxsKHN1YkZpbGVzKTsKKworICAgICAgICByZXR1cm4gc3ViRGlycy50b0FycmF5KG5ldyBMaXN0SXRlbVtzdWJEaXJzLnNpemUoKV0pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tayBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzQzZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEh3QWNjZWxlcmF0aW9uVGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxYjRjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpIj4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJId1VpIgorICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9InRydWUiPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWxwaGFMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfzrFMYXllcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iWGZlcm1vZGVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfWGZlcm1vZGVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJCaXRtYXBzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkJpdG1hcHNSZWN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNSZWN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJOaW5lUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2giPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJRdWlja1JlamVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9RdWlja1JlamVjdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlJvdGF0aW9uQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JvdGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNoYWRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2hhZGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfVGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ikxpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGlzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik1vcmVTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkNvbG9yRmlsdGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9Db2xvckZpbHRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGluZXNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGluZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJQYXRoc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9QYXRocyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUcmFuc2Zvcm0zZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il8zZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTaW1wbGVQYXRoc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TaW1wbGVQYXRocyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJBZHZhbmNlZEJsZW5kQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0FkdmFuY2VkQmxlbmQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NDhmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiIC8+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjNkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQWRkIiAvPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJSZW1vdmUiIC8+CisgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgwYTZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0FkdmFuY2VkQmxlbmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBBZHZhbmNlZEJsZW5kQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZVNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlMlNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlM1NoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlNFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlNVNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlNlNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZDJTaGFkZXI7CisKKyAgICAgICAgU2hhZGVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgQml0bWFwIHRleHR1cmUgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtVGV4V2lkdGggPSB0ZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gdGV4dHVyZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSBtVGV4V2lkdGggKiAyLjJmOworICAgICAgICAgICAgbURyYXdIZWlnaHQgPSBtVGV4SGVpZ2h0ICogMS4yZjsKKworICAgICAgICAgICAgbVNjYWxlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMi5zZXRTY2FsZSgwLjVmLCAwLjVmKTsKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTMgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMy5zZXRTY2FsZSgwLjFmLCAwLjFmKTsKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyLnNldExvY2FsTWF0cml4KG0zKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUNvbXBvc2VTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5EQVJLRU4pOworICAgICAgICAgICAgbUNvbXBvc2UyU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTElHSFRFTik7CisgICAgICAgICAgICBtQ29tcG9zZTNTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5NVUxUSVBMWSk7CisgICAgICAgICAgICBtQ29tcG9zZTRTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TQ1JFRU4pOworICAgICAgICAgICAgbUNvbXBvc2U1U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuQUREKTsKKyAgICAgICAgICAgIG1Db21wb3NlNlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1Ib3JHcmFkaWVudCwgbVNjYWxlZFNoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLk9WRVJMQVkpOworCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlM1NoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2U0U2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2U1U2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2U2U2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTdhMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBBbHBoYUxheWVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkh3VWkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIERpcnR5Qml0bWFwVmlldyBjb250YWluZXIgPSBuZXcgRGlydHlCaXRtYXBWaWV3KHRoaXMpOworCisgICAgICAgIENvbG9yVmlldyBjb2xvciA9IG5ldyBDb2xvclZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGNvbG9yLCBuZXcgRGlydHlCaXRtYXBWaWV3LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBkaXBUb1B4KHRoaXMsIDEwMCksIGRpcFRvUHgodGhpcywgMTAwKSwgR3Jhdml0eS5DRU5URVIpKTsKKworICAgICAgICBBbHBoYUFuaW1hdGlvbiBhID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIGNvbG9yLnN0YXJ0QW5pbWF0aW9uKGEpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ29sb3JWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIENvbG9yVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDAsIDI1NSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRGlydHlCaXRtYXBWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDIwMC4wZiwgMC4wZiwgMjIwLjBmLCAyMC4wZiwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMTAwLjBmLCAxMDAuMGYsIDExMC4wZiwgMTEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsaXBSZWN0ID0gIiArIGNhbnZhcy5nZXRDbGlwQm91bmRzKCkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCg1MC4wZiwgNTAuMGYsIDYwLjBmLCA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoODAuMGYsIDgwLjBmLCA5MC4wZiwgOTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUoMi4wZiwgMi4wZik7ICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMC4wZiwgMjAuMGYsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZVRvID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYSgwLjBmLCAxMDAuMGYsIGdldFdpZHRoKCksIDE1MC4wZiwgMTI3LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMTAwLjBmLCA0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMGZmZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDQwLjBmLCAxMDAuMGYsIDE0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDE0MC4wZiwgMTAwLjBmLCAyNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlVG8pOworCisgICAgICAgICAgICBzdXBlci5kaXNwYXRjaERyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE4ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5TY2FsZUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEJpdG1hcHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg0ODAsIDgwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICAgICAgCisgICAgICAgIFNjYWxlQW5pbWF0aW9uIGEgPSBuZXcgU2NhbGVBbmltYXRpb24oMS4wZiwgMi4wZiwgMS4wZiwgMi4wZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLCAwLjVmLAorICAgICAgICAgICAgICAgIFNjYWxlQW5pbWF0aW9uLlJFTEFUSVZFX1RPX1NFTEYsMC41Zik7CisgICAgICAgIGEuc2V0RHVyYXRpb24oMjAwMCk7CisgICAgICAgIGEuc2V0UmVwZWF0Q291bnQoQW5pbWF0aW9uLklORklOSVRFKTsKKyAgICAgICAgYS5zZXRSZXBlYXRNb2RlKEFuaW1hdGlvbi5SRVZFUlNFKTsKKyAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQb3J0ZXJEdWZmWGZlcm1vZGUgbURzdEluOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbURzdEluID0gbmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0lOKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMjUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtQml0bWFwMi5nZXRXaWR0aCgpLCBtQml0bWFwMi5nZXRIZWlnaHQoKSwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRYZmVybW9kZShtRHN0SW4pOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5yZXNldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzUmVjdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3MjZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzUmVjdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc1JlY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVNyY1JlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3QyOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgZm91cnRoID0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDQuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBoYWxmID0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgbVNyY1JlY3QgPSBuZXcgUmVjdCgoaW50KSBmb3VydGgsIChpbnQpIChoYWxmIC0gaGFsZiAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoZm91cnRoICsgZm91cnRoKSwgKGludCkgKGhhbGYgKyBoYWxmIC8gMi4wZikpOworICAgICAgICAgICAgbURzdFJlY3QgPSBuZXcgUmVjdEYoZm91cnRoLCBoYWxmIC0gaGFsZiAvIDIuMGYsIGZvdXJ0aCArIGZvdXJ0aCwgaGFsZiArIGhhbGYgLyAyLjBmKTsKKyAgICAgICAgICAgIG1Ec3RSZWN0MiA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgKGZvdXJ0aCArIGZvdXJ0aCkgKiAzLjBmLCAoaGFsZiArIGhhbGYgLyAyLjBmKSAqIDMuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMTAwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgbVNyY1JlY3QsIG1Ec3RSZWN0MiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTFlYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JNYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeENvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGlnaHRpbmdDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIENvbG9yRmlsdGVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQml0bWFwc1ZpZXcgdmlldyA9IG5ldyBCaXRtYXBzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQ29sb3JNYXRyaXhQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGlnaHRpbmdQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQmxlbmRQYWludDsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQ29sb3JNYXRyaXhQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgZmluYWwgQ29sb3JNYXRyaXggY29sb3JNYXRyaXggPSBuZXcgQ29sb3JNYXRyaXgoKTsKKyAgICAgICAgICAgIGNvbG9yTWF0cml4LnNldFNhdHVyYXRpb24oMCk7CisgICAgICAgICAgICBtQ29sb3JNYXRyaXhQYWludC5zZXRDb2xvckZpbHRlcihuZXcgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihjb2xvck1hdHJpeCkpOworCisgICAgICAgICAgICBtTGlnaHRpbmdQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxpZ2h0aW5nUGFpbnQuc2V0Q29sb3JGaWx0ZXIobmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMHgwMDYwZmZmZiwgMHgwMDEwMTAzMCkpOworCisgICAgICAgICAgICBtQmxlbmRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsZW5kUGFpbnQuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigweDdmOTkwMDQwLAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX09WRVIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQ29sb3JNYXRyaXhQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUxpZ2h0aW5nUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDUwLjBmICsgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CbGVuZFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiArIG1CaXRtYXAxLmdldFdpZHRoKCkgKyAxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQ29sb3JNYXRyaXhQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUxpZ2h0aW5nUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDUwLjBmICsgbUJpdG1hcDIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1CbGVuZFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGF5ZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2NkMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTQwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDUwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDEyNS4wZik7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKSk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0FUT1ApKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGluZXNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDBkNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGluZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaW5lc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgTGluZXNWaWV3IHZpZXcgPSBuZXcgTGluZXNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGluZXNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TbWFsbFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1NZWRpdW1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGFyZ2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBTaGFkZXIgbVNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUFscGhhUGFpbnQ7CisKKyAgICAgICAgTGluZXNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworCisgICAgICAgICAgICBtU21hbGxQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHJva2VXaWR0aCgxLjBmKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0cm9rZVdpZHRoKDQuMGYpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHJva2VXaWR0aCgxNS4wZik7CisKKyAgICAgICAgICAgIG1BbHBoYVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRDb2xvcigweDdmZmYwMDUwKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFN0cm9rZVdpZHRoKDEwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIobUJpdG1hcDEsIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUG9pbnRzID0gbmV3IGZsb2F0W10geworICAgICAgICAgICAgICAgICAgICA2Mi4wZiwgMC4wZiwgMzAyLjBmLCA0MDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDMwMi4wZiwgNDAwLjBmLCAzNTIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzUyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNTAwLjBmCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEwMC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoMC4wZiwgMC4wZiwgNDAuMGYsIDQwMC4wZiwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDUuMGYsIDAuMGYsIDk1LjBmLCA0MDAuMGYsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoMjIuMGYsIDAuMGYsIDE2Mi4wZiwgNDAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSg0Mi4wZiwgMC4wZiwgMjIyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lcyhtUG9pbnRzLCBtQWxwaGFQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZXMobVBvaW50cywgbUFscGhhUGFpbnQpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG51bGwpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Mzg5NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHVibGljIFNpbXBsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIERBVEFfTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHYgPSAoVGV4dFZpZXcpIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gci5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgdi5zZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZygoaW50KSAoNiAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKHIuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL01vcmVTaGFkZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNlZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL01vcmVTaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGlnaHRpbmdDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTW9yZVNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMyA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0zLnNldFNjYWxlKDAuMWYsIDAuMWYpOworICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTMpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCAweDdmMDBmZjAwLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbUNvbXBvc2VTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBtQ29tcG9zZTJTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKTsKKworICAgICAgICAgICAgbUNvbG9yRmlsdGVyID0gbmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMHgwMDYwZmZmZiwgMHgwMDEwMTAzMCk7CisgCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNjYWxlZDJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgNjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihtQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMTAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtVmVydEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDIwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTmluZVBhdGNoZXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY4ZmJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTmluZVBhdGNoZXNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgYi5zZXRMYXlvdXRQYXJhbXMobmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyhGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIGIuc2V0VGV4dCgiOSBwYXRjaGVzIik7CisgICAgICAgIGxheW91dC5hZGRWaWV3KGIpOworICAgICAgICBsYXlvdXQuc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQ5OTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUGF0aHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFBhdGhzVmlldyB2aWV3ID0gbmV3IFBhdGhzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhdGhzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU21hbGxQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwU2hhZGVyIG1TaGFkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aCBtUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtUGF0aEJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQm91bmRzUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGluZVBhaW50OworCisgICAgICAgIFBhdGhzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMS4wZik7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGluZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDBmZik7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYXRoID0gbmV3IFBhdGgoKTsKKyAgICAgICAgICAgIG1QYXRoLm1vdmVUbygwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMC4wZiwgMC4wZiwgMTAwLjBmLCAxNTAuMGYsIDEwMC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMTAwLjBmLCAyMDAuMGYsIDUwLjBmLCAzMDAuMGYsIC04MC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oLTgwLjBmLCAyMDAuMGYsIDEwMC4wZiwgMjAwLjBmLCAyMDAuMGYsIDAuMGYpOworCisgICAgICAgICAgICBtUGF0aEJvdW5kcyA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgbVBhdGguY29tcHV0ZUJvdW5kcyhtUGF0aEJvdW5kcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJvdW5kc1BhaW50LnNldENvbG9yKDB4NDAwMGZmMDApOworCisgICAgICAgICAgICBtT2Zmc2V0ID0gbU1lZGl1bVBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAoaW50KSAobVBhdGhCb3VuZHMud2lkdGgoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gKGludCkgKG1QYXRoQm91bmRzLmhlaWdodCgpICsgbU9mZnNldCAqIDMuMGYgKyAwLjVmKTsKKyAgICAgICAgICAgIG1CaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQUxQSEFfOCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLW1QYXRoQm91bmRzLmxlZnQgKyBtT2Zmc2V0ICogMS41ZiwgLW1QYXRoQm91bmRzLnRvcCArIG1PZmZzZXQgKiAxLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyMDAuMGYsIDYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCAzNjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVBhdGhCb3VuZHMsIG1Cb3VuZHNQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAsIG1QYXRoQm91bmRzLmxlZnQgLSBtT2Zmc2V0ICogMS41ZiwKKyAgICAgICAgICAgICAgICAgICAgbVBhdGhCb3VuZHMudG9wIC0gbU9mZnNldCAqIDEuNWYsIG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAuMGYsIC0zNjAuMGYsIDAuMGYsIDUwMC4wZiwgbUxpbmVQYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9RdWlja1JlamVjdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2ExZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFF1aWNrUmVqZWN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBRdWlja1JlamVjdFZpZXcgdmlldyA9IG5ldyBRdWlja1JlamVjdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBRdWlja1JlamVjdFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworCisgICAgICAgIFF1aWNrUmVqZWN0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLjBmLCAwLjBmLCA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgNTAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Sb3RhdGlvbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjljYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUm90YXRpb25BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcgY29udGFpbmVyID0gbmV3IERyYXdpbmdWaWV3KHRoaXMpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhd2luZ1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZGlwVG9QeChnZXRDb250ZXh0KCksIDQwMCksIGRpcFRvUHgoZ2V0Q29udGV4dCgpLCAyMDApKTsKKyAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoNDUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTgwLjBmLCAtODAuMGYsIDgwLjBmLCA4MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMjAuMGYsIDIyMC4wZiwgbVBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMTQyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9TaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVJlcGVhdFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVRyYW5zbGF0ZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbURpYWdHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1SZXBlYXRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworCisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCk7CisgICAgICAgICAgICBNYXRyaXggbTEgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMS5zZXRUcmFuc2xhdGUobVRleFdpZHRoIC8gMi4wZiwgbVRleEhlaWdodCAvIDIuMGYpOworICAgICAgICAgICAgbTEucG9zdFJvdGF0ZSg0NSwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1EaWFnR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCAvIDEuNWYsIG1EcmF3SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTFVFLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgLy8gQml0bWFwIHNoYWRlcnMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVJlcGVhdFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1UcmFuc2xhdGVkU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVNjYWxlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIC8vIEdyYWRpZW50cworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtSG9yR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtRGlhZ0dyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVZlcnRHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFhMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY2NjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RleHRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgVGV4dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgQ3VzdG9tVGV4dFZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDdXN0b21UZXh0VmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1NZWRpdW1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGFyZ2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU3RyaWtlUGFpbnQ7CisKKyAgICAgICAgQ3VzdG9tVGV4dFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbUxhcmdlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFRleHRTaXplKDM2LjBmKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDIwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5DRU5URVIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA0MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uUklHSFQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA2MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uTEVGVCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDEwMCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMjAwLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCA0MCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dCh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNzAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dChmYWxzZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDEwMCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dChmYWxzZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgxNTAuMGYsIDIyMC4wZiwgNDUwLjBmLCAzMjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAzMDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNGNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zZm9ybTNkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBUcmFuc2Zvcm0zZFZpZXcgdmlldyA9IG5ldyBUcmFuc2Zvcm0zZFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm0zZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7CisgICAgICAgIHByaXZhdGUgTWF0cml4IG1NYXRyaXg7CisKKyAgICAgICAgVHJhbnNmb3JtM2RWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgIG1NYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWCA9IGdldFdpZHRoKCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDIuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBjZW50ZXJZID0gZ2V0SGVpZ2h0KCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgQ2FtZXJhIGNhbWVyYSA9IG1DYW1lcmE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIE1hdHJpeCBtYXRyaXggPSBtTWF0cml4OworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDMyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAwLjBmLCBtYXRyaXgpOworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDEyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAtbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCA1Mi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMjIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCkgKiAyLjBmLCBtYXRyaXgpOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JpdG1hcChDYW52YXMgY2FudmFzLCBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCkgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUob2Zmc2V0LCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jb25jYXQobWF0cml4KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBjZW50ZXJYLCBjZW50ZXJZLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcm90YXRlKGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIENhbWVyYSBjYW1lcmEsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCwgZmxvYXQgYW5nbGUpIHsKKyAgICAgICAgICAgIGNhbWVyYS5zYXZlKCk7CisgICAgICAgICAgICBjYW1lcmEucm90YXRlWShhbmdsZSk7CisgICAgICAgICAgICBjYW1lcmEuZ2V0TWF0cml4KG1hdHJpeCk7CisgICAgICAgICAgICBjYW1lcmEucmVzdG9yZSgpOworCisgICAgICAgICAgICBtYXRyaXgucHJlVHJhbnNsYXRlKC1jZW50ZXJYLCAtY2VudGVyWSk7CisgICAgICAgICAgICBtYXRyaXgucG9zdFRyYW5zbGF0ZShjZW50ZXJYLCBjZW50ZXJZKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODFmMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBYZmVybW9kZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBYZmVybW9kZXNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgWGZlcm1vZGVzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlZFBhaW50OworCisgICAgICAgIFhmZXJtb2Rlc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJsdWVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNSQyBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEU1QgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT3RoZXIgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuQ0xFQVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlhPUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4N2YwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1JlY3RzKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1SZWRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MmI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcCBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKaW5kZXggODMwNTdiOC4uYzQwYWY4MCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAorKysgYi90b29scy9hYXB0L0NvbW1hbmQuY3BwCkBAIC0xOTcsOCArMTk3LDEwIEBACiAgICAgICAgIGlmICgmcmVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHByaW50ZigiXG5ObyByZXNvdXJjZSB0YWJsZSBmb3VuZC5cbiIpOwogICAgICAgICB9IGVsc2UgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgICAgIHByaW50ZigiXG5SZXNvdXJjZSB0YWJsZTpcbiIpOwogICAgICAgICAgICAgcmVzLnByaW50KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgQXNzZXQqIG1hbmlmZXN0QXNzZXQgPSBhc3NldHMub3Blbk5vbkFzc2V0KCJBbmRyb2lkTWFuaWZlc3QueG1sIiwKQEAgLTM4OCw4ICszOTAsOSBAQAogICAgIH0KIAogICAgIGlmIChzdHJjbXAoInJlc291cmNlcyIsIG9wdGlvbikgPT0gMCkgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgcmVzLnByaW50KGJ1bmRsZS0+Z2V0VmFsdWVzKCkpOwotCisjZW5kaWYKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgieG1sdHJlZSIsIG9wdGlvbikgPT0gMCkgewogICAgICAgICBpZiAoYnVuZGxlLT5nZXRGaWxlU3BlY0NvdW50KCkgPCAzKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBubyBkdW1wIHhtbHRyZWUgcmVzb3VyY2UgZmlsZSBzcGVjaWZpZWRcbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcCBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKaW5kZXggOTk5YTVjZi4uM2NiNjE0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAorKysgYi90b29scy9hYXB0L1BhY2thZ2UuY3BwCkBAIC00NDEsNyArNDQxLDcgQEAKIAogc3NpemVfdCBwcm9jZXNzSmFyRmlsZXMoQnVuZGxlKiBidW5kbGUsIFppcEZpbGUqIHppcCkKIHsKLSAgICBzc2l6ZV90IGVycjsKKyAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3NpemVfdCBjb3VudCA9IDA7CiAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPGNvbnN0IGNoYXIqPiYgamFycyA9IGJ1bmRsZS0+Z2V0SmFyRmlsZXMoKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcAppbmRleCBjYWZkNjM1Li41ODU1YjU2IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcApAQCAtNTQyLDExICs1NDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxBYXB0R3JvdXBFbnRyeSwgc3A8QWFwdEZpbGU+ID4gYmFzZUZpbGVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwLT5nZXRGaWxlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYmFzZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYXNlRmlsZSAlbGQgaGFzIGZsYXZvciAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVkIGhhcyBmbGF2b3IgJXNcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZXMua2V5QXQoaSkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdmVybGF5RmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm92ZXJsYXlGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUF0KG92ZXJsYXlHcm91cEluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihiYXNlRmlsZUluZGV4IDwgVU5LTk9XTl9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUtPmdldFZlcmJvc2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVsZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhIG1hdGNoICglZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cC0+Z2V0TGVhZigpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChvdmVybGF5R3JvdXBJbmRleCkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAppbmRleCA3NTViOTNiLi5mNDBhODc3IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKQEAgLTIzNjYsNyArMjM2Niw3IEBACiAgICAgICAgIGlmIChjb25maWdTZXQuY291bnQoZGVmYXVsdExvY2FsZSkgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJhYXB0OiB3YXJuaW5nOiBzdHJpbmcgJyVzJyBoYXMgbm8gZGVmYXVsdCB0cmFuc2xhdGlvbiBpbiAlczsgZm91bmQ6IiwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChuYW1lSXRlci0+Zmlyc3QpLnN0cmluZygpLCBtQnVuZGxlLT5nZXRSZXNvdXJjZVNvdXJjZURpcnMoKVswXSk7Ci0gICAgICAgICAgICBmb3IgKHNldDxTdHJpbmc4Pjo6aXRlcmF0b3IgbG9jYWxlcyA9IGNvbmZpZ1NldC5iZWdpbigpOworICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46OmNvbnN0X2l0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKICAgICAgICAgICAgICAgICAgbG9jYWxlcyAhPSBjb25maWdTZXQuZW5kKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMrKykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICVzIiwgKCpsb2NhbGVzKS5zdHJpbmcoKSk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAppbmRleCBhMDljZWMwLi5lMjhiZGZmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCisrKyBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIHN0ciA9IFN0cmluZzgocG9vbC0+c3RyaW5nQXQocywgJmxlbikpLnN0cmluZygpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpbnRmKCJTdHJpbmcgIyVsZDogJXNcbiIsIHMsIHN0cik7CisgICAgICAgIHByaW50ZigiU3RyaW5nICMlZDogJXNcbiIsIHMsIHN0cik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1hNTE5vZGUuY3BwIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAppbmRleCA1N2ZmNDdhLi40NTI1NDliIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1hNTE5vZGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKQEAgLTIwMyw5ICsyMDMsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoeGxpZmZEZXB0aCA9PSAwICYmIHBzZXVkb2xvY2FsaXplKSB7CisjaWZkZWYgRU5BQkxFX1BTRVVET0xPQ0FMSVpFCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3JpZyhTdHJpbmc4KHRleHQpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwc2V1ZG8gPSBwc2V1ZG9sb2NhbGl6ZV9zdHJpbmcob3JpZyk7CiAgICAgICAgICAgICAgICAgY3VyU3RyaW5nLmFwcGVuZChTdHJpbmcxNihTdHJpbmc4KHBzZXVkby5jX3N0cigpKSkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChpc0Zvcm1hdHRlZCAmJiBoYXNTdWJzdGl0dXRpb25FcnJvcnMoZmlsZU5hbWUsIGluWG1sLCB0ZXh0KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oIGIvdG9vbHMvYWFwdC9aaXBGaWxlLmgKaW5kZXggZGJiZDA3Mi4uNzg3NzU1MCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9aaXBGaWxlLmgKKysrIGIvdG9vbHMvYWFwdC9aaXBGaWxlLmgKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAvKgogICAgICAqIE9wZW4gYSBuZXcgb3IgZXhpc3RpbmcgYXJjaGl2ZS4KICAgICAgKi8KLSAgICB0eXBlZGVmIGVudW0geworICAgIGVudW0gewogICAgICAgICBrT3BlblJlYWRPbmx5ICAgPSAweDAxLAogICAgICAgICBrT3BlblJlYWRXcml0ZSAgPSAweDAyLAogICAgICAgICBrT3BlbkNyZWF0ZSAgICAgPSAweDA0LCAgICAgLy8gY3JlYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9SRUFETUUgYi90b29scy9sYXlvdXRsaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZWE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorTGF5b3V0bGliIGlzIGEgY3VzdG9tIHZlcnNpb24gb2YgdGhlIGFuZHJvaWQgVmlldyBmcmFtZXdvcmsgZGVzaWduZWQgdG8gcnVuIGluc2lkZSBFY2xpcHNlLgorVGhlIGdvYWwgb2YgdGhlIGxpYnJhcnkgaXMgdG8gcHJvdmlkZSBsYXlvdXQgcmVuZGVyaW5nIGluIEVjbGlwc2UgdGhhdCBhcmUgdmVyeSB2ZXJ5IGNsb3NlIHRvIHRoZWlyIHJlbmRlcmluZyBvbiBkZXZpY2VzLgorCitOb25lIG9mIHRoZSBjb20uYW5kcm9pZC4qIG9yIGFuZHJvaWQuKiBjbGFzc2VzIGluIGxheW91dGxpYiBydW4gb24gZGV2aWNlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQppbmRleCBkNWQzMTVlLi4xZTFhYmE5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKQEAgLTY5LDExICs2OSw2IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIENhbnZhcyhpbnQpIik7CiAgICAgfQogCi0gICAgcHVibGljIENhbnZhcyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCBnbCkgewotICAgICAgICBtTG9nZ2VyID0gbnVsbDsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgQ2FudmFzKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMKSIpOwotICAgIH0KLQogICAgIC8vIGN1c3RvbSBjb25zdHJ1Y3RvcnMgZm9yIG91ciB1c2UuCiAgICAgcHVibGljIENhbnZhcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIElMYXlvdXRMb2cgbG9nZ2VyKSB7CiAgICAgICAgIG1Mb2dnZXIgPSBsb2dnZXI7CkBAIC0xMTc0LDE1ICsxMTY5LDYgQEAKICAgICB9CiAKICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNnZXRHTCgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEdMIGdldEdMKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRHTCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2dldE1hdHJpeCgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMjU3LDE1ICsxMjQzLDYgQEAKICAgICB9CiAKICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNzZXRWaWV3cG9ydChpbnQsIGludCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICBzdXBlci5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNza2V3KGZsb2F0LCBmbG9hdCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEKaW5kZXggNzQ0YmZiZS4uNThiMWI2YyAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtMTA1OSw2ICsxMDYwLDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBhcmcwLCBpbnQgYXJnMSwKKyAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgYXJnMiwgRGF0YWJhc2VFcnJvckhhbmRsZXIgYXJnMykgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEcmF3YWJsZSBwZWVrV2FsbHBhcGVyKCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAppbmRleCA2ZTBiYzlkLi4zNDI2YWY3IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbApAQCAtODUsNSArODUsMTMgQEAKICAgICBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCk7CiAKICAgICB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIHN0YXJ0V2lmaSgpOworCisgICAgdm9pZCBzdG9wV2lmaSgpOworCisgICAgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpOworCisgICAgdm9pZCBjbGVhckJsYWNrbGlzdCgpOwogfQogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQppbmRleCA0YTIyYjY4Li4zMzk3NjNhIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcgPSAxMDsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBkaXNhYmxlZC4KICAgICAgKgpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMRUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMRUQgPSAxMTsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBjdXJyZW50bHkgYmVpbmcgZW5hYmxlZC4gVGhlIHN0YXRlIHdpbGwgY2hhbmdlIHRvCiAgICAgICoge0BsaW5rICNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9IGlmIGl0IGZpbmlzaGVzIHN1Y2Nlc3NmdWxseS4KQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HID0gMTI7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgZW5hYmxlZC4KICAgICAgKgpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxFRCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMTM7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgaW4gYSBmYWlsZWQgc3RhdGUuIFRoaXMgc3RhdGUgd2lsbCBvY2N1ciB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKICAgICAgKiBlbmFibGluZyBvciBkaXNhYmxpbmcKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9GQUlMRUQgPSAxNDsKIAogICAgIC8qKgogICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQgaGFzCkBAIC0yOTMsNiArMjkzLDIxIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTkVXX1JTU0kgPSAibmV3UnNzaSI7CiAKICAgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgaW50ZW50IGFjdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIElQIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBjaGFuZ2VkIG9uIHdpZmkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DSEFOR0VEX0FDVElPTiA9ICJhbmRyb2lkLm5ldC53aWZpLkNPTkZJR19DSEFOR0VEIjsKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXN9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogV2ktRmkgbmV0d29yay4gUmV0cmlldmUgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFBhcmNlbGFibGVFeHRyYShTdHJpbmcpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FVFdPUktfUFJPUEVSVElFUyA9ICJuZXR3b3JrUHJvcGVydGllcyI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbmV0d29yayBJRHMgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgY291bGQgaGF2ZSBjaGFuZ2VkLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCkBAIC04MzgsNiArODUzLDgyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBkcml2ZXIgYW5kIGNvbm5lY3QgdG8gbmV0d29yay4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gRm9yIGV4YW1wbGUsCisgICAgICogZXZlbiBpZiB0aGUgZGV2aWNlIGlzIGlkbGUgb3IgdGhlcmUgaXMgb25seSBhIHNjYW4tb25seSBsb2NrIGhlbGQsCisgICAgICogYSBzdGFydCB3aWZpIHdvdWxkIG1lYW4gdGhhdCB3aWZpIGNvbm5lY3Rpb24gaXMga2VwdCBhY3RpdmUgdW50aWwKKyAgICAgKiBhIHN0b3BXaWZpKCkgaXMgc2VudC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0V2lmaSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gYSBuZXR3b3JrIChpZiBhbnkpIGFuZCBzdG9wIHRoZSBkcml2ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb3Zlci1yaWRlIFdpZmlMb2NrIGFuZCBkZXZpY2UgaWRsZSBzdGF0dXMuIFdpLUZpCisgICAgICogc3RheXMgaW5hY3RpdmUgdW50aWwgYSBzdGFydFdpZmkoKSBpcyBpc3N1ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlTdGF0ZVRyYWNrZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wV2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0b3BXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGJzc2lkIHRvIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8ga2VlcCB0aGUgV2ktRmkgcmFkaW8gYXdha2UuCiAgICAgICogTm9ybWFsbHkgdGhlIFdpLUZpIHJhZGlvIG1heSB0dXJuIG9mZiB3aGVuIHRoZSB1c2VyIGhhcyBub3QgdXNlZCB0aGUgZGV2aWNlIGluIGEgd2hpbGUuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQppbmRleCAyNjZkODAxLi5hZjMxMzJmIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKQEAgLTE5LDE0ICsxOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogCiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiAKIC8qKgogICogTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIHdwYV9zdXBwbGljYW50IHNlcnZlciwgYW5kIHBhc3NlcyB0aGVtIG9uCi0gKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZVRyYWNrZXJ9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KKyAqIHRvIHRoZSB7QGxpbmsgV2lmaVN0YXRlTWFjaGluZX0gZm9yIGhhbmRsaW5nLiBSdW5zIGluIGl0cyBvd24gdGhyZWFkLgogICoKICAqIEBoaWRlCiAgKi8KQEAgLTExNyw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gbUNvbm5lY3RlZEV2ZW50UGF0dGVybiA9CiAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKCg/OlswLTlhLWZdezJ9Oil7NX1bMC05YS1mXXsyfSkgLiogXFxbaWQ9KFswLTldKykgIik7CiAKLSAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZVRyYWNrZXIgbVdpZmlTdGF0ZVRyYWNrZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVNYWNoaW5lIG1XaWZpU3RhdGVNYWNoaW5lOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpbmRpY2F0ZXMgdGhlIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBmb3IgdGhlIG1vbml0b3IgaXMgY2xvc2VkCkBAIC0xMzksMzEgKzEzOCwyNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDVl9FUlJPUlMgICAgPSAxMDsKIAotICAgIHB1YmxpYyBXaWZpTW9uaXRvcihXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB0cmFja2VyOworICAgIHB1YmxpYyBXaWZpTW9uaXRvcihXaWZpU3RhdGVNYWNoaW5lIHdpZmlTdGF0ZU1hY2hpbmUpIHsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUgPSB3aWZpU3RhdGVNYWNoaW5lOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKICAgICAgICAgbmV3IE1vbml0b3JUaHJlYWQoKS5zdGFydCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICBjbGFzcyBNb25pdG9yVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICAgICAgcHVibGljIE1vbml0b3JUaHJlYWQoKSB7CiAgICAgICAgICAgICBzdXBlcigiV2lmaU1vbml0b3IiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAKICAgICAgICAgICAgIGlmIChjb25uZWN0VG9TdXBwbGljYW50KCkpIHsKICAgICAgICAgICAgICAgICAvLyBTZW5kIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHNlbmQgY29tbWFuZHMKICAgICAgICAgICAgICAgICAvLyB0byB0aGUgc3VwcGxpY2FudAotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50TG9zdCgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMjU5LDcgKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgYW5kIGV4aXQKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXZlbnQoZXZlbnQsIGV2ZW50RGF0YSk7CkBAIC0yNzIsNyArMjY3LDcgQEAKICAgICAgICAgICAgIGludCBjb25uZWN0VHJpZXMgPSAwOwogCiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGlmIChtV2lmaVN0YXRlVHJhY2tlci5jb25uZWN0VG9TdXBwbGljYW50KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoV2lmaU5hdGl2ZS5jb25uZWN0VG9TdXBwbGljYW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjb25uZWN0VHJpZXMrKyA8IDMpIHsKQEAgLTI4NSw3ICsyODAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHJpdmVyRXZlbnQoU3RyaW5nIHN0YXRlKSB7CkBAIC0yOTMsMTEgKzI4OCwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5lcXVhbHMoIlNUT1BQRUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0b3BwZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiU1RBUlRFRCIpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5RHJpdmVyU3RhcnRlZCgpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKCJIQU5HRUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlckh1bmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJIdW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzE4LDcgKzMxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFM6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBVTktOT1dOOgpAQCAtMzc1LDcgKzM3MCw3IEBACiAgICAgICAgICAgICBpZiAobmV3U3VwcGxpY2FudFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTlZBTElEKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW52YWxpZCBzdXBwbGljYW50IHN0YXRlOiAiICsgbmV3U3RhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShuZXR3b3JrSWQsIEJTU0lELCBuZXdTdXBwbGljYW50U3RhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTUsNyArMzkwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3RhdGVDaGFuZ2UobmV3U3RhdGUsIEJTU0lELCBuZXR3b3JrSWQpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlOZXR3b3JrU3RhdGVDaGFuZ2UobmV3U3RhdGUsIEJTU0lELCBuZXR3b3JrSWQpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCmluZGV4IGUwOGY4NTcuLjQ3Zjg4MTMgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpOwogCitpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87CisKIC8qKgogICogTmF0aXZlIGNhbGxzIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBzdXBwbGljYW50IGRhZW1vbiwgYW5kIGZvcgogICogcmVjZWl2aW5nIGFzeW5jaHJvbm91cyBldmVudHMuIEFsbCBtZXRob2RzIG9mIHRoZSBmb3JtICJ4eHh4Q29tbWFuZCgpIgpAQCAtMzksNiArNDEsOCBAQAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIFN0cmluZyBnZXRFcnJvclN0cmluZyhpbnQgZXJyb3JDb2RlKTsKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gbG9hZERyaXZlcigpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBpc0RyaXZlckxvYWRlZCgpOwogICAgIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gdW5sb2FkRHJpdmVyKCk7CiAKQEAgLTE0Myw2ICsxNDcsMTAgQEAKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7CiAKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGRvRGhjcFJlcXVlc3QoRGhjcEluZm8gcmVzdWx0cyk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CisKICAgICAvKioKICAgICAgKiBXYWl0IGZvciB0aGUgc3VwcGxpY2FudCB0byBzZW5kIGFuIGV2ZW50LCByZXR1cm5pbmcgdGhlIGV2ZW50IHN0cmluZy4KICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBzdHJpbmcgc2VudCBieSB0aGUgc3VwcGxpY2FudC4KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU1MDhiCi0tLSAvZGV2L251bGwKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlTWFjaGluZS5qYXZhCkBAIC0wLDAgKzEsMzU3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQud2lmaTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOOworCisvKioKKyAqIFRPRE86IEFkZCBzb2Z0IEFQIHN0YXRlcyBhcyBwYXJ0IG9mIFdJRklfU1RBVEVfWFhYCisgKiBSZXRhaW4gV0lGSV9TVEFURV9FTkFCTElORyB0aGF0IGluZGljYXRlcyBkcml2ZXIgaXMgbG9hZGluZworICogQWRkIFdJRklfU1RBVEVfQVBfRU5BQkxFRCB0byBpbmRpY2F0ZSBzb2Z0IEFQIGhhcyBzdGFydGVkCisgKiBhbmQgV0lGSV9TVEFURV9GQUlMRUQgZm9yIGZhaWx1cmUKKyAqIERlcHJlY2F0ZSBXSUZJX1NUQVRFX1VOS05PV04KKyAqCisgKiBEb2luZyB0aGlzIHdpbGwgc2ltcGxpZnkgdGhlIGxvZ2ljIGZvciBzZW5kaW5nIGJyb2FkY2FzdHMKKyAqLworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9ESVNBQkxJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9FTkFCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9GQUlMRUQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiBXaWZpIGNvbm5lY3Rpdml0eS4gQWxsIGV2ZW50IGhhbmRsaW5nIGlzIGRvbmUgaGVyZSwKKyAqIGFuZCBhbGwgY2hhbmdlcyBpbiBjb25uZWN0aXZpdHkgc3RhdGUgYXJlIGluaXRpYXRlZCBoZXJlLgorICoKKyAqIEBoaWRlCisgKi8KKy8vVE9ETzogd2Ugc3RpbGwgbmVlZCBmcmVxdWVudCBzY2FubmluZyBmb3IgdGhlIGNhc2Ugd2hlbgorLy8gd2UgaXNzdWUgZGlzY29ubmVjdCBidXQgbmVlZCBzY2FuIHJlc3VsdHMgZm9yIG9wZW4gbmV0d29yayBub3RpZmljYXRpb24KK3B1YmxpYyBjbGFzcyBXaWZpU3RhdGVNYWNoaW5lIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVN0YXRlTWFjaGluZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktUWVBFID0gIldJRkkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiBUT0RPOiBmZXRjaCBhIGNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVEFQX0lGQUNFID0gIndsMC4xIjsKKworICAgIHByaXZhdGUgV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yOworICAgIHByaXZhdGUgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBud1NlcnZpY2U7CisgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKKworICAgIC8qIFNjYW4gcmVzdWx0cyBoYW5kbGluZyAqLworICAgIHByaXZhdGUgTGlzdDxTY2FuUmVzdWx0PiBtU2NhblJlc3VsdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUgPSA4MDsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PiBtU2NhblJlc3VsdENhY2hlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUludGVyZmFjZU5hbWU7CisKKyAgICBwcml2YXRlIGludCBtTnVtQWxsb3dlZENoYW5uZWxzID0gMDsKKyAgICBwcml2YXRlIGludCBtTGFzdFNpZ25hbExldmVsID0gLTE7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RCc3NpZDsKKyAgICBwcml2YXRlIGludCBtTGFzdE5ldHdvcmtJZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZVJzc2lQb2xsaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Db25maWdDaGFuZ2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQgaGVscGVyLiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCisgICAgICogbm90ZWQgYnkgaXRzIGphdmFkb2MuIElmIHdlIGNoZWNrIGJlZm9yZSBpdCBpcyBjb25uZWN0ZWQsIGl0IHdpbGwgYmUKKyAgICAgKiBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgd2Ugd2lsbCBub3QgZGlzYWJsZSBjb2V4aXN0ZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUJsdWV0b290aEhlYWRzZXQ7CisKKyAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUJsdWV0b290aEEyZHA7CisKKyAgICAvKioKKyAgICAgKiBPYnNlcnZlcyB0aGUgc3RhdGljIElQIGFkZHJlc3Mgc2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOworICAgIHByaXZhdGUgTmV0d29ya1Byb3BlcnRpZXMgbU5ldHdvcmtQcm9wZXJ0aWVzOworCisgICAgLy8gSGVsZCBkdXJpbmcgZHJpdmVyIGxvYWQgYW5kIHVubG9hZAorICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIERoY3BJbmZvIG1EaGNwSW5mbzsKKyAgICBwcml2YXRlIFdpZmlJbmZvIG1XaWZpSW5mbzsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXI7CisKKyAgICAvLyBFdmVudCBsb2cgdGFncyAobXVzdCBiZSBpbiBzeW5jIHdpdGggZXZlbnQtbG9nLXRhZ3MpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCAgICAgICAgPSA1MDAyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVEICAgICAgICA9IDUwMDIyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgID0gNTAwMjM7CisKKyAgICAvKiBMb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAvKiBVbmxvYWQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgbG9hZCBzdWNjZWVkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICAgID0gMzsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgICA9IDQ7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICA9IDU7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX0ZBSUxVUkUgICAgICAgICAgICA9IDY7CisKKyAgICAvKiBTdGFydCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU1VQUExJQ0FOVCAgICAgICAgICAgICAgICAgPSAxMTsKKyAgICAvKiBTdG9wIHRoZSBzdXBwbGljYW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDEyOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgID0gMTM7CisgICAgLyogU3RhcnQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgPSAxNDsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBzdWNjZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfSVBfQ09ORklHX1NVQ0NFU1MgICAgICAgICAgICAgICAgPSAxNTsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBmYWlsZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19GQUlMVVJFICAgICAgICAgICAgICAgID0gMTY7CisgICAgLyogUmUtY29uZmlndXJlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05GSUdVUkVfSVAgICAgICAgICAgICAgICAgICAgPSAxNzsKKworCisgICAgLyogU3RhcnQgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOworICAgIC8qIFN0b3AgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX0FQICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyOworCisKKyAgICAvKiBTdXBwbGljYW50IGV2ZW50cyAqLworICAgIC8qIENvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBlc3RhYmxpc2hlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgICAgPSAzMTsKKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgbG9zdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgPSAzMjsKKyAgICAvKiBEcml2ZXIgc3RhcnQgY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVF9FVkVOVCAgICAgICAgICAgICAgICAgICA9IDMzOworICAgIC8qIERyaXZlciBzdG9wIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RPUF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSAzNDsKKyAgICAvKiBOZXR3b3JrIGNvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICA9IDM2OworICAgIC8qIE5ldHdvcmsgZGlzY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UICAgICAgICAgID0gMzc7CisgICAgLyogU2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRTX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMzg7CisgICAgLyogU3VwcGxpY2F0ZSBzdGF0ZSBjaGFuZ2VkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UICAgICAgICA9IDM5OworICAgIC8qIFBhc3N3b3JkIG1heSBiZSBpbmNvcnJlY3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVCAgICAgID0gNDA7CisKKyAgICAvKiBTdXBwbGljYW50IGNvbW1hbmRzICovCisgICAgLyogSXMgc3VwcGxpY2FudCBhbGl2ZSA/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9QSU5HX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDUxOworICAgIC8qIEFkZC91cGRhdGUgYSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSyAgICAgICAgICAgID0gNTI7CisgICAgLyogRGVsZXRlIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVNT1ZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1MzsKKyAgICAvKiBFbmFibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIHdpbGwgYXR0ZW1wdCBhIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIG5ldHdvcmsuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9FTkFCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgICA9IDU0OworICAgIC8qIERpc2FibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIGRvZXMgbm90IGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRElTQUJMRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA1NTsKKyAgICAvKiBCbGFja2xpc3QgbmV0d29yay4gRGUtcHJpb3JpdGl6ZXMgdGhlIGdpdmVuIEJTU0lEIGZvciBjb25uZWN0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQkxBQ0tMSVNUX05FVFdPUksgICAgICAgICAgICAgICAgPSA1NjsKKyAgICAvKiBDbGVhciB0aGUgYmxhY2tsaXN0IG5ldHdvcmsgbGlzdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ0xFQVJfQkxBQ0tMSVNUICAgICAgICAgICAgICAgICAgPSA1NzsKKyAgICAvKiBHZXQgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0dFVF9ORVRXT1JLX0NPTkZJRyAgICAgICAgICAgICAgID0gNTg7CisgICAgLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDU5OworICAgIC8qIENvbm5lY3Rpb24gc3RhdHVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9DT05ORUNUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICA9IDYwOworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyBhZnRlciBkcml2ZXIgc3RhcnQqLworICAgIC8qIEluaXRpYXRlIGEgc2NhbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgPSA3MTsKKyAgICAvKiBTZXQgc2NhbiBtb2RlLiBDT05ORUNUX01PREUgb3IgU0NBTl9PTkxZX01PREUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX01PREUgICAgICAgICAgICAgICAgICAgID0gNzI7CisgICAgLyogU2V0IHNjYW4gdHlwZS4gU0NBTl9BQ1RJVkUgb3IgU0NBTl9QQVNTSVZFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICA9IDczOworICAgIC8qIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgID0gNzQ7CisgICAgLyogUmVjb25uZWN0IHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTsKKyAgICAvKiBSZWFzc29jaWF0ZSB0byBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgID0gNzY7CisgICAgLyogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBQT1dFUl9NT0RFX0FDVElWRQorICAgICAqIFBPV0VSX01PREVfQVVUTworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgPSA3NzsKKyAgICAvKiBTZXQgYmx1ZXRvb3RoIGNvLWV4aXN0ZW5jZQorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFICAgICAgICA9IDc4OworICAgIC8qIEVuYWJsZS9kaXNhYmxlIGJsdWV0b290aCBzY2FuIG1vZGUKKyAgICAgKiB0cnVlKDEpCisgICAgICogZmFsc2UoMCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFICAgICAgICAgID0gNzk7CisgICAgLyogU2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMgICAgICAgICA9IDgwOworICAgIC8qIFJlcXVlc3QgY29ubmVjdGl2aXR5IG1hbmFnZXIgd2FrZSBsb2NrIGJlZm9yZSBkcml2ZXIgc3RvcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyAgICAgICAgICAgICAgPSA4MTsKKyAgICAvKiBFbmFibGVzIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgPSA4MjsKKyAgICAvKiBSU1NJIHBvbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgID0gODM7CisgICAgLyogR2V0IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0kgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NDsKKyAgICAvKiBHZXQgYXBwcm94IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0lfQVBQUk9YICAgICAgICAgICAgICAgICAgPSA4NTsKKyAgICAvKiBHZXQgbGluayBzcGVlZCBvbiBjb25uZWN0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICA9IDg2OworICAgIC8qIFJhZGlvIG1hYyBhZGRyZXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICA9IDg3OworICAgIC8qIFNldCB1cCBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICA9IDg4OworICAgIC8qIENsZWFyIHBhY2tldCBmaWx0ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyAgICAgICAgICAgID0gODk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCisgICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX01PREUgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fT05MWV9NT0RFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX0FDVElWRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUEFTU0lWRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50CisgICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgorICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKKworICAgIC8qIERlZmF1bHQgcGFyZW50IHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGVmYXVsdFN0YXRlID0gbmV3IERlZmF1bHRTdGF0ZSgpOworICAgIC8qIFRlbXBvcmFyeSBpbml0aWFsIHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbFN0YXRlID0gbmV3IEluaXRpYWxTdGF0ZSgpOworICAgIC8qIFVubG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyVW5sb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBMb2FkaW5nIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJVbmxvYWRlZFN0YXRlID0gbmV3IERyaXZlclVubG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZC91bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyRmFpbGVkU3RhdGUgPSBuZXcgRHJpdmVyRmFpbGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRpbmdTdGF0ZSA9IG5ldyBEcml2ZXJMb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyTG9hZGVkU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkLCB3YWl0aW5nIGZvciBzdXBwbGljYW50IHRvIHN0YXJ0ICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtV2FpdEZvclN1cFN0YXRlID0gbmV3IFdhaXRGb3JTdXBTdGF0ZSgpOworCisgICAgLyogRHJpdmVyIGxvYWRlZCBhbmQgc3VwcGxpY2FudCByZWFkeSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN1cFJlYWR5U3RhdGUgPSBuZXcgRHJpdmVyU3VwUmVhZHlTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydCBpc3N1ZWQsIHdhaXRpbmcgZm9yIGNvbXBsZXRlZCBldmVudCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0aW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RhcnRpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RhcnRlZFN0YXRlID0gbmV3IERyaXZlclN0YXJ0ZWRTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwaW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RvcHBpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RvcHBlZFN0YXRlID0gbmV3IERyaXZlclN0b3BwZWRTdGF0ZSgpOworICAgIC8qIFNjYW4gZm9yIG5ldHdvcmtzLCBubyBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuTW9kZVN0YXRlID0gbmV3IFNjYW5Nb2RlU3RhdGUoKTsKKyAgICAvKiBDb25uZWN0aW5nIHRvIGFuIGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RNb2RlU3RhdGUgPSBuZXcgQ29ubmVjdE1vZGVTdGF0ZSgpOworICAgIC8qIEZldGNoaW5nIElQIGFmdGVyIG5ldHdvcmsgY29ubmVjdGlvbiAoYXNzb2MrYXV0aCBjb21wbGV0ZSkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0aW5nU3RhdGUgPSBuZXcgQ29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogQ29ubmVjdGVkIHdpdGggSVAgYWRkciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RlZFN0YXRlID0gbmV3IENvbm5lY3RlZFN0YXRlKCk7CisgICAgLyogZGlzY29ubmVjdCBpc3N1ZWQsIHdhaXRpbmcgZm9yIG5ldHdvcmsgZGlzY29ubmVjdCBjb25maXJtYXRpb24gKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0aW5nU3RhdGUgPSBuZXcgRGlzY29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogTmV0d29yayBpcyBub3QgY29ubmVjdGVkLCBzdXBwbGljYW50IGFzc29jK2F1dGggaXMgbm90IGNvbXBsZXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGVkU3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKworICAgIC8qIFNvZnQgQXAgaXMgcnVubmluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNvZnRBcFN0YXJ0ZWRTdGF0ZSA9IG5ldyBTb2Z0QXBTdGFydGVkU3RhdGUoKTsKKworICAgIC8qIEFyZ3VtZW50IGZvciBNZXNzYWdlIG9iamVjdCB0byBpbmRpY2F0ZSBhIHN5bmNocm9ub3VzIGNhbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hST05PVVNfQ0FMTCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTWU5DSFJPTk9VU19DQUxMID0gMDsKKworCisgICAgLyoqCisgICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpQXBTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfQVBfU1RBVEVfRElTQUJMRUQpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0RW5hYmxlVWlkID0gbmV3IEF0b21pY0ludGVnZXIoUHJvY2Vzcy5teVVpZCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbUxhc3RBcEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKKworICAgIHB1YmxpYyBXaWZpU3RhdGVNYWNoaW5lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihUQUcpOworCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsIE5FVFdPUktUWVBFLCAiIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOworICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CisKKyAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOworICAgICAgICBtRGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7CisgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIndpZmkuaW50ZXJmYWNlIiwgInRpd2xhbjAiKTsKKyAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgPSBuZXcgU3VwcGxpY2FudFN0YXRlVHJhY2tlcihjb250ZXh0LCBnZXRIYW5kbGVyKCkpOworCisgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOworICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMgPSBuZXcgTmV0d29ya1Byb3BlcnRpZXMoKTsKKworICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKKyAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCisgICAgICAgICAgICAgICAgICogZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBUQUcpOworCisgICAgICAgIGFkZFN0YXRlKG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyVW5sb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJGYWlsZWRTdGF0ZSwgbURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRpbmdTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyTG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1XYWl0Rm9yU3VwU3RhdGUsIG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3VwUmVhZHlTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0aW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RhcnRlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuTW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RNb2RlU3RhdGUsIG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZ1N0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBpbmdTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdG9wcGVkU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Tb2Z0QXBTdGFydGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworCisgICAgICAgIHNldEluaXRpYWxTdGF0ZShtSW5pdGlhbFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBzZXREYmcodHJ1ZSk7CisKKyAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICBzdGFydCgpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBNZXRob2RzIGV4cG9zZWQgZm9yIHB1YmxpYyB1c2UKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfUElOR19TVVBQTElDQU5UKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/CisgICAgICAgICAgICAgICAgU0NBTl9BQ1RJVkUgOiBTQ0FOX1BBU1NJVkUsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUxhc3RFbmFibGVVaWQuc2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHByaW9yIHRvIGxvYWQgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSLCBXSUZJX1NUQVRFX0VOQUJMSU5HLCAwKSk7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RBUlRfU1VQUExJQ0FOVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9TVVBQTElDQU5UKTsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgdXBvbiBzdWNjZXNzICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX1NUQVRFX0RJU0FCTEVELCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWZpQXBFbmFibGVkKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcsIGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1MYXN0QXBFbmFibGVVaWQuc2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHByaW9yIHRvIGxvYWQgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HLCAwKSk7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9BUCwgd2lmaUNvbmZpZykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfQVApOworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRElTQUJMRUQsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdpZmlTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gc3RhdGUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZmlBcFN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdpZmlBcFN0YXRlLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2lmaUFwU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlBcFN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbGVkIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgaWYgYW55LgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgV2lmaUluZm99IG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBXaWZpSW5mbyByZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7CisgICAgICAgIHJldHVybiBtV2lmaUluZm87CisgICAgfQorCisgICAgcHVibGljIERoY3BJbmZvIGdldERoY3BJbmZvKCkgeworICAgICAgICByZXR1cm4gbURoY3BJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlclN0YXJ0KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX0RSSVZFUik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0RSSVZFUik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Nhbk9ubHlNb2RlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgU0NBTl9PTkxZX01PREUsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgQ09OTkVDVF9NT0RFLCAwKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhblR5cGUoYm9vbGVhbiBhY3RpdmUpIHsKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX0FDVElWRSwgMCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0c0xpc3QoKSB7CisgICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9ESVNDT05ORUNUKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3RDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9SRUNPTk5FQ1QpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIHJlLWFzc29jaWF0aW9uIHRvIEFQCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGVDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9SRUFTU09DSUFURSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldHdvcmsgc3luY2hyb25vdXNseQorICAgICAqCisgICAgICogQHJldHVybiBuZXR3b3JrIGlkIG9mIHRoZSBuZXcgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9BRERfT1JfVVBEQVRFX05FVFdPUkssIGNvbmZpZykuaW50VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX05FVFdPUktfQ09ORklHKS5jb25maWdMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1JFTU9WRV9ORVRXT1JLLCBuZXR3b3JrSWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbmFibGVOZXRQYXJhbXMgeworICAgICAgICBwcml2YXRlIGludCBuZXRJZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVPdGhlcnM7CisgICAgICAgIEVuYWJsZU5ldFBhcmFtcyhpbnQgbiwgYm9vbGVhbiBiKSB7CisgICAgICAgICAgICBuZXRJZCA9IG47CisgICAgICAgICAgICBkaXNhYmxlT3RoZXJzID0gYjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0VOQUJMRV9ORVRXT1JLLAorICAgICAgICAgICAgICAgIG5ldyBFbmFibGVOZXRQYXJhbXMobmV0SWQsIGRpc2FibGVPdGhlcnMpKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9ESVNBQkxFX05FVFdPUkssIG5ldElkLCAwKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsYWNrbGlzdCBhIEJTU0lELiBUaGlzIHdpbGwgYXZvaWQgdGhlIEFQIGlmIHRoZXJlIGFyZQorICAgICAqIGFsdGVybmF0ZSBBUHMgdG8gY29ubmVjdAorICAgICAqCisgICAgICogQHBhcmFtIGJzc2lkIEJTU0lEIG9mIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0JMQUNLTElTVF9ORVRXT1JLLCBic3NpZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBibGFja2xpc3QgbGlzdAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NMRUFSX0JMQUNLTElTVCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXhhbXBsZSBzdGF0dXMgcmVzdWx0CisgICAgICogIGJzc2lkPWFhOmJiOmNjOmRkOmVlOmZmCisgICAgICogIHNzaWQ9VGVzdE5ldAorICAgICAqICBpZD0zCisgICAgICogIHBhaXJ3aXNlX2NpcGhlcj1OT05FCisgICAgICogIGdyb3VwX2NpcGhlcj1OT05FCisgICAgICogIGtleV9tZ210PU5PTkUKKyAgICAgKiAgd3BhX3N0YXRlPUNPTVBMRVRFRAorICAgICAqICBpcF9hZGRyZXNzPVguWC5YLlgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfQ09OTkVDVElPTl9TVEFUVVMpLnN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwsIGVuYWJsZWQgPyAxIDogMCwgMCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UnNzaSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX1JTU0kpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhcHByb3ggUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UnNzaUFwcHJveCgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX1JTU0lfQVBQUk9YKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGluayBzcGVlZCB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gbGluayBzcGVlZCwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGlua1NwZWVkKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTElOS19TUEVFRCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hY0FkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9NQUNfQUREUikuc3RyaW5nVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFja2V0RmlsdGVyaW5nKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBwYWNrZXQgZmlsdGVyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BVVRPCisgICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvd2VyTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfUE9XRVJfTU9ERSwgbW9kZSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGZyb20gdGhlIHN5c3RlbQorICAgICAqIHNldHRpbmcgdmFsdWUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTKSk7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobU51bUFsbG93ZWRDaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKG1OdW1BbGxvd2VkQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGRyaXZlciBkZWZhdWx0CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCisgICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAorICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMsIG51bUNoYW5uZWxzLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNoYW5uZWwgY291bnQsIC0xIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFRPRE86IHRoaXMgaXMgbm90IGEgcHVibGljIEFQSSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBpbiBmYXZvcgorICAgICAqIG9mIGFzeW5jaHJvbm91cyByZXBvcnRpbmcuIHVudXNlZCBmb3Igbm93LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6CisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECisgICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECisgICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0UsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBCbHVldG9vdGggY29leGlzdGVuY2Ugc2NhbiBtb2RlLiBXaGVuIHRoaXMgbW9kZSBpcyBvbiwKKyAgICAgKiBzb21lIG9mIHRoZSBsb3ctbGV2ZWwgc2NhbiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGRyaXZlciBhcmUgY2hhbmdlZCB0bworICAgICAqIHJlZHVjZSBpbnRlcmZlcmVuY2Ugd2l0aCBBMkRQIHN0cmVhbWluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0JsdWV0b290aFBsYXlpbmcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGlzIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbHVldG9vdGhTY2FuTW9kZShib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZykgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERSwgaXNCbHVldG9vdGhQbGF5aW5nID8gMSA6IDAsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfU0FWRV9DT05GSUcpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Q21XYWtlTG9jaygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0spOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBJbnRlcm5hbCBwcml2YXRlIGZ1bmN0aW9ucworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGNsYXNzIFN5bmNSZXR1cm4geworICAgICAgICBib29sZWFuIGJvb2xWYWx1ZTsKKyAgICAgICAgaW50IGludFZhbHVlOworICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7CisgICAgICAgIE9iamVjdCBvYmpWYWx1ZTsKKyAgICAgICAgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gY29uZmlnTGlzdDsKKyAgICB9CisKKyAgICBjbGFzcyBTeW5jUGFyYW1zIHsKKyAgICAgICAgT2JqZWN0IG1QYXJhbWV0ZXI7CisgICAgICAgIFN5bmNSZXR1cm4gbVN5bmNSZXR1cm47CisgICAgICAgIFN5bmNQYXJhbXMoKSB7CisgICAgICAgICAgICBtU3luY1JldHVybiA9IG5ldyBTeW5jUmV0dXJuKCk7CisgICAgICAgIH0KKyAgICAgICAgU3luY1BhcmFtcyhPYmplY3QgcCkgeworICAgICAgICAgICAgbVBhcmFtZXRlciA9IHA7CisgICAgICAgICAgICBtU3luY1JldHVybiA9IG5ldyBTeW5jUmV0dXJuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZXNzYWdlLmFyZzIgaXMgcmVzZXJ2ZWQgdG8gaW5kaWNhdGUgc3luY2hyb25pemVkCisgICAgICogbWVzc2FnZS5vYmogaXMgdXNlZCB0byBzdG9yZSBTeW5jUGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHN5bmNlZFNlbmQoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIG1zZy5hcmcyID0gU1lOQ0hST05PVVNfQ0FMTDsKKyAgICAgICAgc3luY2hyb25pemVkKHN5bmNQYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInN5bmNlZFNlbmQgIiArIG1zZyk7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZW5kU3luY01lc3NhZ2U6IHVuZXhwZWN0ZWQgaW50ZXJydXB0aW9uIG9mIHdhaXQoKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuOworICAgIH0KKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gbmV3IFN5bmNQYXJhbXMoKTsKKyAgICAgICAgbXNnLm9iaiA9IHN5bmNQYXJhbXM7CisgICAgICAgIHJldHVybiBzeW5jZWRTZW5kKG1zZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShpbnQgd2hhdCwgT2JqZWN0IHBhcmFtKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IG5ldyBTeW5jUGFyYW1zKHBhcmFtKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKHdoYXQsIHN5bmNQYXJhbXMpOworICAgICAgICByZXR1cm4gc3luY2VkU2VuZChtc2cpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShpbnQgd2hhdCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2Uod2hhdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlPbk1zZ09iamVjdChNZXNzYWdlIG1zZykgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbXNnLm9iajsKKyAgICAgICAgaWYgKHN5bmNQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHN5bmNQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJub3RpZnlPbk1zZ09iamVjdCAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHN5bmNQYXJhbXMgaW4gbm90aWZ5T25Nc2dPYmplY3QgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlTdGF0ZShpbnQgd2lmaVN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKG1MYXN0RW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKG1MYXN0RW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBub3RlIGJhdHRlcnkgc3RhdHMgaW4gd2lmaSIpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpU3RhdGU6ICIgKyBnZXRXaWZpU3RhdGVCeU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9TVEFURSwgd2lmaVN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfU1RBVEUsIHByZXZpb3VzV2lmaVN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpQXBTdGF0ZShpbnQgd2lmaUFwU3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24obUxhc3RBcEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKG1MYXN0QXBFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIG5vdGUgYmF0dGVyeSBzdGF0cyBpbiB3aWZpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbVdpZmlBcFN0YXRlLnNldCh3aWZpQXBTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0V2lmaUFwU3RhdGU6ICIgKyBnZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX0FQX1NUQVRFLCB3aWZpQXBTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX0FQX1NUQVRFLCBwcmV2aW91c1dpZmlBcFN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKKyAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOworICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAorICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJNaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgdGV4dCB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgIiBmaWVsZHM6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NhblJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzY2FuUmVzdWx0cyBpbnB1dCBmb3JtYXQKKyAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTY2FuUmVzdWx0cyhTdHJpbmcgc2NhblJlc3VsdHMpIHsKKyAgICAgICAgaWYgKHNjYW5SZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7CisKKyAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7CisKKyAgICAgICAgaW50IHNjYW5SZXN1bHRzTGVuID0gc2NhblJlc3VsdHMubGVuZ3RoKCk7CisgICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKKyAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KKyAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHNjYW5SZXN1bHRzTGVuOyArK2xpbmVFbmQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHNjYW5SZXN1bHRzTGVuIHx8IHNjYW5SZXN1bHRzLmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gc2NhblJlc3VsdHMuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOworICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTmV0d29ya1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMuc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKG1JbnRlcmZhY2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJTb2NrZXRFeGNlcHRpb24gY3JlYXRpbmcgTmV0d29ya0ludGVyZmFjZSBmcm9tICIgKyBtSW50ZXJmYWNlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIuIGU9IiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJOUEUgY3JlYXRpbmcgTmV0d29ya0ludGVyZmFjZS4gZT0iICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGlzIGZvciB2NgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmFkZEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMudjRJbnRUb0FycmF5KG1EaGNwSW5mby5pcEFkZHJlc3MpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBzZXR0aW5nIElwQWRkcmVzcyB1c2luZyAiICsgbURoY3BJbmZvICsgIiwgZT0iICsgZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKE5ldHdvcmtVdGlscy52NEludFRvQXJyYXkoCisgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mby5nYXRld2F5KSkpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gc2V0dGluZyBHYXRld2F5IHVzaW5nICIgKyBtRGhjcEluZm8gKyAiLCBlPSIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnY0SW50VG9BcnJheShtRGhjcEluZm8uZG5zMSkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHNldHRpbmcgRG5zMSB1c2luZyAiICsgbURoY3BJbmZvICsgIiwgZT0iICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OZXR3b3JrUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMudjRJbnRUb0FycmF5KG1EaGNwSW5mby5kbnMyKSkpOworCisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBzZXR0aW5nIERuczIgdXNpbmcgIiArIG1EaGNwSW5mbyArICIsIGU9IiArIGUpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gLSBhZGQgcHJveHkgaW5mbworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7CisgICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOworICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOworICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKKyAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworCisgICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRNYXhEaGNwUmV0cmllcygpIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01BWF9ESENQX1JFVFJZX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHB1YmxpYyBTZXR0aW5nc09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX05FVE1BU0spLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMiksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOworICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7CisgICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7CisgICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOworICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OworICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKKyAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOworICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7CisKKyAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9CisgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAorICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7CisKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQ09ORklHVVJFX0lQKTsKKyAgICAgICAgICAgICAgICBtQ29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB3aGlsZSBvYnRhaW5pbmcgSVAgYWRkcmVzcy4gVGhpcworICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKKyAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KKyAgICAgKiBlcnJvciBzdGF0ZSwgd2Ugd2lsbCBOT1QgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHRvIGVyciBvbiB0aGUgc2lkZQorICAgICAqIG9mIHNhZmV0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgeworICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QoZmluYWwgaW50IG5ld1Jzc2kpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX1BST1BFUlRJRVMsIG1OZXR3b3JrUHJvcGVydGllcyk7CisgICAgICAgIGlmIChic3NpZCAhPSBudWxsKQorICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfUFJPUEVSVElFUywgbU5ldHdvcmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChTdGF0ZUNoYW5nZVJlc3VsdCBzYywgYm9vbGVhbiBmYWlsZWRBdXRoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFLCAoUGFyY2VsYWJsZSlzYy5zdGF0ZSk7CisgICAgICAgIGlmIChmYWlsZWRBdXRoKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiwKKyAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FUlJPUl9BVVRIRU5USUNBVElORyk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCBjb25uZWN0ZWQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iCisgICAgICAgICAgICAgICAgKyBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICsgIiBhbmQgbmV3IHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPD0gMikgcmV0dXJuICIiOworICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSwgc3RyaW5nLmxlbmd0aCgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1F1b3RlZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiAiXCIiICsgc3RyaW5nICsgIlwiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVN0cmluZyhCaXRTZXQgc2V0LCBTdHJpbmdbXSBzdHJpbmdzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBuZXh0U2V0Qml0ID0gLTE7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGFsbCBzZXQgYml0cyBhcmUgaW4gWzAsIHN0cmluZ3MubGVuZ3RoKSB0byBhdm9pZAorICAgICAgICAgKiBnb2luZyBvdXQgb2YgYm91bmRzIG9uIHN0cmluZ3MuICAoU2hvdWxkbid0IGhhcHBlbiwgYnV0Li4uKSAqLworICAgICAgICBzZXQgPSBzZXQuZ2V0KDAsIHN0cmluZ3MubGVuZ3RoKTsKKworICAgICAgICB3aGlsZSAoKG5leHRTZXRCaXQgPSBzZXQubmV4dFNldEJpdChuZXh0U2V0Qml0ICsgMSkpICE9IC0xKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHN0cmluZ3NbbmV4dFNldEJpdF0ucmVwbGFjZSgnXycsICctJykpLmFwcGVuZCgnICcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNwYWNlCisgICAgICAgIGlmIChzZXQuY2FyZGluYWxpdHkoKSA+IDApIHsKKyAgICAgICAgICAgIGJ1Zi5zZXRMZW5ndGgoYnVmLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFN0cmluZyhTdHJpbmcgc3RyaW5nLCBTdHJpbmdbXSBzdHJpbmdzKSB7CisgICAgICAgIGludCBzaXplID0gc3RyaW5ncy5sZW5ndGg7CisKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJy0nLCAnXycpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgaWYgKHN0cmluZy5lcXVhbHMoc3RyaW5nc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgLy8gaWYgd2UgZXZlciBnZXQgaGVyZSwgd2Ugc2hvdWxkIHByb2JhYmx5IGFkZCB0aGUKKyAgICAgICAgLy8gdmFsdWUgdG8gV2lmaUNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCB0aGF0IGl0J3MKKyAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAorICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9vay11cCBhIHN0cmluZzogIiArIHN0cmluZyk7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5CisgICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAorICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gbmV0SWQgPT0gLTE7CisgICAgICAgIC8vIG5ldHdvcmtJZCBvZiAtMSBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCisKKyAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgIG5ldElkID0gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOworICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRWYXJpYWJsZXM6IHsKKworICAgICAgICAgICAgaWYgKGNvbmZpZy5TU0lEICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uc3NpZFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuU1NJRCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IFNTSUQ6ICIrY29uZmlnLlNTSUQpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbmZpZy5CU1NJRCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5CU1NJRCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IEJTU0lEOiAiK2NvbmZpZy5CU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBrZXlfbWdtdDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFByb3RvY29scy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwcm90bzogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRBdXRoQWxnb3JpdGhtc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdXRoQWxnb3JpdGhtc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGF1dGhfYWxnOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nID0KKyAgICAgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcGFpcndpc2U6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLCBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBncm91cDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJldmVudCBjbGllbnQgc2NyZXctdXAgYnkgcGFzc2luZyBpbiBhIFdpZmlDb25maWd1cmF0aW9uIHdlIGdhdmUgaXQKKyAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgorICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmVTaGFyZWRLZXkgIT0gbnVsbCAmJiAhY29uZmlnLnByZVNoYXJlZEtleS5lcXVhbHMoIioiKSAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBzazogIitjb25maWcucHJlU2hhcmVkS2V5KTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzU2V0S2V5ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnLndlcEtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBjbGllbnQgc2NyZXctdXAgYnkgcGFzc2luZyBpbiBhIFdpZmlDb25maWd1cmF0aW9uIHdlIGdhdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgcHJldmVudGluZyAiKiIgYXMgYSBrZXkuCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5c1tpXSAhPSBudWxsICYmICFjb25maWcud2VwS2V5c1tpXS5lcXVhbHMoIioiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX2tleSIraSsiOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTZXRLZXkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGFzU2V0S2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLndlcFR4S2V5SW5kZXgpKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX3R4X2tleWlkeDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5wcmlvcml0eSkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgcHJpb3JpdHk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICtjb25maWcucHJpb3JpdHkpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWRkZW5TU0lEICYmICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcuaGlkZGVuU1NJRCA/IDEgOiAwKSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBoaWRkZW5TU0lEOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgOiBjb25maWcuZW50ZXJwcmlzZUZpZWxkcykgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gZmllbGQudmFyTmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpZWxkLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlLmxlbmd0aCgpID09IDApID8gIk5VTEwiIDogY29udmVydFRvUXVvdGVkU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgIiArIHZhck5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldElkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgIFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgorICAgICAgICAgICAgICAgICAgICArIG5ldElkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyZWROZXR3b3Jrc05hdGl2ZSgpIHsKKyAgICAgICAgU3RyaW5nIGxpc3RTdHIgPSBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKKworICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOworICAgICAgICBpZiAobGlzdFN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmtzOworCisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKKyAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7CisgICAgICAgICAgICAvLyBuZXR3b3JrLWlkIHwgc3NpZCB8IGJzc2lkIHwgZmxhZ3MKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcubmV0d29ya0lkID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMF0pOworICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5DVVJSRU5UOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbRElTQUJMRURdIikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7CisgICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV0d29ya3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bworICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZE5ldHdvcmtWYXJpYWJsZXMoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisKKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgaWYgKG5ldElkIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKgorICAgICAgICAgKiBUT0RPOiBtYXliZSBzaG91bGQgaGF2ZSBhIG5hdGl2ZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZgorICAgICAgICAgKiB2YXJpYWJsZSBuYW1lcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuIEJ1dCB3ZSdkIHN0aWxsCisgICAgICAgICAqIGJlIGRvaW5nIGEgcm91bmQgdHJpcCB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24gZm9yIGVhY2ggdmFyaWFibGUuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcuQlNTSUQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IC0xOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcucHJpb3JpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gZmFsc2U7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgIT0gMDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUpOworICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IC0xOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLAorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZCA6CisgICAgICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKKyAgICAgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLAorICAgICAgICAgICAgICAgICAgICBmaWVsZC52YXJOYW1lKCkpOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgdmFsdWUgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOworICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUG9sbCBmb3IgaW5mbyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cworICAgICAqIFJTU0kgJiBMaW5rc3BlZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oKSB7CisgICAgICAgIGludCBuZXdSc3NpID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKKyAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2kobmV3UnNzaSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKKyAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKKyAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKKyAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKKyAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IG1XaWZpSW5mb3JtaW5nIG90aGVycworICAgICAgICAgICAgICogaW50ZXJlc3RlZCBpbiBSU1NJIG9mIGFsbCB0aGUgY2hhbmdlcyBpbiBzaWduYWwKKyAgICAgICAgICAgICAqIGxldmVsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgc2Vjb25kIGFyZyB0byB0aGUgY2FsbCBiZWxvdyBuZWVkcyB0byBiZSBhIHN5bWJvbCBzb21ld2hlcmUsIGJ1dAorICAgICAgICAgICAgLy8gaXQncyBhY3R1YWxseSB0aGUgc2l6ZSBvZiBhbiBhcnJheSBvZiBpY29ucyB0aGF0J3MgcHJpdmF0ZQorICAgICAgICAgICAgLy8gdG8gU3RhdHVzQmFyIFBvbGljeS4KKyAgICAgICAgICAgIGludCBuZXdTaWduYWxMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKG5ld1Jzc2ksIDQpOworICAgICAgICAgICAgaWYgKG5ld1NpZ25hbExldmVsICE9IG1MYXN0U2lnbmFsTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChuZXdSc3NpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSBuZXdTaWduYWxMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRSc3NpKC0yMDApOworICAgICAgICB9CisgICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cworICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AgJiBkaXNhYmxpbmcgaW50ZXJmYWNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCkgeworICAgICAgICBMb2cuZChUQUcsICJSZXNldCBjb25uZWN0aW9ucyBhbmQgc3RvcHBpbmcgREhDUCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb25zICYgc3RvcCBESENQCisgICAgICAgICAqLworICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuc3RvcERoY3AobUludGVyZmFjZU5hbWUpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBESENQIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaXNhYmxlIGludGVyZmFjZSAqLworICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgLyogc2VuZCBldmVudCB0byBDTSAmIG5ldHdvcmsgY2hhbmdlIGJyb2FkY2FzdCAqLworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKKworICAgICAgICAvKiBSZXNldCBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0U1NJRChudWxsKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZCgtMSk7CisKKyAgICAgICAgLyogQ2xlYXIgbmV0d29yayBwcm9wZXJ0aWVzICovCisgICAgICAgIG1OZXR3b3JrUHJvcGVydGllcy5jbGVhcigpOworCisgICAgICAgIG1MYXN0QnNzaWQ9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBOb3RpZmljYXRpb25zIGZyb20gV2lmaU1vbml0b3IKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQorICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQorICAgICAqIFdpZmlNb25pdG9yCisgICAgICogdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlQ2hhbmdlUmVzdWx0IHsKKyAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBPYmplY3Qgc3RhdGUpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKKyAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOworICAgICAgICB9CisgICAgICAgIGludCBuZXR3b3JrSWQ7CisgICAgICAgIFN0cmluZyBCU1NJRDsKKyAgICAgICAgT2JqZWN0IHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKKyAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCisgICAgICovCisgICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9DT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudExvc3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5CisgICAgICogaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBuZXR3b3JrIHN0YXRlCisgICAgICogQHBhcmFtIEJTU0lEIHdoZW4gdGhlIG5ldyBzdGF0ZSBpcyB7QGxpbmsgRGV0YWlsZWRTdGF0ZSNDT05ORUNURUQKKyAgICAgKiBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRH0sCisgICAgICogdGhpcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGFjY2VzcyBwb2ludC4gT3RoZXJ3aXNlLCBpdAorICAgICAqIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeU5ldHdvcmtTdGF0ZUNoYW5nZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBTdHJpbmcgQlNTSUQsIGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IHtAY29kZSBTdXBwbGljYW50U3RhdGV9CisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCwKKyAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cworICAgICAqIGFyZSBhdmFpbGFibGUuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN3aXRjaCBzY2FuIG1vZGUgb3ZlciB0byBwYXNzaXZlLgorICAgICAgICAgKiBUdXJuaW5nIG9mZiBzY2FuLW9ubHkgbW9kZSBoYXBwZW5zIG9ubHkgaW4gIkNvbm5lY3QiIG1vZGUKKyAgICAgICAgICovCisgICAgICAgIHNldFNjYW5UeXBlKGZhbHNlKTsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU0NBTl9SRVNVTFRTX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVEFSVF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkgeworICAgICAgICBzZW5kTWVzc2FnZShEUklWRVJfU1RPUF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgeworICAgICAgICBzZXRXaWZpRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHNldFdpZmlFbmFibGVkKHRydWUpOworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSFNNIHN0YXRlcworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2xhc3MgRGVmYXVsdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU3luY2hyb25vdXMgY2FsbCByZXR1cm5zICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSV9BUFBST1g6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RJT05fU1RBVFVTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9ORVRXT1JLX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiA9PSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5jb25maWdMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9SU1NJX1BPTEw6CisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVSc3NpUG9sbGluZyA9IChtZXNzYWdlLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKENNRF9FTkFCTEVfUlNTSV9QT0xMKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVE9QX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHVuaGFuZGxlZCBtZXNzYWdlIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgSW5pdGlhbFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLy9UT0RPOiBjb3VsZCBtb3ZlIGxvZ2dpbmcgaW50byBhIGNvbW1vbiBjbGFzcworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAvLyBbMzEtOF0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs3IC0gMF0gSFNNIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gNTAwMjEgd2lmaV9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmIChXaWZpTmF0aXZlLmlzRHJpdmVyTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29weUZyb20oZ2V0Q3VycmVudE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAvKiBUT0RPOiBhZGQgYSB0aW1lb3V0IHRvIGZhaWwgd2hlbiBkcml2ZXIgbG9hZCBpcyBodW5nLgorICAgICAgICAgICAgICogU2ltaWxhcmx5IGZvciBkcml2ZXIgdW5sb2FkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgbG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfTE9BRF9EUklWRVJfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaU1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtV2FpdEZvclN1cFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RhcnRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU29mdCBBUCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU29mdEFwU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgdW5sb2FkIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyRmFpbGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBXYWl0Rm9yU3VwU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRNYWNBZGRyZXNzKFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBpbml0aWFsaXplIGFuZCBmaXggbXVsdGljYXN0IGZpbHRlcmluZworICAgICAgICAgICAgICAgICAgICAvL21XTS5pbml0aWFsaXplTXVsdGljYXN0RmlsdGVyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tVc2VTdGF0aWNJcCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0b3Agc3VwcGxpY2FudCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFpbCBzb2Z0IGFwIHdoZW4gd2FpdGluZyBmb3Igc3VwcGxpY2FudCBzdGFydCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gc3RhcnQgc29mdCBBUCB3aXRoIGEgcnVubmluZyBzdXBwbGljYW50Iik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN1cFJlYWR5U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZm9yIGNvbm5lY3QgbW9kZSBvcGVyYXRpb24gYXQgc3RhcnQgKi8KKyAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6ICAgLyogU3VwcGxpY2FudCBzdG9wcGVkIGJ5IHVzZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RvcCBzdXBwbGljYW50IHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFN1cHBsaWNhbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8kRkFMTC1USFJPVUdIJAorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQ6ICAvKiBTdXBwbGljYW50IGRpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXR3b3JrRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIucmVzZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogV2hlbiBzdXBwbGljYW50IGRpZXMsIHVubG9hZCBkcml2ZXIgYW5kIGVudGVyIGZhaWxlZCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbnNpZGVyIGJyaW5naW5nIHVwIHN1cHBsaWNhbnQgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2Uud2hhdCA9PSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBkaWVkLCB1bmxvYWRpbmcgZHJpdmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX1NUQVRFX1VOS05PV04sIDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0YXJ0RHJpdmVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0YXJ0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgc2V0U2NhblJlc3VsdHMoV2lmaU5hdGl2ZS5zY2FuUmVzdWx0c0NvbW1hbmQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZUJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9QSU5HX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5waW5nQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQUREX09SX1VQREFURV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBzeW5jUGFyYW1zLm1QYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiA9PSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3luY2hyb25vdXMgaGFuZGxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzIgPT0gU1lOQ0hST05PVVNfQ0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZU5ldFBhcmFtcyBlbmFibGVOZXRQYXJhbXMgPSAoRW5hYmxlTmV0UGFyYW1zKSBzeW5jUGFyYW1zLm1QYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldFBhcmFtcy5uZXRJZCwgZW5hYmxlTmV0UGFyYW1zLmRpc2FibGVPdGhlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3luY2hyb25vdXMgaGFuZGxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobWVzc2FnZS5hcmcxLCBtZXNzYWdlLmFyZzIgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiA9PSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNocm9ub3VzIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5hZGRUb0JsYWNrbGlzdENvbW1hbmQoKFN0cmluZyltZXNzYWdlLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX05FVFdPUktfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmNvbmZpZ0xpc3QgPSBnZXRDb25maWd1cmVkTmV0d29ya3NOYXRpdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcyID09IFNZTkNIUk9OT1VTX0NBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNocm9ub3VzIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5zdHJpbmdWYWx1ZSA9IFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLnN0cmluZ1ZhbHVlID0gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbm5vdCBzdGFydCBzb2Z0IEFQIHdoaWxlIGluIGNsaWVudCBtb2RlICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBzdGFydCBzb2Z0IEFQIHdpdGggYSBydW5uaW5nIHN1cHBsaWNhbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdGFydGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICYgY29ubmVjdGlvbiBldmVudHMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIHRoZXNlIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiAhPSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0YXJ0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7fQorCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGNoYW5uZWwgY291bnQgKi8KKyAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOworCisgICAgICAgICAgICBpZiAobUlzU2Nhbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5Nb2RlU3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoQ09OTkVDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAvKiBJZiBzdXBwbGljYW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCwgYmVmb3JlIHdlIGNvdWxkIGZpbmlzaCBlc3RhYmxpc2hpbmcKKyAgICAgICAgICAgICAgICAgKiB0aGUgY29udHJvbCBjaGFubmVsIGNvbm5lY3Rpb24sIHdlIG1pc3MgYWxsIHRoZSBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKiBEaXNjb25uZWN0IGFuZCByZWNvbm5lY3Qgd2hlbiBkcml2ZXIgaGFzIHN0YXJ0ZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgKiBhbGwgc3VwcGxpY2FudCBldmVudHMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUT0RPOiBUaGlzIGlzIGEgYml0IHVuY2xlYW4sIGlkZWFsbHkgdGhlIHN1cHBsaWNhbnQgc2hvdWxkIG5ldmVyCisgICAgICAgICAgICAgICAgICogY29ubmVjdCB1bnRpbCB0b2xkIHRvIGRvIHNvIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgYW5vdGhlciBkcml2ZXIgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ20ucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVN0b3BwZWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGVzZSBjb21tYW5kcyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzIgIT0gU1lOQ0hST05PVVNfQ0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdG9wcGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2Nhbk1vZGVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiA9PSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3luY2hyb25vdXMgaGFuZGxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIENvbm5lY3RNb2RlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQ7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuaGFuZGxlRXZlbnQoc3RhdGVDaGFuZ2VSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcyID09IFNZTkNIUk9OT1VTX0NBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHNldCBzY2FuIHR5cGUgaW4gY29tcGxldGVkIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbmV3TXNnID0gb2J0YWluTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY29weUZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKG5ld01zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBEbyBhIHJlZHVuZGFudCBkaXNjb25uZWN0IHdpdGhvdXQgdHJhbnNpdGlvbiAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzIgPT0gU1lOQ0hST05PVVNfQ0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3luY2hyb25vdXMgaGFuZGxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzIgPT0gU1lOQ0hST05PVVNfQ0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzeW5jaHJvbm91cyBoYW5kbGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzIgPT0gU1lOQ0hST05PVVNfQ0FMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5yZWFzc29jaWF0ZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNocm9ub3VzIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHNjYW4gc2V0dGluZyBiYWNrIHRvICJjb25uZWN0IiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgc2NhbiByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJOZXR3b3JrIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChtTGFzdEJzc2lkID0gc3RhdGVDaGFuZ2VSZXN1bHQuQlNTSUQpOworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZXZlbnQgdG8gQ00gJiBuZXR3b3JrIGNoYW5nZSBicm9hZGNhc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiTmV0d29yayBjb25uZWN0aW9uIGxvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGU7CisgICAgICAgIGludCBwb3dlck1vZGU7CisgICAgICAgIFRocmVhZCBtRGhjcFRocmVhZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisKKyAgICAgICAgICAgICAgICBtRGhjcFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworCisgICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZSB0byBhY3RpdmUgd2hlbiBibHVldG9vdGggY29leGlzdGVuY2UgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogV2Ugc2V0IFdpLUZpIHRvIGFjdGl2ZSBtb2RlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgorICAgICAgICAgICAgICAgICAgICAgKiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAorICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdW50aWwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQorICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZworICAgICAgICAgICAgICAgICAgICAgKiBjb2V4aXN0ZW5jZSB3b3VsZCBpbnRlcnJ1cHQgdGhhdCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNvZXhpc3RlbmNlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9ICBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FVVE87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5ydW5EaGNwKG1JbnRlcmZhY2VOYW1lLCBtRGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmdldERoY3BFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworCisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZU5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAvL1RPRE86IHdlIGNvdWxkIGFsc28gZGV0ZWN0IGFuIElQIGNvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgIC8vIGZyb20gYSBESENQIHJlbmV3YWwgYW5kIHNlbmQgb3V0IGEgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0lQX0NPTkZJR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKworICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICogSWYgd2UndmUgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIERIQ1AKKyAgICAgICAgICAgICAgICAgICAqIHRvIGEgZ2l2ZW4gbmV0d29yaywgZGlzYWJsZSB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgKyAiIHRpbWVzLCBEaXNhYmxpbmcgIiArIG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIERIQ1AgdGltZXMgb3V0IGFmdGVyIGFib3V0IDMwIHNlY29uZHMsIHdlIGRvIGEKKyAgICAgICAgICAgICAgICAgICAqIGRpc2Nvbm5lY3QgYW5kIGFuIGltbWVkaWF0ZSByZWNvbm5lY3QgdG8gdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcyID09IFNZTkNIUk9OT1VTX0NBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIC8qIGFzeW5jaHJvbm91cyBoYW5kbGluZyAqLworICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICB9CisgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAvKiByZXNldCBwb3dlciBzdGF0ZSAmIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBpZiBvbiBESENQICovCisgICAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChwb3dlck1vZGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKSB7CisgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGNvZXhpc3RlbmNlIG1vZGUgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIENvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMiA9PSBTWU5DSFJPTk9VU19DQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNocm9ub3VzIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJSZWNvbmZpZ3VyaW5nIElQIG9uIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERpc2Nvbm5lY3RpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOiAvKiBTdG9wIGRyaXZlciBvbmx5IGFmdGVyIGRpc2Nvbm5lY3QgaGFuZGxlZCAqLworICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcGxpY2FudCBkaXNjb25uZWN0IHRvIHByZXZlbnQgZnVydGhlciBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuTW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIG5ldHdvcmsgZGlzY29ubmVjdCAqLworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU29mdEFwU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlN0b3BwaW5nIFNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RvcEFjY2Vzc1BvaW50KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiU29mdEFQIHNldCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50Iik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgc29mdCBBUCBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRkFJTEVELCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRmFpbCBjbGllbnQgbW9kZSBvcGVyYXRpb24gd2hlbiBzb2Z0IEFQIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIkNhbm5vdCBzdGFydCBzdXBwbGljYW50IHdpdGggYSBydW5uaW5nIHNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgICAgIHByaXZhdGUgaW50IG1Sc3NpUG9sbFRva2VuID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKKyAgICAgICAgICogZGVjaWRlIHRoYXQgdGhlIGxvb3Agc2hvdWxkIGJlIHRlcm1pbmF0ZWQ6CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxvb3BEZXRlY3RJbmRleCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1Mb29wRGV0ZWN0Q291bnQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgY29tbWFuZHMgZm9sbG93CisgICAgICAgICAqICB0aGUgb3JkaW5hbCB2YWx1ZXMgZGVmaW5lZCBpbiBTdXBwbGljYW50U3RhdGUuamF2YQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RFRCAgICAgICAgICAgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5BQ1RJVkUgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOTklORyAgICAgICAgICAgICAgID0gMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFUSU5HICAgICAgICAgICAgPSAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRFRCAgICAgICAgICAgICA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1VSX1dBWV9IQU5EU0hBS0UgICAgID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX0hBTkRTSEFLRSAgICAgICAgPSA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVEICAgICAgICAgICAgICA9IDc7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET1JNQU5UICAgICAgICAgICAgICAgID0gODsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRUQgICAgICAgICAgPSA5OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCAgICAgICAgICAgICAgICA9IDEwOworCisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBJbml0aWFsaXplZFN0YXRlKCk7OworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1JbmFjdGl2ZVN0YXRlID0gbmV3IEluYWN0aXZlU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdFN0YXRlID0gbmV3IERpc2Nvbm5lY3RlZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNjYW5TdGF0ZSA9IG5ldyBTY2FuU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29ubmVjdFN0YXRlID0gbmV3IENvbm5lY3RTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1IYW5kc2hha2VTdGF0ZSA9IG5ldyBIYW5kc2hha2VTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db21wbGV0ZWRTdGF0ZSA9IG5ldyBDb21wbGV0ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Eb3JtYW50U3RhdGUgPSBuZXcgRG9ybWFudFN0YXRlKCk7CisKKyAgICAgICAgcHVibGljIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICAgICAgc3VwZXIoVEFHLCB0YXJnZXQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgICAgICBhZGRTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSW5hY3RpdmVTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1EaXNjb25uZWN0U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2NhblN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSGFuZHNoYWtlU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtQ29tcGxldGVkU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Eb3JtYW50U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKworICAgICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOworCisgICAgICAgICAgICAvL3N0YXJ0IHRoZSBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQpIHsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworCisgICAgICAgICAgICAvLyBTdXBwbGljYW50IHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICAgICAgICAgICAgLy8gWzggLSAwXSBTdXBwbGljYW50IHN0YXRlIChhcyBkZWZpbmVkIGluIFN1cHBsaWNhbnRTdGF0ZS5qYXZhKQorICAgICAgICAgICAgLy8gNTAwMjMgc3VwcGxpY2FudF9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIG5ld1N0YXRlLm9yZGluYWwoKSk7CisKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UobmV3U3RhdGUub3JkaW5hbCgpLCBzdGF0ZUNoYW5nZVJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRTdXBwbGljYW50U3RhdGUoKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRMb29wRGV0ZWN0aW9uKCkgeworICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUcmFuc2l0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1zZy50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgLyogQlNTSUQgaXMgdmFsaWQgb25seSBpbiBBU1NPQ0lBVElORyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQoc3RhdGVDaGFuZ2VSZXN1bHQuQlNTSUQpOworICAgICAgICAgICAgICAgICAgICAvLyRGQUxMLVRIUk9VR0gkCisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUhhbmRzaGFrZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29tcGxldGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERPUk1BTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRG9ybWFudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmFjdGl2ZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3VwU3RhdGUpKTsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3VwU3RhdGUpOworICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgLy9UT0RPOiBNb2RpZnkgV2lmaU1vbml0b3IgdG8gcmVwb3J0IFNTSUQgb24gZXZlbnRzCisgICAgICAgICAgICAvL21XaWZpSW5mby5zZXRTU0lEKCkKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIEhTTSBzdGF0ZXMKKyAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgY2xhc3MgSW5pdGlhbGl6ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBVbmluaXRpYWxpemVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSW5hY3RpdmVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgIC8qIElmIGEgZGlzY29ubmVjdCBldmVudCBoYXBwZW5zIGFmdGVyIGEgcGFzc3dvcmQga2V5IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgICogZXZlbnQsIGRpc2FibGUgdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCkgeworICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSwgZGlzYWJsaW5nIG5ldHdvcmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgU2NhblN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29ubmVjdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEhhbmRzaGFrZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RJbmRleCA+IG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCsrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdENvdW50ID4gTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gbWVzc2FnZS53aGF0OworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIENvbXBsZXRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUnNzaVBvbGxUb2tlbisrOworICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBtUnNzaVBvbGxUb2tlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBJbmZvIGFuZCBjb250aW51ZSBwb2xsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsaW5nIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb2xsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBEb3JtYW50U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8qIFRPRE86IHJlY29ubmVjdCBpcyBub3cgYmVpbmcgaGFuZGxlZCBhdCBESENQIGZhaWx1cmUgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBydW4gaW50byBpc3N1ZXMgd2l0aCBzdGF5aW5nIGluIERvcm1hbnQgc3RhdGUsIG1pZ2h0CisgICAgICAgICAgICAgICAgICogbmVlZCBhIHJlY29ubmVjdCBoZXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDk5ZjNkMDYuLjhlMWIyMzYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw0MzQgKzE2LDExMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCi0gKiBUcmFjayB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkuIEFsbCBldmVudCBoYW5kbGluZyBpcyBkb25lIGhlcmUsCi0gKiBhbmQgYWxsIGNoYW5nZXMgaW4gY29ubmVjdGl2aXR5IHN0YXRlIGFyZSBpbml0aWF0ZWQgaGVyZS4KKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiB3aWZpIGZvciBjb25uZWN0aXZpdHkgc2VydmljZS4KICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IENvbmZpZy5MT0dEIHx8IGZhbHNlOwotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLVFlQRSA9ICJXSUZJIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTdGF0ZVRyYWNrZXIiOwogCi0gICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQgPSA1MDAyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEID0gNTAwMjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VEID0gNTAwMjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtRGVmYXVsdEdhdGV3YXlBZGRyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKLSAgICAvLyBFdmVudCBjb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0NPTk5FQ1RJT04gICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFICAgICAgICAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQgICAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESENQX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUICAgICAgICAgICAgICAgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUICAgICAgICAgICAgICAgID0gMTE7Ci0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBpcyBzdGFydGVkIG9yIHN0b3BwZWQuIFRoZSBvYmplY3Qgd2lsbCBiZSB0aGUgc3RhdGU6IHRydWUgZm9yCi0gICAgICogc3RhcnRlZCwgZmFsc2UgZm9yIHN0b3BwZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCAgICAgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QgID0gMTQ7CisgICAgcHJpdmF0ZSBOZXR3b3JrUHJvcGVydGllcyBtTmV0d29ya1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZHJpdmVyIHN0YXRlIGluZGljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVE9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9IVU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCi0gICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgotICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MgPSAzMDAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKLSAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBESVNDT05ORUNUIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBkZWZlciBoYW5kbGluZyBpdCB0bwotICAgICAqIGFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgRElTQ09OTkVDVCBpcyBhYm91dCB0bwotICAgICAqIGJlIGZvbGxvd2VkIHNob3J0bHkgYnkgYSBDT05ORUNUIHRvIHRoZSBzYW1lIG5ldHdvcmsgd2Ugd2VyZQotICAgICAqIGp1c3QgY29ubmVjdGVkIHRvLiBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXBvcnQKLSAgICAgKiB0aGUgbmV0d29yayBhcyBkb3duLCBub3IgZG8gd2Ugd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgbmV0d29yawotICAgICAqIGludGVyZmFjZSwgZXRjLiBJZiB3ZSBnZXQgYSBDT05ORUNUIGV2ZW50IGZvciBhbm90aGVyIG5ldHdvcmsKLSAgICAgKiB3aXRoaW4gdGhlIGRlbGF5IHdpbmRvdywgd2UgaW1tZWRpYXRlbHkgaGFuZGxlIHRoZSBwZW5kaW5nCi0gICAgICogZGlzY29ubmVjdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgQ09OTkVDVC48cC8+Ci0gICAgICogVGhlIGZpdmUgc2Vjb25kIGRlbGF5IGlzIGNob3NlbiBzb21ld2hhdCBhcmJpdHJhcmlseSwgYnV0IGlzCi0gICAgICogbWVhbnQgdG8gY292ZXIgbW9zdCBvZiB0aGUgY2FzZXMgd2hlcmUgYSBESVNDT05ORUNUL0NPTk5FQ1QKLSAgICAgKiBoYXBwZW5zIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDUwMDA7Ci0gICAgLyoqCi0gICAgICogV2hlbiB0aGUgc3VwcGxpY2FudCBnb2VzIGlkbGUgYWZ0ZXIgd2UgZG8gYW4gZXhwbGljaXQgZGlzY29ubmVjdAotICAgICAqIGZvbGxvd2luZyBhIERIQ1AgZmFpbHVyZSwgd2UgbmVlZCB0byBraWNrIHRoZSBzdXBwbGljYW50IGludG8KLSAgICAgKiB0cnlpbmcgdG8gYXNzb2NpYXRlIHdpdGggYWNjZXNzIHBvaW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT05ORUNUX0RFTEFZX01TRUNTID0gMjAwMDsKLQotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZGlzY29ubmVjdHMgZnJvbSBhbiBBUCBpdCBzb21ldGltZXMgZm9yZ2V0cwotICAgICAqIHRvIHJlc3RhcnQgc2Nhbm5pbmcuICBXYWl0IHRoaXMgZGVsYXkgYmVmb3JlIGFza2luZyBpdCB0byBzdGFydAotICAgICAqIHNjYW5uaW5nIChpbiBjYXNlIGl0IGZvcmdvdCkuICAxNSBzZWMgaXMgdGhlIHN0YW5kYXJkIGRlbGF5IGJldHdlZW4KLSAgICAgKiBzY2Fucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lDS1NUQVJUX1NDQU5OSU5HX0RFTEFZX01TRUNTID0gMTUwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50Ci0gICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgotICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgotICAgICAqIDxwPgotICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUgKHVzZWQgdG8gZGV0ZWN0IGxvb3BpbmcgYmVoYXZpb3IpOgotICAgICAqLwotICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlIG1TdXBwbGljYW50TG9vcFN0YXRlID0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnM6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2Ygc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VzLiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZQotICAgICAqIGlmIHdlJ3ZlIHJlY2VpdmVkIGFueSBuZXcgaW5mbyBzaW5jZSB3ZSBmb3VuZCBvdXQgaXQgd2FzIERJU0NPTk5FQ1RFRCBvcgotICAgICAqIElOQUNUSVZFLiAgSWYgd2UgaGF2ZW4ndCBmb3IgWCBtcywgd2UgdGhlbiByZXF1ZXN0IGEgc2NhbiAtIGl0IHNob3VsZCBoYXZlCi0gICAgICogZG9uZSB0aGF0IGF1dG9tYXRpY2FsbHksIGJ1dCBzb21ldGltZXMgc29tZSBmaXJtd2FyZSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHdlIHJlY2VpdmVkIGFuIGV2ZW50IHRoYXQgdGhhdCBhIHBhc3N3b3JkLWtleSBtYXkgYmUgaW5jb3JyZWN0LgotICAgICAqIElmIHRoZSBuZXh0IGluY29taW5nIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50IGlzIERJU0NPTk5FQ1QsCi0gICAgICogYnJvYWRjYXN0IGEgbWVzc2FnZSB0aGF0IHdlIGhhdmUgYSBwb3NzaWJsZSBwYXNzd29yZCBlcnJvciBhbmQgZGlzYWJsZQotICAgICAqIHRoZSBuZXR3b3JrLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZID0gMjsKLQotICAgIHByaXZhdGUgV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yOwotICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOwotICAgIHByaXZhdGUgTGlzdDxTY2FuUmVzdWx0PiBtU2NhblJlc3VsdHM7Ci0gICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV007Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT2J0YWluaW5nSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVG9ybkRvd25CeUNvbm5NZ3I7Ci0gICAgLyoqCi0gICAgICogQSBESVNDT05ORUNUIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLCBidXQgcHJvY2Vzc2luZyBpdAotICAgICAqIGlzIGJlaW5nIGRlZmVycmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgLyoqCi0gICAgICogQW4gb3BlcmF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBhcyBhIHJlc3VsdCBvZiB3aGljaCB3ZSBleHBlY3QgdGhlIG5leHQgZXZlbnQKLSAgICAgKiB3aWxsIGJlIGEgRElTQ09OTkVDVC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RFeHBlY3RlZDsKLSAgICBwcml2YXRlIERoY3BIYW5kbGVyIG1EaGNwVGFyZ2V0OwotICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOwotICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOwotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0U3NpZDsKLSAgICBwcml2YXRlIGludCBtTGFzdE5ldHdvcmtJZCA9IC0xOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQ7Ci0KLSAgICAvLyB1c2VkIHRvIHN0b3JlIHRoZSAobm9uLXBlcnNpc3RlZCkgbnVtIGRldGVybWluZWQgZHVyaW5nIGRldmljZSBib290IAotICAgIC8vIChmcm9tIG1jYyBvciBvdGhlciBwaG9uZSBpbmZvKSBiZWZvcmUgdGhlIGRyaXZlciBpcyBzdGFydGVkLgotICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOwotCi0gICAgLy8gVmFyaWFibGVzIHJlbGF0aW5nIHRvIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaWNvbiB0byBzaG93IGluIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uIFRoaXMgd2lsbCBhbHNvCi0gICAgICogYmUgdGhlIElEIG9mIHRoZSBOb3RpZmljYXRpb24gZ2l2ZW4gdG8gdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElDT05fTkVUV09SS1NfQVZBSUxBQkxFID0KLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9ub3RpZnlfd2lmaV9pbl9yYW5nZTsKLSAgICAvKioKLSAgICAgKiBXaGVuIGEgbm90aWZpY2F0aW9uIGlzIHNob3duLCB3ZSB3YWl0IHRoaXMgYW1vdW50IGJlZm9yZSBwb3NzaWJseSBzaG93aW5nIGl0IGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNldCB0aGUgc2V0dGluZyB0byBzaG93IHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25FbmFibGVkOwotICAgIC8qKgotICAgICAqIE9ic2VydmVzIHRoZSB1c2VyIHNldHRpbmcgdG8ga2VlcCB7QGxpbmsgI21Ob3RpZmljYXRpb25FbmFibGVkfSBpbiBzeW5jLgotICAgICAqLwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcjsKLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMgdmFsdWUgZm9yIHVzCi0gICAgICogdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBtTm90aWZpY2F0aW9uUmVwZWF0VGltZTsKLSAgICAvKioKLSAgICAgKiBUaGUgTm90aWZpY2F0aW9uIG9iamVjdCBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uOwotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIG5vdGlmaWNhdGlvbiBpcyBiZWluZyBzaG93biwgYXMgc2V0IGJ5IHVzLiBUaGF0IGlzLCBpZiB0aGUKLSAgICAgKiB1c2VyIGNhbmNlbHMgdGhlIG5vdGlmaWNhdGlvbiwgd2Ugd2lsbCBub3QgcmVjZWl2ZSB0aGUgY2FsbGJhY2sgc28gdGhpcwotICAgICAqIHdpbGwgc3RpbGwgYmUgdHJ1ZS4gV2Ugb25seSBndWFyYW50ZWUgaWYgdGhpcyBpcyBmYWxzZSwgdGhlbiB0aGUKLSAgICAgKiBub3RpZmljYXRpb24gaXMgbm90IHNob3dpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25TaG93bjsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbnRpbnVvdXMgc2NhbnMgdGhhdCBtdXN0IG9jY3VyIGJlZm9yZSBjb25zaWRlciB0aGUKLSAgICAgKiBzdXBwbGljYW50IGluIGEgc2Nhbm5pbmcgc3RhdGUuIFRoaXMgYWxsb3dzIHN1cHBsaWNhbnQgdG8gYXNzb2NpYXRlIHdpdGgKLSAgICAgKiByZW1lbWJlcmVkIG5ldHdvcmtzIHRoYXQgYXJlIGluIHRoZSBzY2FuIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcgPSAzOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc2NhbnMgc2luY2UgdGhlIGxhc3QgbmV0d29yayBzdGF0ZSBjaGFuZ2UuIFdoZW4gdGhpcwotICAgICAqIGV4Y2VlZHMge0BsaW5rICNOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HfSwgd2UgY29uc2lkZXIgdGhlCi0gICAgICogc3VwcGxpY2FudCB0byBhY3R1YWxseSBiZSBzY2FubmluZy4gV2hlbiB0aGUgbmV0d29yayBzdGF0ZSBjaGFuZ2VzIHRvCi0gICAgICogc29tZXRoaW5nIG90aGVyIHRoYW4gc2Nhbm5pbmcsIHdlIHJlc2V0IHRoaXMgdG8gMC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZTsKLSAgICAvKioKLSAgICAgKiBPYnNlcnZlcyB0aGUgc3RhdGljIElQIGFkZHJlc3Mgc2V0dGluZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZUFjdGl2ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZVJzc2lQb2xsaW5nOwotCi0gICAgLyoqCi0gICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQotICAgICAqCi0gICAgICogZ2V0V2lmaVN0YXRlKCkgaXMgbm90IHN5bmNocm9uaXplZCB0byBtYWtlIHN1cmUgaXQncyBhbHdheXMgZmFzdCwKLSAgICAgKiBldmVuIHdoZW4gdGhlIGluc3RhbmNlIGxvY2sgaXMgaGVsZCBvbiBvdGhlciBzbG93IG9wZXJhdGlvbnMuCi0gICAgICogVXNlIGEgYXRvbWljIHZhcmlhYmxlIGZvciBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbVdpZmlTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfU1RBVEVfVU5LTk9XTik7Ci0KLSAgICAvLyBXaS1GaSBydW4gc3RhdGVzOgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RBUlRJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfUlVOTklORyAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RPUFBJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RPUFBFRCAgPSA0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1SdW5TdGF0ZU5hbWVzW10gPSB7Ci0gICAgICAgICAgICAiU3RhcnRpbmciLAotICAgICAgICAgICAgIlJ1bm5pbmciLAotICAgICAgICAgICAgIlN0b3BwaW5nIiwKLSAgICAgICAgICAgICJTdG9wcGVkIgotICAgIH07Ci0gICAgcHJpdmF0ZSBpbnQgbVJ1blN0YXRlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk9ubHk7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUJsdWV0b290aEEyZHA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlbGVhc2VXYWtlTG9ja0NhbGxiYWNrOwotCi0gICAgLyoqCi0gICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cHBsaWNhbnQgc3RhdGUKLSAgICAgKiBjaGFuZ2UgaW4gdGhlIFNUQVRFX0NIQU5HRSBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUKLSAgICAgKiBXaWZpTW9uaXRvcgotICAgICAqIHRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKLSAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgICAgIFN0cmluZyBCU1NJRDsKLSAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0aW9uIGluCi0gICAgICogdGhlIENPTk5FQ1RFRCBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUgV2lmaU1vbml0b3IKLSAgICAgKiB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHsKLSAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KERldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgRGV0YWlsZWRTdGF0ZSBzdGF0ZTsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBpbnQgbmV0d29ya0lkOwotICAgIH0KKyAgICAvKiBGb3Igc2VuZGluZyBldmVudHMgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UgaGFuZGxlciAqLworICAgIHByaXZhdGUgSGFuZGxlciBtQ3NIYW5kbGVyOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1XaWZpU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKIAogICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7Ci0gICAgICAgIAotICAgICAgICBtV2lmaUluZm8gPSBuZXcgV2lmaUluZm8oKTsKLSAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOwotICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKLSAgICAgICAgLy8gQWxsb2NhdGUgREhDUCBpbmZvIG9iamVjdCBvbmNlLCBhbmQgZmlsbCBpdCBpbiBvbiBlYWNoIHJlcXVlc3QKLSAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKKyAgICAgICAgbUNzSGFuZGxlciA9IHRhcmdldDsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCi0gICAgICAgIC8vIFNldHRpbmcgaXMgaW4gc2Vjb25kcwotICAgICAgICBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCAKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgTkVUV09SS1RZUEUsICIiKTsKKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gbmV3IE5ldHdvcmtQcm9wZXJ0aWVzKCk7CiAKLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKKyAgICB9CiAKLSAgICAgICAgbUludGVyZmFjZU5hbWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgid2lmaS5pbnRlcmZhY2UiLCAidGl3bGFuMCIpOwotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJuZXQuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMxIiwKLSAgICAgICAgICAgICJuZXQuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMyIgotICAgICAgICB9OwotICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOwogCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KGlzUmVxdWVzdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkLmdldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IHN0YXRlCisgICAgICogQmVnaW4gbW9uaXRvcmluZyB3aWZpIGNvbm5lY3Rpdml0eQogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkIChzdHJpbmcgdmVyc2lvbikuCi0gICAgICogQHBhcmFtIHN0YXRlTmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG5ldyBzdGF0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3RyaW5nIHN0YXRlTmFtZSkgewotICAgICAgICBtV2lmaUluZm8uc2V0U3VwcGxpY2FudFN0YXRlKHN0YXRlTmFtZSk7Ci0gICAgICAgIHVwZGF0ZU5ldHdvcmtJbmZvKCk7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgotICAgICAqIG5ldHdvcmsgaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBmbGFnIHtAY29kZSB0cnVlfSBpZiBleHBsaWNpdGx5IGRpc2FibGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUb3JuRG93bkJ5Q29ubk1ncihib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmxhZzsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIFdMQU4gbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiBvdXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKLSAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJuZXQudGNwLmJ1ZmZlcnNpemUud2lmaSI7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKCkgewotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBoYW5kbGUgb24gdGhlIFdpZmlNYW5hZ2VyLiBUaGlzIGNhbm5vdCBiZSBkb25lIGluIG91cgotICAgICAgICAgKiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB0aGUgV2lmaSBzZXJ2aWNlIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZC4KLSAgICAgICAgICovCi0gICAgICAgIG1XTSA9IChXaWZpTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKTsKKworICAgICAgICBtV2lmaVN0YXRlUmVjZWl2ZXIgPSBuZXcgV2lmaVN0YXRlUmVjZWl2ZXIoKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtV2lmaVN0YXRlUmVjZWl2ZXIsIGZpbHRlcik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKSB7Ci0gICAgICAgIG1XaWZpTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsKKyAgICAgKiBUT0RPOiBkbyBhd2F5IHdpdGggcmV0dXJuIHZhbHVlIGFmdGVyIG1ha2luZyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGFzeW5jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZC5zZXQodHJ1ZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdG9wV2lmaSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZS1lbmFibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yayBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChmYWxzZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybiB0aGUgd2lyZWxlc3MgcmFkaW8gb2ZmIGZvciBhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIHR1cm5PbiB7QGNvZGUgdHJ1ZX0gdG8gdHVybiB0aGUgcmFkaW8gb24sIHtAY29kZSBmYWxzZX0KKyAgICAgKiBUT0RPOiBkbyBhd2F5IHdpdGggcmV0dXJuIHZhbHVlIGFmdGVyIG1ha2luZyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGFzeW5jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pIHsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU1LDIwNTQgKzEzMSwxMTggQEAKICAgICAgKiB1bmF2YWlsYWJsZS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBXaS1GaSBjb25uZWN0aW9ucyBhcmUgcG9zc2libGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86IE5lZWQgdG8gYWxzbyBsb29rIGF0IHNjYW4gcmVzdWx0cyB0byBzZWUgd2hldGhlciB3ZSdyZQotICAgICAgICAgKiBpbiByYW5nZSBvZiBhbnkgYWNjZXNzIHBvaW50cy4gSWYgd2UgaGF2ZSBzY2FuIHJlc3VsdHMgdGhhdAotICAgICAgICAgKiBhcmUgbm8gbW9yZSB0aGFuIE4gc2Vjb25kcyBvbGQsIHVzZSB0aG9zZSwgb3RoZXJ3aXNlLCBpbml0aWF0ZQotICAgICAgICAgKiBhIHNjYW4gYW5kIHdhaXQgZm9yIHRoZSByZXN1bHRzLiBUaGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotICAgICAgICAgKiBhbGxvdyBtb2JpbGUgdG8gYmUgdGhlIHByZWZlcnJlZCBuZXR3b3JrLgotICAgICAgICAgKi8KLSAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cHBTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIHN1cHBTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJgotICAgICAgICAgICAgICAgIHN1cHBTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuSU5BQ1RJVkUgJiYKLSAgICAgICAgICAgICAgICAobVRvcm5Eb3duQnlDb25uTWdyIHx8ICFpc0RyaXZlclN0b3BwZWQoKSk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm8uaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBkZWZpbmVkIFdpLUZpIHN1YnR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya1N1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHVwZGF0ZXMgdGhlIG5ldHdvcmsgaW5mbyBvYmplY3QgdG8ga2VlcCBpdCBpbiBzeW5jIHdpdGgKLSAgICAgKiB0aGUgV2ktRmkgc3RhdGUgdHJhY2tlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTmV0d29ya0luZm8oKSB7Ci0gICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShpc0F2YWlsYWJsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgd2hldGhlciB0aGUgV2ktRmkgY29ubmVjdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGZvciBkYXRhLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGxpbmsgU3VwcGxpY2FudFN0YXRlfSBpcwotICAgICAqIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSNDT01QTEVURUQgQ09NUExFVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rpb25Db21wbGV0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgd2hldGhlciB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGFuIElQIGFkZHJlc3MuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIFdpLUZpIGNvbm5lY3Rpb24gaGFzIGJlZW4gYXNzaWduZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJcEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBtSGF2ZUlwQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSB1c2VyLWVudGVyZWQgcGFzc3dvcmQga2V5Ci0gICAgICogbWF5IGJlIGluY29ycmVjdCAoaS5lLiwgY2F1c2VkIGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwpLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpIHsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudAotICAgICAqIGRhZW1vbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3VwcGxpY2FudAotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcge0Bjb2RlIFN1cHBsaWNhbnRTdGF0ZX0KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlKGludCBuZXR3b3JrSWQsIFN0cmluZyBCU1NJRCwgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBuZXR3b3JrIHN0YXRlCi0gICAgICogQHBhcmFtIEJTU0lEIHdoZW4gdGhlIG5ldyBzdGF0ZSBpcyB7QGxpbmsgRGV0YWlsZWRTdGF0ZSNDT05ORUNURUQKLSAgICAgKiBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRH0sCi0gICAgICogdGhpcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGFjY2VzcyBwb2ludC4gT3RoZXJ3aXNlLCBpdAotICAgICAqIGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKAotICAgICAgICAgICAgdGhpcywgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VELAotICAgICAgICAgICAgbmV3IE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdChuZXdTdGF0ZSwgQlNTSUQsIG5ldHdvcmtJZCkpOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cwotICAgICAqIGFyZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgdGhlIHN1cHBsaWNhbnQncyBoYW5kbGluZyBvZiBzY2FuIHJlc3VsdHMgdG8gIm5vcm1hbCIgbW9kZQotICAgICAgICBzZXRTY2FuUmVzdWx0SGFuZGxpbmcoU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwpOwotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiB0aGUgc3VwcGxpY2FudCBkYWVtb24uCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpIHsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBiZWVuIHN0b3BwZWQuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkgewotICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBFRDsKLQotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIHN0b3BwZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX1NUT1BQRUQsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBiZWVuIHJlc3RhcnRlZCBhZnRlcgotICAgICAqIGhhdmluZyBiZWVuIHN0b3BwZWQuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJTdGFydGVkKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIHN0YXJ0ZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX1NUQVJURUQsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBodW5nIGFuZCBuZWVkcyByZXN0YXJ0aW5nLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5RHJpdmVySHVuZygpIHsKLSAgICAgICAgLy8gU2VuZCBhIGRyaXZlciBoYW5nZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX0hVTkcsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW50ZXJ2YWwgdGltZXIgZm9yIHBvbGxpbmcgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgbm90IGRlbGl2ZXJlZCBhc3luY2hyb25vdXNseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrUG9sbFRpbWVyKCkgewotICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nICYmCi0gICAgICAgICAgICAgICAgbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYKLSAgICAgICAgICAgICAgICAhaGFzTWVzc2FnZXMoRVZFTlRfUE9MTF9JTlRFUlZBTCkpIHsKLSAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKEVWRU5UX1BPTExfSU5URVJWQUwsIFBPTExfU1RBVFVTX0lOVEVSVkFMX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IG1SdW5TdGF0ZSBpcyBub3Qgc3luY2hyb25pemVkIGluIHNvbWUgcGxhY2VzCi0gICAgICogYWRkcmVzcyB0aGlzIGFzIHBhcnQgb2YgcmUtYXJjaGl0ZWN0LgotICAgICAqCi0gICAgICogVE9ETzogV2UgYXJlIGV4cG9zaW5nIGFuIGFkZGl0aW9uYWwgcHVibGljIHN5bmNocm9uaXplZCBjYWxsCi0gICAgICogZm9yIGEgd2FrZWxvY2sgb3B0aW1pemF0aW9uIGluIFdpZmlTZXJ2aWNlLiBSZW1vdmUgaXQKLSAgICAgKiB3aGVuIHdlIGhhbmRsZSB0aGUgd2FrZWxvY2sgaW4gQ29ubmVjdGl2aXR5U2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEcml2ZXJTdG9wcGVkKCkgewotICAgICAgICByZXR1cm4gbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEIHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGVSdW5TdGF0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpUnVubmluZygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpU3RvcHBlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJ1biBzdGF0ZSB0byBlaXRoZXIgIm5vcm1hbCIgb3IgInNjYW4tb25seSIuCi0gICAgICogQHBhcmFtIHNjYW5Pbmx5TW9kZSB0cnVlIGlmIHRoZSBuZXcgbW9kZSBzaG91bGQgYmUgc2Nhbi1vbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuT25seU1vZGUoYm9vbGVhbiBzY2FuT25seU1vZGUpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyB1bmxlc3Mgc2Nhbi1vbmx5IG1vZGUgaXMgY2hhbmdpbmcKLSAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5ICE9IHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgaW50IHNjYW5UeXBlID0gKHNjYW5Pbmx5TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZIDogU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlNjYW4tb25seSBtb2RlIGNoYW5naW5nIHRvICIgKyBzY2FuT25seU1vZGUgKyAiIHNjYW5UeXBlPSIgKyBzY2FuVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc2V0U2NhblJlc3VsdEhhbmRsaW5nKHNjYW5UeXBlKSkgewotICAgICAgICAgICAgICAgIG1Jc1NjYW5Pbmx5ID0gc2Nhbk9ubHlNb2RlOwotICAgICAgICAgICAgICAgIGlmICghaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSBlbmFibGU7Ci0gICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgotICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCi0gICAgICogYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGNvbnRpbnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBsaWNhbnRMb29waW5nKFN1cHBsaWNhbnRTdGF0ZSBuZXdTdXBwbGljYW50U3RhdGUpIHsKLSAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORy5vcmRpbmFsKCkgPD0gbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKQotICAgICAgICAgICAgJiYgbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKSA8IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBpZiAobVN1cHBsaWNhbnRMb29wU3RhdGUgIT0gbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBtU3VwcGxpY2FudExvb3BTdGF0ZS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdXBwbGljYW50TG9vcFN0YXRlID0gbmV3U3VwcGxpY2FudFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID49IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpIHsKLSAgICAgICAgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBJbnRlbnQgaW50ZW50OwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLSAgICAgICAgICAgICAgICAvKiBSZXNldCBub3RpZmljYXRpb24gc3RhdGUgb24gbmV3IGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBESENQIHJlcXVlc3RzIGFyZSBibG9ja2luZywgc28gcnVuIHRoZW0gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCBkaGNwVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRIQ1AgSGFuZGxlciBUaHJlYWQiKTsKLSAgICAgICAgICAgICAgICBkaGNwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBuZXcgRGhjcEhhbmRsZXIoZGhjcFRocmVhZC5nZXRMb29wZXIoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGVBY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Ub3JuRG93bkJ5Q29ubk1nciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cHBsU3RhdGUgPSBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIE1BQyBhZGRyZXNzIGlzbid0IGdvaW5nIHRvIGNoYW5nZSwgc28ganVzdCByZXF1ZXN0IGl0Ci0gICAgICAgICAgICAgICAgICogb25jZSBoZXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBtYWNhZGRyID0gZ2V0TWFjQWRkcmVzcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1hY2FkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TWFjQWRkcmVzcyhtYWNhZGRyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBlc3RhYmxpc2hlZCwgc3RhdGU9IiArCi0gICAgICAgICAgICAgICAgICAgIHN1cHBsU3RhdGUpOwotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gMl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDEtIDBdIENvbm5lY3RlZCB0byBzdXBwbGljYW50ICgxKSwgZGlzY29ubmVjdGVkIGZyb20gc3VwcGxpY2FudCAoMCkgLAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3Igc3VwcGxpY2FudCBkaWVkICgyKQotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsIDEpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIENPTVBMRVRFRCBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgc3VwcGxpY2FudCBtYXkgaGF2ZSBvY2N1cnJlZAotICAgICAgICAgICAgICAgICAqIGluIGJldHdlZW4gcG9sbGluZyBmb3Igc3VwcGxpY2FudCBhdmFpbGFiaWxpdHksIGluIHdoaWNoIGNhc2UKLSAgICAgICAgICAgICAgICAgKiB3ZSBkaWRuJ3QgcGVyZm9ybSBhIERIQ1AgcmVxdWVzdCB0byBnZXQgYW4gSVAgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBtV2lmaUluZm8uZ2V0QlNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbVdpZmlJbmZvLmdldFNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdXBwbFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYgbUhhdmVJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3VwcGxTdGF0ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZpbHRlciBvdXQgbXVsdGljYXN0IHBhY2tldHMuIFRoaXMgc2F2ZXMgYmF0dGVyeSBwb3dlciwgc2luY2UKLSAgICAgICAgICAgICAgICAgKiB0aGUgQ1BVIGRvZXNuJ3QgaGF2ZSB0byBzcGVuZCB0aW1lIHByb2Nlc3NpbmcgcGFja2V0cyB0aGF0Ci0gICAgICAgICAgICAgICAgICogYXJlIGdvaW5nIHRvIGVuZCB1cCBiZWluZyB0aHJvd24gYXdheS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtV00uaW5pdGlhbGl6ZU11bHRpY2FzdEZpbHRlcmluZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoaXMgYWZ0ZXIgdGhlIHN1cHBsaWNhbnQgaXMgYWxpdmUKLSAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgbm90ZVJ1blN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaWVkID0gbVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0RJU0FCTEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0RJU0FCTElORzsKLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3VwcGxpY2FudCBkaWVkIHVuZXhwZWN0ZWRseSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgbG9zdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCBkaWVkID8gMiA6IDApOwotICAgICAgICAgICAgICAgIGNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFdoZW4gc3VwcGxpY2FudCBkaWVzLCBraWxsIHRoZSBESENQIHRocmVhZAotICAgICAgICAgICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LmdldExvb3BlcigpLnF1aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ29udGV4dC5yZW1vdmVTdGlja3lCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCk7Ci0gICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHdlIGhhdmVuJ3QgZ290dGVuIGEgbmV3IHN1cHBsaWNhbnQgc3RhdHVzIHNpbmNlIHRoZSB0aW1lcgotICAgICAgICAgICAgICAgIC8vIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICBpZiAobU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMgPT0gbXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbihmYWxzZSk7IC8vIGRvIGEgcGFzc2l2ZSBzY2FuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcysrOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCBzdXBwbGljYW50U3RhdGVSZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAoU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5zdGF0ZTsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgY3VycmVudFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDUtIDBdIFN1cHBsaWNhbnQgc3RhdGUgb3JkaW5hbCAoYXMgZGVmaW5lZCBieSBTdXBwbGljYW50U3RhdGUpCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50TG9nUGFyYW0gPSAobmV3U3RhdGUub3JkaW5hbCgpICYgMHgzZik7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIGV2ZW50TG9nUGFyYW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNoYW5naW5nIHN1cHBsaWNhbnQgc3RhdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50U3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID09PiAiICsgbmV3U3RhdGUpOwotCi0gICAgICAgICAgICAgICAgaW50IG5ldHdvcmtJZCA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5uZXR3b3JrSWQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGUgU3VwcGxpY2FudFN0YXRlIEJTU0lEIHZhbHVlIGlzIHZhbGlkIGluIEFTU09DSUFUSU5HIHN0YXRlIG9ubHkuCi0gICAgICAgICAgICAgICAgICogVGhlIE5ldHdvcmtTdGF0ZSBCU1NJRCB2YWx1ZSBjb21lcyB1cG9uIGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChzdXBwbGljYW50U3RhdGVSZXN1bHQuc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQuQlNTSUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGRpc2Nvbm5lY3Qgb3IgaW5hY3RpdmUgd2UgbmVlZCB0byBzdGFydCBvdXIKLSAgICAgICAgICAgICAgICAgKiB3YXRjaGRvZyB0aW1lciB0byBzdGFydCBhIHNjYW4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLklOQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzLCAwKSwgS0lDS1NUQVJUX1NDQU5OSU5HX0RFTEFZX01TRUNTKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRGlkIHdlIGdldCB0byBESVNDT05ORUNURUQgc3RhdGUgZHVlIHRvIGFuCi0gICAgICAgICAgICAgICAgICogYXV0aGVudGljYXRpb24gKHBhc3N3b3JkKSBmYWlsdXJlPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbGVkVG9BdXRoZW50aWNhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb0F1dGhlbnRpY2F0ZSA9IG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdXBwbGljYW50IHN0YXRlIGFuZCBjaGVjayBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgKiBkaXNhYmxlIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZE5ldHdvcmsgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdXBwbGljYW50TG9vcGluZyhuZXdTdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wIFdQQSBzdXBwbGljYW50IGxvb3AgYW5kIGRpc2FibGUgbmV0d29yayIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkTmV0d29yayA9IHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsobmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWROZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBsb29wIHN0YXRlIGlmIHdlIGRpc2FibGVkIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlICE9IGN1cnJlbnRTdGF0ZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQgJiYgaXNEcml2ZXJTdG9wcGVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShuZXdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRE9STUFOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsZWRTdGF0ZSBuZXdEZXRhaWxlZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZWNvbm5lY3RNc2cgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVCwgbUxhc3RCc3NpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzU2Nhbk9ubHkgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGFpbGVkU3RhdGUgPSBEZXRhaWxlZFN0YXRlLklETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGFpbGVkU3RhdGUgPSBEZXRhaWxlZFN0YXRlLkZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKG5ld0RldGFpbGVkU3RhdGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldHdvcmsgKG5ldHdvcmtJZCAhPSAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3N1bWUgd2UgcmVhY2hlZCB0aGlzIHN0YXRlIGJlY2F1c2Ugb2YgYSBmYWlsZWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gYWNxdWlyZSBhbiBJUCBhZGRyZXNzLCBhbmQgYXR0ZW1wdCBhbm90aGVyIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBJUCBhZGRyZXNzIGFjcXVpc2l0aW9uIGluIFJFQ09OTkVDVF9ERUxBWV9NU0VDUwotICAgICAgICAgICAgICAgICAgICAgICAgICogbWlsbGlzZWNvbmRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9SVU5OSU5HICYmICFtSXNTY2FuT25seSAmJiBuZXR3b3JrSWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQocmVjb25uZWN0TXNnLCBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcERyaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUQVJUSU5HICYmICFtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRHJpdmVyU3RvcHBlZCgpIHx8IG1EaXNjb25uZWN0RXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYgIW1EaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZ25vcmUgZXZlbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNoIGFzIFdQQSByZWtleWluZyBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjdXJyZW50U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkZPVVJfV0FZX0hBTkRTSEFLRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuR1JPVVBfSEFORFNIQUtFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZihuZXdTdGF0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFLCAoUGFyY2VsYWJsZSluZXdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRUb0F1dGhlbnRpY2F0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkZhaWxlZCB0byBhdXRoZW50aWNhdGUsIGRpc2FibGluZyBuZXR3b3JrICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVJST1JfQVVUSEVOVElDQVRJTkcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRWFjaCBDT05ORUNUIG9yIERJU0NPTk5FQ1QgZ2VuZXJhdGVzIGEgcGFpciBvZiBldmVudHMuCi0gICAgICAgICAgICAgICAgICogT25lIGlzIGEgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQsIGFuZCB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgKiBpcyBhIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50LiBGb3IgY29ubmVjdHMsIHRoZQotICAgICAgICAgICAgICAgICAqIHN1cHBsaWNhbnQgZXZlbnQgYWx3YXlzIGFycml2ZXMgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgICogdGhlIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50LiBPbmx5IHRoZSBsYXR0ZXIgZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBoYXMgdGhlIEJTU0lELCB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYXB0dXJpbmcuCi0gICAgICAgICAgICAgICAgICogRm9yIGRpc2Nvbm5lY3RzLCB0aGUgb3JkZXIgaXMgdGhlIG9wcG9zaXRlIC0tIHRoZQotICAgICAgICAgICAgICAgICAqIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50IGNvbWVzIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAqIHRoZSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKLQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIG5ldHdvcmsgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyA1LSAwXSBEZXRhaWxlZCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUpICAgCi0gICAgICAgICAgICAgICAgZXZlbnRMb2dQYXJhbSA9IChyZXN1bHQuc3RhdGUub3JkaW5hbCgpICYgMHgzZik7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQsIGV2ZW50TG9nUGFyYW0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJOZXcgbmV0d29yayBzdGF0ZSBpcyAiICsgcmVzdWx0LnN0YXRlKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHdlJ3JlIGluIHNjYW4tb25seSBtb2RlLCBkb24ndCBhZHZhbmNlIHRoZSBzdGF0ZSBtYWNoaW5lLCBhbmQKLSAgICAgICAgICAgICAgICAgKiBkb24ndCByZXBvcnQgdGhlIHN0YXRlIGNoYW5nZSB0byBjbGllbnRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRHJvcHBpbmcgZXZlbnQgaW4gc2Nhbi1vbmx5IG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgIT0gRGV0YWlsZWRTdGF0ZS5TQ0FOTklORykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc2NhbiBjb3VudCBzaW5jZSB0aGVyZSB3YXMgYSBuZXR3b3JrIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAqIGNoYW5nZS4gVGhpcyBjb3VsZCBiZSBmcm9tIHN1cHBsaWNhbnQgdHJ5aW5nIHRvIGFzc29jaWF0ZQotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGEgbmV0d29yay4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB0aGUgc3VwcGxpY2FudCBzZW50IHVzIGEgQ09OTkVDVEVEIGV2ZW50LCB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAqIHdhbnQgdG8gc2VuZCBvdXQgYW4gaW5kaWNhdGlvbiBvZiBvdmVyYWxsIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKiBjb25uZWN0aXZpdHkgdW50aWwgd2UgaGF2ZSBvdXIgSVAgYWRkcmVzcy4gSWYgdGhlCi0gICAgICAgICAgICAgICAgICogc3VwcGxpY2FudCBzZW50IHVzIGEgRElTQ09OTkVDVEVEIGV2ZW50LCB3ZSBkZWxheQotICAgICAgICAgICAgICAgICAqIHNlbmRpbmcgYSBub3RpZmljYXRpb24gaW4gY2FzZSBhIHJlY29ubmVjdGlvbiB0bwotICAgICAgICAgICAgICAgICAqIHRoZSBzYW1lIGFjY2VzcyBwb2ludCBvY2N1cnMgd2l0aGluIGEgc2hvcnQgdGltZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29ubmVjdGlvblN0YXR1cyhtV2lmaUluZm8pOwotICAgICAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCFtSGF2ZUlwQWRkcmVzcyB8fCBtRGlzY29ubmVjdFBlbmRpbmcpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHJlc3VsdC5zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZW1vdmUgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbiB3aGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAqIHN1Y2Nlc3NmdWxseSBjb25uZWN0IHRvIGEgbmV0d29yay4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3YXNEaXNjb25uZWN0UGVuZGluZyA9IG1EaXNjb25uZWN0UGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgY29ubmVjdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGFzIGZhciBhcyBsaW5rLWxldmVsCi0gICAgICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpdml0eSBpcyBjb25jZXJuZWQsIGJ1dCB3ZSBtYXkgc3RpbGwgbmVlZCB0byBvYnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICogYW4gSVAgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh3YXNEaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsZWRTdGF0ZSBzYXZlU3RhdGUgPSBnZXROZXR3b3JrSW5mbygpLmdldERldGFpbGVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoc2F2ZVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gcmVzdWx0LkJTU0lEOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBtV2lmaUluZm8uZ2V0U1NJRCgpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IHJlc3VsdC5uZXR3b3JrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGF2ZUlwQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuT0JUQUlOSU5HX0lQQUREUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtV2lmaUluZm8uZ2V0QlNTSUQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT24gcmVjZWl2aW5nIHRoZSBmaXJzdCBzY2FuIHJlc3VsdHMgYWZ0ZXIgY29ubmVjdGluZyB0bwotICAgICAgICAgICAgICAgICAqIHRoZSBzdXBwbGljYW50LCBzd2l0Y2ggc2NhbiBtb2RlIG92ZXIgdG8gcGFzc2l2ZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzZXRTY2FuTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfUE9MTF9JTlRFUlZBTDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKG1XaWZpSW5mbywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBtTGFzdEJzc2lkIGNhbiBiZSBudWxsIHdoZW4gdGhlcmUgaXMgYSByZWNvbm5lY3QKLSAgICAgICAgICAgICAgICAgKiByZXF1ZXN0IG9uIHRoZSBmaXJzdCBCU1NJRCB3ZSBjb25uZWN0IHRvCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIEJTU0lEID0gKG1zZy5vYmogIT0gbnVsbCkgPyBtc2cub2JqLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIElmIHdlJ3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciByZWNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgKiB0byBhIGdpdmVuIG5ldHdvcmssIGRpc2FibGUgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21SZWNvbm5lY3RDb3VudCA+IGdldE1heERoY3BSZXRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHJlY29ubmVjdCBjb3VudDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgKyAiIERpc2FibGluZyAiICsgQlNTSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdNLmRpc2FibGVOZXR3b3JrKG1MYXN0TmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBTaW5jZSB0aGlzIGV2ZW50IGlzIHNlbnQgZnJvbSBhbm90aGVyIHRocmVhZCwgaXQgbWlnaHQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICogc2VudCBhZnRlciB3ZSBjbG9zZWQgb3VyIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQgaW4gdGhlIGNvdXJzZQotICAgICAgICAgICAgICAgICAqIG9mIGRpc2FibGluZyBXaS1GaS4gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGQganVzdCBpZ25vcmUgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsgLy8gZm9yY2UgdXBkYXRlIG9mIHNpZ25hbCBzdHJlbmd0aAotICAgICAgICAgICAgICAgIGlmIChtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICE9IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1XaWZpSW5mby5nZXRCU1NJRCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIklQIGNvbmZpZ3VyYXRpb246ICIgKyBtRGhjcEluZm8pOwotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApICAgCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHksIHNvIGFsbG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4gaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXaS1GaSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApCi0gICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1RBVEVfQ0hBTkdFRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBkcml2ZXIgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyAwIFNUQVJURUQKLSAgICAgICAgICAgICAgICAvLyAxIFNUT1BQRUQKLSAgICAgICAgICAgICAgICAvLyAyIEhVTkcKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VELCBtc2cuYXJnMSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gY2hhbm5lbHMgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBzeXN0ZW0gc2V0dGluZywgc2luY2UgaXQgZ2V0cyByZXNldCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZHJpdmVyIHVwb24gY2hhbmdpbmcgdG8gdGhlIFNUQVJURUQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgc2l0dWF0aW9ucywgc3VwcGxpY2FudCBuZWVkcyB0byBiZSBraWNrc3RhcnRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9IVU5HOgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJXaWZpIERyaXZlciByZXBvcnRzIEhVTkcgLSByZWxvYWRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiByZXN0YXJ0IHRoZSBkcml2ZXIgLSB0b2dnbGUgb2ZmIGFuZCBvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm90ZVJ1blN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1Q6Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBib29sZWFuIGRpc2FibGVkTmV0d29yayA9IGZhbHNlOwotICAgICAgICBpZiAoMCA8PSBuZXR3b3JrSWQpIHsKLSAgICAgICAgICAgIGRpc2FibGVkTmV0d29yayA9IG1XTS5kaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWROZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGVkIG5ldHdvcms6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgaWYgKCFkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZGlzYWJsZSBuZXR3b3JrOiIgKwotICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBuZXR3b3JrIGlkOiAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlzYWJsZWROZXR3b3JrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVJbnRlcmZhY2UoKSB7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKLSAgICAgICAgICAgIGlmICghbUhhdmVJcEFkZHJlc3MgJiYgIW1PYnRhaW5pbmdJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5zZW5kRW1wdHlNZXNzYWdlKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgb3VyIElQIHN0YXRlIGFuZCBzZW5kIG91dCBicm9hZGNhc3RzIGZvbGxvd2luZyBhIGRpc2Nvbm5lY3QuCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSB7QGNvZGUgRGV0YWlsZWRTdGF0ZX0gdG8gc2V0LiBTaG91bGQgYmUgZWl0aGVyCi0gICAgICoge0Bjb2RlIERJU0NPTk5FQ1RFRH0gb3Ige0Bjb2RlIEZBSUxFRH0uCi0gICAgICogQHBhcmFtIGRpc2FibGVJbnRlcmZhY2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGludGVyZmFjZSBzaG91bGQKLSAgICAgKiBiZSBkaXNhYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKG1EaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgY2FuY2VsRGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgcmVzZXRDb25uZWN0aW9ucyhkaXNhYmxlSW50ZXJmYWNlKTsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShuZXdTdGF0ZSk7Ci0gICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChudWxsKTsKLSAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7Ci0gICAgICAgIG1MYXN0U3NpZCA9IG51bGw7Ci0gICAgICAgIG1EaXNjb25uZWN0UGVuZGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgV2ktRmkgQ29ubmVjdGlvbnMgYnkgY2xlYXJpbmcgYW55IHN0YXRlLCByZXNldHRpbmcgYW55IHNvY2tldHMKLSAgICAgKiB1c2luZyB0aGUgaW50ZXJmYWNlLCBzdG9wcGluZyBESENQLCBhbmQgZGlzYWJsaW5nIHRoZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb25uZWN0aW9ucyhib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7Ci0gICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9uIGRlcGVuZHMgb24gYm90aCB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgSVAgYXNzaWduZWQsCi0gICAgICAgICAqIHNvIGl0IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkgY2hhbmNlIG9mIHRoZSBJUCBiZWluZyBsb3N0LgotICAgICAgICAgKi8KLSAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotCi0gICAgICAgIC8vIFN0b3AgREhDUAotICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbURoY3BUYXJnZXQuc2V0Q2FuY2VsQ2FsbGJhY2sodHJ1ZSk7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9ESENQX1NUQVJUKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnRlcmZhY2UgaXMgcmUtZW5hYmxlZCBpbiB0aGUgc3VwcGxpY2FudAotICAgICAgICAgKiB3aGVuIG1vdmluZyBvdXQgb2YgQVNTT0NJQVRJTkcgc3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJEaXNhYmxpbmcgaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3VwcGxpY2FudCBpcyByZXBvcnRpbmcgdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiBhY2Nlc3MgcG9pbnQuIE9mdGVuLCBob3dldmVyLCBhIGRpc2Nvbm5lY3Qgd2lsbCBiZSBmb2xsb3dlZCB2ZXJ5IHNob3J0bHkKLSAgICAgKiBieSBhIHJlY29ubmVjdCB0byB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQuIFRoZXJlZm9yZSwgd2UgZGVsYXkgcmVzZXR0aW5nCi0gICAgICogdGhlIGNvbm5lY3Rpb24ncyBJUCBzdGF0ZSBmb3IgYSBiaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFoYXNNZXNzYWdlcyhFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCwgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIHJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1EaGNwSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHNMaXN0KCkgewotICAgICAgICByZXR1cm4gbVNjYW5SZXN1bHRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuUmVzdWx0c0xpc3QoTGlzdDxTY2FuUmVzdWx0PiBzY2FuTGlzdCkgewotICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCi0gICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaWZpSW5mbyByZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7Ci0gICAgICAgIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKG1XaWZpSW5mbyk7Ci0gICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKG1XaWZpSW5mbywgZmFsc2UpOwotICAgICAgICByZXR1cm4gbVdpZmlJbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0Q29ubmVjdGlvblN0YXR1cyhXaWZpSW5mbyBpbmZvKSB7Ci0gICAgICAgIFN0cmluZyByZXBseSA9IHN0YXR1cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFBhcnNlIHRoZSByZXBseSBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHRoZSBzdGF0dXMgY29tbWFuZCwgYW5kIHVwZGF0ZQotICAgICAgICAgKiBsb2NhbCBzdGF0ZSBhY2NvcmRpbmdseS4gVGhlIHJlcGx5IGlzIGEgc2VyaWVzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCi0gICAgICAgICAqICJuYW1lPXZhbHVlIi4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIEJTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN1cHBTdGF0ZSA9IG51bGw7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IHJlcGx5LnNwbGl0KCJcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb3AgPSBsaW5lLnNwbGl0KCIgKj0gKiIsIDIpOwotICAgICAgICAgICAgaWYgKHByb3AubGVuZ3RoIDwgMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpZCIpKQotICAgICAgICAgICAgICAgIG5ldElkID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNzaWQiKSkKLSAgICAgICAgICAgICAgICBTU0lEID0gdmFsdWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJzc2lkIikpCi0gICAgICAgICAgICAgICAgQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgid3BhX3N0YXRlIikpCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby5zZXROZXR3b3JrSWQobmV0SWQpOwotICAgICAgICBpbmZvLnNldFNTSUQoU1NJRCk7Ci0gICAgICAgIGluZm8uc2V0QlNTSUQoQlNTSUQpOwotICAgICAgICAvKgotICAgICAgICAgKiBXZSBvbmx5IHNldCB0aGUgc3VwcGxpY2FudCBzdGF0ZSBpZiB0aGUgcHJldmlvdXMgc3RhdGUgd2FzCi0gICAgICAgICAqIFVOSU5JVElBTElaRUQuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gd2UgZmlyc3QgY29ubmVjdCB0bwotICAgICAgICAgKiB0aGUgc3VwcGxpY2FudC4gT25jZSB3ZSdyZSBjb25uZWN0ZWQsIHdlIHNob3VsZCBhbHdheXMgcmVjZWl2ZQotICAgICAgICAgKiBhbiBldmVudCB1cG9uIGFueSBzdGF0ZSBjaGFuZ2UsIGJ1dCBpbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8KLSAgICAgICAgICogbWFrZSBzdXJlIGFueSBsaXN0ZW5lcnMgYXJlIG1hZGUgYXdhcmUgb2YgdGhlIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQgJiYgc3VwcFN0YXRlICE9IG51bGwpCi0gICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoc3VwcFN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGR5bmFtaWMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cy4KLSAgICAgKiBAcGFyYW0gaW5mbyB0aGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBjYXB0dXJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlcXVlc3RQb2xsZWRJbmZvKFdpZmlJbmZvIGluZm8sIGJvb2xlYW4gcG9sbGluZykKLSAgICB7Ci0gICAgICAgIGludCBuZXdSc3NpID0gKHBvbGxpbmcgPyBnZXRSc3NpQXBwcm94KCkgOiBnZXRSc3NpKCkpOwotICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKLSAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OwotICAgICAgICAgICAgaW5mby5zZXRSc3NpKG5ld1Jzc2kpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJhdGhlciB0aGVuIHNlbmRpbmcgdGhlIHJhdyBSU1NJIG91dCBldmVyeSB0aW1lIGl0Ci0gICAgICAgICAgICAgKiBjaGFuZ2VzLCB3ZSBwcmVjYWxjdWxhdGUgdGhlIHNpZ25hbCBsZXZlbCB0aGF0IHdvdWxkCi0gICAgICAgICAgICAgKiBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBiYXIsIGFuZCBvbmx5IHNlbmQgdGhlCi0gICAgICAgICAgICAgKiBicm9hZGNhc3QgaWYgdGhhdCBtdWNoIG1vcmUgY29hcnNlLWdyYWluZWQgbnVtYmVyCi0gICAgICAgICAgICAgKiBjaGFuZ2VzLiBUaGlzIGN1dHMgZG93biBncmVhdGx5IG9uIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdHMsIGF0IHRoZSBjb3N0IG9mIG5vdCBpbmZvcm1pbmcgb3RoZXJzCi0gICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAotICAgICAgICAgICAgICogbGV2ZWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0Ci0gICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCi0gICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgotICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7Ci0gICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgewotICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mby5zZXRSc3NpKC0yMDApOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBnZXRMaW5rU3BlZWQoKTsKLSAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgewotICAgICAgICAgICAgaW5mby5zZXRMaW5rU3BlZWQobmV3TGlua1NwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChmaW5hbCBpbnQgbmV3UnNzaSkgewotICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1JTU0ksIG5ld1Jzc2kpOwotICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPLCBtTmV0d29ya0luZm8pOwotICAgICAgICBpZiAoYnNzaWQgIT0gbnVsbCkKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9CU1NJRCwgYnNzaWQpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgc3RvcHBpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgaWYgKCFtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChkaXNjb25uZWN0QW5kU3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0VG9ybkRvd25CeUNvbm5NZ3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVlbmFibGUgV2ktRmkgY29ubmVjdGl2aXR5IGJ5IHJlc3RhcnRpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChyZXN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Ugd2FudCB0byBzdG9wIHRoZSBkcml2ZXIsIGJ1dCBpZiB3ZSdyZSBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLAotICAgICAqIHdlIGZpcnN0IHdhbnQgdG8gZGlzY29ubmVjdCwgc28gdGhhdCB0aGUgc3VwcGxpY2FudCBpcyBhbHdheXMgaW4KLSAgICAgKiBhIGtub3duIHN0YXRlIChESVNDT05ORUNURUQpIHdoZW4gdGhlIGRyaXZlciBpcyBzdG9wcGVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi0gICAgICogZGlzY29ubmVjdCBvciBzdG9wIGNvbW1hbmQgd2FzIGluaXRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdEFuZFN0b3AoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTs7Ci0gICAgICAgIGlmIChtUnVuU3RhdGUgIT0gUlVOX1NUQVRFX1NUT1BQSU5HICYmIG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgLy8gVGFrZSBkb3duIGFueSBvcGVuIG5ldHdvcmsgbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gc3RvcERyaXZlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQgPSBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzdGFydCgpIHsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiBzdGFydERyaXZlcigpOwotICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpZmlTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lmaVN0YXRlKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIFRoZSBXaWZpTmF0aXZlIGludGVyZmFjZSBmdW5jdGlvbnMgYXJlIGxpc3RlZCBiZWxvdy4KLSAgICAgKiBUaGUgb25seSBuYXRpdmUgY2FsbCB0aGF0IGlzIG5vdCBzeW5jaHJvbml6ZWQgb24KLSAgICAgKiBXaWZpU3RhdGVUcmFja2VyIGlzIHdhaXRGb3JFdmVudCgpIHdoaWNoIHdhaXRzIG9uIGEKLSAgICAgKiBzZXBlcmF0ZSBtb25pdG9yIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBBbGwgc3VwcGxpY2FudCBjb21tYW5kcyBuZWVkIHRoZSB3aWZpIHRvIGJlIGluIGFuCi0gICAgICogZW5hYmxlZCBzdGF0ZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBjaGVja2luZyB0aGUKLSAgICAgKiBtV2lmaVN0YXRlIHRvIGJlIFdJRklfU1RBVEVfRU5BQkxFRC4KLSAgICAgKgotICAgICAqIEFsbCBjb21tYW5kcyB0aGF0IGNhbiBjYXVzZSBjb21tYW5kcyB0byBkcml2ZXIKLSAgICAgKiBpbml0aWF0ZWQgbmVlZCB0aGUgZHJpdmVyIHN0YXRlIHRvIGJlIHN0YXJ0ZWQuCi0gICAgICogVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGlzRHJpdmVyU3RvcHBlZCgpIHRvCi0gICAgICogYmUgZmFsc2UuCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2FkRHJpdmVyKCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5sb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1bmxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdXBwbGljYW50IGNvbmZpZyBhbmQKLSAgICAgKiBzdGFydCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzdGFibGlzaGVzIHR3byBjaGFubmVscyAtIGNvbnRyb2wgY2hhbm5lbCBmb3IgY29tbWFuZHMKLSAgICAgKiBhbmQgbW9uaXRvciBjaGFubmVsIGZvciBub3RpZnlpbmcgV2lmaU1vbml0b3IKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RUb1N1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmNvbm5lY3RUb1N1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgY29udHJvbC9tb25pdG9yIGNoYW5uZWxzIHRvIHN1cHBsaWNhbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKLSAgICAgICAgV2lmaU5hdGl2ZS5jbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIHN1cHBsaWNhbnQgaXMgYWxpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHBpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnBpbmdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhdGUgYW4gYWN0aXZlIG9yIHBhc3NpdmUgc2NhbgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlQWN0aXZlIHRydWUgaWYgaXQgaXMgYSBhY3RpdmUgc2NhbgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChmb3JjZUFjdGl2ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN1cHBsaWNhbnQgb3IgZHJpdmVyCi0gICAgICogdGFrZSBjYXJlIG9mIGluaXRpYXRpbmcgc2NhbiBhbmQgZG9pbmcgQVAgc2VsZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuUmVzdWx0SGFuZGxpbmcoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaCB0aGUgc2NhbiByZXN1bHRzIGZyb20gdGhlIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhhbXBsZSByZXN1bHQgc3RyaW5nCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZWUgICAgICAgMjQyNyAgICAxNjYgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MQotICAgICAqIDAwOmJiOmNjOmRkOmNjOmZmICAgICAgIDI0MTIgICAgMTY1ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzY2FuUmVzdWx0cygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuUmVzdWx0c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNjYW4gbW9kZSAtIGFjdGl2ZSBvciBwYXNzaXZlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuTW9kZShib29sZWFuIGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc1NjYW5Nb2RlQWN0aXZlICE9IGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChtSXNTY2FuTW9kZUFjdGl2ZSA9IGlzU2Nhbk1vZGVBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3QgZnJvbSBBY2Nlc3MgUG9pbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlY29ubmVjdENvbW1hbmQoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb2YgdGhlIG5ldyBuZXR3b3JrCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYWRkTmV0d29yaygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkTmV0d29ya0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIGlkIG9mIHRoZSBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXR3b3JrSWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldHdvcmtJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIGEgbmV0d29yawotICAgICAqCi0gICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcGFyYW0gZGlzYWJsZU90aGVycyB0cnVlLCBpZiBhbGwgb3RoZXIgbmV0d29ya3MgaGF2ZSB0byBiZSBkaXNhYmxlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIGEgcmUtYXNzb2NpYXRpb24gaW4gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJsYWNrbGlzdCBhIEJTU0lELiBUaGlzIHdpbGwgYXZvaWQgdGhlIEFQIGlmIHRoZXJlIGFyZQotICAgICAqIGFsdGVybmF0ZSBBUHMgdG8gY29ubmVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGJzc2lkIEJTU0lEIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmFkZFRvQmxhY2tsaXN0Q29tbWFuZChic3NpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdCBhbGwgY29uZmlndXJlZCBuZXR3b3JrcwotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIG5ldHdvcmtzIG9yIG51bGwgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGxpc3ROZXR3b3JrcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHJldHVybiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlIG5ldHdvcmsgdmFyaWFibGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROZXR3b3JrVmFyaWFibGUoaW50IG5ldElkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgZGV0YWlsZWQgc3RhdHVzIG9mIHRoZSBjb25uZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEV4YW1wbGUgc3RhdHVzIHJlc3VsdAotICAgICAqICBic3NpZD1hYTpiYjpjYzpkZDplZTpmZgotICAgICAqICBzc2lkPVRlc3ROZXQKLSAgICAgKiAgaWQ9MwotICAgICAqICBwYWlyd2lzZV9jaXBoZXI9Tk9ORQotICAgICAqICBncm91cF9jaXBoZXI9Tk9ORQotICAgICAqICBrZXlfbWdtdD1OT05FCi0gICAgICogIHdwYV9zdGF0ZT1DT01QTEVURUQKLSAgICAgKiAgaXBfYWRkcmVzcz1YLlguWC5YCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc3RhdHVzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJzc2koKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFJzc2lBcHByb3hDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFwcHJveCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaUFwcHJveCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGluayBzcGVlZCB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbGluayBzcGVlZCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldExpbmtTcGVlZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBNQUMgYWRkcmVzcyBvZiByYWRpbwotICAgICAqCi0gICAgICogQHJldHVybiBNQUMgYWRkcmVzcywgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TWFjQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGRyaXZlcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnREcml2ZXIoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0RHJpdmVyQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3AgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wRHJpdmVyKCkgewotICAgICAgICAvKiBEcml2ZXIgc3RvcCBzaG91bGQgbm90IGhhcHBlbiBvbmx5IHdoZW4gc3VwcGxpY2FudCBldmVudAotICAgICAgICAgKiBEUklWRVJfU1RPUFBFRCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgKi8KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BEcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgcGFja2V0IGZpbHRlcmluZwotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wUGFja2V0RmlsdGVyaW5nKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcmV0dXJuIHBvd2VyIG1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQb3dlck1vZGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCAmJiAhaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRQb3dlck1vZGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BVVRPCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFBvd2VyTW9kZShpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGZyb20gdGhlIHN5c3RlbQotICAgICAqIHNldHRpbmcgdmFsdWUsIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKLSAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobU51bUFsbG93ZWRDaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG1OdW1BbGxvd2VkQ2hhbm5lbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGRyaXZlciBkZWZhdWx0Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAotICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbU51bUFsbG93ZWRDaGFubmVscyA9IG51bUNoYW5uZWxzOwotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG51bUNoYW5uZWxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gY2hhbm5lbCBjb3VudCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIEJsdWV0b290aCBjb2V4aXN0ZW5jZSBzY2FuIG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uLAotICAgICAqIHNvbWUgb2YgdGhlIGxvdy1sZXZlbCBzY2FuIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgZHJpdmVyIGFyZSBjaGFuZ2VkIHRvCi0gICAgICogcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIEEyRFAgc3RyZWFtaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGlzQmx1ZXRvb3RoUGxheWluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCbHVldG9vdGhTY2FuTW9kZShib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKGlzQmx1ZXRvb3RoUGxheWluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNhdmVDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZyb20gZmlsZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkQ29uZmlnKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5yZWxvYWRDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pIHsKLSAgICAgICAgcmV0dXJuIG1XTS5zZXRXaWZpRW5hYmxlZCh0dXJuT24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIFdpLUZpLXNwZWNpZmljIGZlYXR1cmVzIHN1cHBvcnRlZC4KLSAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIC0xfSBpbmRpY2F0aW5nIGZhaWx1cmUsIGFsd2F5cworICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bworICAgICAqIGJlZ2luIHVzaW5nIHRoZSBuYW1lZCBmZWF0dXJlLiBUaGUgaW50ZXJwcmV0YXRpb24gb2Yge0Bjb2RlIGZlYXR1cmV9CisgICAgICogaXMgY29tcGxldGVseSB1cCB0byBlYWNoIG5ldHdvcmtpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gY2FsbGluZ1VpZCB0aGUgdXNlciBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byBlYWNoIG5ldHdvcmtpbmcKKyAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQorICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKiBUT0RPOiBuZWVkcyB0byBnbyBhd2F5CiAgICAgICovCiAgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkCisgICAgICogdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotCi0gICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCi0gICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQotICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IGdldE5ldHdvcmtJbmZvKCk7Ci0KLSAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXR3b3JrSW5mby5nZXRTdGF0ZSgpOwotICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKLQotICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCi0gICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gZ2V0U2NhblJlc3VsdHNMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1PcGVuTmV0d29ya3MgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzY2FuUmVzdWx0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBzY2FuUmVzdWx0cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNjYW5SZXN1bHQuY2FwYWJpbGl0aWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3Blbk5ldHdvcmtzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobnVtT3Blbk5ldHdvcmtzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA+PSBOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogV2UndmUgc2Nhbm5lZCBjb250aW51b3VzbHkgYXQgbGVhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIE5VTV9TQ0FOU19CRUZPUkVfTk9USUZJQ0FUSU9OIHRpbWVzLiBUaGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogcHJvYmFibHkgZG9lcyBub3QgaGF2ZSBhIHJlbWVtYmVyZWQgbmV0d29yayBpbiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIG90aGVyd2lzZSBzdXBwbGljYW50IHdvdWxkIGhhdmUgdHJpZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzc29jaWF0ZSBhbmQgdGh1cyByZXNldHRpbmcgdGhpcyBjb3VudGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKHRydWUsIG51bU9wZW5OZXR3b3JrcywgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCi0gICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZURuc1JvdXRlU2V0LmdldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgotICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKLSAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgotICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCi0gICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsIGludCBkZWxheSkgewotICAgICAgICAKLSAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCi0gICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdwotICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCi0gICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKLSAgICAgICAgCi0gICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKLSAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgotICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG1haW5seSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgIC8vIEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEIG1lc3NhZ2Ugd2l0aCB0aGlzIE5vdGlmaWNhdGlvbiBmcm9tCi0gICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGxhdGVyCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKLQotICAgICAgICAgICAgbWVzc2FnZSA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgIG1UYXJnZXQucmVtb3ZlTWVzc2FnZXMoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAwLCBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGFyZ2V0LnNlbmRNZXNzYWdlRGVsYXllZChtZXNzYWdlLCBkZWxheSk7Ci0gICAgICAgIAotICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldC5zZXQoZW5hYmxlZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRyYWNraW5nIHdoZXRoZXIgYSBub3RpZmljYXRpb24gaGFzIGJlZW4KLSAgICAgKiBzaG93biByZWNlbnRseS4KLSAgICAgKiA8cD4KLSAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgdGltZXIgdGhhdCBwcmV2ZW50cyBub3RpZmljYXRpb25zIGZyb20KLSAgICAgKiBiZWluZyBzaG93biB0b28gb2Z0ZW4gd2lsbCBiZSBjbGVhcmVkLgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvblRpbWVyKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7Ci0gICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoImludGVyZmFjZSAiKS5hcHBlbmQobUludGVyZmFjZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoIiBydW5TdGF0ZT0iKTsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA+PSAxICYmIG1SdW5TdGF0ZSA8PSBtUnVuU3RhdGVOYW1lcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtUnVuU3RhdGVOYW1lc1ttUnVuU3RhdGUtMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKExTKS5hcHBlbmQobVdpZmlJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQobURoY3BJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQoImhhdmVJcEFkZHJlc3M9IikuYXBwZW5kKG1IYXZlSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgb2J0YWluaW5nSXBBZGRyZXNzPSIpLmFwcGVuZChtT2J0YWluaW5nSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgc2Nhbk1vZGVBY3RpdmU9IikuYXBwZW5kKG1Jc1NjYW5Nb2RlQWN0aXZlKS5hcHBlbmQoTFMpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgibGFzdFNpZ25hbExldmVsPSIpLmFwcGVuZChtTGFzdFNpZ25hbExldmVsKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZXhwbGljaXRseURpc2FibGVkPSIpLmFwcGVuZChtVG9ybkRvd25CeUNvbm5NZ3IpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBEaGNwSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotCi0gICAgICAgIHByaXZhdGUgSGFuZGxlciBtVGFyZ2V0OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gc2tpcCB0aGUgREhDUCByZXN1bHQgY2FsbGJhY2sgdG8gdGhlIHRhcmdldC4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAqIHRoaXMgY291bGQgYmUgc2V0IGlmIHRoZSBuZXR3b3JrIHdlIHdlcmUgcmVxdWVzdGluZyBhbiBJUCBmb3IgaGFzCi0gICAgICAgICAqIHNpbmNlIGJlZW4gZGlzY29ubmVjdGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTm90ZTogVGhlcmUgaXMgc3RpbGwgYSBjaGFuY2Ugd2hlcmUgdGhlIGNsaWVudCdzIGludGVuZGVkIERIQ1AKLSAgICAgICAgICogcmVxdWVzdCBub3QgYmVpbmcgY2FuY2VsZWQuIEZvciBleGFtcGxlLCB3ZSBhcmUgcmVxdWVzdCBmb3IgSVAgb24KLSAgICAgICAgICogQSwgYW5kIGhlIHF1ZXVlcyByZXF1ZXN0IGZvciBJUCBvbiBCLCBhbmQgdGhlbiBjYW5jZWxzIHRoZSByZXF1ZXN0IG9uCi0gICAgICAgICAqIEIgd2hpbGUgd2UncmUgc3RpbGwgcmVxdWVzdGluZyBmcm9tIEEuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbENhbGxiYWNrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW5jZSBvZiB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQgaGVscGVyLiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcwotICAgICAgICAgKiBub3RlZCBieSBpdHMgamF2YWRvYy4gSWYgd2UgY2hlY2sgYmVmb3JlIGl0IGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBiZQotICAgICAgICAgKiBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgd2Ugd2lsbCBub3QgZGlzYWJsZSBjb2V4aXN0ZW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBEaGNwSGFuZGxlcihMb29wZXIgbG9vcGVyLCBIYW5kbGVyIHRhcmdldCkgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgaW50IGV2ZW50OwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9ESENQX1NUQVJUOgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnQgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2RlIHRvIGFjdGl2ZSB3aGVuIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBtb2RlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICogPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSBzZXQgV2ktRmkgdG8gYWN0aXZlIG1vZGUgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZXhpc3RlbmNlIHdvdWxkIGludGVycnVwdCB0aGF0IGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY29leGlzdGVuY2UgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gZ2V0UG93ZXJNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbmV3IHJlcXVlc3QgaXMgYmVpbmcgbWFkZSwgc28gYXNzdW1lIHdlIHdpbGwgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLnJ1bkRoY3AobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuZ2V0RGhjcEVycm9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShwb3dlck1vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGNvZXhpc3RlbmNlIG1vZGUgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENhbmNlbENhbGxiYWNrKGJvb2xlYW4gY2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGNhbmNlbENhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHdoaWxlIG9idGFpbmluZyBJUCBhZGRyZXNzLiBUaGlzCi0gICAgICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKLSAgICAgICAgICogaGVhZHNldC9oYW5kc2ZyZWUgc3RhdGUgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1lYW5zIGlmIGl0IGlzIGluIGFuCi0gICAgICAgICAqIGVycm9yIHN0YXRlLCB3ZSB3aWxsIE5PVCBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdG8gZXJyIG9uIHRoZSBzaWRlCi0gICAgICAgICAqIG9mIHNhZmV0eS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpIHsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja1VzZVN0YXRpY0lwKCkgewotICAgICAgICBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmlwQWRkcmVzcyA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5nYXRld2F5ID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLm5ldG1hc2sgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uZG5zMSA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IHRydWU7CisgICAgLyoqCisgICAgICogRmV0Y2ggTmV0d29ya1Byb3BlcnRpZXMgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbU5ldHdvcmtQcm9wZXJ0aWVzOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBzdHJpbmdUb0lwQWRkcihTdHJpbmcgYWRkclN0cmluZykgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYWRkclN0cmluZy5zcGxpdCgiXFwuIik7Ci0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSkgICAgICA7Ci0gICAgICAgICAgICBpbnQgYiA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pIDw8ICA4OwotICAgICAgICAgICAgaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzJdKSA8PCAxNjsKLSAgICAgICAgICAgIGludCBkID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1szXSkgPDwgMjQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBhIHwgYiB8IGMgfCBkOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIEZldGNoIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRHYXRld2F5QWRkci5nZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBnZXRNYXhEaGNwUmV0cmllcygpIHsKLSAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01BWF9ESENQX1JFVFJZX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMpOworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGRlZmF1bHQgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0LmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7Ci0gICAgICAgIHB1YmxpYyBTZXR0aW5nc09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX05FVE1BU0spLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMiksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgewotICAgICAgICAgICAgc3VwZXIub25DaGFuZ2Uoc2VsZkNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gd2FzU3RhdGljSXAgPSBtVXNlU3RhdGljSXA7Ci0gICAgICAgICAgICBpbnQgb0lwLCBvR3csIG9Nc2ssIG9EbnMxLCBvRG5zMjsKLSAgICAgICAgICAgIG9JcCA9IG9HdyA9IG9Nc2sgPSBvRG5zMSA9IG9EbnMyID0gMDsKLSAgICAgICAgICAgIGlmICh3YXNTdGF0aWNJcCkgewotICAgICAgICAgICAgICAgIG9JcCA9IG1EaGNwSW5mby5pcEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgb0d3ID0gbURoY3BJbmZvLmdhdGV3YXk7Ci0gICAgICAgICAgICAgICAgb01zayA9IG1EaGNwSW5mby5uZXRtYXNrOwotICAgICAgICAgICAgICAgIG9EbnMxID0gbURoY3BJbmZvLmRuczE7Ci0gICAgICAgICAgICAgICAgb0RuczIgPSBtRGhjcEluZm8uZG5zMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLQotICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0KLSAgICAgICAgICAgICAgICAod2FzU3RhdGljSXAgIT0gbVVzZVN0YXRpY0lwKSB8fAotICAgICAgICAgICAgICAgICAgICAod2FzU3RhdGljSXAgJiYgKAotICAgICAgICAgICAgICAgICAgICAgICAgb0lwICAgIT0gbURoY3BJbmZvLmlwQWRkcmVzcyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb0d3ICAgIT0gbURoY3BJbmZvLmdhdGV3YXkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9Nc2sgICE9IG1EaGNwSW5mby5uZXRtYXNrIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvRG5zMSAhPSBtRGhjcEluZm8uZG5zMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb0RuczIgIT0gbURoY3BJbmZvLmRuczIpKTsKLQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIGlmIChtVXNlU3RhdGljSXApIHsKLSAgICAgICAgICAgICAgICAgICAgbVRhcmdldC5zZW5kRW1wdHlNZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldC5zZXQoZW5hYmxlZCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCisgICAgICogZm9yIHRoaXMgbmV0d29yay4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7CisgICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOworICAgIH0KIAotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiksIHRydWUsIHRoaXMpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KKyAgICBwcml2YXRlIGNsYXNzIFdpZmlTdGF0ZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKLQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbm90aWZpY2F0aW9uIHRoYXQgbWF5IGJlIHNob3dpbmcKLSAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCB0cnVlLCAwKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gKE5ldHdvcmtQcm9wZXJ0aWVzKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1Dc0hhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gKE5ldHdvcmtQcm9wZXJ0aWVzKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1Dc0hhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiwgMSkgPT0gMTsKICAgICAgICAgfQogICAgIH0KLX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK